Hi, On 11/1/23 10:32, Andy Shevchenko wrote: > On Tue, Oct 31, 2023 at 10:15:52PM +0100, Hans de Goede wrote: >> On 10/31/23 17:07, Hans de Goede wrote: >>> On 10/24/23 18:11, Andy Shevchenko wrote: >>>> On Tue, Oct 24, 2023 at 06:57:38PM +0300, Andy Shevchenko wrote: > > ... > >>> As for the CHT support, I have not added that to my tree yet, I would >>> prefer to directly test the correct/fixed patch. >> >> And I hit the "jackpot" on the first device I tried and the code needed >> some fixing to actually work, so here is something to fold into v3 to >> fix things: > > Thanks! > > But let me first send current v3 as it quite differs to v2 in the sense > of how I do instantiate GPIO lookup tables. The problem is there already is a GPIO lookup table registered for the "0000:00:02.0" device by intel_dsi_vbt_gpio_init() and there can be only be one GPIO lookup table per device. So no matter how you instantiate GPIO lookup tables it will not work. The solution that I chose is to not instantiate a GPIO lookup table at all and instead to extend the existing table with an extra entry. Although thinking more about it I must admit that this is racy. So a better idea would be to unregister the GPIO lookup table registered by intel_dsi_vbt_gpio_init() after getting the GPIOs there, that would allow instantiating a new one from soc_exec_opaque_gpio() as it currently does and that would be race free. > Meanwhile I will look into the change you sent (and hopefully we can > incorporate something in v3 for v4). Ok, lets go with your v3. I'll prepare a patch to move the unregistering of the existing conflicting GPIO lookup from intel_dsi_vbt_gpio_cleanup() to the end of intel_dsi_vbt_gpio_init() to avoid the conflict we have there. Note you still need the first part of my patch which is an unrelated bugfix: --- a/drivers/gpu/drm/i915/display/intel_dsi_vbt.c +++ b/drivers/gpu/drm/i915/display/intel_dsi_vbt.c @@ -219,8 +219,7 @@ static void soc_exec_gpio(struct intel_connector *connector, const char *con_id, } else { gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, con_id, gpio_index, - value ? GPIOD_OUT_LOW : - GPIOD_OUT_HIGH); + value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW); if (IS_ERR(gpio_desc)) { drm_err(&dev_priv->drm, "GPIO index %u request failed (%pe)\n", Regards, Hans