On Tue, 30 Oct 2018, Ville Syrjälä <ville.syrj...@linux.intel.com> wrote:
> On Tue, Oct 30, 2018 at 01:56:40PM +0200, Jani Nikula wrote:
>> From: Madhav Chauhan <madhav.chau...@intel.com>
>> 
>> For ICELAKE DSI, Display Pins are the only GPIOs
>> that need to be programmed. So DSI driver should have
>> its own implementation to toggle these pins based on
>> GPIO info coming from VBT sequences instead of using
>> platform specific GPIO driver.
>> 
>> Signed-off-by: Madhav Chauhan <madhav.chau...@intel.com>
>> Signed-off-by: Jani Nikula <jani.nik...@intel.com>
>> ---
>>  drivers/gpu/drm/i915/intel_dsi_vbt.c | 46 
>> +++++++++++++++++++++++++++++++++++-
>>  1 file changed, 45 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/gpu/drm/i915/intel_dsi_vbt.c 
>> b/drivers/gpu/drm/i915/intel_dsi_vbt.c
>> index 8177305b9c87..04423248bbd7 100644
>> --- a/drivers/gpu/drm/i915/intel_dsi_vbt.c
>> +++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c
>> @@ -334,6 +334,48 @@ static void bxt_exec_gpio(struct drm_i915_private 
>> *dev_priv,
>>      gpiod_set_value(gpio_desc, value);
>>  }
>>  
>> +static void icl_exec_gpio(struct drm_i915_private *dev_priv,
>> +                      u8 gpio_source, u8 gpio_index, bool value)
>> +{
>> +    u32 val;
>> +
>> +    switch (gpio_index) {
>> +    case ICL_GPIO_DDSP_HPD_A:
>> +            val = I915_READ(SHOTPLUG_CTL_DDI);
>> +            val &= ~ICP_DDIA_HPD_ENABLE;
>> +            I915_WRITE(SHOTPLUG_CTL_DDI, val);
>> +            val = I915_READ(SHOTPLUG_CTL_DDI);
>> +            if (value)
>> +                    val |= ICP_DDIA_HPD_OP_DRIVE_1;
>> +            else
>> +                    val &= ~ICP_DDIA_HPD_OP_DRIVE_1;
>> +
>> +            I915_WRITE(SHOTPLUG_CTL_DDI, val);
>
> How badly is this thing going to race with the hotplug irq handler?
>
>> +            break;
>> +    case ICL_GPIO_L_VDDEN_1:
>> +            val = I915_READ(ICP_PP_CONTROL(1));
>> +            if (value)
>> +                    val |= PWR_STATE_TARGET;
>> +            else
>> +                    val &= ~PWR_STATE_TARGET;
>> +            I915_WRITE(ICP_PP_CONTROL(1), val);
>> +            break;
>> +    case ICL_GPIO_L_BKLTEN_1:
>> +            val = I915_READ(ICP_PP_CONTROL(1));
>> +            if (value)
>> +                    val |= BACKLIGHT_ENABLE;
>> +            else
>> +                    val &= ~BACKLIGHT_ENABLE;
>> +            I915_WRITE(ICP_PP_CONTROL(1), val);
>
> :( What a horror show. So basically we're trying to pretend the power 
> sequencer state machine doesn't even exist. Is there some bit somewhere
> we can actually use to disable the state machine? If not I think this
> thing needs much more care.

Frankly I didn't look at the patches towards the end of the series all
that much. Just included them all for completeness.

Agreed, looks pretty bad. :(

BR,
Jani.

>
>> +            break;
>> +    default:
>> +            /* TODO: Add support for remaining GPIOs */
>> +            DRM_ERROR("Invalid GPIO no from VBT\n");
>> +            break;
>> +    }
>> +}
>> +
>>  static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
>>  {
>>      struct drm_device *dev = intel_dsi->base.base.dev;
>> @@ -357,7 +399,9 @@ static const u8 *mipi_exec_gpio(struct intel_dsi 
>> *intel_dsi, const u8 *data)
>>      /* pull up/down */
>>      value = *data++ & 1;
>>  
>> -    if (IS_VALLEYVIEW(dev_priv))
>> +    if (IS_ICELAKE(dev_priv))
>> +            icl_exec_gpio(dev_priv, gpio_source, gpio_index, value);
>> +    else if (IS_VALLEYVIEW(dev_priv))
>>              vlv_exec_gpio(dev_priv, gpio_source, gpio_number, value);
>>      else if (IS_CHERRYVIEW(dev_priv))
>>              chv_exec_gpio(dev_priv, gpio_source, gpio_number, value);
>> -- 
>> 2.11.0

-- 
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to