Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Copyright 2015 Vladimir Zapolskiy <vz@mleia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) #include <linux/clk-provider.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/of_address.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <dt-bindings/clock/lpc32xx-clock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #undef pr_fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #define pr_fmt(fmt) "%s: " fmt, __func__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) /* Common bitfield definitions for x397 PLL (lock), USB PLL and HCLK PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #define PLL_CTRL_ENABLE			BIT(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #define PLL_CTRL_BYPASS			BIT(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #define PLL_CTRL_DIRECT			BIT(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #define PLL_CTRL_FEEDBACK		BIT(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #define PLL_CTRL_POSTDIV		(BIT(12)|BIT(11))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #define PLL_CTRL_PREDIV			(BIT(10)|BIT(9))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #define PLL_CTRL_FEEDDIV		(0xFF << 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #define PLL_CTRL_LOCK			BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) /* Clock registers on System Control Block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #define LPC32XX_CLKPWR_DEBUG_CTRL	0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #define LPC32XX_CLKPWR_USB_DIV		0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #define LPC32XX_CLKPWR_HCLKDIV_CTRL	0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #define LPC32XX_CLKPWR_PWR_CTRL		0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define LPC32XX_CLKPWR_PLL397_CTRL	0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #define LPC32XX_CLKPWR_OSC_CTRL		0x4C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #define LPC32XX_CLKPWR_SYSCLK_CTRL	0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #define LPC32XX_CLKPWR_LCDCLK_CTRL	0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #define LPC32XX_CLKPWR_HCLKPLL_CTRL	0x58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #define LPC32XX_CLKPWR_ADCCLK_CTRL1	0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #define LPC32XX_CLKPWR_USB_CTRL		0x64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #define LPC32XX_CLKPWR_SSP_CTRL		0x78
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #define LPC32XX_CLKPWR_I2S_CTRL		0x7C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #define LPC32XX_CLKPWR_MS_CTRL		0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #define LPC32XX_CLKPWR_MACCLK_CTRL	0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #define LPC32XX_CLKPWR_TEST_CLK_CTRL	0xA4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #define LPC32XX_CLKPWR_I2CCLK_CTRL	0xAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #define LPC32XX_CLKPWR_KEYCLK_CTRL	0xB0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #define LPC32XX_CLKPWR_ADCCLK_CTRL	0xB4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #define LPC32XX_CLKPWR_PWMCLK_CTRL	0xB8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #define LPC32XX_CLKPWR_TIMCLK_CTRL	0xBC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #define LPC32XX_CLKPWR_TIMCLK_CTRL1	0xC0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #define LPC32XX_CLKPWR_SPI_CTRL		0xC4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #define LPC32XX_CLKPWR_FLASHCLK_CTRL	0xC8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define LPC32XX_CLKPWR_UART3_CLK_CTRL	0xD0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #define LPC32XX_CLKPWR_UART4_CLK_CTRL	0xD4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #define LPC32XX_CLKPWR_UART5_CLK_CTRL	0xD8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #define LPC32XX_CLKPWR_UART6_CLK_CTRL	0xDC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #define LPC32XX_CLKPWR_IRDA_CLK_CTRL	0xE0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) #define LPC32XX_CLKPWR_UART_CLK_CTRL	0xE4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #define LPC32XX_CLKPWR_DMA_CLK_CTRL	0xE8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) /* Clock registers on USB controller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #define LPC32XX_USB_CLK_CTRL		0xF4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define LPC32XX_USB_CLK_STS		0xF8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) static struct regmap_config lpc32xx_scb_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	.name = "scb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	.reg_bits = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	.val_bits = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	.reg_stride = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	.val_format_endian = REGMAP_ENDIAN_LITTLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	.max_register = 0x114,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	.fast_io = true,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) static struct regmap *clk_regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) static void __iomem *usb_clk_vbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	LPC32XX_USB_CLK_OTG = LPC32XX_USB_CLK_HOST + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	LPC32XX_USB_CLK_AHB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	LPC32XX_USB_CLK_MAX = LPC32XX_USB_CLK_AHB + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	/* Start from the last defined clock in dt bindings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	LPC32XX_CLK_ADC_DIV = LPC32XX_CLK_PERIPH + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	LPC32XX_CLK_ADC_RTC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	LPC32XX_CLK_TEST1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	LPC32XX_CLK_TEST2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 	/* System clocks, PLL 397x and HCLK PLL clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	LPC32XX_CLK_OSC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	LPC32XX_CLK_SYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	LPC32XX_CLK_PLL397X,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	LPC32XX_CLK_HCLK_DIV_PERIPH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	LPC32XX_CLK_HCLK_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	LPC32XX_CLK_HCLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 	LPC32XX_CLK_ARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	LPC32XX_CLK_ARM_VFP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	/* USB clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	LPC32XX_CLK_USB_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	LPC32XX_CLK_USB_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	LPC32XX_CLK_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	/* Only one control PWR_CTRL[10] for both muxes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	LPC32XX_CLK_PERIPH_HCLK_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	LPC32XX_CLK_PERIPH_ARM_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 	/* Only one control PWR_CTRL[2] for all three muxes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	LPC32XX_CLK_SYSCLK_PERIPH_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 	LPC32XX_CLK_SYSCLK_HCLK_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	LPC32XX_CLK_SYSCLK_ARM_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	/* Two clock sources external to the driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 	LPC32XX_CLK_XTAL_32K,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	LPC32XX_CLK_XTAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	/* Renumbered USB clocks, may have a parent from SCB table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	LPC32XX_CLK_USB_I2C = LPC32XX_USB_CLK_I2C + LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	LPC32XX_CLK_USB_DEV = LPC32XX_USB_CLK_DEVICE + LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	LPC32XX_CLK_USB_HOST = LPC32XX_USB_CLK_HOST + LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	LPC32XX_CLK_USB_OTG = LPC32XX_USB_CLK_OTG + LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	LPC32XX_CLK_USB_AHB = LPC32XX_USB_CLK_AHB + LPC32XX_CLK_USB_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	/* Stub for composite clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	LPC32XX_CLK__NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	/* Subclocks of composite clocks, clocks above are for CCF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	LPC32XX_CLK_PWM1_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	LPC32XX_CLK_PWM1_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	LPC32XX_CLK_PWM1_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	LPC32XX_CLK_PWM2_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	LPC32XX_CLK_PWM2_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	LPC32XX_CLK_PWM2_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	LPC32XX_CLK_UART3_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	LPC32XX_CLK_UART3_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	LPC32XX_CLK_UART3_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	LPC32XX_CLK_UART4_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	LPC32XX_CLK_UART4_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	LPC32XX_CLK_UART4_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	LPC32XX_CLK_UART5_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	LPC32XX_CLK_UART5_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	LPC32XX_CLK_UART5_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	LPC32XX_CLK_UART6_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	LPC32XX_CLK_UART6_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	LPC32XX_CLK_UART6_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	LPC32XX_CLK_TEST1_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	LPC32XX_CLK_TEST1_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	LPC32XX_CLK_TEST2_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	LPC32XX_CLK_TEST2_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	LPC32XX_CLK_USB_DIV_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	LPC32XX_CLK_USB_DIV_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	LPC32XX_CLK_SD_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	LPC32XX_CLK_SD_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	LPC32XX_CLK_LCD_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	LPC32XX_CLK_LCD_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	LPC32XX_CLK_HW_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	LPC32XX_CLK_MAX = LPC32XX_CLK_SYSCLK_ARM_MUX + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	LPC32XX_CLK_CCF_MAX = LPC32XX_CLK_USB_AHB + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) static struct clk *clk[LPC32XX_CLK_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) static struct clk_onecell_data clk_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	.clks = clk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	.clk_num = LPC32XX_CLK_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) static struct clk *usb_clk[LPC32XX_USB_CLK_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) static struct clk_onecell_data usb_clk_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	.clks = usb_clk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	.clk_num = LPC32XX_USB_CLK_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define LPC32XX_CLK_PARENTS_MAX			5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) struct clk_proto_t {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	const u8 parents[LPC32XX_CLK_PARENTS_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	u8 num_parents;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) #define CLK_PREFIX(LITERAL)		LPC32XX_CLK_ ## LITERAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) #define NUMARGS(...)	(sizeof((int[]){__VA_ARGS__})/sizeof(int))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) #define LPC32XX_CLK_DEFINE(_idx, _name, _flags, ...)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	[CLK_PREFIX(_idx)] = {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 		.name = _name,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 		.flags = _flags,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 		.parents = { __VA_ARGS__ },			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 		.num_parents = NUMARGS(__VA_ARGS__),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) static const struct clk_proto_t clk_proto[LPC32XX_CLK_CCF_MAX] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	LPC32XX_CLK_DEFINE(XTAL, "xtal", 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	LPC32XX_CLK_DEFINE(XTAL_32K, "xtal_32k", 0x0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	LPC32XX_CLK_DEFINE(RTC, "rtc", 0x0, LPC32XX_CLK_XTAL_32K),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	LPC32XX_CLK_DEFINE(OSC, "osc", CLK_IGNORE_UNUSED, LPC32XX_CLK_XTAL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	LPC32XX_CLK_DEFINE(SYS, "sys", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 		LPC32XX_CLK_OSC, LPC32XX_CLK_PLL397X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	LPC32XX_CLK_DEFINE(PLL397X, "pll_397x", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 		LPC32XX_CLK_RTC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	LPC32XX_CLK_DEFINE(HCLK_PLL, "hclk_pll", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 		LPC32XX_CLK_SYS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	LPC32XX_CLK_DEFINE(HCLK_DIV_PERIPH, "hclk_div_periph",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 		CLK_IGNORE_UNUSED, LPC32XX_CLK_HCLK_PLL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	LPC32XX_CLK_DEFINE(HCLK_DIV, "hclk_div", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 		LPC32XX_CLK_HCLK_PLL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	LPC32XX_CLK_DEFINE(HCLK, "hclk", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 		LPC32XX_CLK_PERIPH_HCLK_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	LPC32XX_CLK_DEFINE(PERIPH, "pclk", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 		LPC32XX_CLK_SYSCLK_PERIPH_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 	LPC32XX_CLK_DEFINE(ARM, "arm", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 		LPC32XX_CLK_PERIPH_ARM_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	LPC32XX_CLK_DEFINE(PERIPH_HCLK_MUX, "periph_hclk_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 		CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 		LPC32XX_CLK_SYSCLK_HCLK_MUX, LPC32XX_CLK_SYSCLK_PERIPH_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	LPC32XX_CLK_DEFINE(PERIPH_ARM_MUX, "periph_arm_mux", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 		LPC32XX_CLK_SYSCLK_ARM_MUX, LPC32XX_CLK_SYSCLK_PERIPH_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	LPC32XX_CLK_DEFINE(SYSCLK_PERIPH_MUX, "sysclk_periph_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 		CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 		LPC32XX_CLK_SYS, LPC32XX_CLK_HCLK_DIV_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	LPC32XX_CLK_DEFINE(SYSCLK_HCLK_MUX, "sysclk_hclk_mux",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 		CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 		LPC32XX_CLK_SYS, LPC32XX_CLK_HCLK_DIV),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	LPC32XX_CLK_DEFINE(SYSCLK_ARM_MUX, "sysclk_arm_mux", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 		LPC32XX_CLK_SYS, LPC32XX_CLK_HCLK_PLL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	LPC32XX_CLK_DEFINE(ARM_VFP, "vfp9", CLK_IGNORE_UNUSED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 		LPC32XX_CLK_ARM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	LPC32XX_CLK_DEFINE(USB_PLL, "usb_pll",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 		CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT, LPC32XX_CLK_USB_DIV),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	LPC32XX_CLK_DEFINE(USB_DIV, "usb_div", 0x0, LPC32XX_CLK_OSC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	LPC32XX_CLK_DEFINE(USB, "usb", 0x0, LPC32XX_CLK_USB_PLL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	LPC32XX_CLK_DEFINE(DMA, "dma", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	LPC32XX_CLK_DEFINE(MLC, "mlc", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	LPC32XX_CLK_DEFINE(SLC, "slc", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	LPC32XX_CLK_DEFINE(LCD, "lcd", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	LPC32XX_CLK_DEFINE(MAC, "mac", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	LPC32XX_CLK_DEFINE(SD, "sd", 0x0, LPC32XX_CLK_ARM),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	LPC32XX_CLK_DEFINE(DDRAM, "ddram", CLK_GET_RATE_NOCACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 		LPC32XX_CLK_SYSCLK_ARM_MUX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	LPC32XX_CLK_DEFINE(SSP0, "ssp0", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	LPC32XX_CLK_DEFINE(SSP1, "ssp1", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	 * CLK_GET_RATE_NOCACHE is needed, if UART clock is disabled, its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	 * divider register does not contain information about selected rate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	LPC32XX_CLK_DEFINE(UART3, "uart3", CLK_GET_RATE_NOCACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 		LPC32XX_CLK_PERIPH, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	LPC32XX_CLK_DEFINE(UART4, "uart4", CLK_GET_RATE_NOCACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 		LPC32XX_CLK_PERIPH, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	LPC32XX_CLK_DEFINE(UART5, "uart5", CLK_GET_RATE_NOCACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 		LPC32XX_CLK_PERIPH, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	LPC32XX_CLK_DEFINE(UART6, "uart6", CLK_GET_RATE_NOCACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 		LPC32XX_CLK_PERIPH, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	LPC32XX_CLK_DEFINE(IRDA, "irda", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	LPC32XX_CLK_DEFINE(I2C1, "i2c1", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	LPC32XX_CLK_DEFINE(I2C2, "i2c2", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	LPC32XX_CLK_DEFINE(TIMER0, "timer0", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	LPC32XX_CLK_DEFINE(TIMER1, "timer1", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	LPC32XX_CLK_DEFINE(TIMER2, "timer2", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	LPC32XX_CLK_DEFINE(TIMER3, "timer3", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	LPC32XX_CLK_DEFINE(TIMER4, "timer4", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	LPC32XX_CLK_DEFINE(TIMER5, "timer5", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	LPC32XX_CLK_DEFINE(WDOG, "watchdog", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	LPC32XX_CLK_DEFINE(I2S0, "i2s0", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	LPC32XX_CLK_DEFINE(I2S1, "i2s1", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	LPC32XX_CLK_DEFINE(SPI1, "spi1", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	LPC32XX_CLK_DEFINE(SPI2, "spi2", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	LPC32XX_CLK_DEFINE(MCPWM, "mcpwm", 0x0, LPC32XX_CLK_HCLK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	LPC32XX_CLK_DEFINE(HSTIMER, "hstimer", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	LPC32XX_CLK_DEFINE(KEY, "key", 0x0, LPC32XX_CLK_RTC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	LPC32XX_CLK_DEFINE(PWM1, "pwm1", 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 		LPC32XX_CLK_RTC, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	LPC32XX_CLK_DEFINE(PWM2, "pwm2", 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 		LPC32XX_CLK_RTC, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	LPC32XX_CLK_DEFINE(ADC, "adc", 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 		LPC32XX_CLK_ADC_RTC, LPC32XX_CLK_ADC_DIV),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	LPC32XX_CLK_DEFINE(ADC_DIV, "adc_div", 0x0, LPC32XX_CLK_PERIPH),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	LPC32XX_CLK_DEFINE(ADC_RTC, "adc_rtc", 0x0, LPC32XX_CLK_RTC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	LPC32XX_CLK_DEFINE(TEST1, "test1", 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 		LPC32XX_CLK_PERIPH, LPC32XX_CLK_RTC, LPC32XX_CLK_OSC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	LPC32XX_CLK_DEFINE(TEST2, "test2", 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 		LPC32XX_CLK_HCLK, LPC32XX_CLK_PERIPH, LPC32XX_CLK_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 		LPC32XX_CLK_OSC, LPC32XX_CLK_PLL397X),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	/* USB controller clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	LPC32XX_CLK_DEFINE(USB_AHB, "usb_ahb", 0x0, LPC32XX_CLK_USB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	LPC32XX_CLK_DEFINE(USB_OTG, "usb_otg", 0x0, LPC32XX_CLK_USB_AHB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	LPC32XX_CLK_DEFINE(USB_I2C, "usb_i2c", 0x0, LPC32XX_CLK_USB_AHB),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	LPC32XX_CLK_DEFINE(USB_DEV, "usb_dev", 0x0, LPC32XX_CLK_USB_OTG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	LPC32XX_CLK_DEFINE(USB_HOST, "usb_host", 0x0, LPC32XX_CLK_USB_OTG),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) struct lpc32xx_clk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	struct clk_hw hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	u32 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	u32 enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	u32 enable_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	u32 disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	u32 disable_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	u32 busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	u32 busy_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) enum clk_pll_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	PLL_UNKNOWN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	PLL_DIRECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	PLL_BYPASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	PLL_DIRECT_BYPASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	PLL_INTEGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	PLL_NON_INTEGER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) struct lpc32xx_pll_clk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	struct clk_hw hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	u32 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	u32 enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	unsigned long m_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	unsigned long n_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	unsigned long p_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	enum clk_pll_mode mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) struct lpc32xx_usb_clk {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	struct clk_hw hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	u32 ctrl_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	u32 ctrl_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	u32 ctrl_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	u32 enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	u32 busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) struct lpc32xx_clk_mux {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	struct clk_hw	hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	u32		reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	u32		mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	u8		shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	u32		*table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	u8		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) struct lpc32xx_clk_div {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	struct clk_hw	hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	u32		reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	u8		shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	u8		width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	const struct clk_div_table	*table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	u8		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) struct lpc32xx_clk_gate {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	struct clk_hw	hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	u32		reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	u8		bit_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	u8		flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) #define to_lpc32xx_clk(_hw)	container_of(_hw, struct lpc32xx_clk, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) #define to_lpc32xx_pll_clk(_hw)	container_of(_hw, struct lpc32xx_pll_clk, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) #define to_lpc32xx_usb_clk(_hw)	container_of(_hw, struct lpc32xx_usb_clk, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) #define to_lpc32xx_mux(_hw)	container_of(_hw, struct lpc32xx_clk_mux, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) #define to_lpc32xx_div(_hw)	container_of(_hw, struct lpc32xx_clk_div, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) #define to_lpc32xx_gate(_hw)	container_of(_hw, struct lpc32xx_clk_gate, hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) static inline bool pll_is_valid(u64 val0, u64 val1, u64 min, u64 max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	return (val0 >= (val1 * min) && val0 <= (val1 * max));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) static inline u32 lpc32xx_usb_clk_read(struct lpc32xx_usb_clk *clk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	return readl(usb_clk_vbase + LPC32XX_USB_CLK_STS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) static inline void lpc32xx_usb_clk_write(struct lpc32xx_usb_clk *clk, u32 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	writel(val, usb_clk_vbase + LPC32XX_USB_CLK_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) static int clk_mask_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	if (clk->busy_mask && (val & clk->busy_mask) == clk->busy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	return regmap_update_bits(clk_regmap, clk->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 				  clk->enable_mask, clk->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) static void clk_mask_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	regmap_update_bits(clk_regmap, clk->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 			   clk->disable_mask, clk->disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) static int clk_mask_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	return ((val & clk->enable_mask) == clk->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) static const struct clk_ops clk_mask_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	.enable = clk_mask_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	.disable = clk_mask_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	.is_enabled = clk_mask_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) static int clk_pll_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	u32 val, count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	regmap_update_bits(clk_regmap, clk->reg, clk->enable, clk->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	for (count = 0; count < 1000; count++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 		regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 		if (val & PLL_CTRL_LOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	if (val & PLL_CTRL_LOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) static void clk_pll_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	regmap_update_bits(clk_regmap, clk->reg, clk->enable, 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) static int clk_pll_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	val &= clk->enable | PLL_CTRL_LOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	if (val == (clk->enable | PLL_CTRL_LOCK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) static unsigned long clk_pll_397x_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 					      unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	return parent_rate * 397;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) static unsigned long clk_pll_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 					 unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	bool is_direct, is_bypass, is_feedback;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	unsigned long rate, cco_rate, ref_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	is_direct = val & PLL_CTRL_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	is_bypass = val & PLL_CTRL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	is_feedback = val & PLL_CTRL_FEEDBACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	clk->m_div = ((val & PLL_CTRL_FEEDDIV) >> 1) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	clk->n_div = ((val & PLL_CTRL_PREDIV) >> 9) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	clk->p_div = ((val & PLL_CTRL_POSTDIV) >> 11) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	if (is_direct && is_bypass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 		clk->p_div = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 		clk->mode = PLL_DIRECT_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 		return parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	if (is_bypass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 		clk->mode = PLL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 		return parent_rate / (1 << clk->p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	if (is_direct) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 		clk->p_div = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 		clk->mode = PLL_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	ref_rate = parent_rate / clk->n_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	rate = cco_rate = ref_rate * clk->m_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	if (!is_direct) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 		if (is_feedback) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 			cco_rate *= (1 << clk->p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 			clk->mode = PLL_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 			rate /= (1 << clk->p_div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 			clk->mode = PLL_NON_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	pr_debug("%s: %lu: 0x%x: %d/%d/%d, %lu/%lu/%d => %lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 		 clk_hw_get_name(hw),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 		 parent_rate, val, is_direct, is_bypass, is_feedback,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		 clk->n_div, clk->m_div, (1 << clk->p_div), rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	if (clk_pll_is_enabled(hw) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	    !(pll_is_valid(parent_rate, 1, 1000000, 20000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	      && pll_is_valid(cco_rate, 1, 156000000, 320000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	      && pll_is_valid(ref_rate, 1, 1000000, 27000000)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 		pr_err("%s: PLL clocks are not in valid ranges: %lu/%lu/%lu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 		       clk_hw_get_name(hw),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 		       parent_rate, cco_rate, ref_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) static int clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 			    unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	unsigned long new_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	/* Validate PLL clock parameters computed on round rate stage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	switch (clk->mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	case PLL_DIRECT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 		val = PLL_CTRL_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 		val |= (clk->m_div - 1) << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 		val |= (clk->n_div - 1) << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 		new_rate = (parent_rate * clk->m_div) / clk->n_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	case PLL_BYPASS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 		val = PLL_CTRL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 		val |= (clk->p_div - 1) << 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 		new_rate = parent_rate / (1 << (clk->p_div));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	case PLL_DIRECT_BYPASS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 		val = PLL_CTRL_DIRECT | PLL_CTRL_BYPASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 		new_rate = parent_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	case PLL_INTEGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 		val = PLL_CTRL_FEEDBACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 		val |= (clk->m_div - 1) << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 		val |= (clk->n_div - 1) << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 		val |= (clk->p_div - 1) << 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 		new_rate = (parent_rate * clk->m_div) / clk->n_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	case PLL_NON_INTEGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 		val = 0x0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 		val |= (clk->m_div - 1) << 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 		val |= (clk->n_div - 1) << 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 		val |= (clk->p_div - 1) << 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 		new_rate = (parent_rate * clk->m_div) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 				(clk->n_div * (1 << clk->p_div));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	/* Sanity check that round rate is equal to the requested one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	if (new_rate != rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	return regmap_update_bits(clk_regmap, clk->reg, 0x1FFFF, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) static long clk_hclk_pll_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 				    unsigned long *parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	u64 m_i, o = rate, i = *parent_rate, d = (u64)rate << 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	u64 m = 0, n = 0, p = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	int p_i, n_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	pr_debug("%s: %lu/%lu\n", clk_hw_get_name(hw), *parent_rate, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	if (rate > 266500000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	/* Have to check all 20 possibilities to find the minimal M */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	for (p_i = 4; p_i >= 0; p_i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 		for (n_i = 4; n_i > 0; n_i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 			m_i = div64_u64(o * n_i * (1 << p_i), i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 			/* Check for valid PLL parameter constraints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 			if (!(m_i && m_i <= 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 			      && pll_is_valid(i, n_i, 1000000, 27000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 			      && pll_is_valid(i * m_i * (1 << p_i), n_i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 					      156000000, 320000000)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 			/* Store some intermediate valid parameters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 			if (o * n_i * (1 << p_i) - i * m_i <= d) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 				m = m_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 				n = n_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 				p = p_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 				d = o * n_i * (1 << p_i) - i * m_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	if (d == (u64)rate << 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 		pr_err("%s: %lu: no valid PLL parameters are found\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 		       clk_hw_get_name(hw), rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	clk->m_div = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	clk->n_div = n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	clk->p_div = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	/* Set only direct or non-integer mode of PLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	if (!p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 		clk->mode = PLL_DIRECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 		clk->mode = PLL_NON_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	o = div64_u64(i * m, n * (1 << p));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	if (!d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 		pr_debug("%s: %lu: found exact match: %llu/%llu/%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 			 clk_hw_get_name(hw), rate, m, n, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 		pr_debug("%s: %lu: found closest: %llu/%llu/%llu - %llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 			 clk_hw_get_name(hw), rate, m, n, p, o);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	return o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) static long clk_usb_pll_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 				   unsigned long *parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	struct lpc32xx_pll_clk *clk = to_lpc32xx_pll_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	struct clk_hw *usb_div_hw, *osc_hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	u64 d_i, n_i, m, o;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	pr_debug("%s: %lu/%lu\n", clk_hw_get_name(hw), *parent_rate, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	 * The only supported USB clock is 48MHz, with PLL internal constraints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	 * on Fclkin, Fcco and Fref this implies that Fcco must be 192MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	 * and post-divider must be 4, this slightly simplifies calculation of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	 * USB divider, USB PLL N and M parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	if (rate != 48000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	/* USB divider clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	usb_div_hw = clk_hw_get_parent_by_index(hw, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	if (!usb_div_hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 	/* Main oscillator clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	osc_hw = clk_hw_get_parent_by_index(usb_div_hw, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	if (!osc_hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	o = clk_hw_get_rate(osc_hw);	/* must be in range 1..20 MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	/* Check if valid USB divider and USB PLL parameters exists */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	for (d_i = 16; d_i >= 1; d_i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 		for (n_i = 1; n_i <= 4; n_i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 			m = div64_u64(192000000 * d_i * n_i, o);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 			if (!(m && m <= 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 			      && m * o == 192000000 * d_i * n_i
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 			      && pll_is_valid(o, d_i, 1000000, 20000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 			      && pll_is_valid(o, d_i * n_i, 1000000, 27000000)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 			clk->n_div = n_i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 			clk->m_div = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 			clk->p_div = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 			clk->mode = PLL_NON_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 			*parent_rate = div64_u64(o, d_i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 			return rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) #define LPC32XX_DEFINE_PLL_OPS(_name, _rc, _sr, _rr)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	static const struct clk_ops clk_ ##_name ## _ops = {		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 		.enable = clk_pll_enable,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 		.disable = clk_pll_disable,				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 		.is_enabled = clk_pll_is_enabled,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 		.recalc_rate = _rc,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 		.set_rate = _sr,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 		.round_rate = _rr,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) LPC32XX_DEFINE_PLL_OPS(pll_397x, clk_pll_397x_recalc_rate, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) LPC32XX_DEFINE_PLL_OPS(hclk_pll, clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 		       clk_pll_set_rate, clk_hclk_pll_round_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) LPC32XX_DEFINE_PLL_OPS(usb_pll,  clk_pll_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		       clk_pll_set_rate, clk_usb_pll_round_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) static int clk_ddram_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	val &= clk->enable_mask | clk->busy_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	return (val == (BIT(7) | BIT(0)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		val == (BIT(8) | BIT(1)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) static int clk_ddram_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	u32 val, hclk_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	hclk_div = val & clk->busy_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	 * DDRAM clock must be 2 times higher than HCLK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	 * this implies DDRAM clock can not be enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	 * if HCLK clock rate is equal to ARM clock rate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 	if (hclk_div == 0x0 || hclk_div == (BIT(1) | BIT(0)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	return regmap_update_bits(clk_regmap, clk->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 				  clk->enable_mask, hclk_div << 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) static unsigned long clk_ddram_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 					   unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	if (!clk_ddram_is_enabled(hw))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	val &= clk->enable_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	return parent_rate / (val >> 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) static const struct clk_ops clk_ddram_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	.enable = clk_ddram_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	.disable = clk_mask_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	.is_enabled = clk_ddram_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	.recalc_rate = clk_ddram_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) static unsigned long lpc32xx_clk_uart_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 						  unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	struct lpc32xx_clk *clk = to_lpc32xx_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	u32 val, x, y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	x = (val & 0xFF00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	y = val & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	if (x && y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 		return (parent_rate * x) / y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) static const struct clk_ops lpc32xx_uart_div_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	.recalc_rate = lpc32xx_clk_uart_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) static const struct clk_div_table clk_hclk_div_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	{ .val = 0, .div = 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	{ .val = 1, .div = 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 	{ .val = 2, .div = 4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	{ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) static u32 test1_mux_table[] = { 0, 1, 2, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) static u32 test2_mux_table[] = { 0, 1, 2, 5, 7, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) static int clk_usb_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 	struct lpc32xx_usb_clk *clk = to_lpc32xx_usb_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	u32 val, ctrl_val, count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	pr_debug("%s: 0x%x\n", clk_hw_get_name(hw), clk->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	if (clk->ctrl_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		regmap_read(clk_regmap, LPC32XX_CLKPWR_USB_CTRL, &ctrl_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 		regmap_update_bits(clk_regmap, LPC32XX_CLKPWR_USB_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 				   clk->ctrl_mask, clk->ctrl_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	val = lpc32xx_usb_clk_read(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	if (clk->busy && (val & clk->busy) == clk->busy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		if (clk->ctrl_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 			regmap_write(clk_regmap, LPC32XX_CLKPWR_USB_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 				     ctrl_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	val |= clk->enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	lpc32xx_usb_clk_write(clk, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	for (count = 0; count < 1000; count++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 		val = lpc32xx_usb_clk_read(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 		if ((val & clk->enable) == clk->enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	if ((val & clk->enable) == clk->enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	if (clk->ctrl_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		regmap_write(clk_regmap, LPC32XX_CLKPWR_USB_CTRL, ctrl_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) static void clk_usb_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	struct lpc32xx_usb_clk *clk = to_lpc32xx_usb_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 	u32 val = lpc32xx_usb_clk_read(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	val &= ~clk->enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	lpc32xx_usb_clk_write(clk, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	if (clk->ctrl_mask)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 		regmap_update_bits(clk_regmap, LPC32XX_CLKPWR_USB_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 				   clk->ctrl_mask, clk->ctrl_disable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) static int clk_usb_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	struct lpc32xx_usb_clk *clk = to_lpc32xx_usb_clk(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	u32 ctrl_val, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 	if (clk->ctrl_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 		regmap_read(clk_regmap, LPC32XX_CLKPWR_USB_CTRL, &ctrl_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		if ((ctrl_val & clk->ctrl_mask) != clk->ctrl_enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	val = lpc32xx_usb_clk_read(clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	return ((val & clk->enable) == clk->enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) static unsigned long clk_usb_i2c_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 					     unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	return clk_get_rate(clk[LPC32XX_CLK_PERIPH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) static const struct clk_ops clk_usb_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	.enable = clk_usb_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	.disable = clk_usb_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	.is_enabled = clk_usb_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) static const struct clk_ops clk_usb_i2c_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	.enable = clk_usb_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	.disable = clk_usb_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	.is_enabled = clk_usb_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	.recalc_rate = clk_usb_i2c_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) static int lpc32xx_clk_gate_enable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	u32 mask = BIT(clk->bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	u32 val = (clk->flags & CLK_GATE_SET_TO_DISABLE ? 0x0 : mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	return regmap_update_bits(clk_regmap, clk->reg, mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) static void lpc32xx_clk_gate_disable(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	u32 mask = BIT(clk->bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	u32 val = (clk->flags & CLK_GATE_SET_TO_DISABLE ? mask : 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	regmap_update_bits(clk_regmap, clk->reg, mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) static int lpc32xx_clk_gate_is_enabled(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	struct lpc32xx_clk_gate *clk = to_lpc32xx_gate(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	bool is_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 	regmap_read(clk_regmap, clk->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	is_set = val & BIT(clk->bit_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	return (clk->flags & CLK_GATE_SET_TO_DISABLE ? !is_set : is_set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) static const struct clk_ops lpc32xx_clk_gate_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	.enable = lpc32xx_clk_gate_enable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	.disable = lpc32xx_clk_gate_disable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	.is_enabled = lpc32xx_clk_gate_is_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) #define div_mask(width)	((1 << (width)) - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) static unsigned int _get_table_div(const struct clk_div_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 							unsigned int val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	const struct clk_div_table *clkt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	for (clkt = table; clkt->div; clkt++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 		if (clkt->val == val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 			return clkt->div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) static unsigned int _get_div(const struct clk_div_table *table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 			     unsigned int val, unsigned long flags, u8 width)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	if (flags & CLK_DIVIDER_ONE_BASED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 		return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	if (table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 		return _get_table_div(table, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	return val + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) static unsigned long clk_divider_recalc_rate(struct clk_hw *hw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 		unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	struct lpc32xx_clk_div *divider = to_lpc32xx_div(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	regmap_read(clk_regmap, divider->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	val >>= divider->shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	val &= div_mask(divider->width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	return divider_recalc_rate(hw, parent_rate, val, divider->table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 				   divider->flags, divider->width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) static long clk_divider_round_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 				unsigned long *prate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	struct lpc32xx_clk_div *divider = to_lpc32xx_div(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	unsigned int bestdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	/* if read only, just return current value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	if (divider->flags & CLK_DIVIDER_READ_ONLY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 		regmap_read(clk_regmap, divider->reg, &bestdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 		bestdiv >>= divider->shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 		bestdiv &= div_mask(divider->width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 		bestdiv = _get_div(divider->table, bestdiv, divider->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 			divider->width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 		return DIV_ROUND_UP(*prate, bestdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	return divider_round_rate(hw, rate, prate, divider->table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 				  divider->width, divider->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) static int clk_divider_set_rate(struct clk_hw *hw, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 				unsigned long parent_rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	struct lpc32xx_clk_div *divider = to_lpc32xx_div(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	value = divider_get_val(rate, parent_rate, divider->table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 				divider->width, divider->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	return regmap_update_bits(clk_regmap, divider->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 				  div_mask(divider->width) << divider->shift,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 				  value << divider->shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) static const struct clk_ops lpc32xx_clk_divider_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	.recalc_rate = clk_divider_recalc_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	.round_rate = clk_divider_round_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	.set_rate = clk_divider_set_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) static u8 clk_mux_get_parent(struct clk_hw *hw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	struct lpc32xx_clk_mux *mux = to_lpc32xx_mux(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	u32 num_parents = clk_hw_get_num_parents(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	regmap_read(clk_regmap, mux->reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	val >>= mux->shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	val &= mux->mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	if (mux->table) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 		for (i = 0; i < num_parents; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 			if (mux->table[i] == val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 				return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	if (val >= num_parents)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	return val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) static int clk_mux_set_parent(struct clk_hw *hw, u8 index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	struct lpc32xx_clk_mux *mux = to_lpc32xx_mux(hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	if (mux->table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		index = mux->table[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	return regmap_update_bits(clk_regmap, mux->reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 			  mux->mask << mux->shift, index << mux->shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) static const struct clk_ops lpc32xx_clk_mux_ro_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	.get_parent = clk_mux_get_parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) static const struct clk_ops lpc32xx_clk_mux_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	.get_parent = clk_mux_get_parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	.set_parent = clk_mux_set_parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	.determine_rate = __clk_mux_determine_rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) enum lpc32xx_clk_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	CLK_FIXED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	CLK_MUX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	CLK_DIV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	CLK_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	CLK_COMPOSITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	CLK_LPC32XX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	CLK_LPC32XX_PLL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	CLK_LPC32XX_USB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) struct clk_hw_proto0 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	const struct clk_ops *ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 		struct lpc32xx_pll_clk pll;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 		struct lpc32xx_clk clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 		struct lpc32xx_usb_clk usb_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 		struct lpc32xx_clk_mux mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 		struct lpc32xx_clk_div div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 		struct lpc32xx_clk_gate gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) struct clk_hw_proto1 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 	struct clk_hw_proto0 *mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	struct clk_hw_proto0 *div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	struct clk_hw_proto0 *gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) struct clk_hw_proto {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	enum lpc32xx_clk_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 		struct clk_fixed_rate f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 		struct clk_hw_proto0 hw0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 		struct clk_hw_proto1 hw1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) #define LPC32XX_DEFINE_FIXED(_idx, _rate)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	.type = CLK_FIXED,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 		.f = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 			.fixed_rate = (_rate),				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) #define LPC32XX_DEFINE_PLL(_idx, _name, _reg, _enable)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	.type = CLK_LPC32XX_PLL,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 			.ops = &clk_ ##_name ## _ops,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 				.pll = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 					.reg = LPC32XX_CLKPWR_ ## _reg,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 					.enable = (_enable),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 				},					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) #define LPC32XX_DEFINE_MUX(_idx, _reg, _shift, _mask, _table, _flags)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	.type = CLK_MUX,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 			.ops = (_flags & CLK_MUX_READ_ONLY ?		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 				&lpc32xx_clk_mux_ro_ops :		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 				&lpc32xx_clk_mux_ops),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 				.mux = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 					.reg = LPC32XX_CLKPWR_ ## _reg,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 					.mask = (_mask),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 					.shift = (_shift),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 					.table = (_table),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 					.flags = (_flags),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 				},					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) #define LPC32XX_DEFINE_DIV(_idx, _reg, _shift, _width, _table, _flags)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	.type = CLK_DIV,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 			.ops = &lpc32xx_clk_divider_ops,		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 				.div = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 					.reg = LPC32XX_CLKPWR_ ## _reg,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 					.shift = (_shift),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 					.width = (_width),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 					.table = (_table),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 					.flags = (_flags),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 				 },					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 		 },							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) #define LPC32XX_DEFINE_GATE(_idx, _reg, _bit, _flags)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	.type = CLK_GATE,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 			.ops = &lpc32xx_clk_gate_ops,			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 				.gate = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 					.reg = LPC32XX_CLKPWR_ ## _reg,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 					.bit_idx = (_bit),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 					.flags = (_flags),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 				},					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) #define LPC32XX_DEFINE_CLK(_idx, _reg, _e, _em, _d, _dm, _b, _bm, _ops)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	.type = CLK_LPC32XX,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 			.ops = &(_ops),					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 				.clk = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 					.reg = LPC32XX_CLKPWR_ ## _reg,	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 					.enable = (_e),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 					.enable_mask = (_em),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 					.disable = (_d),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 					.disable_mask = (_dm),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 					.busy = (_b),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 					.busy_mask = (_bm),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 				},					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) #define LPC32XX_DEFINE_USB(_idx, _ce, _cd, _cm, _e, _b, _ops)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	.type = CLK_LPC32XX_USB,					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 		.hw0 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 			.ops = &(_ops),					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 			{						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 				.usb_clk = {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 					.ctrl_enable = (_ce),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 					.ctrl_disable = (_cd),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 					.ctrl_mask = (_cm),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 					.enable = (_e),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 					.busy = (_b),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 				}					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 			},						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 		}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) #define LPC32XX_DEFINE_COMPOSITE(_idx, _mux, _div, _gate)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) [CLK_PREFIX(_idx)] = {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	.type = CLK_COMPOSITE,						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	{								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 		.hw1 = {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 		.mux = (CLK_PREFIX(_mux) == LPC32XX_CLK__NULL ? NULL :	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 			&clk_hw_proto[CLK_PREFIX(_mux)].hw0),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 		.div = (CLK_PREFIX(_div) == LPC32XX_CLK__NULL ? NULL :	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 			&clk_hw_proto[CLK_PREFIX(_div)].hw0),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 		.gate = (CLK_PREFIX(_gate) == LPC32XX_CLK__NULL ? NULL :\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 			 &clk_hw_proto[CLK_PREFIX(_gate)].hw0),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		},							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	},								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) static struct clk_hw_proto clk_hw_proto[LPC32XX_CLK_HW_MAX] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	LPC32XX_DEFINE_FIXED(RTC, 32768),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	LPC32XX_DEFINE_PLL(PLL397X, pll_397x, HCLKPLL_CTRL, BIT(1)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	LPC32XX_DEFINE_PLL(HCLK_PLL, hclk_pll, HCLKPLL_CTRL, PLL_CTRL_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	LPC32XX_DEFINE_PLL(USB_PLL, usb_pll, USB_CTRL, PLL_CTRL_ENABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	LPC32XX_DEFINE_GATE(OSC, OSC_CTRL, 0, CLK_GATE_SET_TO_DISABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	LPC32XX_DEFINE_GATE(USB, USB_CTRL, 18, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	LPC32XX_DEFINE_DIV(HCLK_DIV_PERIPH, HCLKDIV_CTRL, 2, 5, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 			   CLK_DIVIDER_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	LPC32XX_DEFINE_DIV(HCLK_DIV, HCLKDIV_CTRL, 0, 2, clk_hclk_div_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 			   CLK_DIVIDER_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	/* Register 3 read-only muxes with a single control PWR_CTRL[2] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	LPC32XX_DEFINE_MUX(SYSCLK_PERIPH_MUX, PWR_CTRL, 2, 0x1, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 			   CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	LPC32XX_DEFINE_MUX(SYSCLK_HCLK_MUX, PWR_CTRL, 2, 0x1, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 			   CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	LPC32XX_DEFINE_MUX(SYSCLK_ARM_MUX, PWR_CTRL, 2, 0x1, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 			   CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 	/* Register 2 read-only muxes with a single control PWR_CTRL[10] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 	LPC32XX_DEFINE_MUX(PERIPH_HCLK_MUX, PWR_CTRL, 10, 0x1, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 			   CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	LPC32XX_DEFINE_MUX(PERIPH_ARM_MUX, PWR_CTRL, 10, 0x1, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 			   CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	/* 3 always on gates with a single control PWR_CTRL[0] same as OSC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	LPC32XX_DEFINE_GATE(PERIPH, PWR_CTRL, 0, CLK_GATE_SET_TO_DISABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	LPC32XX_DEFINE_GATE(HCLK, PWR_CTRL, 0, CLK_GATE_SET_TO_DISABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	LPC32XX_DEFINE_GATE(ARM, PWR_CTRL, 0, CLK_GATE_SET_TO_DISABLE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	LPC32XX_DEFINE_GATE(ARM_VFP, DEBUG_CTRL, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	LPC32XX_DEFINE_GATE(DMA, DMA_CLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	LPC32XX_DEFINE_CLK(DDRAM, HCLKDIV_CTRL, 0x0, BIT(8) | BIT(7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 		   0x0, BIT(8) | BIT(7), 0x0, BIT(1) | BIT(0), clk_ddram_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	LPC32XX_DEFINE_GATE(TIMER0, TIMCLK_CTRL1, 2, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	LPC32XX_DEFINE_GATE(TIMER1, TIMCLK_CTRL1, 3, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 	LPC32XX_DEFINE_GATE(TIMER2, TIMCLK_CTRL1, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	LPC32XX_DEFINE_GATE(TIMER3, TIMCLK_CTRL1, 5, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	LPC32XX_DEFINE_GATE(TIMER4, TIMCLK_CTRL1, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	LPC32XX_DEFINE_GATE(TIMER5, TIMCLK_CTRL1, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	LPC32XX_DEFINE_GATE(SSP0, SSP_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	LPC32XX_DEFINE_GATE(SSP1, SSP_CTRL, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	LPC32XX_DEFINE_GATE(SPI1, SPI_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	LPC32XX_DEFINE_GATE(SPI2, SPI_CTRL, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	LPC32XX_DEFINE_GATE(I2S0, I2S_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	LPC32XX_DEFINE_GATE(I2S1, I2S_CTRL, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	LPC32XX_DEFINE_GATE(I2C1, I2CCLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	LPC32XX_DEFINE_GATE(I2C2, I2CCLK_CTRL, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	LPC32XX_DEFINE_GATE(WDOG, TIMCLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	LPC32XX_DEFINE_GATE(HSTIMER, TIMCLK_CTRL, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	LPC32XX_DEFINE_GATE(KEY, KEYCLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	LPC32XX_DEFINE_GATE(MCPWM, TIMCLK_CTRL1, 6, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	LPC32XX_DEFINE_MUX(PWM1_MUX, PWMCLK_CTRL, 1, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	LPC32XX_DEFINE_DIV(PWM1_DIV, PWMCLK_CTRL, 4, 4, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 			   CLK_DIVIDER_ONE_BASED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	LPC32XX_DEFINE_GATE(PWM1_GATE, PWMCLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	LPC32XX_DEFINE_COMPOSITE(PWM1, PWM1_MUX, PWM1_DIV, PWM1_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	LPC32XX_DEFINE_MUX(PWM2_MUX, PWMCLK_CTRL, 3, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	LPC32XX_DEFINE_DIV(PWM2_DIV, PWMCLK_CTRL, 8, 4, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 			   CLK_DIVIDER_ONE_BASED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	LPC32XX_DEFINE_GATE(PWM2_GATE, PWMCLK_CTRL, 2, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	LPC32XX_DEFINE_COMPOSITE(PWM2, PWM2_MUX, PWM2_DIV, PWM2_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	LPC32XX_DEFINE_MUX(UART3_MUX, UART3_CLK_CTRL, 16, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	LPC32XX_DEFINE_CLK(UART3_DIV, UART3_CLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 			   0, 0, 0, 0, 0, 0, lpc32xx_uart_div_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	LPC32XX_DEFINE_GATE(UART3_GATE, UART_CLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	LPC32XX_DEFINE_COMPOSITE(UART3, UART3_MUX, UART3_DIV, UART3_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 	LPC32XX_DEFINE_MUX(UART4_MUX, UART4_CLK_CTRL, 16, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 	LPC32XX_DEFINE_CLK(UART4_DIV, UART4_CLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 			   0, 0, 0, 0, 0, 0, lpc32xx_uart_div_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 	LPC32XX_DEFINE_GATE(UART4_GATE, UART_CLK_CTRL, 1, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	LPC32XX_DEFINE_COMPOSITE(UART4, UART4_MUX, UART4_DIV, UART4_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	LPC32XX_DEFINE_MUX(UART5_MUX, UART5_CLK_CTRL, 16, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	LPC32XX_DEFINE_CLK(UART5_DIV, UART5_CLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 			   0, 0, 0, 0, 0, 0, lpc32xx_uart_div_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	LPC32XX_DEFINE_GATE(UART5_GATE, UART_CLK_CTRL, 2, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	LPC32XX_DEFINE_COMPOSITE(UART5, UART5_MUX, UART5_DIV, UART5_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 	LPC32XX_DEFINE_MUX(UART6_MUX, UART6_CLK_CTRL, 16, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 	LPC32XX_DEFINE_CLK(UART6_DIV, UART6_CLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 			   0, 0, 0, 0, 0, 0, lpc32xx_uart_div_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 	LPC32XX_DEFINE_GATE(UART6_GATE, UART_CLK_CTRL, 3, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	LPC32XX_DEFINE_COMPOSITE(UART6, UART6_MUX, UART6_DIV, UART6_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	LPC32XX_DEFINE_CLK(IRDA, IRDA_CLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 			   0, 0, 0, 0, 0, 0, lpc32xx_uart_div_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	LPC32XX_DEFINE_MUX(TEST1_MUX, TEST_CLK_CTRL, 5, 0x3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 			   test1_mux_table, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	LPC32XX_DEFINE_GATE(TEST1_GATE, TEST_CLK_CTRL, 4, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	LPC32XX_DEFINE_COMPOSITE(TEST1, TEST1_MUX, _NULL, TEST1_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	LPC32XX_DEFINE_MUX(TEST2_MUX, TEST_CLK_CTRL, 1, 0x7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 			   test2_mux_table, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	LPC32XX_DEFINE_GATE(TEST2_GATE, TEST_CLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	LPC32XX_DEFINE_COMPOSITE(TEST2, TEST2_MUX, _NULL, TEST2_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 	LPC32XX_DEFINE_MUX(SYS, SYSCLK_CTRL, 0, 0x1, NULL, CLK_MUX_READ_ONLY),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 	LPC32XX_DEFINE_DIV(USB_DIV_DIV, USB_DIV, 0, 4, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 	LPC32XX_DEFINE_GATE(USB_DIV_GATE, USB_CTRL, 17, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 	LPC32XX_DEFINE_COMPOSITE(USB_DIV, _NULL, USB_DIV_DIV, USB_DIV_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	LPC32XX_DEFINE_DIV(SD_DIV, MS_CTRL, 0, 4, NULL, CLK_DIVIDER_ONE_BASED),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	LPC32XX_DEFINE_CLK(SD_GATE, MS_CTRL, BIT(5) | BIT(9), BIT(5) | BIT(9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 			   0x0, BIT(5) | BIT(9), 0x0, 0x0, clk_mask_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 	LPC32XX_DEFINE_COMPOSITE(SD, _NULL, SD_DIV, SD_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	LPC32XX_DEFINE_DIV(LCD_DIV, LCDCLK_CTRL, 0, 5, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	LPC32XX_DEFINE_GATE(LCD_GATE, LCDCLK_CTRL, 5, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	LPC32XX_DEFINE_COMPOSITE(LCD, _NULL, LCD_DIV, LCD_GATE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	LPC32XX_DEFINE_CLK(MAC, MACCLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 			   BIT(2) | BIT(1) | BIT(0), BIT(2) | BIT(1) | BIT(0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 			   BIT(2) | BIT(1) | BIT(0), BIT(2) | BIT(1) | BIT(0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 			   0x0, 0x0, clk_mask_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	LPC32XX_DEFINE_CLK(SLC, FLASHCLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 			   BIT(2) | BIT(0), BIT(2) | BIT(0), 0x0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 			   BIT(0), BIT(1), BIT(2) | BIT(1), clk_mask_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	LPC32XX_DEFINE_CLK(MLC, FLASHCLK_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 			   BIT(1), BIT(2) | BIT(1), 0x0, BIT(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 			   BIT(2) | BIT(0), BIT(2) | BIT(0), clk_mask_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 	 * ADC/TS clock unfortunately cannot be registered as a composite one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 	 * due to a different connection of gate, div and mux, e.g. gating it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	 * won't mean that the clock is off, if peripheral clock is its parent:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 	 * rtc-->[gate]-->|     |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	 *                | mux |--> adc/ts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 	 * pclk-->[div]-->|     |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 	 * Constraints:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	 * ADC --- resulting clock must be <= 4.5 MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	 * TS  --- resulting clock must be <= 400 KHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	LPC32XX_DEFINE_DIV(ADC_DIV, ADCCLK_CTRL1, 0, 8, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 	LPC32XX_DEFINE_GATE(ADC_RTC, ADCCLK_CTRL, 0, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 	LPC32XX_DEFINE_MUX(ADC, ADCCLK_CTRL1, 8, 0x1, NULL, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	/* USB controller clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	LPC32XX_DEFINE_USB(USB_AHB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 			   BIT(24), 0x0, BIT(24), BIT(4), 0, clk_usb_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 	LPC32XX_DEFINE_USB(USB_OTG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 			   0x0, 0x0, 0x0, BIT(3), 0, clk_usb_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 	LPC32XX_DEFINE_USB(USB_I2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 			   0x0, BIT(23), BIT(23), BIT(2), 0, clk_usb_i2c_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	LPC32XX_DEFINE_USB(USB_DEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 			   BIT(22), 0x0, BIT(22), BIT(1), BIT(0), clk_usb_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	LPC32XX_DEFINE_USB(USB_HOST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 			   BIT(21), 0x0, BIT(21), BIT(0), BIT(1), clk_usb_ops),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) static struct clk * __init lpc32xx_clk_register(u32 id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 	const struct clk_proto_t *lpc32xx_clk = &clk_proto[id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 	struct clk_hw_proto *clk_hw = &clk_hw_proto[id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	const char *parents[LPC32XX_CLK_PARENTS_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	struct clk *clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	for (i = 0; i < lpc32xx_clk->num_parents; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 		parents[i] = clk_proto[lpc32xx_clk->parents[i]].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 	pr_debug("%s: derived from '%s', clock type %d\n", lpc32xx_clk->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 		 parents[0], clk_hw->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 	switch (clk_hw->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	case CLK_LPC32XX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 	case CLK_LPC32XX_PLL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 	case CLK_LPC32XX_USB:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 	case CLK_MUX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	case CLK_DIV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	case CLK_GATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 		struct clk_init_data clk_init = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 			.name = lpc32xx_clk->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 			.parent_names = parents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			.num_parents = lpc32xx_clk->num_parents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 			.flags = lpc32xx_clk->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 			.ops = clk_hw->hw0.ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 		};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 		struct clk_hw *hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 		if (clk_hw->type == CLK_LPC32XX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 			hw = &clk_hw->hw0.clk.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 		else if (clk_hw->type == CLK_LPC32XX_PLL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 			hw = &clk_hw->hw0.pll.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 		else if (clk_hw->type == CLK_LPC32XX_USB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 			hw = &clk_hw->hw0.usb_clk.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 		else if (clk_hw->type == CLK_MUX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 			hw = &clk_hw->hw0.mux.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 		else if (clk_hw->type == CLK_DIV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 			hw = &clk_hw->hw0.div.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 		else if (clk_hw->type == CLK_GATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 			hw = &clk_hw->hw0.gate.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 			return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 		hw->init = &clk_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 		clk = clk_register(NULL, hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	case CLK_COMPOSITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 		struct clk_hw *mux_hw = NULL, *div_hw = NULL, *gate_hw = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 		const struct clk_ops *mops = NULL, *dops = NULL, *gops = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 		struct clk_hw_proto0 *mux0, *div0, *gate0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 		mux0 = clk_hw->hw1.mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 		div0 = clk_hw->hw1.div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		gate0 = clk_hw->hw1.gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 		if (mux0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 			mops = mux0->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 			mux_hw = &mux0->clk.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 		if (div0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 			dops = div0->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 			div_hw = &div0->clk.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 		if (gate0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 			gops = gate0->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 			gate_hw = &gate0->clk.hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		clk = clk_register_composite(NULL, lpc32xx_clk->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 				parents, lpc32xx_clk->num_parents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 				mux_hw, mops, div_hw, dops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 				gate_hw, gops, lpc32xx_clk->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	case CLK_FIXED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 		struct clk_fixed_rate *fixed = &clk_hw->f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 		clk = clk_register_fixed_rate(NULL, lpc32xx_clk->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 			parents[0], 0, fixed->fixed_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 		clk = ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	return clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) static void __init lpc32xx_clk_div_quirk(u32 reg, u32 div_mask, u32 gate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	regmap_read(clk_regmap, reg, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	if (!(val & div_mask)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 		val &= ~gate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 		val |= BIT(__ffs(div_mask));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	regmap_update_bits(clk_regmap, reg, gate | div_mask, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) static void __init lpc32xx_clk_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	struct clk *clk_osc, *clk_32k;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	void __iomem *base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	/* Ensure that parent clocks are available and valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	clk_32k = of_clk_get_by_name(np, clk_proto[LPC32XX_CLK_XTAL_32K].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	if (IS_ERR(clk_32k)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 		pr_err("failed to find external 32KHz clock: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 		       PTR_ERR(clk_32k));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	if (clk_get_rate(clk_32k) != 32768) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 		pr_err("invalid clock rate of external 32KHz oscillator\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	clk_osc = of_clk_get_by_name(np, clk_proto[LPC32XX_CLK_XTAL].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	if (IS_ERR(clk_osc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 		pr_err("failed to find external main oscillator clock: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 		       PTR_ERR(clk_osc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	base = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	if (!base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 		pr_err("failed to map system control block registers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 	clk_regmap = regmap_init_mmio(NULL, base, &lpc32xx_scb_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 	if (IS_ERR(clk_regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 		pr_err("failed to regmap system control block: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 			PTR_ERR(clk_regmap));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 		iounmap(base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	 * Divider part of PWM and MS clocks requires a quirk to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	 * a misinterpretation of formally valid zero value in register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	 * bitfield, which indicates another clock gate. Instead of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	 * adding complexity to a gate clock ensure that zero value in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	 * divider clock is never met in runtime.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	lpc32xx_clk_div_quirk(LPC32XX_CLKPWR_PWMCLK_CTRL, 0xf0, BIT(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	lpc32xx_clk_div_quirk(LPC32XX_CLKPWR_PWMCLK_CTRL, 0xf00, BIT(2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 	lpc32xx_clk_div_quirk(LPC32XX_CLKPWR_MS_CTRL, 0xf, BIT(5) | BIT(9));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	for (i = 1; i < LPC32XX_CLK_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 		clk[i] = lpc32xx_clk_register(i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 		if (IS_ERR(clk[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 			pr_err("failed to register %s clock: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 				clk_proto[i].name, PTR_ERR(clk[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 			clk[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 	/* Set 48MHz rate of USB PLL clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	clk_set_rate(clk[LPC32XX_CLK_USB_PLL], 48000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 	/* These two clocks must be always on independently on consumers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 	clk_prepare_enable(clk[LPC32XX_CLK_ARM]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 	clk_prepare_enable(clk[LPC32XX_CLK_HCLK]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 	/* Enable ARM VFP by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 	clk_prepare_enable(clk[LPC32XX_CLK_ARM_VFP]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	/* Disable enabled by default clocks for NAND MLC and SLC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 	clk_mask_disable(&clk_hw_proto[LPC32XX_CLK_SLC].hw0.clk.hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	clk_mask_disable(&clk_hw_proto[LPC32XX_CLK_MLC].hw0.clk.hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) CLK_OF_DECLARE(lpc32xx_clk, "nxp,lpc3220-clk", lpc32xx_clk_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) static void __init lpc32xx_usb_clk_init(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	usb_clk_vbase = of_iomap(np, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 	if (!usb_clk_vbase) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 		pr_err("failed to map address range\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 	for (i = 1; i < LPC32XX_USB_CLK_MAX; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 		usb_clk[i] = lpc32xx_clk_register(i + LPC32XX_CLK_USB_OFFSET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 		if (IS_ERR(usb_clk[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 			pr_err("failed to register %s clock: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 				clk_proto[i].name, PTR_ERR(usb_clk[i]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 			usb_clk[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	of_clk_add_provider(np, of_clk_src_onecell_get, &usb_clk_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) CLK_OF_DECLARE(lpc32xx_usb_clk, "nxp,lpc3220-usb-clk", lpc32xx_usb_clk_init);