diff mbox series

[1/7] ACPI / LPSS: Only add device links from consumer to supplier

Message ID 20180919191518.18764-2-hdegoede@redhat.com
State Superseded
Headers show
Series Resume BYT/CHT LPSS I2C controller before the iGPU | expand

Commit Message

Hans de Goede Sept. 19, 2018, 7:15 p.m. UTC
Commit e6ce0ce34f65 ("ACPI / LPSS: Add device link for CHT SD card
dependency on I2C") tries to add device links from consumer to
supplier *and* the other way around.

When the consumer gets registered the supplier is not yet registered, so
acpi_lpss_find_device() cannot find it and we never end up adding the
supplier link. Although not intended this is a good thing, because the
device links are dependencies and if we add a link in both directions the
power-management core will not know which one to suspend/resume first.

I've verified through debug printk-s that indeed only the consumer
to supplier dependency gets added even before this commit removes
the code to add the link the other way.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/acpi/acpi_lpss.c | 25 -------------------------
 1 file changed, 25 deletions(-)

Comments

Adrian Hunter Sept. 21, 2018, 1:01 p.m. UTC | #1
On 19/09/18 22:15, Hans de Goede wrote:
> Commit e6ce0ce34f65 ("ACPI / LPSS: Add device link for CHT SD card
> dependency on I2C") tries to add device links from consumer to
> supplier *and* the other way around.

That is not the intention.  The intention is to add a link irrespective of
which device (consumer or supplier) is created last.

> 
> When the consumer gets registered the supplier is not yet registered, so
> acpi_lpss_find_device() cannot find it and we never end up adding the
> supplier link. Although not intended this is a good thing, because the
> device links are dependencies and if we add a link in both directions the
> power-management core will not know which one to suspend/resume first.

Did that actually happen?  It seems to me that could only happen if the _DEP
methods also pointed to each other.

> 
> I've verified through debug printk-s that indeed only the consumer
> to supplier dependency gets added even before this commit removes
> the code to add the link the other way.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/acpi/acpi_lpss.c | 25 -------------------------
>  1 file changed, 25 deletions(-)
> 
> diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
> index 83875305b1d4..40a8cab81cbd 100644
> --- a/drivers/acpi/acpi_lpss.c
> +++ b/drivers/acpi/acpi_lpss.c
> @@ -486,13 +486,6 @@ static bool acpi_lpss_is_supplier(struct acpi_device *adev,
>  			     link->supplier_hid, link->supplier_uid);
>  }
>  
> -static bool acpi_lpss_is_consumer(struct acpi_device *adev,
> -				  const struct lpss_device_links *link)
> -{
> -	return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
> -			     link->consumer_hid, link->consumer_uid);
> -}
> -
>  struct hid_uid {
>  	const char *hid;
>  	const char *uid;
> @@ -559,21 +552,6 @@ static void acpi_lpss_link_consumer(struct device *dev1,
>  	put_device(dev2);
>  }
>  
> -static void acpi_lpss_link_supplier(struct device *dev1,
> -				    const struct lpss_device_links *link)
> -{
> -	struct device *dev2;
> -
> -	dev2 = acpi_lpss_find_device(link->supplier_hid, link->supplier_uid);
> -	if (!dev2)
> -		return;
> -
> -	if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
> -		device_link_add(dev1, dev2, link->flags);
> -
> -	put_device(dev2);
> -}
> -
>  static void acpi_lpss_create_device_links(struct acpi_device *adev,
>  					  struct platform_device *pdev)
>  {
> @@ -584,9 +562,6 @@ static void acpi_lpss_create_device_links(struct acpi_device *adev,
>  
>  		if (acpi_lpss_is_supplier(adev, link))
>  			acpi_lpss_link_consumer(&pdev->dev, link);
> -
> -		if (acpi_lpss_is_consumer(adev, link))
> -			acpi_lpss_link_supplier(&pdev->dev, link);
>  	}
>  }
>  
>
Hans de Goede Sept. 21, 2018, 2:03 p.m. UTC | #2
Hi,

On 09/21/2018 03:01 PM, Adrian Hunter wrote:
> On 19/09/18 22:15, Hans de Goede wrote:
>> Commit e6ce0ce34f65 ("ACPI / LPSS: Add device link for CHT SD card
>> dependency on I2C") tries to add device links from consumer to
>> supplier *and* the other way around.
> 
> That is not the intention.  The intention is to add a link irrespective of
> which device (consumer or supplier) is created last.

Ah I see an upon rereading the code you are right.

>> When the consumer gets registered the supplier is not yet registered, so
>> acpi_lpss_find_device() cannot find it and we never end up adding the
>> supplier link. Although not intended this is a good thing, because the
>> device links are dependencies and if we add a link in both directions the
>> power-management core will not know which one to suspend/resume first.
> 
> Did that actually happen?  It seems to me that could only happen if the _DEP
> methods also pointed to each other.

You are right again.

So I guess that this patch can be dropped.

Note that for the new GPU -> PMIC I2C controller consumer -> supplier link this
patchset adds we rely on probe ordering. Relying on probe ordering works
for the SDCARD -> PMIC I2C too, so we could keep this patch as it does
simplify the code. If we do that the commit message needs to be corrected
of course.

Regards,

Hans


>> I've verified through debug printk-s that indeed only the consumer
>> to supplier dependency gets added even before this commit removes
>> the code to add the link the other way.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>   drivers/acpi/acpi_lpss.c | 25 -------------------------
>>   1 file changed, 25 deletions(-)
>>
>> diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
>> index 83875305b1d4..40a8cab81cbd 100644
>> --- a/drivers/acpi/acpi_lpss.c
>> +++ b/drivers/acpi/acpi_lpss.c
>> @@ -486,13 +486,6 @@ static bool acpi_lpss_is_supplier(struct acpi_device *adev,
>>   			     link->supplier_hid, link->supplier_uid);
>>   }
>>   
>> -static bool acpi_lpss_is_consumer(struct acpi_device *adev,
>> -				  const struct lpss_device_links *link)
>> -{
>> -	return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
>> -			     link->consumer_hid, link->consumer_uid);
>> -}
>> -
>>   struct hid_uid {
>>   	const char *hid;
>>   	const char *uid;
>> @@ -559,21 +552,6 @@ static void acpi_lpss_link_consumer(struct device *dev1,
>>   	put_device(dev2);
>>   }
>>   
>> -static void acpi_lpss_link_supplier(struct device *dev1,
>> -				    const struct lpss_device_links *link)
>> -{
>> -	struct device *dev2;
>> -
>> -	dev2 = acpi_lpss_find_device(link->supplier_hid, link->supplier_uid);
>> -	if (!dev2)
>> -		return;
>> -
>> -	if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
>> -		device_link_add(dev1, dev2, link->flags);
>> -
>> -	put_device(dev2);
>> -}
>> -
>>   static void acpi_lpss_create_device_links(struct acpi_device *adev,
>>   					  struct platform_device *pdev)
>>   {
>> @@ -584,9 +562,6 @@ static void acpi_lpss_create_device_links(struct acpi_device *adev,
>>   
>>   		if (acpi_lpss_is_supplier(adev, link))
>>   			acpi_lpss_link_consumer(&pdev->dev, link);
>> -
>> -		if (acpi_lpss_is_consumer(adev, link))
>> -			acpi_lpss_link_supplier(&pdev->dev, link);
>>   	}
>>   }
>>   
>>
>
Adrian Hunter Sept. 25, 2018, 12:12 p.m. UTC | #3
On 21/09/18 17:03, Hans de Goede wrote:
> Hi,
> 
> On 09/21/2018 03:01 PM, Adrian Hunter wrote:
>> On 19/09/18 22:15, Hans de Goede wrote:
>>> Commit e6ce0ce34f65 ("ACPI / LPSS: Add device link for CHT SD card
>>> dependency on I2C") tries to add device links from consumer to
>>> supplier *and* the other way around.
>>
>> That is not the intention.  The intention is to add a link irrespective of
>> which device (consumer or supplier) is created last.
> 
> Ah I see an upon rereading the code you are right.
> 
>>> When the consumer gets registered the supplier is not yet registered, so
>>> acpi_lpss_find_device() cannot find it and we never end up adding the
>>> supplier link. Although not intended this is a good thing, because the
>>> device links are dependencies and if we add a link in both directions the
>>> power-management core will not know which one to suspend/resume first.
>>
>> Did that actually happen?  It seems to me that could only happen if the _DEP
>> methods also pointed to each other.
> 
> You are right again.
> 
> So I guess that this patch can be dropped.
> 
> Note that for the new GPU -> PMIC I2C controller consumer -> supplier link this
> patchset adds we rely on probe ordering. Relying on probe ordering works
> for the SDCARD -> PMIC I2C too, so we could keep this patch as it does
> simplify the code. If we do that the commit message needs to be corrected
> of course.

IIRC the ACPI platform devices end up being created in the order the device
nodes appear in the DSDT, so no guarantee of consumer before supplier.

> 
> Regards,
> 
> Hans
> 
> 
>>> I've verified through debug printk-s that indeed only the consumer
>>> to supplier dependency gets added even before this commit removes
>>> the code to add the link the other way.
>>>
>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>> ---
>>>   drivers/acpi/acpi_lpss.c | 25 -------------------------
>>>   1 file changed, 25 deletions(-)
>>>
>>> diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
>>> index 83875305b1d4..40a8cab81cbd 100644
>>> --- a/drivers/acpi/acpi_lpss.c
>>> +++ b/drivers/acpi/acpi_lpss.c
>>> @@ -486,13 +486,6 @@ static bool acpi_lpss_is_supplier(struct acpi_device
>>> *adev,
>>>                    link->supplier_hid, link->supplier_uid);
>>>   }
>>>   -static bool acpi_lpss_is_consumer(struct acpi_device *adev,
>>> -                  const struct lpss_device_links *link)
>>> -{
>>> -    return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
>>> -                 link->consumer_hid, link->consumer_uid);
>>> -}
>>> -
>>>   struct hid_uid {
>>>       const char *hid;
>>>       const char *uid;
>>> @@ -559,21 +552,6 @@ static void acpi_lpss_link_consumer(struct device
>>> *dev1,
>>>       put_device(dev2);
>>>   }
>>>   -static void acpi_lpss_link_supplier(struct device *dev1,
>>> -                    const struct lpss_device_links *link)
>>> -{
>>> -    struct device *dev2;
>>> -
>>> -    dev2 = acpi_lpss_find_device(link->supplier_hid, link->supplier_uid);
>>> -    if (!dev2)
>>> -        return;
>>> -
>>> -    if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
>>> -        device_link_add(dev1, dev2, link->flags);
>>> -
>>> -    put_device(dev2);
>>> -}
>>> -
>>>   static void acpi_lpss_create_device_links(struct acpi_device *adev,
>>>                         struct platform_device *pdev)
>>>   {
>>> @@ -584,9 +562,6 @@ static void acpi_lpss_create_device_links(struct
>>> acpi_device *adev,
>>>             if (acpi_lpss_is_supplier(adev, link))
>>>               acpi_lpss_link_consumer(&pdev->dev, link);
>>> -
>>> -        if (acpi_lpss_is_consumer(adev, link))
>>> -            acpi_lpss_link_supplier(&pdev->dev, link);
>>>       }
>>>   }
>>>  
>>
>
diff mbox series

Patch

diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 83875305b1d4..40a8cab81cbd 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -486,13 +486,6 @@  static bool acpi_lpss_is_supplier(struct acpi_device *adev,
 			     link->supplier_hid, link->supplier_uid);
 }
 
-static bool acpi_lpss_is_consumer(struct acpi_device *adev,
-				  const struct lpss_device_links *link)
-{
-	return hid_uid_match(acpi_device_hid(adev), acpi_device_uid(adev),
-			     link->consumer_hid, link->consumer_uid);
-}
-
 struct hid_uid {
 	const char *hid;
 	const char *uid;
@@ -559,21 +552,6 @@  static void acpi_lpss_link_consumer(struct device *dev1,
 	put_device(dev2);
 }
 
-static void acpi_lpss_link_supplier(struct device *dev1,
-				    const struct lpss_device_links *link)
-{
-	struct device *dev2;
-
-	dev2 = acpi_lpss_find_device(link->supplier_hid, link->supplier_uid);
-	if (!dev2)
-		return;
-
-	if (acpi_lpss_dep(ACPI_COMPANION(dev1), ACPI_HANDLE(dev2)))
-		device_link_add(dev1, dev2, link->flags);
-
-	put_device(dev2);
-}
-
 static void acpi_lpss_create_device_links(struct acpi_device *adev,
 					  struct platform_device *pdev)
 {
@@ -584,9 +562,6 @@  static void acpi_lpss_create_device_links(struct acpi_device *adev,
 
 		if (acpi_lpss_is_supplier(adev, link))
 			acpi_lpss_link_consumer(&pdev->dev, link);
-
-		if (acpi_lpss_is_consumer(adev, link))
-			acpi_lpss_link_supplier(&pdev->dev, link);
 	}
 }