[PATCH v2 1/3] net: ti: am65-cpsw-nuss: Enforce pinctrl state on the MDIO child node

Roger Quadros rogerq at kernel.org
Mon Jul 24 12:13:55 CEST 2023


On 24/07/2023 11:39, Maxime Ripard wrote:
> On Sat, Jul 22, 2023 at 11:25:50AM +0300, Roger Quadros wrote:
>> On 21/07/2023 16:07, Maxime Ripard wrote:
>>> The binding represents the MDIO controller as a child device tree
>>> node of the MAC device tree node.
>>>
>>> The U-Boot driver mostly ignores that child device tree node and just
>>> hardcodes the resources it uses to support both the MAC and MDIO in a
>>> single driver.
>>>
>>> However, some resources like pinctrl muxing states are thus ignored.
>>> This has been a problem with some device trees that will put some
>>> pinctrl states on the MDIO device tree node, like the SK-AM62 Device
>>> Tree does.
>>
>> You don't clearly explain the problem.
> 
> I'm sorry to hear that.
> 
>> I think you need to mention that there wash a hackish solution in
>> place that was duplicating MDIO pinctrl node in the CPSW node. And
>> this causes problems in Linux (if booted with u-boot's device tree)
>> due to 2 drivers (CPSW and MDIO) racing for the same MDIO pinctrl
>> resource.
> 
> I mean, ultimately, this hack was due to nothing but a workaround around
> the fact that U-Boot was ignoring the MDIO child node resources. This is
> the root cause. And once fixed, that hack can go away.
> 
>> Then mention how you are fixing it.
> 
> I'm fixing it by "rework[ing] the driver a bit to create a dummy MDIO
> driver that we will then get during our initialization to force the core
> to select the right muxing."
> 
> If that's still not a clear explanation, please provide a better one so
> that we can move forward.

This is fine thanks.

> 
>> By deleting the duplicate MDIO pinctrl entry from CPSW node.
> 
> Not really, no. If I was only deleting the duplitate pinctrl entry,
> U-Boot would still be broken.
> 
>>> Let's rework the driver a bit to create a dummy MDIO driver that we will
>>> then get during our initialization to force the core to select the right
>>> muxing.
>>>
>>> Signed-off-by: Maxime Ripard <mripard at kernel.org>
>>> ---
>>>  drivers/net/ti/Kconfig          |  1 +
>>>  drivers/net/ti/am65-cpsw-nuss.c | 67 +++++++++++++++++++++++++++++++++++++++++
>>>  2 files changed, 68 insertions(+)
>>>
>>> diff --git a/drivers/net/ti/Kconfig b/drivers/net/ti/Kconfig
>>> index e13dbc940182..08c81f79adf9 100644
>>> --- a/drivers/net/ti/Kconfig
>>> +++ b/drivers/net/ti/Kconfig
>>> @@ -41,6 +41,7 @@ endchoice
>>>  config TI_AM65_CPSW_NUSS
>>>  	bool "TI K3 AM65x MCU CPSW Nuss Ethernet controller driver"
>>>  	depends on ARCH_K3
>>> +	imply DM_MDIO
>>>  	imply MISC_INIT_R
>>>  	imply MISC
>>>  	select PHYLIB
>>> diff --git a/drivers/net/ti/am65-cpsw-nuss.c b/drivers/net/ti/am65-cpsw-nuss.c
>>> index 3069550d53c2..ac7907e7ef70 100644
>>> --- a/drivers/net/ti/am65-cpsw-nuss.c
>>> +++ b/drivers/net/ti/am65-cpsw-nuss.c
>>> @@ -15,6 +15,7 @@
>>>  #include <dm.h>
>>>  #include <dm/device_compat.h>
>>>  #include <dm/lists.h>
>>> +#include <dm/pinctrl.h>
>>>  #include <dma-uclass.h>
>>>  #include <dm/of_access.h>
>>>  #include <miiphy.h>
>>> @@ -580,14 +581,69 @@ static const struct soc_attr k3_mdio_soc_data[] = {
>>>  	{ /* sentinel */ },
>>>  };
>>>  
>>> +static ofnode am65_cpsw_find_mdio(ofnode parent)
>>> +{
>>> +	ofnode node;
>>> +
>>> +	ofnode_for_each_subnode(node, parent)
>>> +		if (ofnode_device_is_compatible(node, "ti,cpsw-mdio"))
>>> +			return node;
>>> +
>>> +	return ofnode_null();
>>> +}
>>> +
>>> +static int am65_cpsw_mdio_setup(struct udevice *dev)
>>> +{
>>> +	struct am65_cpsw_priv *priv = dev_get_priv(dev);
>>> +	struct am65_cpsw_common	*cpsw_common = priv->cpsw_common;
>>> +	struct udevice *mdio_dev;
>>> +	ofnode mdio;
>>> +	int ret;
>>> +
>>> +	mdio = am65_cpsw_find_mdio(dev_ofnode(cpsw_common->dev));
>>> +	if (!ofnode_valid(mdio))
>>> +		return -ENODEV;
>>
>> Do we really want to treat this as an error?
>>
>> As per Linux/Documentation/devicetree/bindings/net/ti,k3-am654-cpsw-nuss.yaml
>> mdio node is not a required property/child.
> 
> Ack, I'll change it.
> 
>>> +
>>> +	/*
>>> +	 * The MDIO controller is represented in the DT binding by a
>>> +	 * subnode of the MAC controller.
>>> +	 *
>>> +	 * Our driver largely ignores that and supports MDIO by
>>> +	 * hardcoding the register offsets.
>>> +	 *
>>> +	 * However, some resources (clocks, pinctrl) might be tied to
>>> +	 * the MDIO node, and thus ignored.
>>> +	 *
>>> +	 * Clocks are not a concern at the moment since it's shared
>>> +	 * between the MAC and MDIO, so the driver handles both at the
>>> +	 * same time.
>>
>> I think you can drop the above 3 paras and instead say
>> "We don't yet have a DM device driver for the MDIO device and so its
>> pinctrl setting will be ignored."
> 
> Ok.
> 
> Maxime

-- 
cheers,
-roger


More information about the U-Boot mailing list