> Add the missing CLK_INFRA_SSPM, CLK_INFRA_SSPM_BUS_HCLK,
> CLK_INFRA_SSPM_26M_SELF and CLK_INFRA_SSPM_32K_SELF gates, based on the
> Linux driver, along with the 32 kHz external clock that is the parent of
> the last one. Move CLK_INFRA_USB and CLK_INFRA_DEVMPU_BCLK to their
> places in ID order.
>
> The common MediaTek clock code looks a gate up by using the clock ID as
> an index into the gate array, so the array must be sorted by ID and have
> no holes. infra_clks[] followed the register layout instead and was
> missing the four SSPM gates, so every ID from 51 up selected the wrong
> gate.
>
> Fixes: c9d7e79f02ef ("clk: mediatek: Add MT8183 clock driver")
> Signed-off-by: David Lechner <[email protected]>
>
> diff --git a/drivers/clk/mediatek/clk-mt8183.c 
> b/drivers/clk/mediatek/clk-mt8183.c
> index 08e06c60f68..aff5d629c30 100644
> --- a/drivers/clk/mediatek/clk-mt8183.c
> +++ b/drivers/clk/mediatek/clk-mt8183.c
> @@ -18,10 +18,12 @@
>  #define MT8183_PLL_FMIN              (1500UL * MHZ)
>
>  enum {
> +     CLK_PAD_CLK32K,
>       CLK_PAD_CLK26M,
>  };
>
>  static const ulong ext_clock_rates[] = {
> +     [CLK_PAD_CLK32K] = 32000,
>       [CLK_PAD_CLK26M] = 26 * MHZ,
>  };
>
> @@ -683,6 +685,14 @@ static const struct mtk_gate_regs infra3_cg_regs = {
>               .flags = CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN,         \
>       }
>
> +#define GATE_INFRA3_EXT(_id, _parent, _shift) {              \
> +             .id = _id,                                              \
> +             .parent = _parent,                                      \
> +             .regs = &infra3_cg_regs,                                \
> +             .shift = _shift,                                        \
> +             .flags = CLK_GATE_SETCLR | CLK_PARENT_EXT,              \
> +     }
> +
>  static const struct mtk_gate infra_clks[] = {
>       /* INFRA0 */
>       GATE_INFRA0(CLK_INFRA_PMIC_TMR, CLK_TOP_MUX_AXI, 0),
> @@ -737,11 +747,9 @@ static const struct mtk_gate infra_clks[] = {
>       GATE_INFRA1(CLK_INFRA_CCIF_MD, CLK_TOP_MUX_AXI, 26),
>       GATE_INFRA1(CLK_INFRA_DXCC_SEC_CORE, CLK_TOP_MUX_DXCC, 27),
>       GATE_INFRA1(CLK_INFRA_DXCC_AO, CLK_TOP_MUX_DXCC, 28),
> -     GATE_INFRA1(CLK_INFRA_DEVMPU_BCLK, CLK_TOP_MUX_AXI, 30),
>       GATE_INFRA1(CLK_INFRA_DRAMC_F26M, CLK_TOP_CLK26M, 31),
>       /* INFRA2 */
>       GATE_INFRA2(CLK_INFRA_IRTX, CLK_TOP_CLK26M, 0),
> -     GATE_INFRA2(CLK_INFRA_USB, CLK_TOP_MUX_USB_TOP, 1),
>       GATE_INFRA2(CLK_INFRA_DISP_PWM, CLK_TOP_MUX_AXI, 2),
>       GATE_INFRA2(CLK_INFRA_CLDMA_BCLK, CLK_TOP_MUX_AXI, 3),
>       GATE_INFRA2(CLK_INFRA_AUDIO_26M_BCLK, CLK_TOP_CLK26M, 4),
> @@ -754,7 +762,9 @@ static const struct mtk_gate infra_clks[] = {
>       GATE_INFRA2(CLK_INFRA_UNIPRO_TICK, CLK_TOP_MUX_FUFS, 12),
>       GATE_INFRA2(CLK_INFRA_UFS_MP_SAP_BCLK, CLK_TOP_MUX_FUFS, 13),
>       GATE_INFRA2(CLK_INFRA_MD32_BCLK, CLK_TOP_MUX_AXI, 14),
> +     GATE_INFRA2(CLK_INFRA_SSPM, CLK_TOP_MUX_SSPM, 15),
>       GATE_INFRA2(CLK_INFRA_UNIPRO_MBIST, CLK_TOP_MUX_AXI, 16),
> +     GATE_INFRA2(CLK_INFRA_SSPM_BUS_HCLK, CLK_TOP_MUX_AXI, 17),
>       GATE_INFRA2(CLK_INFRA_I2C5, CLK_TOP_MUX_I2C, 18),
>       GATE_INFRA2(CLK_INFRA_I2C5_ARBITER, CLK_TOP_MUX_I2C, 19),
>       GATE_INFRA2(CLK_INFRA_I2C5_IMM, CLK_TOP_MUX_I2C, 20),
> @@ -772,10 +782,14 @@ static const struct mtk_gate infra_clks[] = {
>       GATE_INFRA3(CLK_INFRA_MSDC0_SELF, CLK_TOP_MUX_MSDC50_0, 0),
>       GATE_INFRA3(CLK_INFRA_MSDC1_SELF, CLK_TOP_MUX_MSDC50_0, 1),
>       GATE_INFRA3(CLK_INFRA_MSDC2_SELF, CLK_TOP_MUX_MSDC50_0, 2),
> +     GATE_INFRA3(CLK_INFRA_SSPM_26M_SELF, CLK_TOP_CLK26M, 3),
> +     GATE_INFRA3_EXT(CLK_INFRA_SSPM_32K_SELF, CLK_PAD_CLK32K, 4),
>       GATE_INFRA3(CLK_INFRA_UFS_AXI, CLK_TOP_MUX_AXI, 5),
>       GATE_INFRA3(CLK_INFRA_I2C6, CLK_TOP_MUX_I2C, 6),
>       GATE_INFRA3(CLK_INFRA_AP_MSDC0, CLK_TOP_MUX_MSDC50_0_HCLK, 7),
>       GATE_INFRA3(CLK_INFRA_MD_MSDC0, CLK_TOP_MUX_MSDC50_0_HCLK, 8),
> +     GATE_INFRA2(CLK_INFRA_USB, CLK_TOP_MUX_USB_TOP, 1),
> +     GATE_INFRA1(CLK_INFRA_DEVMPU_BCLK, CLK_TOP_MUX_AXI, 30),

Nit: CLK_INFRA_USB (INFRA2) and CLK_INFRA_DEVMPU_BCLK (INFRA1) now sit
under the /* INFRA3 */ comment, which may be misleading to the next reader
who may "fix" them back into their bank. Maybe we should just drop all
block comments or add a comment above these two such as:

  /* out of bank order: array index must match ID */

-- 
Julien Stephan <[email protected]>

Reply via email to