Re: [PATCH 7/9] phy: renesas: ethernet serdes: add support for R-Car SoC X5H (r8a78000)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Michael,

On Fri, 9 May 2025 at 14:07, Michael Dege <michael.dege@xxxxxxxxxxx> wrote:
> Adding support for a new SOC device.
>
> Signed-off-by: Michael Dege <michael.dege@xxxxxxxxxxx>

Thanks for your patch!

> --- a/drivers/phy/renesas/renesas-ether-serdes.c
> +++ b/drivers/phy/renesas/renesas-ether-serdes.c
> @@ -14,11 +14,13 @@
>  #include <linux/platform_device.h>
>  #include <linux/reset.h>
>
> +#define RENESAS_ETH_SERDES_MAX_NUM             R8A78000_ETH_SERDES_NUM

I think you can just fix this to 8:

    #define RENESAS_ETH_SERDES_MAX_NUM    8

>  #define R8A779F0_ETH_SERDES_NUM                        3
> +#define R8A78000_ETH_SERDES_NUM                        8

These are not really used.

>  #define RENESAS_ETH_SERDES_OFFSET              0x0400
>  #define RENESAS_ETH_SERDES_BANK_SELECT         0x03fc
>  #define RENESAS_ETH_SERDES_TIMEOUT_US          100000
> -#define RENESAS_ETH_SERDES_LOCAL_OFFSET        0x2600
> +#define RENESAS_ETH_SERDES_LOCAL_OFFSET                0x2600
>  #define RENESAS_ETH_SERDES_NUM_RETRY_LINKUP    3
>
>  struct renesas_eth_serdes_drv_data;
> @@ -35,10 +37,21 @@ struct renesas_eth_serdes_drv_data {
>         void __iomem *addr;
>         struct platform_device *pdev;
>         struct reset_control *reset;
> -       struct renesas_eth_serdes_channel channel[R8A779F0_ETH_SERDES_NUM];
> +       struct renesas_eth_serdes_channel channel[RENESAS_ETH_SERDES_MAX_NUM];
> +       const struct renesas_serdes_hw_info *info;
>         bool initialized;
>  };
>
> +enum DEVICE_CODE {
> +       r8a779f0,
> +       r8a78000,
> +};

Unused (see below), so please drop.

> +
> +struct renesas_serdes_hw_info {
> +       int renesas_eth_serdes_num;

That's a rather long name. "num_serdes"?

> +       int device_type;

Unused. And it's cleaner to use "feature flags" (like num_serdes above)
than to check for a specific device type.

> +};
> +
>  /*
>   * The datasheet describes initialization procedure without any information
>   * about registers' name/bits. So, this is all black magic to initialize
> @@ -82,7 +95,7 @@ renesas_eth_serdes_common_init_ram(struct renesas_eth_serdes_drv_data *dd)
>         struct renesas_eth_serdes_channel *channel;
>         int i, ret;
>
> -       for (i = 0; i < R8A779F0_ETH_SERDES_NUM; i++) {
> +       for (i = 0; i < dd->info->renesas_eth_serdes_num; i++) {
>                 channel = &dd->channel[i];
>                 ret = renesas_eth_serdes_reg_wait(channel, 0x026c, 0x180, BIT(0), 0x01);
>                 if (ret)
> @@ -265,32 +278,34 @@ static int renesas_eth_serdes_hw_init(struct renesas_eth_serdes_channel *channel
>
>         reset_control_reset(dd->reset);
>
> +       mdelay(1);
> +
>         /* There is a slight difference in SerDes hardware behavior between
>          * each version after resetting. This step is to ensure the stable
>          * condition of initialization, especially for R-Car S4 v1.1.
>          */
> -       mdelay(1);

Why move this up?

> -       iowrite32(0, dd->addr + RENESAS_ETH_SERDES_LOCAL_OFFSET);
> +       if (dd->info->renesas_eth_serdes_num == r8a779f0)

That test doesn't look right to me...

> +               iowrite32(0, dd->addr + RENESAS_ETH_SERDES_LOCAL_OFFSET);
>
>         ret = renesas_eth_serdes_common_init_ram(dd);
>         if (ret)
>                 return ret;

> @@ -430,12 +456,19 @@ static int renesas_eth_serdes_probe(struct platform_device *pdev)
>  {
>         struct renesas_eth_serdes_drv_data *dd;
>         struct phy_provider *provider;
> +       const struct renesas_serdes_hw_info *info;

Please use "reverse Christmas tree"-order.

>         int i;
>
>         dd = devm_kzalloc(&pdev->dev, sizeof(*dd), GFP_KERNEL);
>         if (!dd)
>                 return -ENOMEM;
>
> +       info = of_device_get_match_data(&pdev->dev);
> +       if (info > 0)
> +               dd->info = info;
> +       else
> +               return PTR_ERR(info);

of_device_get_match_data() returns NULL on failure instead of an error
pointer.  But it can never fail here, so there is no need to check.

> +
>         platform_set_drvdata(pdev, dd);
>         dd->pdev = pdev;
>         dd->addr = devm_platform_ioremap_resource(pdev, 0);

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds




[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux