linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ivan Vecera <ivecera@redhat.com>
To: Lee Jones <lee@kernel.org>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>,
	netdev@vger.kernel.org,
	Vadim Fedorenko <vadim.fedorenko@linux.dev>,
	Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>,
	Jiri Pirko <jiri@resnulli.us>, Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Prathosh Satish <Prathosh.Satish@microchip.com>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Simon Horman <horms@kernel.org>,
	Michal Schmidt <mschmidt@redhat.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-doc@vger.kernel.org
Subject: Re: [PATCH net-next v7 8/8] mfd: zl3073x: Register DPLL sub-device during init
Date: Thu, 22 May 2025 13:23:44 +0200	[thread overview]
Message-ID: <73eb151c-93cd-4617-b0e4-f7dccb20c4cb@redhat.com> (raw)
In-Reply-To: <20250522104551.GD1199143@google.com>

On 22. 05. 25 12:45 odp., Lee Jones wrote:
> On Thu, 22 May 2025, Ivan Vecera wrote:
> 
>>
>>
>> On 22. 05. 25 9:39 dop., Lee Jones wrote:
>>> On Tue, 13 May 2025, Ivan Vecera wrote:
>>>
>>>> On 13. 05. 25 11:41 dop., Lee Jones wrote:
>>>>> On Mon, 12 May 2025, Ivan Vecera wrote:
>>>>>
>>>>>> On 07. 05. 25 5:26 odp., Lee Jones wrote:
>>>>>>> On Wed, 07 May 2025, Andy Shevchenko wrote:
>>>>>>>
>>>>>>>> On Wed, May 07, 2025 at 03:56:37PM +0200, Ivan Vecera wrote:
>>>>>>>>> On 07. 05. 25 3:41 odp., Andy Shevchenko wrote:
>>>>>>>>>> On Wed, May 7, 2025 at 3:45 PM Ivan Vecera <ivecera@redhat.com> wrote:
>>>>>>>>
>>>>>>>> ...
>>>>>>>>
>>>>>>>>>>> +static const struct zl3073x_pdata zl3073x_pdata[ZL3073X_MAX_CHANNELS] = {
>>>>>>>>>>> +       { .channel = 0, },
>>>>>>>>>>> +       { .channel = 1, },
>>>>>>>>>>> +       { .channel = 2, },
>>>>>>>>>>> +       { .channel = 3, },
>>>>>>>>>>> +       { .channel = 4, },
>>>>>>>>>>> +};
>>>>>>>>>>
>>>>>>>>>>> +static const struct mfd_cell zl3073x_devs[] = {
>>>>>>>>>>> +       ZL3073X_CELL("zl3073x-dpll", 0),
>>>>>>>>>>> +       ZL3073X_CELL("zl3073x-dpll", 1),
>>>>>>>>>>> +       ZL3073X_CELL("zl3073x-dpll", 2),
>>>>>>>>>>> +       ZL3073X_CELL("zl3073x-dpll", 3),
>>>>>>>>>>> +       ZL3073X_CELL("zl3073x-dpll", 4),
>>>>>>>>>>> +};
>>>>>>>>>>
>>>>>>>>>>> +#define ZL3073X_MAX_CHANNELS   5
>>>>>>>>>>
>>>>>>>>>> Btw, wouldn't be better to keep the above lists synchronised like
>>>>>>>>>>
>>>>>>>>>> 1. Make ZL3073X_CELL() to use indexed variant
>>>>>>>>>>
>>>>>>>>>> [idx] = ...
>>>>>>>>>>
>>>>>>>>>> 2. Define the channel numbers
>>>>>>>>>>
>>>>>>>>>> and use them in both data structures.
>>>>>>>>>>
>>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>> WDYM?
>>>>>>>>>
>>>>>>>>>> OTOH, I'm not sure why we even need this. If this is going to be
>>>>>>>>>> sequential, can't we make a core to decide which cell will be given
>>>>>>>>>> which id?
>>>>>>>>>
>>>>>>>>> Just a note that after introduction of PHC sub-driver the array will look
>>>>>>>>> like:
>>>>>>>>> static const struct mfd_cell zl3073x_devs[] = {
>>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", 0),  // DPLL sub-dev for chan 0
>>>>>>>>>            ZL3073X_CELL("zl3073x-phc", 0),   // PHC sub-dev for chan 0
>>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", 1),  // ...
>>>>>>>>>            ZL3073X_CELL("zl3073x-phc", 1),
>>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", 2),
>>>>>>>>>            ZL3073X_CELL("zl3073x-phc", 2),
>>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", 3),
>>>>>>>>>            ZL3073X_CELL("zl3073x-phc", 3),
>>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", 4),
>>>>>>>>>            ZL3073X_CELL("zl3073x-phc", 4),   // PHC sub-dev for chan 4
>>>>>>>>> };
>>>>>>>>
>>>>>>>> Ah, this is very important piece. Then I mean only this kind of change
>>>>>>>>
>>>>>>>> enum {
>>>>>>>> 	// this or whatever meaningful names
>>>>>>>> 	..._CH_0	0
>>>>>>>> 	..._CH_1	1
>>>>>>>> 	...
>>>>>>>> };
>>>>>>>>
>>>>>>>> static const struct zl3073x_pdata zl3073x_pdata[ZL3073X_MAX_CHANNELS] = {
>>>>>>>>            { .channel = ..._CH_0, },
>>>>>>>>            ...
>>>>>>>> };
>>>>>>>>
>>>>>>>> static const struct mfd_cell zl3073x_devs[] = {
>>>>>>>>            ZL3073X_CELL("zl3073x-dpll", ..._CH_0),
>>>>>>>>            ZL3073X_CELL("zl3073x-phc", ..._CH_0),
>>>>>>>>            ...
>>>>>>>> };
>>>>>>>
>>>>>>> This is getting hectic.  All for a sequential enumeration.  Seeing as
>>>>>>> there are no other differentiations, why not use IDA in the child
>>>>>>> instead?
>>>>>>
>>>>>> For that, there have to be two IDAs, one for DPLLs and one for PHCs...
>>>>>
>>>>> Sorry, can you explain a bit more.  Why is this a problem?
>>>>>
>>>>> The IDA API is very simple.
>>>>>
>>>>> Much better than building your own bespoke MACROs.
>>>>
>>>> I will try to explain this in more detail... This MFD driver handles
>>>> chip family ZL3073x where the x == number of DPLL channels and can
>>>> be from <1, 5>.
>>>>
>>>> The driver creates 'x' DPLL sub-devices during probe and has to pass
>>>> channel number that should this sub-device use. Here can be used IDA
>>>> in DPLL sub-driver:
>>>> e.g. ida_alloc_max(zldev->channels, zldev->max_channels, GFP_KERNEL);
>>>>
>>>> This way the DPLL sub-device get its own unique channel ID to use.
>>>>
>>>> The situation is getting more complicated with PHC sub-devices because
>>>> the chip can provide UP TO 'x' PHC sub-devices depending on HW
>>>> configuration. To handle this the MFD driver has to check this HW config
>>>> for particular channel if it is capable to provide PHC functionality.
>>>>
>>>> E.g. ZL30735 chip has 5 channels, in this case the MFD driver should
>>>> create 5 DPLL sub-devices. And then lets say channel 0, 2 and 4 are
>>>> PHC capable. Then the MFD driver should create 3 PHC sub-devices and
>>>> pass 0, 2 resp. 4 for them.
>>>
>>> Where is the code that determines which channels are PHC capable?
>>
>> It is not included in this series and will be added once the PTP driver
>> will be added. But the code looks like:
>>
>> for (i = 0; i < ZL3073X_MAX_CHANNELS; i++) {
>> 	if (channel_is_in_nco_mode(..., i)) {
>> 		struct mfd_cell phc_dev = ZL3073X_CELL("zl3073x-phc", i);
>> 		rc = devm_mfd_add_devices(zldev->dev,
>> 					  PLATFORM_DEVID_AUTO, &phc_dev,
>> 					  1, NULL, 0, NULL);
>> 		...
>> 	}
>> }
> 
> It's the channel_is_in_nco_mode() code I wanted to see.

The function is like this:

static bool zl3073x_chan_in_nco_mode(struct zl3073x_dev *zldev, u8 ch)
{
	u8 mode, mode_refsel;
	int rc;

	rc = zl3073x_read_u8(zlptp->mfd,
			     ZL_REG_DPLL_MODE_REFSEL(ch), &mode_refsel);
	if (rc)
		return false;

	mode = FIELD_GET(ZL_DPLL_MODE_REFSEL_MODE, mode_refsel);

	return (mode == ZL_DPLL_MODE_REFSEL_MODE_NCO);
}

> What if you register all PHC devices, then bomb out if
> !channel_is_in_nco_mode()?  Presumably this can / should also live in
> the PHC driver as well?

Yes, we can register PHC sub-dev for all channels disregard to channel
mode. The PHC driver checks for the mode and return -ENODEV when it is
different from NCO. But in this case the user will see PHC platform
devices under /sys/bus/platform/device and some of them won't have
driver bound (they will look like some kind of phantom devices).
I'm not sure if this is OK and not confusing.

Thanks for an opinion.

Ivan


  reply	other threads:[~2025-05-22 11:23 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-07 12:43 [PATCH net-next v7 0/8] Add Microchip ZL3073x support (part 1) Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 1/8] dt-bindings: dpll: Add DPLL device and pin Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 2/8] dt-bindings: dpll: Add support for Microchip Azurite chip family Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 3/8] mfd: Add Microchip ZL3073x support Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 4/8] mfd: zl3073x: Add support for devlink device info Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 5/8] mfd: zl3073x: Protect operations requiring multiple register accesses Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 6/8] mfd: zl3073x: Fetch invariants during probe Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 7/8] mfd: zl3073x: Add clock_id field Ivan Vecera
2025-05-07 12:43 ` [PATCH net-next v7 8/8] mfd: zl3073x: Register DPLL sub-device during init Ivan Vecera
2025-05-07 13:30   ` Andy Shevchenko
2025-05-07 13:41   ` Andy Shevchenko
2025-05-07 13:56     ` Ivan Vecera
2025-05-07 14:59       ` Andy Shevchenko
2025-05-07 15:26         ` Lee Jones
2025-05-12 11:55           ` Ivan Vecera
2025-05-13  9:41             ` Lee Jones
2025-05-13 10:47               ` Ivan Vecera
2025-05-19 16:59                 ` Ivan Vecera
2025-05-22  7:39                 ` Lee Jones
2025-05-22  8:54                   ` Ivan Vecera
2025-05-22 10:45                     ` Lee Jones
2025-05-22 11:23                       ` Ivan Vecera [this message]
2025-06-12 10:26                         ` Lee Jones
2025-05-07 14:19     ` Ivan Vecera
2025-05-07 15:00       ` Andy Shevchenko
2025-05-07 15:23         ` Ivan Vecera

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=73eb151c-93cd-4617-b0e4-f7dccb20c4cb@redhat.com \
    --to=ivecera@redhat.com \
    --cc=Prathosh.Satish@microchip.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=arkadiusz.kubalewski@intel.com \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=horms@kernel.org \
    --cc=jiri@resnulli.us \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=lee@kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mschmidt@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    --cc=vadim.fedorenko@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).