Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Clk driver for NXP LPC18xx/LPC43xx Clock Generation Unit (CGU)
0004  *
0005  * Copyright (C) 2015 Joachim Eastwood <manabian@gmail.com>
0006  */
0007 
0008 #include <linux/clk-provider.h>
0009 #include <linux/delay.h>
0010 #include <linux/io.h>
0011 #include <linux/kernel.h>
0012 #include <linux/of.h>
0013 #include <linux/of_address.h>
0014 
0015 #include <dt-bindings/clock/lpc18xx-cgu.h>
0016 
0017 /* Clock Generation Unit (CGU) registers */
0018 #define LPC18XX_CGU_XTAL_OSC_CTRL   0x018
0019 #define LPC18XX_CGU_PLL0USB_STAT    0x01c
0020 #define LPC18XX_CGU_PLL0USB_CTRL    0x020
0021 #define LPC18XX_CGU_PLL0USB_MDIV    0x024
0022 #define LPC18XX_CGU_PLL0USB_NP_DIV  0x028
0023 #define LPC18XX_CGU_PLL0AUDIO_STAT  0x02c
0024 #define LPC18XX_CGU_PLL0AUDIO_CTRL  0x030
0025 #define LPC18XX_CGU_PLL0AUDIO_MDIV  0x034
0026 #define LPC18XX_CGU_PLL0AUDIO_NP_DIV    0x038
0027 #define LPC18XX_CGU_PLL0AUDIO_FRAC  0x03c
0028 #define LPC18XX_CGU_PLL1_STAT       0x040
0029 #define LPC18XX_CGU_PLL1_CTRL       0x044
0030 #define  LPC18XX_PLL1_CTRL_FBSEL    BIT(6)
0031 #define  LPC18XX_PLL1_CTRL_DIRECT   BIT(7)
0032 #define LPC18XX_CGU_IDIV_CTRL(n)    (0x048 + (n) * sizeof(u32))
0033 #define LPC18XX_CGU_BASE_CLK(id)    (0x05c + (id) * sizeof(u32))
0034 #define LPC18XX_CGU_PLL_CTRL_OFFSET 0x4
0035 
0036 /* PLL0 bits common to both audio and USB PLL */
0037 #define LPC18XX_PLL0_STAT_LOCK      BIT(0)
0038 #define LPC18XX_PLL0_CTRL_PD        BIT(0)
0039 #define LPC18XX_PLL0_CTRL_BYPASS    BIT(1)
0040 #define LPC18XX_PLL0_CTRL_DIRECTI   BIT(2)
0041 #define LPC18XX_PLL0_CTRL_DIRECTO   BIT(3)
0042 #define LPC18XX_PLL0_CTRL_CLKEN     BIT(4)
0043 #define LPC18XX_PLL0_MDIV_MDEC_MASK 0x1ffff
0044 #define LPC18XX_PLL0_MDIV_SELP_SHIFT    17
0045 #define LPC18XX_PLL0_MDIV_SELI_SHIFT    22
0046 #define LPC18XX_PLL0_MSEL_MAX       BIT(15)
0047 
0048 /* Register value that gives PLL0 post/pre dividers equal to 1 */
0049 #define LPC18XX_PLL0_NP_DIVS_1      0x00302062
0050 
0051 enum {
0052     CLK_SRC_OSC32,
0053     CLK_SRC_IRC,
0054     CLK_SRC_ENET_RX_CLK,
0055     CLK_SRC_ENET_TX_CLK,
0056     CLK_SRC_GP_CLKIN,
0057     CLK_SRC_RESERVED1,
0058     CLK_SRC_OSC,
0059     CLK_SRC_PLL0USB,
0060     CLK_SRC_PLL0AUDIO,
0061     CLK_SRC_PLL1,
0062     CLK_SRC_RESERVED2,
0063     CLK_SRC_RESERVED3,
0064     CLK_SRC_IDIVA,
0065     CLK_SRC_IDIVB,
0066     CLK_SRC_IDIVC,
0067     CLK_SRC_IDIVD,
0068     CLK_SRC_IDIVE,
0069     CLK_SRC_MAX
0070 };
0071 
0072 static const char *clk_src_names[CLK_SRC_MAX] = {
0073     [CLK_SRC_OSC32]     = "osc32",
0074     [CLK_SRC_IRC]       = "irc",
0075     [CLK_SRC_ENET_RX_CLK]   = "enet_rx_clk",
0076     [CLK_SRC_ENET_TX_CLK]   = "enet_tx_clk",
0077     [CLK_SRC_GP_CLKIN]  = "gp_clkin",
0078     [CLK_SRC_OSC]       = "osc",
0079     [CLK_SRC_PLL0USB]   = "pll0usb",
0080     [CLK_SRC_PLL0AUDIO] = "pll0audio",
0081     [CLK_SRC_PLL1]      = "pll1",
0082     [CLK_SRC_IDIVA]     = "idiva",
0083     [CLK_SRC_IDIVB]     = "idivb",
0084     [CLK_SRC_IDIVC]     = "idivc",
0085     [CLK_SRC_IDIVD]     = "idivd",
0086     [CLK_SRC_IDIVE]     = "idive",
0087 };
0088 
0089 static const char *clk_base_names[BASE_CLK_MAX] = {
0090     [BASE_SAFE_CLK]     = "base_safe_clk",
0091     [BASE_USB0_CLK]     = "base_usb0_clk",
0092     [BASE_PERIPH_CLK]   = "base_periph_clk",
0093     [BASE_USB1_CLK]     = "base_usb1_clk",
0094     [BASE_CPU_CLK]      = "base_cpu_clk",
0095     [BASE_SPIFI_CLK]    = "base_spifi_clk",
0096     [BASE_SPI_CLK]      = "base_spi_clk",
0097     [BASE_PHY_RX_CLK]   = "base_phy_rx_clk",
0098     [BASE_PHY_TX_CLK]   = "base_phy_tx_clk",
0099     [BASE_APB1_CLK]     = "base_apb1_clk",
0100     [BASE_APB3_CLK]     = "base_apb3_clk",
0101     [BASE_LCD_CLK]      = "base_lcd_clk",
0102     [BASE_ADCHS_CLK]    = "base_adchs_clk",
0103     [BASE_SDIO_CLK]     = "base_sdio_clk",
0104     [BASE_SSP0_CLK]     = "base_ssp0_clk",
0105     [BASE_SSP1_CLK]     = "base_ssp1_clk",
0106     [BASE_UART0_CLK]    = "base_uart0_clk",
0107     [BASE_UART1_CLK]    = "base_uart1_clk",
0108     [BASE_UART2_CLK]    = "base_uart2_clk",
0109     [BASE_UART3_CLK]    = "base_uart3_clk",
0110     [BASE_OUT_CLK]      = "base_out_clk",
0111     [BASE_AUDIO_CLK]    = "base_audio_clk",
0112     [BASE_CGU_OUT0_CLK] = "base_cgu_out0_clk",
0113     [BASE_CGU_OUT1_CLK] = "base_cgu_out1_clk",
0114 };
0115 
0116 static u32 lpc18xx_cgu_pll0_src_ids[] = {
0117     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0118     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0119     CLK_SRC_PLL1, CLK_SRC_IDIVA, CLK_SRC_IDIVB, CLK_SRC_IDIVC,
0120     CLK_SRC_IDIVD, CLK_SRC_IDIVE,
0121 };
0122 
0123 static u32 lpc18xx_cgu_pll1_src_ids[] = {
0124     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0125     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0126     CLK_SRC_PLL0USB, CLK_SRC_PLL0AUDIO, CLK_SRC_IDIVA,
0127     CLK_SRC_IDIVB, CLK_SRC_IDIVC, CLK_SRC_IDIVD, CLK_SRC_IDIVE,
0128 };
0129 
0130 static u32 lpc18xx_cgu_idiva_src_ids[] = {
0131     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0132     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0133     CLK_SRC_PLL0USB, CLK_SRC_PLL0AUDIO, CLK_SRC_PLL1
0134 };
0135 
0136 static u32 lpc18xx_cgu_idivbcde_src_ids[] = {
0137     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0138     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0139     CLK_SRC_PLL0AUDIO, CLK_SRC_PLL1, CLK_SRC_IDIVA,
0140 };
0141 
0142 static u32 lpc18xx_cgu_base_irc_src_ids[] = {CLK_SRC_IRC};
0143 
0144 static u32 lpc18xx_cgu_base_usb0_src_ids[] = {CLK_SRC_PLL0USB};
0145 
0146 static u32 lpc18xx_cgu_base_common_src_ids[] = {
0147     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0148     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0149     CLK_SRC_PLL0AUDIO, CLK_SRC_PLL1, CLK_SRC_IDIVA,
0150     CLK_SRC_IDIVB, CLK_SRC_IDIVC, CLK_SRC_IDIVD, CLK_SRC_IDIVE,
0151 };
0152 
0153 static u32 lpc18xx_cgu_base_all_src_ids[] = {
0154     CLK_SRC_OSC32, CLK_SRC_IRC, CLK_SRC_ENET_RX_CLK,
0155     CLK_SRC_ENET_TX_CLK, CLK_SRC_GP_CLKIN, CLK_SRC_OSC,
0156     CLK_SRC_PLL0USB, CLK_SRC_PLL0AUDIO, CLK_SRC_PLL1,
0157     CLK_SRC_IDIVA, CLK_SRC_IDIVB, CLK_SRC_IDIVC,
0158     CLK_SRC_IDIVD, CLK_SRC_IDIVE,
0159 };
0160 
0161 struct lpc18xx_cgu_src_clk_div {
0162     u8 clk_id;
0163     u8 n_parents;
0164     struct clk_divider  div;
0165     struct clk_mux      mux;
0166     struct clk_gate     gate;
0167 };
0168 
0169 #define LPC1XX_CGU_SRC_CLK_DIV(_id, _width, _table) \
0170 {                           \
0171     .clk_id = CLK_SRC_ ##_id,           \
0172     .n_parents = ARRAY_SIZE(lpc18xx_cgu_ ##_table), \
0173     .div = {                    \
0174         .shift = 2,             \
0175         .width = _width,            \
0176     },                      \
0177     .mux = {                    \
0178         .mask = 0x1f,               \
0179         .shift = 24,                \
0180         .table = lpc18xx_cgu_ ##_table,     \
0181     },                      \
0182     .gate = {                   \
0183         .bit_idx = 0,               \
0184         .flags = CLK_GATE_SET_TO_DISABLE,   \
0185     },                      \
0186 }
0187 
0188 static struct lpc18xx_cgu_src_clk_div lpc18xx_cgu_src_clk_divs[] = {
0189     LPC1XX_CGU_SRC_CLK_DIV(IDIVA, 2, idiva_src_ids),
0190     LPC1XX_CGU_SRC_CLK_DIV(IDIVB, 4, idivbcde_src_ids),
0191     LPC1XX_CGU_SRC_CLK_DIV(IDIVC, 4, idivbcde_src_ids),
0192     LPC1XX_CGU_SRC_CLK_DIV(IDIVD, 4, idivbcde_src_ids),
0193     LPC1XX_CGU_SRC_CLK_DIV(IDIVE, 8, idivbcde_src_ids),
0194 };
0195 
0196 struct lpc18xx_cgu_base_clk {
0197     u8 clk_id;
0198     u8 n_parents;
0199     struct clk_mux mux;
0200     struct clk_gate gate;
0201 };
0202 
0203 #define LPC1XX_CGU_BASE_CLK(_id, _table, _flags)    \
0204 {                           \
0205     .clk_id = BASE_ ##_id ##_CLK,           \
0206     .n_parents = ARRAY_SIZE(lpc18xx_cgu_ ##_table), \
0207     .mux = {                    \
0208         .mask = 0x1f,               \
0209         .shift = 24,                \
0210         .table = lpc18xx_cgu_ ##_table,     \
0211         .flags = _flags,            \
0212     },                      \
0213     .gate = {                   \
0214         .bit_idx = 0,               \
0215         .flags = CLK_GATE_SET_TO_DISABLE,   \
0216     },                      \
0217 }
0218 
0219 static struct lpc18xx_cgu_base_clk lpc18xx_cgu_base_clks[] = {
0220     LPC1XX_CGU_BASE_CLK(SAFE,   base_irc_src_ids, CLK_MUX_READ_ONLY),
0221     LPC1XX_CGU_BASE_CLK(USB0,   base_usb0_src_ids,   0),
0222     LPC1XX_CGU_BASE_CLK(PERIPH, base_common_src_ids, 0),
0223     LPC1XX_CGU_BASE_CLK(USB1,   base_all_src_ids,    0),
0224     LPC1XX_CGU_BASE_CLK(CPU,    base_common_src_ids, 0),
0225     LPC1XX_CGU_BASE_CLK(SPIFI,  base_common_src_ids, 0),
0226     LPC1XX_CGU_BASE_CLK(SPI,    base_common_src_ids, 0),
0227     LPC1XX_CGU_BASE_CLK(PHY_RX, base_common_src_ids, 0),
0228     LPC1XX_CGU_BASE_CLK(PHY_TX, base_common_src_ids, 0),
0229     LPC1XX_CGU_BASE_CLK(APB1,   base_common_src_ids, 0),
0230     LPC1XX_CGU_BASE_CLK(APB3,   base_common_src_ids, 0),
0231     LPC1XX_CGU_BASE_CLK(LCD,    base_common_src_ids, 0),
0232     LPC1XX_CGU_BASE_CLK(ADCHS,  base_common_src_ids, 0),
0233     LPC1XX_CGU_BASE_CLK(SDIO,   base_common_src_ids, 0),
0234     LPC1XX_CGU_BASE_CLK(SSP0,   base_common_src_ids, 0),
0235     LPC1XX_CGU_BASE_CLK(SSP1,   base_common_src_ids, 0),
0236     LPC1XX_CGU_BASE_CLK(UART0,  base_common_src_ids, 0),
0237     LPC1XX_CGU_BASE_CLK(UART1,  base_common_src_ids, 0),
0238     LPC1XX_CGU_BASE_CLK(UART2,  base_common_src_ids, 0),
0239     LPC1XX_CGU_BASE_CLK(UART3,  base_common_src_ids, 0),
0240     LPC1XX_CGU_BASE_CLK(OUT,    base_all_src_ids,    0),
0241     { /* 21 reserved */ },
0242     { /* 22 reserved */ },
0243     { /* 23 reserved */ },
0244     { /* 24 reserved */ },
0245     LPC1XX_CGU_BASE_CLK(AUDIO,  base_common_src_ids, 0),
0246     LPC1XX_CGU_BASE_CLK(CGU_OUT0,   base_all_src_ids,    0),
0247     LPC1XX_CGU_BASE_CLK(CGU_OUT1,   base_all_src_ids,    0),
0248 };
0249 
0250 struct lpc18xx_pll {
0251     struct      clk_hw hw;
0252     void __iomem    *reg;
0253     spinlock_t  *lock;
0254     u8      flags;
0255 };
0256 
0257 #define to_lpc_pll(hw) container_of(hw, struct lpc18xx_pll, hw)
0258 
0259 struct lpc18xx_cgu_pll_clk {
0260     u8 clk_id;
0261     u8 n_parents;
0262     u8 reg_offset;
0263     struct clk_mux mux;
0264     struct clk_gate gate;
0265     struct lpc18xx_pll pll;
0266     const struct clk_ops *pll_ops;
0267 };
0268 
0269 #define LPC1XX_CGU_CLK_PLL(_id, _table, _pll_ops)   \
0270 {                           \
0271     .clk_id = CLK_SRC_ ##_id,           \
0272     .n_parents = ARRAY_SIZE(lpc18xx_cgu_ ##_table), \
0273     .reg_offset = LPC18XX_CGU_ ##_id ##_STAT,   \
0274     .mux = {                    \
0275         .mask = 0x1f,               \
0276         .shift = 24,                \
0277         .table = lpc18xx_cgu_ ##_table,     \
0278     },                      \
0279     .gate = {                   \
0280         .bit_idx = 0,               \
0281         .flags = CLK_GATE_SET_TO_DISABLE,   \
0282     },                      \
0283     .pll_ops = &lpc18xx_ ##_pll_ops,        \
0284 }
0285 
0286 /*
0287  * PLL0 uses a special register value encoding. The compute functions below
0288  * are taken or derived from the LPC1850 user manual (section 12.6.3.3).
0289  */
0290 
0291 /* Compute PLL0 multiplier from decoded version */
0292 static u32 lpc18xx_pll0_mdec2msel(u32 x)
0293 {
0294     int i;
0295 
0296     switch (x) {
0297     case 0x18003: return 1;
0298     case 0x10003: return 2;
0299     default:
0300         for (i = LPC18XX_PLL0_MSEL_MAX + 1; x != 0x4000 && i > 0; i--)
0301             x = ((x ^ x >> 14) & 1) | (x << 1 & 0x7fff);
0302         return i;
0303     }
0304 }
0305 /* Compute PLL0 decoded multiplier from binary version */
0306 static u32 lpc18xx_pll0_msel2mdec(u32 msel)
0307 {
0308     u32 i, x = 0x4000;
0309 
0310     switch (msel) {
0311     case 0: return 0;
0312     case 1: return 0x18003;
0313     case 2: return 0x10003;
0314     default:
0315         for (i = msel; i <= LPC18XX_PLL0_MSEL_MAX; i++)
0316             x = ((x ^ x >> 1) & 1) << 14 | (x >> 1 & 0xffff);
0317         return x;
0318     }
0319 }
0320 
0321 /* Compute PLL0 bandwidth SELI reg from multiplier */
0322 static u32 lpc18xx_pll0_msel2seli(u32 msel)
0323 {
0324     u32 tmp;
0325 
0326     if (msel > 16384) return 1;
0327     if (msel >  8192) return 2;
0328     if (msel >  2048) return 4;
0329     if (msel >=  501) return 8;
0330     if (msel >=   60) {
0331         tmp = 1024 / (msel + 9);
0332         return ((1024 == (tmp * (msel + 9))) == 0) ? tmp * 4 : (tmp + 1) * 4;
0333     }
0334 
0335     return (msel & 0x3c) + 4;
0336 }
0337 
0338 /* Compute PLL0 bandwidth SELP reg from multiplier */
0339 static u32 lpc18xx_pll0_msel2selp(u32 msel)
0340 {
0341     if (msel < 60)
0342         return (msel >> 1) + 1;
0343 
0344     return 31;
0345 }
0346 
0347 static unsigned long lpc18xx_pll0_recalc_rate(struct clk_hw *hw,
0348                           unsigned long parent_rate)
0349 {
0350     struct lpc18xx_pll *pll = to_lpc_pll(hw);
0351     u32 ctrl, mdiv, msel, npdiv;
0352 
0353     ctrl = readl(pll->reg + LPC18XX_CGU_PLL0USB_CTRL);
0354     mdiv = readl(pll->reg + LPC18XX_CGU_PLL0USB_MDIV);
0355     npdiv = readl(pll->reg + LPC18XX_CGU_PLL0USB_NP_DIV);
0356 
0357     if (ctrl & LPC18XX_PLL0_CTRL_BYPASS)
0358         return parent_rate;
0359 
0360     if (npdiv != LPC18XX_PLL0_NP_DIVS_1) {
0361         pr_warn("%s: pre/post dividers not supported\n", __func__);
0362         return 0;
0363     }
0364 
0365     msel = lpc18xx_pll0_mdec2msel(mdiv & LPC18XX_PLL0_MDIV_MDEC_MASK);
0366     if (msel)
0367         return 2 * msel * parent_rate;
0368 
0369     pr_warn("%s: unable to calculate rate\n", __func__);
0370 
0371     return 0;
0372 }
0373 
0374 static long lpc18xx_pll0_round_rate(struct clk_hw *hw, unsigned long rate,
0375                     unsigned long *prate)
0376 {
0377     unsigned long m;
0378 
0379     if (*prate < rate) {
0380         pr_warn("%s: pll dividers not supported\n", __func__);
0381         return -EINVAL;
0382     }
0383 
0384     m = DIV_ROUND_UP_ULL(*prate, rate * 2);
0385     if (m <= 0 && m > LPC18XX_PLL0_MSEL_MAX) {
0386         pr_warn("%s: unable to support rate %lu\n", __func__, rate);
0387         return -EINVAL;
0388     }
0389 
0390     return 2 * *prate * m;
0391 }
0392 
0393 static int lpc18xx_pll0_set_rate(struct clk_hw *hw, unsigned long rate,
0394                  unsigned long parent_rate)
0395 {
0396     struct lpc18xx_pll *pll = to_lpc_pll(hw);
0397     u32 ctrl, stat, m;
0398     int retry = 3;
0399 
0400     if (parent_rate < rate) {
0401         pr_warn("%s: pll dividers not supported\n", __func__);
0402         return -EINVAL;
0403     }
0404 
0405     m = DIV_ROUND_UP_ULL(parent_rate, rate * 2);
0406     if (m <= 0 && m > LPC18XX_PLL0_MSEL_MAX) {
0407         pr_warn("%s: unable to support rate %lu\n", __func__, rate);
0408         return -EINVAL;
0409     }
0410 
0411     m  = lpc18xx_pll0_msel2mdec(m);
0412     m |= lpc18xx_pll0_msel2selp(m) << LPC18XX_PLL0_MDIV_SELP_SHIFT;
0413     m |= lpc18xx_pll0_msel2seli(m) << LPC18XX_PLL0_MDIV_SELI_SHIFT;
0414 
0415     /* Power down PLL, disable clk output and dividers */
0416     ctrl = readl(pll->reg + LPC18XX_CGU_PLL0USB_CTRL);
0417     ctrl |= LPC18XX_PLL0_CTRL_PD;
0418     ctrl &= ~(LPC18XX_PLL0_CTRL_BYPASS | LPC18XX_PLL0_CTRL_DIRECTI |
0419           LPC18XX_PLL0_CTRL_DIRECTO | LPC18XX_PLL0_CTRL_CLKEN);
0420     writel(ctrl, pll->reg + LPC18XX_CGU_PLL0USB_CTRL);
0421 
0422     /* Configure new PLL settings */
0423     writel(m, pll->reg + LPC18XX_CGU_PLL0USB_MDIV);
0424     writel(LPC18XX_PLL0_NP_DIVS_1, pll->reg + LPC18XX_CGU_PLL0USB_NP_DIV);
0425 
0426     /* Power up PLL and wait for lock */
0427     ctrl &= ~LPC18XX_PLL0_CTRL_PD;
0428     writel(ctrl, pll->reg + LPC18XX_CGU_PLL0USB_CTRL);
0429     do {
0430         udelay(10);
0431         stat = readl(pll->reg + LPC18XX_CGU_PLL0USB_STAT);
0432         if (stat & LPC18XX_PLL0_STAT_LOCK) {
0433             ctrl |= LPC18XX_PLL0_CTRL_CLKEN;
0434             writel(ctrl, pll->reg + LPC18XX_CGU_PLL0USB_CTRL);
0435 
0436             return 0;
0437         }
0438     } while (retry--);
0439 
0440     pr_warn("%s: unable to lock pll\n", __func__);
0441 
0442     return -EINVAL;
0443 }
0444 
0445 static const struct clk_ops lpc18xx_pll0_ops = {
0446     .recalc_rate    = lpc18xx_pll0_recalc_rate,
0447     .round_rate = lpc18xx_pll0_round_rate,
0448     .set_rate   = lpc18xx_pll0_set_rate,
0449 };
0450 
0451 static unsigned long lpc18xx_pll1_recalc_rate(struct clk_hw *hw,
0452                           unsigned long parent_rate)
0453 {
0454     struct lpc18xx_pll *pll = to_lpc_pll(hw);
0455     u16 msel, nsel, psel;
0456     bool direct, fbsel;
0457     u32 ctrl;
0458 
0459     ctrl = readl(pll->reg + LPC18XX_CGU_PLL1_CTRL);
0460 
0461     direct = (ctrl & LPC18XX_PLL1_CTRL_DIRECT) ? true : false;
0462     fbsel = (ctrl & LPC18XX_PLL1_CTRL_FBSEL) ? true : false;
0463 
0464     msel = ((ctrl >> 16) & 0xff) + 1;
0465     nsel = ((ctrl >> 12) & 0x3) + 1;
0466 
0467     if (direct || fbsel)
0468         return msel * (parent_rate / nsel);
0469 
0470     psel = (ctrl >>  8) & 0x3;
0471     psel = 1 << psel;
0472 
0473     return (msel / (2 * psel)) * (parent_rate / nsel);
0474 }
0475 
0476 static const struct clk_ops lpc18xx_pll1_ops = {
0477     .recalc_rate = lpc18xx_pll1_recalc_rate,
0478 };
0479 
0480 static int lpc18xx_cgu_gate_enable(struct clk_hw *hw)
0481 {
0482     return clk_gate_ops.enable(hw);
0483 }
0484 
0485 static void lpc18xx_cgu_gate_disable(struct clk_hw *hw)
0486 {
0487     clk_gate_ops.disable(hw);
0488 }
0489 
0490 static int lpc18xx_cgu_gate_is_enabled(struct clk_hw *hw)
0491 {
0492     const struct clk_hw *parent;
0493 
0494     /*
0495      * The consumer of base clocks needs know if the
0496      * base clock is really enabled before it can be
0497      * accessed. It is therefore necessary to verify
0498      * this all the way up.
0499      */
0500     parent = clk_hw_get_parent(hw);
0501     if (!parent)
0502         return 0;
0503 
0504     if (!clk_hw_is_enabled(parent))
0505         return 0;
0506 
0507     return clk_gate_ops.is_enabled(hw);
0508 }
0509 
0510 static const struct clk_ops lpc18xx_gate_ops = {
0511     .enable = lpc18xx_cgu_gate_enable,
0512     .disable = lpc18xx_cgu_gate_disable,
0513     .is_enabled = lpc18xx_cgu_gate_is_enabled,
0514 };
0515 
0516 static struct lpc18xx_cgu_pll_clk lpc18xx_cgu_src_clk_plls[] = {
0517     LPC1XX_CGU_CLK_PLL(PLL0USB, pll0_src_ids, pll0_ops),
0518     LPC1XX_CGU_CLK_PLL(PLL0AUDIO,   pll0_src_ids, pll0_ops),
0519     LPC1XX_CGU_CLK_PLL(PLL1,    pll1_src_ids, pll1_ops),
0520 };
0521 
0522 static void lpc18xx_fill_parent_names(const char **parent, const u32 *id, int size)
0523 {
0524     int i;
0525 
0526     for (i = 0; i < size; i++)
0527         parent[i] = clk_src_names[id[i]];
0528 }
0529 
0530 static struct clk *lpc18xx_cgu_register_div(struct lpc18xx_cgu_src_clk_div *clk,
0531                         void __iomem *base, int n)
0532 {
0533     void __iomem *reg = base + LPC18XX_CGU_IDIV_CTRL(n);
0534     const char *name = clk_src_names[clk->clk_id];
0535     const char *parents[CLK_SRC_MAX];
0536 
0537     clk->div.reg = reg;
0538     clk->mux.reg = reg;
0539     clk->gate.reg = reg;
0540 
0541     lpc18xx_fill_parent_names(parents, clk->mux.table, clk->n_parents);
0542 
0543     return clk_register_composite(NULL, name, parents, clk->n_parents,
0544                       &clk->mux.hw, &clk_mux_ops,
0545                       &clk->div.hw, &clk_divider_ops,
0546                       &clk->gate.hw, &lpc18xx_gate_ops, 0);
0547 }
0548 
0549 
0550 static struct clk *lpc18xx_register_base_clk(struct lpc18xx_cgu_base_clk *clk,
0551                          void __iomem *reg_base, int n)
0552 {
0553     void __iomem *reg = reg_base + LPC18XX_CGU_BASE_CLK(n);
0554     const char *name = clk_base_names[clk->clk_id];
0555     const char *parents[CLK_SRC_MAX];
0556 
0557     if (clk->n_parents == 0)
0558         return ERR_PTR(-ENOENT);
0559 
0560     clk->mux.reg = reg;
0561     clk->gate.reg = reg;
0562 
0563     lpc18xx_fill_parent_names(parents, clk->mux.table, clk->n_parents);
0564 
0565     /* SAFE_CLK can not be turned off */
0566     if (n == BASE_SAFE_CLK)
0567         return clk_register_composite(NULL, name, parents, clk->n_parents,
0568                           &clk->mux.hw, &clk_mux_ops,
0569                           NULL, NULL, NULL, NULL, 0);
0570 
0571     return clk_register_composite(NULL, name, parents, clk->n_parents,
0572                       &clk->mux.hw, &clk_mux_ops,
0573                       NULL,  NULL,
0574                       &clk->gate.hw, &lpc18xx_gate_ops, 0);
0575 }
0576 
0577 
0578 static struct clk *lpc18xx_cgu_register_pll(struct lpc18xx_cgu_pll_clk *clk,
0579                         void __iomem *base)
0580 {
0581     const char *name = clk_src_names[clk->clk_id];
0582     const char *parents[CLK_SRC_MAX];
0583 
0584     clk->pll.reg  = base;
0585     clk->mux.reg  = base + clk->reg_offset + LPC18XX_CGU_PLL_CTRL_OFFSET;
0586     clk->gate.reg = base + clk->reg_offset + LPC18XX_CGU_PLL_CTRL_OFFSET;
0587 
0588     lpc18xx_fill_parent_names(parents, clk->mux.table, clk->n_parents);
0589 
0590     return clk_register_composite(NULL, name, parents, clk->n_parents,
0591                       &clk->mux.hw, &clk_mux_ops,
0592                       &clk->pll.hw, clk->pll_ops,
0593                       &clk->gate.hw, &lpc18xx_gate_ops, 0);
0594 }
0595 
0596 static void __init lpc18xx_cgu_register_source_clks(struct device_node *np,
0597                             void __iomem *base)
0598 {
0599     const char *parents[CLK_SRC_MAX];
0600     struct clk *clk;
0601     int i;
0602 
0603     /* Register the internal 12 MHz RC oscillator (IRC) */
0604     clk = clk_register_fixed_rate(NULL, clk_src_names[CLK_SRC_IRC],
0605                       NULL, 0, 12000000);
0606     if (IS_ERR(clk))
0607         pr_warn("%s: failed to register irc clk\n", __func__);
0608 
0609     /* Register crystal oscillator controlller */
0610     parents[0] = of_clk_get_parent_name(np, 0);
0611     clk = clk_register_gate(NULL, clk_src_names[CLK_SRC_OSC], parents[0],
0612                 0, base + LPC18XX_CGU_XTAL_OSC_CTRL,
0613                 0, CLK_GATE_SET_TO_DISABLE, NULL);
0614     if (IS_ERR(clk))
0615         pr_warn("%s: failed to register osc clk\n", __func__);
0616 
0617     /* Register all PLLs */
0618     for (i = 0; i < ARRAY_SIZE(lpc18xx_cgu_src_clk_plls); i++) {
0619         clk = lpc18xx_cgu_register_pll(&lpc18xx_cgu_src_clk_plls[i],
0620                            base);
0621         if (IS_ERR(clk))
0622             pr_warn("%s: failed to register pll (%d)\n", __func__, i);
0623     }
0624 
0625     /* Register all clock dividers A-E */
0626     for (i = 0; i < ARRAY_SIZE(lpc18xx_cgu_src_clk_divs); i++) {
0627         clk = lpc18xx_cgu_register_div(&lpc18xx_cgu_src_clk_divs[i],
0628                            base, i);
0629         if (IS_ERR(clk))
0630             pr_warn("%s: failed to register div %d\n", __func__, i);
0631     }
0632 }
0633 
0634 static struct clk *clk_base[BASE_CLK_MAX];
0635 static struct clk_onecell_data clk_base_data = {
0636     .clks = clk_base,
0637     .clk_num = BASE_CLK_MAX,
0638 };
0639 
0640 static void __init lpc18xx_cgu_register_base_clks(void __iomem *reg_base)
0641 {
0642     int i;
0643 
0644     for (i = BASE_SAFE_CLK; i < BASE_CLK_MAX; i++) {
0645         clk_base[i] = lpc18xx_register_base_clk(&lpc18xx_cgu_base_clks[i],
0646                             reg_base, i);
0647         if (IS_ERR(clk_base[i]) && PTR_ERR(clk_base[i]) != -ENOENT)
0648             pr_warn("%s: register base clk %d failed\n", __func__, i);
0649     }
0650 }
0651 
0652 static void __init lpc18xx_cgu_init(struct device_node *np)
0653 {
0654     void __iomem *reg_base;
0655 
0656     reg_base = of_iomap(np, 0);
0657     if (!reg_base) {
0658         pr_warn("%s: failed to map address range\n", __func__);
0659         return;
0660     }
0661 
0662     lpc18xx_cgu_register_source_clks(np, reg_base);
0663     lpc18xx_cgu_register_base_clks(reg_base);
0664 
0665     of_clk_add_provider(np, of_clk_src_onecell_get, &clk_base_data);
0666 }
0667 CLK_OF_DECLARE(lpc18xx_cgu, "nxp,lpc1850-cgu", lpc18xx_cgu_init);