diff mbox series

[RFC] Soundwire: Initialize multi_link with fwnode props

Message ID 20220814080416.7531-1-khalid.masum.92@gmail.com
State New
Headers show
Series [RFC] Soundwire: Initialize multi_link with fwnode props | expand

Commit Message

Khalid Masum Aug. 14, 2022, 8:04 a.m. UTC
According to the TODO, In sw_bus_master_add, bus->multi_link is to be
populated with properties from FW node props. Make this happen by 
creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use 
the flag to store the multi_link value from intel_link_startup. Use 
this flag to initialize bus->multi_link.

Signed-off-by: Khalid Masum <khalid.masum.92@gmail.com>
---
I do not think adding a new flag for fwnode_handle is a good idea.
So, what would be the best way to initialize bus->multilink with 
fwnode props?

  -- Khalid Masum

 drivers/soundwire/bus.c   | 4 ++--
 drivers/soundwire/intel.c | 1 +
 include/linux/fwnode.h    | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

Comments

Greg KH Aug. 14, 2022, 9:45 a.m. UTC | #1
On Sun, Aug 14, 2022 at 02:04:15PM +0600, Khalid Masum wrote:
> According to the TODO, In sw_bus_master_add, bus->multi_link is to be
> populated with properties from FW node props. Make this happen by 
> creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use 
> the flag to store the multi_link value from intel_link_startup. Use 
> this flag to initialize bus->multi_link.
> 
> Signed-off-by: Khalid Masum <khalid.masum.92@gmail.com>
> ---
> I do not think adding a new flag for fwnode_handle is a good idea.
> So, what would be the best way to initialize bus->multilink with 
> fwnode props?
> 
>   -- Khalid Masum
> 
>  drivers/soundwire/bus.c   | 4 ++--
>  drivers/soundwire/intel.c | 1 +
>  include/linux/fwnode.h    | 1 +
>  3 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
> index a2bfb0434a67..80df1672c60b 100644
> --- a/drivers/soundwire/bus.c
> +++ b/drivers/soundwire/bus.c
> @@ -74,9 +74,9 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
>  
>  	/*
>  	 * Initialize multi_link flag
> -	 * TODO: populate this flag by reading property from FW node
>  	 */
> -	bus->multi_link = false;
> +	bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
> +		== FWNODE_FLAG_MULTI_LINKED;
>  	if (bus->ops->read_prop) {
>  		ret = bus->ops->read_prop(bus);
>  		if (ret < 0) {
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index 505c5ef061e3..034d1c523ddf 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -1347,6 +1347,7 @@ int intel_link_startup(struct auxiliary_device *auxdev)
>  		 */
>  		bus->multi_link = true;
>  		bus->hw_sync_min_links = 1;
> +		dev->fwnode->flags |= FWNODE_FLAG_MULTI_LINKED;
>  	}
>  
>  	/* Initialize shim, controller */
> diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
> index 9a81c4410b9f..446a52744953 100644
> --- a/include/linux/fwnode.h
> +++ b/include/linux/fwnode.h
> @@ -32,6 +32,7 @@ struct device;
>  #define FWNODE_FLAG_NOT_DEVICE			BIT(1)
>  #define FWNODE_FLAG_INITIALIZED			BIT(2)
>  #define FWNODE_FLAG_NEEDS_CHILD_BOUND_ON_ADD	BIT(3)
> +#define FWNODE_FLAG_MULTI_LINKED		BIT(4)

What does this commit actually change?

Did you test this on real hardware?

thanks,

greg k-h
Andy Shevchenko Aug. 14, 2022, 6:46 p.m. UTC | #2
On Sun, Aug 14, 2022 at 11:31 AM Khalid Masum <khalid.masum.92@gmail.com> wrote:
>
> According to the TODO, In sw_bus_master_add, bus->multi_link is to be
> populated with properties from FW node props. Make this happen by
> creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use
> the flag to store the multi_link value from intel_link_startup. Use
> this flag to initialize bus->multi_link.

...

>         /*
>          * Initialize multi_link flag
> -        * TODO: populate this flag by reading property from FW node
>          */
> -       bus->multi_link = false;
> +       bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
> +               == FWNODE_FLAG_MULTI_LINKED;

NAK (as far as I understood the context of the comment and the change itself).

These flags are for devlink, we do not mix FW properties with those
internal flags anyhow. The comment suggests that this should be a
property. Also commit message doesn't explain the relation to devlink.
Khalid Masum Aug. 15, 2022, 4:28 a.m. UTC | #3
On 8/15/22 00:46, Andy Shevchenko wrote:
> On Sun, Aug 14, 2022 at 11:31 AM Khalid Masum <khalid.masum.92@gmail.com> wrote:
>>
>> According to the TODO, In sw_bus_master_add, bus->multi_link is to be
>> populated with properties from FW node props. Make this happen by
>> creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use
>> the flag to store the multi_link value from intel_link_startup. Use
>> this flag to initialize bus->multi_link.
> 
> ...
> 
>>          /*
>>           * Initialize multi_link flag
>> -        * TODO: populate this flag by reading property from FW node
>>           */
>> -       bus->multi_link = false;
>> +       bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
>> +               == FWNODE_FLAG_MULTI_LINKED;
> 
> NAK (as far as I understood the context of the comment and the change itself).
> 
> These flags are for devlink, we do not mix FW properties with those
> internal flags anyhow. The comment suggests that this should be az
> property. Also commit message doesn't explain the relation to devlink.
> 
That is a good information to know. Thanks.

I shall try to find out if I can somehow get multi_link's value from 
fwnode in any other way and look into devlink in the process.

If you have any suggestions regarding this TODO, please let me know.

Thanks,
   -- Khalid Masum
Pierre-Louis Bossart Aug. 15, 2022, 8:16 a.m. UTC | #4
On 8/15/22 06:28, Khalid Masum wrote:
> On 8/15/22 00:46, Andy Shevchenko wrote:
>> On Sun, Aug 14, 2022 at 11:31 AM Khalid Masum
>> <khalid.masum.92@gmail.com> wrote:
>>>
>>> According to the TODO, In sw_bus_master_add, bus->multi_link is to be
>>> populated with properties from FW node props. Make this happen by
>>> creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use
>>> the flag to store the multi_link value from intel_link_startup. Use
>>> this flag to initialize bus->multi_link.
>>
>> ...
>>
>>>          /*
>>>           * Initialize multi_link flag
>>> -        * TODO: populate this flag by reading property from FW node
>>>           */
>>> -       bus->multi_link = false;
>>> +       bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
>>> +               == FWNODE_FLAG_MULTI_LINKED;
>>
>> NAK (as far as I understood the context of the comment and the change
>> itself).
>>
>> These flags are for devlink, we do not mix FW properties with those
>> internal flags anyhow. The comment suggests that this should be az
>> property. Also commit message doesn't explain the relation to devlink.
>>
> That is a good information to know. Thanks.
> 
> I shall try to find out if I can somehow get multi_link's value from
> fwnode in any other way and look into devlink in the process.
> 
> If you have any suggestions regarding this TODO, please let me know.

The suggestion is to remove the TODO and leave the code as is: the
capabilities enabled for multi-link are required as part of the
programming sequences, even when a stream uses a single link we still
use the syncArm/syncGo sequences.

Please don't change this.
Khalid Masum Aug. 15, 2022, 12:30 p.m. UTC | #5
On 8/15/22 12:37, Greg KH wrote:
> On Mon, Aug 15, 2022 at 10:08:07AM +0600, Khalid Masum wrote:
>> On 8/14/22 15:45, Greg KH wrote:
>>> On Sun, Aug 14, 2022 at 02:04:15PM +0600, Khalid Masum wrote:
>>>> According to the TODO, In sw_bus_master_add, bus->multi_link is to be
>>>> populated with properties from FW node props. Make this happen by
>>>> creating a new fwnode_handle flag FWNODE_FLAG_MULTI_LINKED and use
>>>> the flag to store the multi_link value from intel_link_startup. Use
>>>> this flag to initialize bus->multi_link.
>>>>
>>>> Signed-off-by: Khalid Masum <khalid.masum.92@gmail.com>
>>>> ---
>>>> I do not think adding a new flag for fwnode_handle is a good idea.
>>>> So, what would be the best way to initialize bus->multilink with
>>>> fwnode props?
>>>>
>>>>     -- Khalid Masum
>>>>
>>>>    drivers/soundwire/bus.c   | 4 ++--
>>>>    drivers/soundwire/intel.c | 1 +
>>>>    include/linux/fwnode.h    | 1 +
>>>>    3 files changed, 4 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
>>>> index a2bfb0434a67..80df1672c60b 100644
>>>> --- a/drivers/soundwire/bus.c
>>>> +++ b/drivers/soundwire/bus.c
>>>> @@ -74,9 +74,9 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
>>>>    	/*
>>>>    	 * Initialize multi_link flag
>>>> -	 * TODO: populate this flag by reading property from FW node
>>>>    	 */
>>>> -	bus->multi_link = false;
>>>> +	bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
>>>> +		== FWNODE_FLAG_MULTI_LINKED;
> 
> I missed that this was an if statement here, please write this to be
> more obvious and readable.
> 
>>>>    	if (bus->ops->read_prop) {
>>>>    		ret = bus->ops->read_prop(bus);
>>>>    		if (ret < 0) {
>>>> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
>>>> index 505c5ef061e3..034d1c523ddf 100644
>>>> --- a/drivers/soundwire/intel.c
>>>> +++ b/drivers/soundwire/intel.c
>>>> @@ -1347,6 +1347,7 @@ int intel_link_startup(struct auxiliary_device *auxdev)
>>>>    		 */
>>>>    		bus->multi_link = true;
>>>>    		bus->hw_sync_min_links = 1;
>>>> +		dev->fwnode->flags |= FWNODE_FLAG_MULTI_LINKED;
>>>>    	}
>>>>    	/* Initialize shim, controller */
>>>> diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
>>>> index 9a81c4410b9f..446a52744953 100644
>>>> --- a/include/linux/fwnode.h
>>>> +++ b/include/linux/fwnode.h
>>>> @@ -32,6 +32,7 @@ struct device;
>>>>    #define FWNODE_FLAG_NOT_DEVICE			BIT(1)
>>>>    #define FWNODE_FLAG_INITIALIZED			BIT(2)
>>>>    #define FWNODE_FLAG_NEEDS_CHILD_BOUND_ON_ADD	BIT(3)
>>>> +#define FWNODE_FLAG_MULTI_LINKED		BIT(4)
>>>
>>> What does this commit actually change?
>>
>> The new flag will lets us save if the device has multilink in fwnode_handle
>> whenever needed.
>> Then for soundwire/intel, save the multi_link flag into fwnode during
>> startup.
>> Later at master_add, as written in todo, initialize the multilink flag with
>> fwnode's flag property.
> 
> And what does that allow to happen?  What changes with all of this?

As suggested by Pierre-Louis Bossart these changes are not necessary and 
the TODO is to be removed. Earlier my intention was to create a new flag 
that lets us know whether multi_link is to be read from 
sdw_bus_master_add just as instructed in TODO.

I shall send another patch, that removes the TODO, as suggested by 
Pierre-Louis Bossart.
> 
> thanks,
> 
> greg k-h

thanks,
   -- Khalid Masum
diff mbox series

Patch

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index a2bfb0434a67..80df1672c60b 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -74,9 +74,9 @@  int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
 
 	/*
 	 * Initialize multi_link flag
-	 * TODO: populate this flag by reading property from FW node
 	 */
-	bus->multi_link = false;
+	bus->multi_link = (fwnode->flags & FWNODE_FLAG_MULTI_LINKED)
+		== FWNODE_FLAG_MULTI_LINKED;
 	if (bus->ops->read_prop) {
 		ret = bus->ops->read_prop(bus);
 		if (ret < 0) {
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 505c5ef061e3..034d1c523ddf 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -1347,6 +1347,7 @@  int intel_link_startup(struct auxiliary_device *auxdev)
 		 */
 		bus->multi_link = true;
 		bus->hw_sync_min_links = 1;
+		dev->fwnode->flags |= FWNODE_FLAG_MULTI_LINKED;
 	}
 
 	/* Initialize shim, controller */
diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
index 9a81c4410b9f..446a52744953 100644
--- a/include/linux/fwnode.h
+++ b/include/linux/fwnode.h
@@ -32,6 +32,7 @@  struct device;
 #define FWNODE_FLAG_NOT_DEVICE			BIT(1)
 #define FWNODE_FLAG_INITIALIZED			BIT(2)
 #define FWNODE_FLAG_NEEDS_CHILD_BOUND_ON_ADD	BIT(3)
+#define FWNODE_FLAG_MULTI_LINKED		BIT(4)
 
 struct fwnode_handle {
 	struct fwnode_handle *secondary;