1919#include "clk.h"
2020#include "reset.h"
2121
22- #define APBC_RTC 0x28
23- #define APBC_TWSI0 0x2c
24- #define APBC_KPC 0x30
2522#define APBC_UART0 0x0
2623#define APBC_UART1 0x4
2724#define APBC_GPIO 0x8
2825#define APBC_PWM0 0xc
2926#define APBC_PWM1 0x10
3027#define APBC_PWM2 0x14
3128#define APBC_PWM3 0x18
29+ #define APBC_RTC 0x28
30+ #define APBC_TWSI0 0x2c
31+ #define APBC_KPC 0x30
3232#define APBC_TIMER 0x34
33+ #define APBC_AIB 0x3c
34+ #define APBC_SW_JTAG 0x40
35+ #define APBC_ONEWIRE 0x48
36+ #define APBC_TWSI1 0x6c
37+ #define APBC_UART2 0x70
38+ #define APBC_AC97 0x84
3339#define APBC_SSP0 0x81c
3440#define APBC_SSP1 0x820
3541#define APBC_SSP2 0x84c
3642#define APBC_SSP3 0x858
3743#define APBC_SSP4 0x85c
38- #define APBC_TWSI1 0x6c
39- #define APBC_UART2 0x70
44+ #define APMU_DISP0 0x4c
45+ #define APMU_CCIC0 0x50
4046#define APMU_SDH0 0x54
4147#define APMU_SDH1 0x58
4248#define APMU_USB 0x5c
43- #define APMU_DISP0 0x4c
44- #define APMU_CCIC0 0x50
4549#define APMU_DFC 0x60
50+ #define APMU_DMA 0x64
51+ #define APMU_BUS 0x6c
52+ #define APMU_GC 0xcc
53+ #define APMU_SMC 0xd4
54+ #define APMU_XD 0xdc
55+ #define APMU_SDH2 0xe0
56+ #define APMU_SDH3 0xe4
57+ #define APMU_CF 0xf0
58+ #define APMU_MSP 0xf4
59+ #define APMU_CMU 0xf8
60+ #define APMU_FE 0xfc
61+ #define APMU_PCIE 0x100
62+ #define APMU_EPD 0x104
4663#define MPMU_UART_PLL 0x14
4764
4865struct pxa168_clk_unit {
@@ -71,9 +88,12 @@ static struct mmp_param_fixed_factor_clk fixed_factor_clks[] = {
7188 {PXA168_CLK_PLL1_96 , "pll1_96" , "pll1_48" , 1 , 2 , 0 },
7289 {PXA168_CLK_PLL1_192 , "pll1_192" , "pll1_96" , 1 , 2 , 0 },
7390 {PXA168_CLK_PLL1_13 , "pll1_13" , "pll1" , 1 , 13 , 0 },
74- {PXA168_CLK_PLL1_13_1_5 , "pll1_13_1_5" , "pll1_13" , 2 , 3 , 0 },
75- {PXA168_CLK_PLL1_2_1_5 , "pll1_2_1_5" , "pll1_2" , 2 , 3 , 0 },
91+ {PXA168_CLK_PLL1_13_1_5 , "pll1_13_1_5" , "pll1_13" , 1 , 5 , 0 },
92+ {PXA168_CLK_PLL1_2_1_5 , "pll1_2_1_5" , "pll1_2" , 1 , 5 , 0 },
7693 {PXA168_CLK_PLL1_3_16 , "pll1_3_16" , "pll1" , 3 , 16 , 0 },
94+ {PXA168_CLK_PLL1_2_1_10 , "pll1_2_1_10" , "pll1_2" , 1 , 10 , 0 },
95+ {PXA168_CLK_PLL1_2_3_16 , "pll1_2_3_16" , "pll1_2" , 3 , 16 , 0 },
96+ {PXA168_CLK_CLK32_2 , "clk32_2" , "clk32" , 1 , 2 , 0 },
7797};
7898
7999static struct mmp_clk_factor_masks uart_factor_masks = {
@@ -107,24 +127,44 @@ static void pxa168_pll_init(struct pxa168_clk_unit *pxa_unit)
107127 mmp_clk_add (unit , PXA168_CLK_UART_PLL , clk );
108128}
109129
130+ static DEFINE_SPINLOCK (twsi0_lock );
131+ static DEFINE_SPINLOCK (twsi1_lock );
132+ static const char * const twsi_parent_names [] = {"pll1_2_1_10" , "pll1_2_1_5" };
133+
134+ static DEFINE_SPINLOCK (kpc_lock );
135+ static const char * const kpc_parent_names [] = {"clk32" , "clk32_2" , "pll1_24" };
136+
137+ static DEFINE_SPINLOCK (pwm0_lock );
138+ static DEFINE_SPINLOCK (pwm1_lock );
139+ static DEFINE_SPINLOCK (pwm2_lock );
140+ static DEFINE_SPINLOCK (pwm3_lock );
141+ static const char * const pwm_parent_names [] = {"pll1_48" , "clk32" };
142+
110143static DEFINE_SPINLOCK (uart0_lock );
111144static DEFINE_SPINLOCK (uart1_lock );
112145static DEFINE_SPINLOCK (uart2_lock );
113- static const char * uart_parent_names [] = {"pll1_3_16 " , "uart_pll" };
146+ static const char * const uart_parent_names [] = {"pll1_2_3_16 " , "uart_pll" };
114147
115148static DEFINE_SPINLOCK (ssp0_lock );
116149static DEFINE_SPINLOCK (ssp1_lock );
117150static DEFINE_SPINLOCK (ssp2_lock );
118151static DEFINE_SPINLOCK (ssp3_lock );
119152static DEFINE_SPINLOCK (ssp4_lock );
120- static const char * ssp_parent_names [] = {"pll1_96" , "pll1_48" , "pll1_24" , "pll1_12" };
153+ static const char * const ssp_parent_names [] = {"pll1_96" , "pll1_48" , "pll1_24" , "pll1_12" };
121154
122155static DEFINE_SPINLOCK (timer_lock );
123- static const char * timer_parent_names [] = {"pll1_48" , "clk32" , "pll1_96" , "pll1_192" };
156+ static const char * const timer_parent_names [] = {"pll1_48" , "clk32" , "pll1_96" , "pll1_192" };
124157
125158static DEFINE_SPINLOCK (reset_lock );
126159
127160static struct mmp_param_mux_clk apbc_mux_clks [] = {
161+ {0 , "twsi0_mux" , twsi_parent_names , ARRAY_SIZE (twsi_parent_names ), CLK_SET_RATE_PARENT , APBC_TWSI0 , 4 , 3 , 0 , & twsi0_lock },
162+ {0 , "twsi1_mux" , twsi_parent_names , ARRAY_SIZE (twsi_parent_names ), CLK_SET_RATE_PARENT , APBC_TWSI1 , 4 , 3 , 0 , & twsi1_lock },
163+ {0 , "kpc_mux" , kpc_parent_names , ARRAY_SIZE (kpc_parent_names ), CLK_SET_RATE_PARENT , APBC_KPC , 4 , 3 , 0 , & kpc_lock },
164+ {0 , "pwm0_mux" , pwm_parent_names , ARRAY_SIZE (pwm_parent_names ), CLK_SET_RATE_PARENT , APBC_PWM0 , 4 , 3 , 0 , & pwm0_lock },
165+ {0 , "pwm1_mux" , pwm_parent_names , ARRAY_SIZE (pwm_parent_names ), CLK_SET_RATE_PARENT , APBC_PWM1 , 4 , 3 , 0 , & pwm1_lock },
166+ {0 , "pwm2_mux" , pwm_parent_names , ARRAY_SIZE (pwm_parent_names ), CLK_SET_RATE_PARENT , APBC_PWM2 , 4 , 3 , 0 , & pwm2_lock },
167+ {0 , "pwm3_mux" , pwm_parent_names , ARRAY_SIZE (pwm_parent_names ), CLK_SET_RATE_PARENT , APBC_PWM3 , 4 , 3 , 0 , & pwm3_lock },
128168 {0 , "uart0_mux" , uart_parent_names , ARRAY_SIZE (uart_parent_names ), CLK_SET_RATE_PARENT , APBC_UART0 , 4 , 3 , 0 , & uart0_lock },
129169 {0 , "uart1_mux" , uart_parent_names , ARRAY_SIZE (uart_parent_names ), CLK_SET_RATE_PARENT , APBC_UART1 , 4 , 3 , 0 , & uart1_lock },
130170 {0 , "uart2_mux" , uart_parent_names , ARRAY_SIZE (uart_parent_names ), CLK_SET_RATE_PARENT , APBC_UART2 , 4 , 3 , 0 , & uart2_lock },
@@ -137,16 +177,15 @@ static struct mmp_param_mux_clk apbc_mux_clks[] = {
137177};
138178
139179static struct mmp_param_gate_clk apbc_gate_clks [] = {
140- {PXA168_CLK_TWSI0 , "twsi0_clk" , "pll1_13_1_5 " , CLK_SET_RATE_PARENT , APBC_TWSI0 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
141- {PXA168_CLK_TWSI1 , "twsi1_clk" , "pll1_13_1_5 " , CLK_SET_RATE_PARENT , APBC_TWSI1 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
142- {PXA168_CLK_GPIO , "gpio_clk" , "vctcxo" , CLK_SET_RATE_PARENT , APBC_GPIO , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
143- {PXA168_CLK_KPC , "kpc_clk" , "clk32 " , CLK_SET_RATE_PARENT , APBC_KPC , 0x3 , 0x3 , 0x0 , MMP_CLK_GATE_NEED_DELAY , NULL },
180+ {PXA168_CLK_TWSI0 , "twsi0_clk" , "twsi0_mux " , CLK_SET_RATE_PARENT , APBC_TWSI0 , 0x3 , 0x3 , 0x0 , 0 , & twsi0_lock },
181+ {PXA168_CLK_TWSI1 , "twsi1_clk" , "twsi1_mux " , CLK_SET_RATE_PARENT , APBC_TWSI1 , 0x3 , 0x3 , 0x0 , 0 , & twsi1_lock },
182+ {PXA168_CLK_GPIO , "gpio_clk" , "vctcxo" , CLK_SET_RATE_PARENT , APBC_GPIO , 0x1 , 0x1 , 0x0 , 0 , & reset_lock },
183+ {PXA168_CLK_KPC , "kpc_clk" , "kpc_mux " , CLK_SET_RATE_PARENT , APBC_KPC , 0x3 , 0x3 , 0x0 , MMP_CLK_GATE_NEED_DELAY , & kpc_lock },
144184 {PXA168_CLK_RTC , "rtc_clk" , "clk32" , CLK_SET_RATE_PARENT , APBC_RTC , 0x83 , 0x83 , 0x0 , MMP_CLK_GATE_NEED_DELAY , NULL },
145- {PXA168_CLK_PWM0 , "pwm0_clk" , "pll1_48" , CLK_SET_RATE_PARENT , APBC_PWM0 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
146- {PXA168_CLK_PWM1 , "pwm1_clk" , "pll1_48" , CLK_SET_RATE_PARENT , APBC_PWM1 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
147- {PXA168_CLK_PWM2 , "pwm2_clk" , "pll1_48" , CLK_SET_RATE_PARENT , APBC_PWM2 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
148- {PXA168_CLK_PWM3 , "pwm3_clk" , "pll1_48" , CLK_SET_RATE_PARENT , APBC_PWM3 , 0x3 , 0x3 , 0x0 , 0 , & reset_lock },
149- /* The gate clocks has mux parent. */
185+ {PXA168_CLK_PWM0 , "pwm0_clk" , "pwm0_mux" , CLK_SET_RATE_PARENT , APBC_PWM0 , 0x3 , 0x3 , 0x0 , 0 , & pwm0_lock },
186+ {PXA168_CLK_PWM1 , "pwm1_clk" , "pwm1_mux" , CLK_SET_RATE_PARENT , APBC_PWM1 , 0x3 , 0x3 , 0x0 , 0 , & pwm1_lock },
187+ {PXA168_CLK_PWM2 , "pwm2_clk" , "pwm2_mux" , CLK_SET_RATE_PARENT , APBC_PWM2 , 0x3 , 0x3 , 0x0 , 0 , & pwm2_lock },
188+ {PXA168_CLK_PWM3 , "pwm3_clk" , "pwm3_mux" , CLK_SET_RATE_PARENT , APBC_PWM3 , 0x3 , 0x3 , 0x0 , 0 , & pwm3_lock },
150189 {PXA168_CLK_UART0 , "uart0_clk" , "uart0_mux" , CLK_SET_RATE_PARENT , APBC_UART0 , 0x3 , 0x3 , 0x0 , 0 , & uart0_lock },
151190 {PXA168_CLK_UART1 , "uart1_clk" , "uart1_mux" , CLK_SET_RATE_PARENT , APBC_UART1 , 0x3 , 0x3 , 0x0 , 0 , & uart1_lock },
152191 {PXA168_CLK_UART2 , "uart2_clk" , "uart2_mux" , CLK_SET_RATE_PARENT , APBC_UART2 , 0x3 , 0x3 , 0x0 , 0 , & uart2_lock },
@@ -170,22 +209,30 @@ static void pxa168_apb_periph_clk_init(struct pxa168_clk_unit *pxa_unit)
170209
171210}
172211
212+ static DEFINE_SPINLOCK (dfc_lock );
213+ static const char * const dfc_parent_names [] = {"pll1_4" , "pll1_8" };
214+
173215static DEFINE_SPINLOCK (sdh0_lock );
174216static DEFINE_SPINLOCK (sdh1_lock );
175- static const char * sdh_parent_names [] = {"pll1_12" , "pll1_13" };
217+ static DEFINE_SPINLOCK (sdh2_lock );
218+ static DEFINE_SPINLOCK (sdh3_lock );
219+ static const char * const sdh_parent_names [] = {"pll1_13" , "pll1_12" , "pll1_8" };
176220
177221static DEFINE_SPINLOCK (usb_lock );
178222
179223static DEFINE_SPINLOCK (disp0_lock );
180- static const char * disp_parent_names [] = {"pll1_2 " , "pll1_12 " };
224+ static const char * const disp_parent_names [] = {"pll1 " , "pll1_2 " };
181225
182226static DEFINE_SPINLOCK (ccic0_lock );
183- static const char * ccic_parent_names [] = {"pll1_2 " , "pll1_12 " };
184- static const char * ccic_phy_parent_names [] = {"pll1_6" , "pll1_12" };
227+ static const char * const ccic_parent_names [] = {"pll1_4 " , "pll1_8 " };
228+ static const char * const ccic_phy_parent_names [] = {"pll1_6" , "pll1_12" };
185229
186230static struct mmp_param_mux_clk apmu_mux_clks [] = {
187- {0 , "sdh0_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH0 , 6 , 1 , 0 , & sdh0_lock },
188- {0 , "sdh1_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH1 , 6 , 1 , 0 , & sdh1_lock },
231+ {0 , "dfc_mux" , dfc_parent_names , ARRAY_SIZE (dfc_parent_names ), CLK_SET_RATE_PARENT , APMU_DFC , 6 , 1 , 0 , & dfc_lock },
232+ {0 , "sdh0_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH0 , 6 , 2 , 0 , & sdh0_lock },
233+ {0 , "sdh1_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH1 , 6 , 2 , 0 , & sdh1_lock },
234+ {0 , "sdh2_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH2 , 6 , 2 , 0 , & sdh2_lock },
235+ {0 , "sdh3_mux" , sdh_parent_names , ARRAY_SIZE (sdh_parent_names ), CLK_SET_RATE_PARENT , APMU_SDH3 , 6 , 2 , 0 , & sdh3_lock },
189236 {0 , "disp0_mux" , disp_parent_names , ARRAY_SIZE (disp_parent_names ), CLK_SET_RATE_PARENT , APMU_DISP0 , 6 , 1 , 0 , & disp0_lock },
190237 {0 , "ccic0_mux" , ccic_parent_names , ARRAY_SIZE (ccic_parent_names ), CLK_SET_RATE_PARENT , APMU_CCIC0 , 6 , 1 , 0 , & ccic0_lock },
191238 {0 , "ccic0_phy_mux" , ccic_phy_parent_names , ARRAY_SIZE (ccic_phy_parent_names ), CLK_SET_RATE_PARENT , APMU_CCIC0 , 7 , 1 , 0 , & ccic0_lock },
@@ -196,12 +243,16 @@ static struct mmp_param_div_clk apmu_div_clks[] = {
196243};
197244
198245static struct mmp_param_gate_clk apmu_gate_clks [] = {
199- {PXA168_CLK_DFC , "dfc_clk" , "pll1_4 " , CLK_SET_RATE_PARENT , APMU_DFC , 0x19b , 0x19b , 0x0 , 0 , NULL },
246+ {PXA168_CLK_DFC , "dfc_clk" , "dfc_mux " , CLK_SET_RATE_PARENT , APMU_DFC , 0x19b , 0x19b , 0x0 , 0 , & dfc_lock },
200247 {PXA168_CLK_USB , "usb_clk" , "usb_pll" , 0 , APMU_USB , 0x9 , 0x9 , 0x0 , 0 , & usb_lock },
201248 {PXA168_CLK_SPH , "sph_clk" , "usb_pll" , 0 , APMU_USB , 0x12 , 0x12 , 0x0 , 0 , & usb_lock },
202- /* The gate clocks has mux parent. */
203- {PXA168_CLK_SDH0 , "sdh0_clk" , "sdh0_mux" , CLK_SET_RATE_PARENT , APMU_SDH0 , 0x1b , 0x1b , 0x0 , 0 , & sdh0_lock },
204- {PXA168_CLK_SDH1 , "sdh1_clk" , "sdh1_mux" , CLK_SET_RATE_PARENT , APMU_SDH1 , 0x1b , 0x1b , 0x0 , 0 , & sdh1_lock },
249+ {PXA168_CLK_SDH0 , "sdh0_clk" , "sdh0_mux" , CLK_SET_RATE_PARENT , APMU_SDH0 , 0x12 , 0x12 , 0x0 , 0 , & sdh0_lock },
250+ {PXA168_CLK_SDH1 , "sdh1_clk" , "sdh1_mux" , CLK_SET_RATE_PARENT , APMU_SDH1 , 0x12 , 0x12 , 0x0 , 0 , & sdh1_lock },
251+ {PXA168_CLK_SDH2 , "sdh2_clk" , "sdh2_mux" , CLK_SET_RATE_PARENT , APMU_SDH2 , 0x12 , 0x12 , 0x0 , 0 , & sdh2_lock },
252+ {PXA168_CLK_SDH3 , "sdh3_clk" , "sdh3_mux" , CLK_SET_RATE_PARENT , APMU_SDH3 , 0x12 , 0x12 , 0x0 , 0 , & sdh3_lock },
253+ /* SDH0/1 and 2/3 AXI clocks are also gated by common bits in SDH0 and SDH2 registers */
254+ {PXA168_CLK_SDH01_AXI , "sdh01_axi_clk" , NULL , CLK_SET_RATE_PARENT , APMU_SDH0 , 0x9 , 0x9 , 0x0 , 0 , & sdh0_lock },
255+ {PXA168_CLK_SDH23_AXI , "sdh23_axi_clk" , NULL , CLK_SET_RATE_PARENT , APMU_SDH2 , 0x9 , 0x9 , 0x0 , 0 , & sdh2_lock },
205256 {PXA168_CLK_DISP0 , "disp0_clk" , "disp0_mux" , CLK_SET_RATE_PARENT , APMU_DISP0 , 0x1b , 0x1b , 0x0 , 0 , & disp0_lock },
206257 {PXA168_CLK_CCIC0 , "ccic0_clk" , "ccic0_mux" , CLK_SET_RATE_PARENT , APMU_CCIC0 , 0x1b , 0x1b , 0x0 , 0 , & ccic0_lock },
207258 {PXA168_CLK_CCIC0_PHY , "ccic0_phy_clk" , "ccic0_phy_mux" , CLK_SET_RATE_PARENT , APMU_CCIC0 , 0x24 , 0x24 , 0x0 , 0 , & ccic0_lock },
0 commit comments