On 10.1.2017 15:46, [email protected] wrote:
>> -----Ursprüngliche Nachricht-----
>> Von: Michal Simek [mailto:[email protected]]
>> Gesendet: Dienstag, 10. Januar 2017 14:59
>> An: Herbrechtsmeier, Stefan; [email protected]
>> Cc: Herbrechtsmeier, Stefan; Albert Aribaud; Michal Simek; Joe
>> Hershberger
>> Betreff: Re: [PATCH 2/8] net: zynq: Add clk framework support to zynq
>> ethernet driver
>>
>> On 4.1.2017 13:27, [email protected] wrote:
>>> From: Stefan Herbrechtsmeier <[email protected]>
>>>
>>> If available use the clock framework to set the tx clock rate of the
>>> zynq ethernet controller.
>>>
>>> Signed-off-by: Stefan Herbrechtsmeier
>>> <[email protected]>
>>> ---
>>>
>>>  arch/arm/include/asm/arch-zynqmp/sys_proto.h |  5 -----
>>>  drivers/net/zynq_gem.c                       | 31
>> ++++++++++++++++++++++++++++
>>>  2 files changed, 31 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/arch/arm/include/asm/arch-zynqmp/sys_proto.h
>>> b/arch/arm/include/asm/arch-zynqmp/sys_proto.h
>>> index 1db2bd6..bd633a6 100644
>>> --- a/arch/arm/include/asm/arch-zynqmp/sys_proto.h
>>> +++ b/arch/arm/include/asm/arch-zynqmp/sys_proto.h
>>> @@ -8,11 +8,6 @@
>>>  #ifndef _ASM_ARCH_SYS_PROTO_H
>>>  #define _ASM_ARCH_SYS_PROTO_H
>>>
>>> -/* Setup clk for network */
>>> -static inline void zynq_slcr_gem_clk_setup(u32 gem_id, unsigned long
>>> clk_rate) -{ -}
>>> -
>>>  int zynq_slcr_get_mio_pin_status(const char *periph);
>>>
>>>  unsigned int zynqmp_get_silicon_version(void); diff --git
>>> a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index
>>> 9bfb89f..9118e49 100644
>>> --- a/drivers/net/zynq_gem.c
>>> +++ b/drivers/net/zynq_gem.c
>>> @@ -9,6 +9,7 @@
>>>   * SPDX-License-Identifier:        GPL-2.0+
>>>   */
>>>
>>> +#include <clk.h>
>>>  #include <common.h>
>>>  #include <dm.h>
>>>  #include <net.h>
>>> @@ -180,6 +181,9 @@ struct zynq_gem_priv {
>>>     struct phy_device *phydev;
>>>     int phy_of_handle;
>>>     struct mii_dev *bus;
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +   struct clk tx_clk;
>>> +#endif
>>>  };
>>>
>>>  static inline int mdio_wait(struct zynq_gem_regs *regs) @@ -364,6
>>> +368,9 @@ static int zynq_gem_init(struct udevice *dev)
>>>     u32 i, nwconfig;
>>>     int ret;
>>>     unsigned long clk_rate = 0;
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +   unsigned long clk_rate_rounded;
>>> +#endif
>>>     struct zynq_gem_priv *priv = dev_get_priv(dev);
>>>     struct zynq_gem_regs *regs = priv->iobase;
>>>     struct emac_bd *dummy_tx_bd = &priv->tx_bd[TX_FREE_DESC]; @@ -
>> 466,8
>>> +473,22 @@ static int zynq_gem_init(struct udevice *dev)
>>>             break;
>>>     }
>>>
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +   clk_rate_rounded = clk_set_rate(&priv->tx_clk, clk_rate);
>>> +   if (IS_ERR_VALUE(clk_rate_rounded)) {
>>> +           dev_err(dev, "failed to set tx clock rate\n");
>>> +           return clk_rate_rounded;
>>> +   }
>>> +
>>> +   ret = clk_enable(&priv->tx_clk);
>>> +   if (ret && ret != -ENOSYS) {
>>> +           dev_err(dev, "failed to enable tx clock\n");
>>> +           return ret;
>>> +   }
>>> +#else
>>>     zynq_slcr_gem_clk_setup((ulong)priv->iobase !=
>>>                             ZYNQ_GEM_BASEADDR0, clk_rate);
>>> +#endif
>>>
>>>     setbits_le32(&regs->nwctrl, ZYNQ_GEM_NWCTRL_RXEN_MASK |
>>>                                     ZYNQ_GEM_NWCTRL_TXEN_MASK);
>>> @@ -678,6 +699,9 @@ static int zynq_gem_ofdata_to_platdata(struct
>> udevice *dev)
>>>     struct eth_pdata *pdata = dev_get_platdata(dev);
>>>     struct zynq_gem_priv *priv = dev_get_priv(dev);
>>>     const char *phy_mode;
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +   int ret;
>>> +#endif
>>>
>>>     pdata->iobase = (phys_addr_t)dev_get_addr(dev);
>>>     priv->iobase = (struct zynq_gem_regs *)pdata->iobase; @@ -699,6
>>> +723,13 @@ static int zynq_gem_ofdata_to_platdata(struct udevice
>> *dev)
>>>     }
>>>     priv->interface = pdata->phy_interface;
>>>
>>> +#if defined(CONFIG_CLK) || defined(CONFIG_SPL_CLK)
>>> +   ret = clk_get_by_index(dev, 2, &priv->tx_clk);
>>> +   if (ret < 0) {
>>> +           dev_err(dev, "failed to get clock\n");
>>> +           return ret;
>>> +   }
>>> +#endif
>>>
>>>     printf("ZYNQ GEM: %lx, phyaddr %x, interface %s\n", (ulong)priv-
>>> iobase,
>>>            priv->phyaddr, phy_string_for_interface(priv->interface));
>>>
>>
>> Can you please rebase it on the top of this?
>> https://patchwork.ozlabs.org/patch/706419/
>>
>> The reason why this patch was written in this way is that we don't have
>> full zynqmp clk driver yet but we are using fixed clock where you can't
>> run set_rate which fails.
>>
> The patch assumes that the EMIO_ENET_TX_CLK is always fixed. Is this true?
> 
> Why don't you add a set_rate() function to the fixed clock?

It would be a solution but I am not sure if fixed clock was designed for
this. I would expect that fixed clock only provided clock which you
can't change. It means we need to have something as transition when
u-boot has real clk driver for zynqmp.

> 
> Additionally the patch is missing an enable function call.

correct.

> 
> I don't think the emio configuration should be keep in the Ethernet driver as 
> it is part of the clock configuration and doesn't influent the network 
> interface.

Please correct me if I am wrong. Are you saying that with these patches
especially 8/8 clock for emio will handled automatically?

Thanks,
Michal


-- 
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP SoCs


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to