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