On Thu, 01 Dec 2016, Mika Kahola <mika.kahola@xxxxxxxxx> wrote: > On Tue, 2016-11-15 at 14:08 +0200, Jani Nikula wrote: >> Request the GPIO by index through the consumer API. For now, use a >> quick >> hack to store the already requested ones, simply because I have no >> idea >> whether this actually works or not, and I have no way to test it. >> >> Cc: Mika Kahola <mika.kahola@xxxxxxxxx> >> Signed-off-by: Jani Nikula <jani.nikula@xxxxxxxxx> >> --- >> drivers/gpu/drm/i915/intel_dsi_panel_vbt.c | 38 >> +++++++++++++++++++++++++----- >> 1 file changed, 32 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c >> b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c >> index 9f279a3d0f74..41e0eeac97f4 100644 >> --- a/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c >> +++ b/drivers/gpu/drm/i915/intel_dsi_panel_vbt.c >> @@ -29,6 +29,7 @@ >> #include <drm/drm_edid.h> >> #include <drm/i915_drm.h> >> #include <drm/drm_panel.h> >> +#include <linux/gpio/consumer.h> >> #include <linux/slab.h> >> #include <video/mipi_display.h> >> #include <asm/intel-mid.h> >> @@ -304,19 +305,44 @@ static void chv_exec_gpio(struct >> drm_i915_private *dev_priv, >> mutex_unlock(&dev_priv->sb_lock); >> } >> >> +static void bxt_exec_gpio(struct drm_i915_private *dev_priv, >> + u8 gpio_source, u8 gpio_index, bool value) >> +{ >> + /* XXX: this table is a quick ugly hack. */ >> + static struct gpio_desc *bxt_gpio_table[U8_MAX + 1]; >> + struct gpio_desc *gpio_desc = bxt_gpio_table[gpio_index]; >> + >> + if (!gpio_desc) { >> + gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, >> + NULL, gpio_index, > This patch works better with *NULL* replaced by *"panel"*. With this > change we can access GPIO's without GPIO index request failures. Oh, nice find. Can you resend the patch with that fixed, please? BR, Jani. > >> + value ? >> GPIOD_OUT_LOW : >> + GPIOD_OUT_HIGH); >> + >> + if (IS_ERR_OR_NULL(gpio_desc)) { >> + DRM_ERROR("GPIO index %u request failed >> (%ld)\n", >> + gpio_index, PTR_ERR(gpio_desc)); >> + return; >> + } >> + >> + bxt_gpio_table[gpio_index] = gpio_desc; >> + } >> + >> + gpiod_set_value(gpio_desc, value); >> +} >> + >> static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const >> u8 *data) >> { >> struct drm_device *dev = intel_dsi->base.base.dev; >> struct drm_i915_private *dev_priv = to_i915(dev); >> - u8 gpio_source, gpio_index; >> + u8 gpio_source, gpio_index = 0, gpio_number; >> bool value; >> >> DRM_DEBUG_KMS("\n"); >> >> if (dev_priv->vbt.dsi.seq_version >= 3) >> - data++; >> + gpio_index = *data++; >> >> - gpio_index = *data++; >> + gpio_number = *data++; >> >> /* gpio source in sequence v2 only */ >> if (dev_priv->vbt.dsi.seq_version == 2) >> @@ -328,11 +354,11 @@ static const u8 *mipi_exec_gpio(struct >> intel_dsi *intel_dsi, const u8 *data) >> value = *data++ & 1; >> >> if (IS_VALLEYVIEW(dev_priv)) >> - vlv_exec_gpio(dev_priv, gpio_source, gpio_index, >> value); >> + vlv_exec_gpio(dev_priv, gpio_source, gpio_number, >> value); >> else if (IS_CHERRYVIEW(dev_priv)) >> - chv_exec_gpio(dev_priv, gpio_source, gpio_index, >> value); >> + chv_exec_gpio(dev_priv, gpio_source, gpio_number, >> value); >> else >> - DRM_DEBUG_KMS("GPIO element not supported on this >> platform\n"); >> + bxt_exec_gpio(dev_priv, gpio_source, gpio_index, >> value); >> >> return data; >> } -- Jani Nikula, Intel Open Source Technology Center _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx