public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Stephen Boyd <sboyd@kernel.org>
To: Michael Turquette <mturquette@baylibre.com>,
	Nikita Shubin via B4 Relay
	<devnull+nikita.shubin.maquefel.me@kernel.org>,
	nikita.shubin@maquefel.me
Cc: linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org
Subject: Re: [PATCH v11 03/38] clk: ep93xx: add DT support for Cirrus EP93xx
Date: Wed, 28 Aug 2024 13:44:59 -0700	[thread overview]
Message-ID: <020c15c9939c1c4cfac925942a582cee.sboyd@kernel.org> (raw)
In-Reply-To: <20240715-ep93xx-v11-3-4e924efda795@maquefel.me>

Quoting Nikita Shubin via B4 Relay (2024-07-15 01:38:07)
> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
> index 3e9099504fad..234b0a8b7650 100644
> --- a/drivers/clk/Kconfig
> +++ b/drivers/clk/Kconfig
> @@ -218,6 +218,14 @@ config COMMON_CLK_EN7523
>           This driver provides the fixed clocks and gates present on Airoha
>           ARM silicon.
>  
> +config COMMON_CLK_EP93XX
> +       bool "Clock driver for Cirrus Logic ep93xx SoC"

tristate?

> +       depends on ARCH_EP93XX || COMPILE_TEST
> +       select MFD_SYSCON

Why is this selecting syscon?

> +       select REGMAP

Is this needed either?

> +       help
> +         This driver supports the SoC clocks on the Cirrus Logic ep93xx.
> +
>  config COMMON_CLK_FSL_FLEXSPI
>         tristate "Clock driver for FlexSPI on Layerscape SoCs"
>         depends on ARCH_LAYERSCAPE || COMPILE_TEST
> diff --git a/drivers/clk/clk-ep93xx.c b/drivers/clk/clk-ep93xx.c
> new file mode 100644
> index 000000000000..bb1cf59a3d47
> --- /dev/null
> +++ b/drivers/clk/clk-ep93xx.c
> @@ -0,0 +1,846 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Clock control for Cirrus EP93xx chips.
> + * Copyright (C) 2021 Nikita Shubin <nikita.shubin@maquefel.me>
> + *
> + * Based on a rewrite of arch/arm/mach-ep93xx/clock.c:
> + * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
> + */
> +#define pr_fmt(fmt) "ep93xx " KBUILD_MODNAME ": " fmt
> +
> +#include <linux/bits.h>
> +#include <linux/cleanup.h>
> +#include <linux/clk-provider.h>
> +#include <linux/math.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>
> +#include <linux/spinlock.h>
> +
> +#include <linux/soc/cirrus/ep93xx.h>
> +#include <dt-bindings/clock/cirrus,ep9301-syscon.h>
> +
> +#include <asm/div64.h>
[...]
> +
> +static const char adc_divisors[] = { 16, 4 };

These are global symbols in terms of namespace because we're in the
kernel. Please prefix with ep93xx_ to help tags.

> +static const char sclk_divisors[] = { 2, 4 };
> +static const char lrclk_divisors[] = { 32, 64, 128 };
> +
> +struct ep93xx_clk {
> +       struct clk_hw hw;
> +       u16 idx;
> +       u16 reg;
> +       u32 mask;
> +       u8 bit_idx;
> +       u8 shift;
> +       u8 width;
> +       u8 num_div;
> +       const char *div;
> +};
> +
> +struct ep93xx_clk_priv {
> +       spinlock_t lock;
> +       struct ep93xx_regmap_adev *aux_dev;
> +       struct device *dev;
> +       void __iomem *base;
> +       struct regmap *map;
> +       struct clk_hw *fixed[21];

Please make a define for '21'.

> +       struct ep93xx_clk reg[];
> +};
[...]
> +
> +static const struct clk_ops ep93xx_div_ops = {
> +       .enable = ep93xx_clk_enable,
> +       .disable = ep93xx_clk_disable,
> +       .is_enabled = ep93xx_clk_is_enabled,
> +       .recalc_rate = ep93xx_div_recalc_rate,
> +       .round_rate = ep93xx_div_round_rate,
> +       .set_rate = ep93xx_div_set_rate,
> +};
> +
> +static int clk_hw_register_div(struct ep93xx_clk *clk,

Please call this something like ep93xx_register_div(). It doesn't take a
clk_hw pointer so the clk_hw prefix doesn't make sense. This same
comment applies to other clk_hw prefixed functions in this file.

> +                              const char *name,
> +                              struct clk_parent_data *parent_data,

const?

> +                              unsigned int reg,
> +                              u8 enable_bit,
> +                              u8 shift,
> +                              u8 width,
> +                              const char *clk_divisors,
> +                              u8 num_div)
> +{
> +       struct ep93xx_clk_priv *priv = ep93xx_priv_from(clk);
> +       struct clk_init_data init = { };
> +
> +       init.name = name;
> +       init.ops = &ep93xx_div_ops;
> +       init.flags = 0;
> +       init.parent_data = parent_data;
> +       init.num_parents = 1;
> +
> +       clk->reg = reg;
> +       clk->bit_idx = enable_bit;
> +       clk->mask = GENMASK(shift + width - 1, shift);
> +       clk->shift = shift;
> +       clk->div = clk_divisors;
> +       clk->num_div = num_div;
> +       clk->hw.init = &init;
> +
> +       return devm_clk_hw_register(priv->dev, &clk->hw);
> +}
> +
> +struct ep93xx_gate {
> +       unsigned int idx;
> +       unsigned int bit;
> +       const char *name;
> +};
> +
> +static const struct ep93xx_gate ep93xx_uarts[] = {
> +       { EP93XX_CLK_UART1, EP93XX_SYSCON_DEVCFG_U1EN, "uart1" },
> +       { EP93XX_CLK_UART2, EP93XX_SYSCON_DEVCFG_U2EN, "uart2" },
> +       { EP93XX_CLK_UART3, EP93XX_SYSCON_DEVCFG_U3EN, "uart3" },
> +};
> +
> +static int ep93xx_uart_clock_init(struct ep93xx_clk_priv *priv)
> +{
> +       struct clk_parent_data parent_data = { };
> +       unsigned int i, idx, ret, clk_uart_div;
> +       struct ep93xx_clk *clk;
> +       u32 val;
> +
> +       regmap_read(priv->map, EP93XX_SYSCON_PWRCNT, &val);
> +       if (val & EP93XX_SYSCON_PWRCNT_UARTBAUD)
> +               clk_uart_div = 1;
> +       else
> +               clk_uart_div = 2;
> +
> +       priv->fixed[EP93XX_CLK_UART] =
> +               clk_hw_register_fixed_factor(NULL, "uart", "xtali", 0, 1, clk_uart_div);

Pass a device instead of NULL. Don't use string names for parent ^

> +       parent_data.hw = priv->fixed[EP93XX_CLK_UART];
> +
> +       /* parenting uart gate clocks to uart clock */
> +       for (i = 0; i < ARRAY_SIZE(ep93xx_uarts); i++) {
> +               idx = ep93xx_uarts[i].idx - EP93XX_CLK_UART1;
> +               clk = &priv->reg[idx];
> +               clk->idx = idx;
> +               ret = ep93xx_clk_register_gate(clk,
> +                                       ep93xx_uarts[i].name,
> +                                       &parent_data, CLK_SET_RATE_PARENT,
> +                                       EP93XX_SYSCON_DEVCFG,
> +                                       ep93xx_uarts[i].bit);
> +               if (ret)
> +                       return dev_err_probe(priv->dev, ret,
> +                                            "failed to register uart[%d] clock\n", i);
> +       }
> +
> +       return 0;
> +}
> +
> +static const struct ep93xx_gate ep93xx_dmas[] = {
> +       { EP93XX_CLK_M2M0, EP93XX_SYSCON_PWRCNT_DMA_M2M0, "m2m0" },
> +       { EP93XX_CLK_M2M1, EP93XX_SYSCON_PWRCNT_DMA_M2M1, "m2m1" },
> +       { EP93XX_CLK_M2P0, EP93XX_SYSCON_PWRCNT_DMA_M2P0, "m2p0" },
> +       { EP93XX_CLK_M2P1, EP93XX_SYSCON_PWRCNT_DMA_M2P1, "m2p1" },
> +       { EP93XX_CLK_M2P2, EP93XX_SYSCON_PWRCNT_DMA_M2P2, "m2p2" },
> +       { EP93XX_CLK_M2P3, EP93XX_SYSCON_PWRCNT_DMA_M2P3, "m2p3" },
> +       { EP93XX_CLK_M2P4, EP93XX_SYSCON_PWRCNT_DMA_M2P4, "m2p4" },
> +       { EP93XX_CLK_M2P5, EP93XX_SYSCON_PWRCNT_DMA_M2P5, "m2p5" },
> +       { EP93XX_CLK_M2P6, EP93XX_SYSCON_PWRCNT_DMA_M2P6, "m2p6" },
> +       { EP93XX_CLK_M2P7, EP93XX_SYSCON_PWRCNT_DMA_M2P7, "m2p7" },
> +       { EP93XX_CLK_M2P8, EP93XX_SYSCON_PWRCNT_DMA_M2P8, "m2p8" },
> +       { EP93XX_CLK_M2P9, EP93XX_SYSCON_PWRCNT_DMA_M2P9, "m2p9" },
> +};
> +
> +static int ep93xx_dma_clock_init(struct ep93xx_clk_priv *priv)
> +{
> +       struct clk_parent_data parent_data = { };
> +       unsigned int i, idx;
> +
> +       parent_data.hw = priv->fixed[EP93XX_CLK_HCLK];
> +       for (i = 0; i < ARRAY_SIZE(ep93xx_dmas); i++) {
> +               idx = ep93xx_dmas[i].idx;
> +               priv->fixed[idx] = devm_clk_hw_register_gate_parent_data(priv->dev,
> +                                       ep93xx_dmas[i].name,
> +                                       &parent_data, 0,
> +                                       priv->base + EP93XX_SYSCON_PWRCNT,
> +                                       ep93xx_dmas[i].bit,
> +                                       0,
> +                                       &priv->lock);
> +               if (IS_ERR(priv->fixed[idx]))
> +                       return PTR_ERR(priv->fixed[idx]);
> +       }
> +
> +       return 0;
> +}
> +
> +static struct clk_hw *of_clk_ep93xx_get(struct of_phandle_args *clkspec, void *data)
> +{
> +       struct ep93xx_clk_priv *priv = data;
> +       unsigned int idx = clkspec->args[0];
> +
> +       if (idx < EP93XX_CLK_UART1)
> +               return priv->fixed[idx];
> +
> +       if (idx <= EP93XX_CLK_I2S_LRCLK)
> +               return &priv->reg[idx - EP93XX_CLK_UART1].hw;
> +
> +       return ERR_PTR(-EINVAL);
> +}
> +
> +/*
> + * PLL rate = 14.7456 MHz * (X1FBD + 1) * (X2FBD + 1) / (X2IPD + 1) / 2^PS
> + */
> +static unsigned long calc_pll_rate(u64 rate, u32 config_word)
> +{
> +       rate *= ((config_word >> 11) & GENMASK(4, 0)) + 1;      /* X1FBD */
> +       rate *= ((config_word >> 5) & GENMASK(5, 0)) + 1;       /* X2FBD */
> +       do_div(rate, (config_word & GENMASK(4, 0)) + 1);        /* X2IPD */
> +       rate >>= (config_word >> 16) & GENMASK(1, 0);           /* PS */
> +
> +       return rate;
> +}
> +
> +#define devm_ep93xx_clk_hw_register_fixed_rate_parent_data(dev, name, parent_data, flags, fixed_rate)  \
> +       __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, \
> +                                    (parent_data), (flags), (fixed_rate), 0, 0, true)

Is this to workaround a missing devm_clk_hw_register_fixed_rate_parent_data() macro?

  parent reply	other threads:[~2024-08-28 20:45 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-15  8:38 [PATCH v11 00/38] ep93xx device tree conversion Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 01/38] gpio: ep93xx: split device in multiple Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 02/38] ARM: ep93xx: add regmap aux_dev Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 03/38] clk: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2024-08-02  7:07   ` Nikita Shubin
2024-08-26  8:33     ` Nikita Shubin
2024-08-28 20:44   ` Stephen Boyd [this message]
2024-08-30  9:23     ` Nikita Shubin
2024-08-30 22:27       ` Stephen Boyd
2024-09-02 13:31         ` Nikita Shubin
2024-09-05 20:50           ` Stephen Boyd
2024-09-06 12:08             ` Nikita Shubin
2024-07-15  8:38 ` [PATCH v11 04/38] pinctrl: add a Cirrus ep93xx SoC pin controller Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 05/38] power: reset: Add a driver for the ep93xx reset Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 06/38] dt-bindings: soc: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 07/38] soc: Add SoC driver for Cirrus ep93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 08/38] dt-bindings: dma: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 09/38] dmaengine: cirrus: Convert to DT for " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 10/38] dt-bindings: watchdog: Add Cirrus EP93x Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 11/38] watchdog: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 12/38] dt-bindings: pwm: Add " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 13/38] pwm: ep93xx: add DT support for " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 14/38] dt-bindings: spi: Add " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 15/38] spi: ep93xx: add DT support for " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 16/38] dt-bindings: net: Add " Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 17/38] net: cirrus: add DT support for " Nikita Shubin via B4 Relay
2024-07-15 16:02   ` Sai Krishna Gajula
2024-07-15  8:38 ` [PATCH v11 18/38] dt-bindings: mtd: Add ts7200 nand-controller Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 19/38] mtd: rawnand: add support for ts72xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 20/38] dt-bindings: ata: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 21/38] ata: pata_ep93xx: add device tree support Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 22/38] dt-bindings: input: Add Cirrus EP93xx keypad Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 23/38] input: keypad: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 24/38] wdt: ts72xx: add DT support for ts72xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 25/38] gpio: ep93xx: add DT support for gpio-ep93xx Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 26/38] ASoC: dt-bindings: ep93xx: Document DMA support Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 27/38] ASoC: dt-bindings: ep93xx: Document Audio Port support Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 28/38] ASoC: ep93xx: Drop legacy DMA support Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 29/38] ARM: dts: add Cirrus EP93XX SoC .dtsi Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 30/38] ARM: dts: ep93xx: add ts7250 board Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 31/38] ARM: dts: ep93xx: Add EDB9302 DT Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 32/38] ARM: ep93xx: DT for the Cirrus ep93xx SoC platforms Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 33/38] pwm: ep93xx: drop legacy pinctrl Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 34/38] ata: pata_ep93xx: remove legacy pinctrl use Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 35/38] ARM: ep93xx: delete all boardfiles Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 36/38] ARM: ep93xx: soc: drop defines Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 37/38] ASoC: cirrus: edb93xx: Delete driver Nikita Shubin via B4 Relay
2024-07-15  8:38 ` [PATCH v11 38/38] dmaengine: cirrus: remove platform code Nikita Shubin via B4 Relay
2024-07-15 12:12 ` [PATCH v11 00/38] ep93xx device tree conversion Rob Herring (Arm)
2024-07-15 20:46   ` Alexander Sverdlin
2024-08-02  7:36     ` Nikita Shubin

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=020c15c9939c1c4cfac925942a582cee.sboyd@kernel.org \
    --to=sboyd@kernel.org \
    --cc=devnull+nikita.shubin.maquefel.me@kernel.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mturquette@baylibre.com \
    --cc=nikita.shubin@maquefel.me \
    /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