18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * mmp2 clock framework source file 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2012 Marvell 58c2ecf20Sopenharmony_ci * Chao Xie <xiechao.mail@gmail.com> 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * This file is licensed under the terms of the GNU General Public 88c2ecf20Sopenharmony_ci * License version 2. This program is licensed "as is" without any 98c2ecf20Sopenharmony_ci * warranty of any kind, whether express or implied. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/clk.h> 138c2ecf20Sopenharmony_ci#include <linux/module.h> 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 168c2ecf20Sopenharmony_ci#include <linux/io.h> 178c2ecf20Sopenharmony_ci#include <linux/delay.h> 188c2ecf20Sopenharmony_ci#include <linux/err.h> 198c2ecf20Sopenharmony_ci#include <linux/clk/mmp.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#include "clk.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#define APBC_RTC 0x0 248c2ecf20Sopenharmony_ci#define APBC_TWSI0 0x4 258c2ecf20Sopenharmony_ci#define APBC_TWSI1 0x8 268c2ecf20Sopenharmony_ci#define APBC_TWSI2 0xc 278c2ecf20Sopenharmony_ci#define APBC_TWSI3 0x10 288c2ecf20Sopenharmony_ci#define APBC_TWSI4 0x7c 298c2ecf20Sopenharmony_ci#define APBC_TWSI5 0x80 308c2ecf20Sopenharmony_ci#define APBC_KPC 0x18 318c2ecf20Sopenharmony_ci#define APBC_UART0 0x2c 328c2ecf20Sopenharmony_ci#define APBC_UART1 0x30 338c2ecf20Sopenharmony_ci#define APBC_UART2 0x34 348c2ecf20Sopenharmony_ci#define APBC_UART3 0x88 358c2ecf20Sopenharmony_ci#define APBC_GPIO 0x38 368c2ecf20Sopenharmony_ci#define APBC_PWM0 0x3c 378c2ecf20Sopenharmony_ci#define APBC_PWM1 0x40 388c2ecf20Sopenharmony_ci#define APBC_PWM2 0x44 398c2ecf20Sopenharmony_ci#define APBC_PWM3 0x48 408c2ecf20Sopenharmony_ci#define APBC_SSP0 0x50 418c2ecf20Sopenharmony_ci#define APBC_SSP1 0x54 428c2ecf20Sopenharmony_ci#define APBC_SSP2 0x58 438c2ecf20Sopenharmony_ci#define APBC_SSP3 0x5c 448c2ecf20Sopenharmony_ci#define APMU_SDH0 0x54 458c2ecf20Sopenharmony_ci#define APMU_SDH1 0x58 468c2ecf20Sopenharmony_ci#define APMU_SDH2 0xe8 478c2ecf20Sopenharmony_ci#define APMU_SDH3 0xec 488c2ecf20Sopenharmony_ci#define APMU_USB 0x5c 498c2ecf20Sopenharmony_ci#define APMU_DISP0 0x4c 508c2ecf20Sopenharmony_ci#define APMU_DISP1 0x110 518c2ecf20Sopenharmony_ci#define APMU_CCIC0 0x50 528c2ecf20Sopenharmony_ci#define APMU_CCIC1 0xf4 538c2ecf20Sopenharmony_ci#define MPMU_UART_PLL 0x14 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic DEFINE_SPINLOCK(clk_lock); 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic struct mmp_clk_factor_masks uart_factor_masks = { 588c2ecf20Sopenharmony_ci .factor = 2, 598c2ecf20Sopenharmony_ci .num_mask = 0x1fff, 608c2ecf20Sopenharmony_ci .den_mask = 0x1fff, 618c2ecf20Sopenharmony_ci .num_shift = 16, 628c2ecf20Sopenharmony_ci .den_shift = 0, 638c2ecf20Sopenharmony_ci}; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic struct mmp_clk_factor_tbl uart_factor_tbl[] = { 668c2ecf20Sopenharmony_ci {.num = 8125, .den = 1536}, /*14.745MHZ */ 678c2ecf20Sopenharmony_ci {.num = 3521, .den = 689}, /*19.23MHZ */ 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistatic const char *uart_parent[] = {"uart_pll", "vctcxo"}; 718c2ecf20Sopenharmony_cistatic const char *ssp_parent[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"}; 728c2ecf20Sopenharmony_cistatic const char *sdh_parent[] = {"pll1_4", "pll2", "usb_pll", "pll1"}; 738c2ecf20Sopenharmony_cistatic const char *disp_parent[] = {"pll1", "pll1_16", "pll2", "vctcxo"}; 748c2ecf20Sopenharmony_cistatic const char *ccic_parent[] = {"pll1_2", "pll1_16", "vctcxo"}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_civoid __init mmp2_clk_init(phys_addr_t mpmu_phys, phys_addr_t apmu_phys, 778c2ecf20Sopenharmony_ci phys_addr_t apbc_phys) 788c2ecf20Sopenharmony_ci{ 798c2ecf20Sopenharmony_ci struct clk *clk; 808c2ecf20Sopenharmony_ci struct clk *vctcxo; 818c2ecf20Sopenharmony_ci void __iomem *mpmu_base; 828c2ecf20Sopenharmony_ci void __iomem *apmu_base; 838c2ecf20Sopenharmony_ci void __iomem *apbc_base; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci mpmu_base = ioremap(mpmu_phys, SZ_4K); 868c2ecf20Sopenharmony_ci if (!mpmu_base) { 878c2ecf20Sopenharmony_ci pr_err("error to ioremap MPMU base\n"); 888c2ecf20Sopenharmony_ci return; 898c2ecf20Sopenharmony_ci } 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci apmu_base = ioremap(apmu_phys, SZ_4K); 928c2ecf20Sopenharmony_ci if (!apmu_base) { 938c2ecf20Sopenharmony_ci pr_err("error to ioremap APMU base\n"); 948c2ecf20Sopenharmony_ci return; 958c2ecf20Sopenharmony_ci } 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci apbc_base = ioremap(apbc_phys, SZ_4K); 988c2ecf20Sopenharmony_ci if (!apbc_base) { 998c2ecf20Sopenharmony_ci pr_err("error to ioremap APBC base\n"); 1008c2ecf20Sopenharmony_ci return; 1018c2ecf20Sopenharmony_ci } 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci clk = clk_register_fixed_rate(NULL, "clk32", NULL, 0, 3200); 1048c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "clk32", NULL); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci vctcxo = clk_register_fixed_rate(NULL, "vctcxo", NULL, 0, 26000000); 1078c2ecf20Sopenharmony_ci clk_register_clkdev(vctcxo, "vctcxo", NULL); 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci clk = clk_register_fixed_rate(NULL, "pll1", NULL, 0, 800000000); 1108c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1", NULL); 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci clk = clk_register_fixed_rate(NULL, "usb_pll", NULL, 0, 480000000); 1138c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "usb_pll", NULL); 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci clk = clk_register_fixed_rate(NULL, "pll2", NULL, 0, 960000000); 1168c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2", NULL); 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1", 1198c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1208c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_2", NULL); 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2", 1238c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1248c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_4", NULL); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4", 1278c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1288c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_8", NULL); 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8", 1318c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1328c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_16", NULL); 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_20", "pll1_4", 1358c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 5); 1368c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_20", NULL); 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_3", "pll1", 1398c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 3); 1408c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_3", NULL); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_3", 1438c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1448c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_6", NULL); 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6", 1478c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1488c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll1_12", NULL); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_2", "pll2", 1518c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1528c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_2", NULL); 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_4", "pll2_2", 1558c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1568c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_4", NULL); 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_8", "pll2_4", 1598c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1608c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_8", NULL); 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_16", "pll2_8", 1638c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1648c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_16", NULL); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_3", "pll2", 1678c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 3); 1688c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_3", NULL); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_6", "pll2_3", 1718c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1728c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_6", NULL); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "pll2_12", "pll2_6", 1758c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1768c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "pll2_12", NULL); 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "vctcxo_2", "vctcxo", 1798c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1808c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "vctcxo_2", NULL); 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci clk = clk_register_fixed_factor(NULL, "vctcxo_4", "vctcxo_2", 1838c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, 1, 2); 1848c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "vctcxo_4", NULL); 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci clk = mmp_clk_register_factor("uart_pll", "pll1_4", 0, 1878c2ecf20Sopenharmony_ci mpmu_base + MPMU_UART_PLL, 1888c2ecf20Sopenharmony_ci &uart_factor_masks, uart_factor_tbl, 1898c2ecf20Sopenharmony_ci ARRAY_SIZE(uart_factor_tbl), &clk_lock); 1908c2ecf20Sopenharmony_ci clk_set_rate(clk, 14745600); 1918c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_pll", NULL); 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi0", "vctcxo", 1948c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI0, 10, 0, &clk_lock); 1958c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0"); 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi1", "vctcxo", 1988c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI1, 10, 0, &clk_lock); 1998c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1"); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi2", "vctcxo", 2028c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI2, 10, 0, &clk_lock); 2038c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.2"); 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi3", "vctcxo", 2068c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI3, 10, 0, &clk_lock); 2078c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.3"); 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi4", "vctcxo", 2108c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI4, 10, 0, &clk_lock); 2118c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.4"); 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("twsi5", "vctcxo", 2148c2ecf20Sopenharmony_ci apbc_base + APBC_TWSI5, 10, 0, &clk_lock); 2158c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-i2c.5"); 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("gpio", "vctcxo", 2188c2ecf20Sopenharmony_ci apbc_base + APBC_GPIO, 10, 0, &clk_lock); 2198c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp2-gpio"); 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("kpc", "clk32", 2228c2ecf20Sopenharmony_ci apbc_base + APBC_KPC, 10, 0, &clk_lock); 2238c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa27x-keypad"); 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("rtc", "clk32", 2268c2ecf20Sopenharmony_ci apbc_base + APBC_RTC, 10, 0, &clk_lock); 2278c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-rtc"); 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("pwm0", "vctcxo", 2308c2ecf20Sopenharmony_ci apbc_base + APBC_PWM0, 10, 0, &clk_lock); 2318c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp2-pwm.0"); 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("pwm1", "vctcxo", 2348c2ecf20Sopenharmony_ci apbc_base + APBC_PWM1, 10, 0, &clk_lock); 2358c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp2-pwm.1"); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("pwm2", "vctcxo", 2388c2ecf20Sopenharmony_ci apbc_base + APBC_PWM2, 10, 0, &clk_lock); 2398c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp2-pwm.2"); 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("pwm3", "vctcxo", 2428c2ecf20Sopenharmony_ci apbc_base + APBC_PWM3, 10, 0, &clk_lock); 2438c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp2-pwm.3"); 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "uart0_mux", uart_parent, 2468c2ecf20Sopenharmony_ci ARRAY_SIZE(uart_parent), 2478c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2488c2ecf20Sopenharmony_ci apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); 2498c2ecf20Sopenharmony_ci clk_set_parent(clk, vctcxo); 2508c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_mux.0", NULL); 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("uart0", "uart0_mux", 2538c2ecf20Sopenharmony_ci apbc_base + APBC_UART0, 10, 0, &clk_lock); 2548c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "uart1_mux", uart_parent, 2578c2ecf20Sopenharmony_ci ARRAY_SIZE(uart_parent), 2588c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2598c2ecf20Sopenharmony_ci apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); 2608c2ecf20Sopenharmony_ci clk_set_parent(clk, vctcxo); 2618c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_mux.1", NULL); 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("uart1", "uart1_mux", 2648c2ecf20Sopenharmony_ci apbc_base + APBC_UART1, 10, 0, &clk_lock); 2658c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "uart2_mux", uart_parent, 2688c2ecf20Sopenharmony_ci ARRAY_SIZE(uart_parent), 2698c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2708c2ecf20Sopenharmony_ci apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); 2718c2ecf20Sopenharmony_ci clk_set_parent(clk, vctcxo); 2728c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_mux.2", NULL); 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("uart2", "uart2_mux", 2758c2ecf20Sopenharmony_ci apbc_base + APBC_UART2, 10, 0, &clk_lock); 2768c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "uart3_mux", uart_parent, 2798c2ecf20Sopenharmony_ci ARRAY_SIZE(uart_parent), 2808c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2818c2ecf20Sopenharmony_ci apbc_base + APBC_UART3, 4, 3, 0, &clk_lock); 2828c2ecf20Sopenharmony_ci clk_set_parent(clk, vctcxo); 2838c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_mux.3", NULL); 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("uart3", "uart3_mux", 2868c2ecf20Sopenharmony_ci apbc_base + APBC_UART3, 10, 0, &clk_lock); 2878c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "pxa2xx-uart.3"); 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, 2908c2ecf20Sopenharmony_ci ARRAY_SIZE(ssp_parent), 2918c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 2928c2ecf20Sopenharmony_ci apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); 2938c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "uart_mux.0", NULL); 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("ssp0", "ssp0_mux", 2968c2ecf20Sopenharmony_ci apbc_base + APBC_SSP0, 10, 0, &clk_lock); 2978c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-ssp.0"); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, 3008c2ecf20Sopenharmony_ci ARRAY_SIZE(ssp_parent), 3018c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3028c2ecf20Sopenharmony_ci apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); 3038c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ssp_mux.1", NULL); 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("ssp1", "ssp1_mux", 3068c2ecf20Sopenharmony_ci apbc_base + APBC_SSP1, 10, 0, &clk_lock); 3078c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-ssp.1"); 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, 3108c2ecf20Sopenharmony_ci ARRAY_SIZE(ssp_parent), 3118c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3128c2ecf20Sopenharmony_ci apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); 3138c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ssp_mux.2", NULL); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("ssp2", "ssp2_mux", 3168c2ecf20Sopenharmony_ci apbc_base + APBC_SSP2, 10, 0, &clk_lock); 3178c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-ssp.2"); 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, 3208c2ecf20Sopenharmony_ci ARRAY_SIZE(ssp_parent), 3218c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3228c2ecf20Sopenharmony_ci apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); 3238c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ssp_mux.3", NULL); 3248c2ecf20Sopenharmony_ci 3258c2ecf20Sopenharmony_ci clk = mmp_clk_register_apbc("ssp3", "ssp3_mux", 3268c2ecf20Sopenharmony_ci apbc_base + APBC_SSP3, 10, 0, &clk_lock); 3278c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-ssp.3"); 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "sdh_mux", sdh_parent, 3308c2ecf20Sopenharmony_ci ARRAY_SIZE(sdh_parent), 3318c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3328c2ecf20Sopenharmony_ci apmu_base + APMU_SDH0, 8, 2, 0, &clk_lock); 3338c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sdh_mux", NULL); 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "sdh_div", "sdh_mux", 3368c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_SDH0, 3378c2ecf20Sopenharmony_ci 10, 4, CLK_DIVIDER_ONE_BASED, &clk_lock); 3388c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sdh_div", NULL); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("sdh0", "sdh_div", apmu_base + APMU_SDH0, 3418c2ecf20Sopenharmony_ci 0x1b, &clk_lock); 3428c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "sdhci-pxav3.0"); 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("sdh1", "sdh_div", apmu_base + APMU_SDH1, 3458c2ecf20Sopenharmony_ci 0x1b, &clk_lock); 3468c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "sdhci-pxav3.1"); 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("sdh2", "sdh_div", apmu_base + APMU_SDH2, 3498c2ecf20Sopenharmony_ci 0x1b, &clk_lock); 3508c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "sdhci-pxav3.2"); 3518c2ecf20Sopenharmony_ci 3528c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("sdh3", "sdh_div", apmu_base + APMU_SDH3, 3538c2ecf20Sopenharmony_ci 0x1b, &clk_lock); 3548c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "sdhci-pxav3.3"); 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("usb", "usb_pll", apmu_base + APMU_USB, 3578c2ecf20Sopenharmony_ci 0x9, &clk_lock); 3588c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "usb_clk", NULL); 3598c2ecf20Sopenharmony_ci 3608c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "disp0_mux", disp_parent, 3618c2ecf20Sopenharmony_ci ARRAY_SIZE(disp_parent), 3628c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3638c2ecf20Sopenharmony_ci apmu_base + APMU_DISP0, 6, 2, 0, &clk_lock); 3648c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_mux.0", NULL); 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "disp0_div", "disp0_mux", 3678c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_DISP0, 3688c2ecf20Sopenharmony_ci 8, 4, CLK_DIVIDER_ONE_BASED, &clk_lock); 3698c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_div.0", NULL); 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("disp0", "disp0_div", 3728c2ecf20Sopenharmony_ci apmu_base + APMU_DISP0, 0x1b, &clk_lock); 3738c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-disp.0"); 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "disp0_sphy_div", "disp0_mux", 0, 3768c2ecf20Sopenharmony_ci apmu_base + APMU_DISP0, 15, 5, 0, &clk_lock); 3778c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_sphy_div.0", NULL); 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("disp0_sphy", "disp0_sphy_div", 3808c2ecf20Sopenharmony_ci apmu_base + APMU_DISP0, 0x1024, &clk_lock); 3818c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_sphy.0", NULL); 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "disp1_mux", disp_parent, 3848c2ecf20Sopenharmony_ci ARRAY_SIZE(disp_parent), 3858c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 3868c2ecf20Sopenharmony_ci apmu_base + APMU_DISP1, 6, 2, 0, &clk_lock); 3878c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_mux.1", NULL); 3888c2ecf20Sopenharmony_ci 3898c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "disp1_div", "disp1_mux", 3908c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_DISP1, 3918c2ecf20Sopenharmony_ci 8, 4, CLK_DIVIDER_ONE_BASED, &clk_lock); 3928c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "disp_div.1", NULL); 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("disp1", "disp1_div", 3958c2ecf20Sopenharmony_ci apmu_base + APMU_DISP1, 0x1b, &clk_lock); 3968c2ecf20Sopenharmony_ci clk_register_clkdev(clk, NULL, "mmp-disp.1"); 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic_arbiter", "vctcxo", 3998c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC0, 0x1800, &clk_lock); 4008c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ccic_arbiter", NULL); 4018c2ecf20Sopenharmony_ci 4028c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, 4038c2ecf20Sopenharmony_ci ARRAY_SIZE(ccic_parent), 4048c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 4058c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC0, 6, 2, 0, &clk_lock); 4068c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ccic_mux.0", NULL); 4078c2ecf20Sopenharmony_ci 4088c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "ccic0_div", "ccic0_mux", 4098c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, 4108c2ecf20Sopenharmony_ci 17, 4, CLK_DIVIDER_ONE_BASED, &clk_lock); 4118c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ccic_div.0", NULL); 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic0", "ccic0_div", 4148c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC0, 0x1b, &clk_lock); 4158c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "fnclk", "mmp-ccic.0"); 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_div", 4188c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC0, 0x24, &clk_lock); 4198c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "phyclk", "mmp-ccic.0"); 4208c2ecf20Sopenharmony_ci 4218c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_div", 4228c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, 4238c2ecf20Sopenharmony_ci 10, 5, 0, &clk_lock); 4248c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sphyclk_div", "mmp-ccic.0"); 4258c2ecf20Sopenharmony_ci 4268c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div", 4278c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC0, 0x300, &clk_lock); 4288c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0"); 4298c2ecf20Sopenharmony_ci 4308c2ecf20Sopenharmony_ci clk = clk_register_mux(NULL, "ccic1_mux", ccic_parent, 4318c2ecf20Sopenharmony_ci ARRAY_SIZE(ccic_parent), 4328c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 4338c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC1, 6, 2, 0, &clk_lock); 4348c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ccic_mux.1", NULL); 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "ccic1_div", "ccic1_mux", 4378c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC1, 4388c2ecf20Sopenharmony_ci 16, 4, CLK_DIVIDER_ONE_BASED, &clk_lock); 4398c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "ccic_div.1", NULL); 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic1", "ccic1_div", 4428c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC1, 0x1b, &clk_lock); 4438c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "fnclk", "mmp-ccic.1"); 4448c2ecf20Sopenharmony_ci 4458c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic1_phy", "ccic1_div", 4468c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC1, 0x24, &clk_lock); 4478c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "phyclk", "mmp-ccic.1"); 4488c2ecf20Sopenharmony_ci 4498c2ecf20Sopenharmony_ci clk = clk_register_divider(NULL, "ccic1_sphy_div", "ccic1_div", 4508c2ecf20Sopenharmony_ci CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC1, 4518c2ecf20Sopenharmony_ci 10, 5, 0, &clk_lock); 4528c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sphyclk_div", "mmp-ccic.1"); 4538c2ecf20Sopenharmony_ci 4548c2ecf20Sopenharmony_ci clk = mmp_clk_register_apmu("ccic1_sphy", "ccic1_sphy_div", 4558c2ecf20Sopenharmony_ci apmu_base + APMU_CCIC1, 0x300, &clk_lock); 4568c2ecf20Sopenharmony_ci clk_register_clkdev(clk, "sphyclk", "mmp-ccic.1"); 4578c2ecf20Sopenharmony_ci} 458