All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ramon Fried <rfried.dev@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v5 6/8] net: macb: Extend MACB driver for SiFive Unleashed board
Date: Thu, 20 Jun 2019 12:18:08 +0300	[thread overview]
Message-ID: <30bcb346-a0df-f114-1157-cf4858813756@gmail.com> (raw)
In-Reply-To: <CAGi-RUJqtzE9xgPkO8bNbTcznO+u3ORGk2RJNY2rw04476Hy7Q@mail.gmail.com>


On Thu, Jun 20, 2019 at 9:49 AM Anup Patel <Anup.Patel@wdc.com> wrote:
> The SiFive MACB ethernet has a custom TX_CLK_SEL register to select
> different TX clock for 1000mbps vs 10/100mbps.
>
> This patch adds SiFive MACB compatible string and extends the MACB
> ethernet driver to change TX clock using TX_CLK_SEL register for
> SiFive MACB.
>
> Signed-off-by: Anup Patel <anup.patel@wdc.com>
> ---
>  drivers/net/macb.c | 53 +++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 45 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/macb.c b/drivers/net/macb.c
> index c072f99d8f..6a29ee3064 100644
> --- a/drivers/net/macb.c
> +++ b/drivers/net/macb.c
> @@ -83,6 +83,9 @@ struct macb_dma_desc {
>
>  struct macb_device {
>         void                    *regs;
> +       void                    *regs_sifive_gemgxl;
This needs needs to be part of the specific config structure.
> +
> +       bool                    skip_dma_config;
Why do you ever need to skip_dma_config ?
>         unsigned int            dma_burst_length;
>
>         unsigned int            rx_tail;
> @@ -122,7 +125,9 @@ struct macb_device {
>  };
>
>  struct macb_config {
> +       bool                    skip_dma_config;
>         unsigned int            dma_burst_length;
> +       bool                    has_sifive_gemgxl;
>  };
>
>  #ifndef CONFIG_DM_ETH
> @@ -486,18 +491,11 @@ static int macb_phy_find(struct macb_device *macb, const char *name)
>  int __weak macb_linkspd_cb(struct udevice *dev, unsigned int speed)
>  {
>  #ifdef CONFIG_CLK
> +       struct macb_device *macb = dev_get_priv(dev);
>         struct clk tx_clk;
>         ulong rate;
>         int ret;
>
> -       /*
> -        * "tx_clk" is an optional clock source for MACB.
> -        * Ignore if it does not exist in DT.
> -        */
> -       ret = clk_get_by_name(dev, "tx_clk", &tx_clk);
> -       if (ret)
> -               return 0;
> -
>         switch (speed) {
>         case _10BASET:
>                 rate = 2500000;         /* 2.5 MHz */
> @@ -513,6 +511,26 @@ int __weak macb_linkspd_cb(struct udevice *dev, unsigned int speed)
>                 return 0;
>         }
>
> +       if (macb->regs_sifive_gemgxl) {
> +               /*
> +                * SiFive GEMGXL TX clock operation mode:
> +                *
> +                * 0 = GMII mode. Use 125 MHz gemgxlclk from PRCI in TX logic
> +                *     and output clock on GMII output signal GTX_CLK
> +                * 1 = MII mode. Use MII input signal TX_CLK in TX logic
> +                */
> +               writel(rate != 125000000, macb->regs_sifive_gemgxl);
> +               return 0;
> +       }
move to dedicated clock init.
> +
> +       /*
> +        * "tx_clk" is an optional clock source for MACB.
> +        * Ignore if it does not exist in DT.
> +        */
> +       ret = clk_get_by_name(dev, "tx_clk", &tx_clk);
> +       if (ret)
> +               return 0;
> +
>         if (tx_clk.dev) {
>                 ret = clk_set_rate(&tx_clk, rate);
>                 if (ret)
> @@ -701,6 +719,9 @@ static void gmac_configure_dma(struct macb_device *macb)
>         u32 buffer_size;
>         u32 dmacfg;
>
> +       if (macb->skip_dma_config)
> +               return;
> +
Same as before, why do you skip it ?
>         buffer_size = 128 / RX_BUFFER_MULTIPLE;
>         dmacfg = gem_readl(macb, DMACFG) & ~GEM_BF(RXBS, -1L);
>         dmacfg |= GEM_BF(RXBS, buffer_size);
> @@ -1178,6 +1199,7 @@ static int macb_eth_probe(struct udevice *dev)
>         struct macb_device *macb = dev_get_priv(dev);
>         const char *phy_mode;
>         __maybe_unused int ret;
> +       fdt_addr_t addr;
>
>         phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
>                                NULL);
> @@ -1194,6 +1216,7 @@ static int macb_eth_probe(struct udevice *dev)
>         if (!macb_config)
>                 macb_config = &default_gem_config;
>
> +       macb->skip_dma_config = macb_config->skip_dma_config;
>         macb->dma_burst_length = macb_config->dma_burst_length;
>  #ifdef CONFIG_CLK
>         ret = macb_enable_clk(dev);
> @@ -1201,6 +1224,13 @@ static int macb_eth_probe(struct udevice *dev)
>                 return ret;
>  #endif
>
> +       if (macb_config->has_sifive_gemgxl) {
> +               addr = dev_read_addr_index(dev, 1);
> +               if (addr == FDT_ADDR_T_NONE)
> +                       return -ENODEV;
> +               macb->regs_sifive_gemgxl = (void __iomem *)addr;
> +       }
This should be all done in a a specific sifive init function.
You can define init function and clock init function CB functions in
config (Like in Linux):
"
int (*clk_init)(struct platform_device *pdev, struct clk **pclk,
struct clk **hclk, struct clk **tx_clk,
struct clk **rx_clk);
int (*init)(struct platform_device *pdev);
"

and add your specific SOC initialization there.
This function should be generic as possible.

> +
>         _macb_eth_initialize(macb);
>
>  #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
> @@ -1259,6 +1289,12 @@ static const struct macb_config sama5d4_config = {
>         .dma_burst_length = 4,
>  };
>
> +static const struct macb_config sifive_config = {
> +       .skip_dma_config = true,
> +       .dma_burst_length = 0,
Don't mention it if it's zero, and by the way, I assume it should be not zero.
You're wasting memory cycles, try to find the correct value. (I think
4 is the default in macb)
> +       .has_sifive_gemgxl = true,
can be dropped if callback functions are declared.
> +};
> +
>  static const struct udevice_id macb_eth_ids[] = {
>         { .compatible = "cdns,macb" },
>         { .compatible = "cdns,at91sam9260-macb" },
> @@ -1266,6 +1302,7 @@ static const struct udevice_id macb_eth_ids[] = {
>         { .compatible = "atmel,sama5d3-gem" },
>         { .compatible = "atmel,sama5d4-gem", .data = (ulong)&sama5d4_config },
>         { .compatible = "cdns,zynq-gem" },
> +       { .compatible = "sifive,fu540-macb", .data = (ulong)&sifive_config },
>         { }
>  };
>
> --
> 2.17.1
>
Thanks,
Ramon.

  parent reply	other threads:[~2019-06-20  9:18 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-20  6:48 [U-Boot] [PATCH v5 0/8] Update SiFive Unleashed Drivers Anup Patel
2019-06-20  6:48 ` [U-Boot] [PATCH v5 1/8] clk: sifive: Factor-out PLL library as separate module Anup Patel
2019-06-21  7:15   ` Bin Meng
2019-06-20  6:48 ` [U-Boot] [PATCH v5 2/8] clk: sifive: Sync-up WRPLL library with upstream Linux Anup Patel
2019-06-21  7:15   ` Bin Meng
2019-06-20  6:48 ` [U-Boot] [PATCH v5 3/8] clk: sifive: Sync-up DT bindings header " Anup Patel
2019-06-21  7:15   ` Bin Meng
2019-06-21 11:24     ` Anup Patel
2019-06-21 11:36       ` Anup Patel
2019-06-20  6:49 ` [U-Boot] [PATCH v5 4/8] clk: sifive: Sync-up main driver " Anup Patel
2019-06-21  7:16   ` Bin Meng
2019-06-20  6:49 ` [U-Boot] [PATCH v5 5/8] clk: sifive: Drop GEMGXL clock driver Anup Patel
2019-06-20  6:49 ` [U-Boot] [PATCH v5 6/8] net: macb: Extend MACB driver for SiFive Unleashed board Anup Patel
     [not found]   ` <CAGi-RUJqtzE9xgPkO8bNbTcznO+u3ORGk2RJNY2rw04476Hy7Q@mail.gmail.com>
2019-06-20  9:18     ` Ramon Fried [this message]
2019-06-20  9:55       ` Anup Patel
2019-06-20 10:31         ` Ramon Fried
2019-06-24  3:47           ` Anup Patel
2019-06-20  6:49 ` [U-Boot] [PATCH v5 7/8] riscv: sifive: fu540: Setup ethaddr env variable using OTP Anup Patel
2019-06-21  7:16   ` Bin Meng
2019-06-21 12:49     ` Anup Patel
2019-06-21 12:52       ` Bin Meng
2019-06-20  6:49 ` [U-Boot] [PATCH v5 8/8] doc: sifive-fu540: Update README for steps to create FW_PAYLOAD Anup Patel
2019-06-21  7:16   ` Bin Meng
2019-06-21 18:42   ` Alistair Francis

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=30bcb346-a0df-f114-1157-cf4858813756@gmail.com \
    --to=rfried.dev@gmail.com \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.