1e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie/* 2e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * pxa168 clock framework source file 3e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * 4e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * Copyright (C) 2012 Marvell 5e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * Chao Xie <xiechao.mail@gmail.com> 6e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * 7e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * This file is licensed under the terms of the GNU General Public 8e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * License version 2. This program is licensed "as is" without any 9e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie * warranty of any kind, whether express or implied. 10e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie */ 11e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 12e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/module.h> 13e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/kernel.h> 14e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/spinlock.h> 15e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/io.h> 16e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/delay.h> 17e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <linux/err.h> 18e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 19e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include <mach/addr-map.h> 20e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 21e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#include "clk.h" 22e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 23e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_RTC 0x28 24e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_TWSI0 0x2c 25e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_KPC 0x30 26e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_UART0 0x0 27e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_UART1 0x4 28e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_GPIO 0x8 29e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_PWM0 0xc 30e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_PWM1 0x10 31e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_PWM2 0x14 32e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_PWM3 0x18 33e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_SSP0 0x81c 34e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_SSP1 0x820 35e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_SSP2 0x84c 36e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_SSP3 0x858 37e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_SSP4 0x85c 38e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_TWSI1 0x6c 39e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APBC_UART2 0x70 40e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_SDH0 0x54 41e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_SDH1 0x58 42e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_USB 0x5c 43e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_DISP0 0x4c 44e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_CCIC0 0x50 45e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define APMU_DFC 0x60 46e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie#define MPMU_UART_PLL 0x14 47e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 48e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic DEFINE_SPINLOCK(clk_lock); 49e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 50e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic struct clk_factor_masks uart_factor_masks = { 51e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie .factor = 2, 52e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie .num_mask = 0x1fff, 53e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie .den_mask = 0x1fff, 54e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie .num_shift = 16, 55e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie .den_shift = 0, 56e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie}; 57e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 58e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic struct clk_factor_tbl uart_factor_tbl[] = { 59e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie {.num = 8125, .den = 1536}, /*14.745MHZ */ 60e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie}; 61e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 62e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *uart_parent[] = {"pll1_3_16", "uart_pll"}; 63e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *ssp_parent[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"}; 64e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *sdh_parent[] = {"pll1_12", "pll1_13"}; 65e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *disp_parent[] = {"pll1_2", "pll1_12"}; 66e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *ccic_parent[] = {"pll1_2", "pll1_12"}; 67e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xiestatic const char *ccic_phy_parent[] = {"pll1_6", "pll1_12"}; 68e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 69e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xievoid __init pxa168_clk_init(void) 70e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie{ 71e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie struct clk *clk; 72e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie struct clk *uart_pll; 73e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie void __iomem *mpmu_base; 74e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie void __iomem *apmu_base; 75e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie void __iomem *apbc_base; 76e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 77e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie mpmu_base = ioremap(APB_PHYS_BASE + 0x50000, SZ_4K); 78e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie if (mpmu_base == NULL) { 79e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie pr_err("error to ioremap MPMU base\n"); 80e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie return; 81e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie } 82e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 83e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base = ioremap(AXI_PHYS_BASE + 0x82800, SZ_4K); 84e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie if (apmu_base == NULL) { 85e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie pr_err("error to ioremap APMU base\n"); 86e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie return; 87e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie } 88e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 89e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base = ioremap(APB_PHYS_BASE + 0x15000, SZ_4K); 90e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie if (apbc_base == NULL) { 91e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie pr_err("error to ioremap APBC base\n"); 92e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie return; 93e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie } 94e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 95e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_rate(NULL, "clk32", NULL, CLK_IS_ROOT, 3200); 96e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "clk32", NULL); 97e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 98e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_rate(NULL, "vctcxo", NULL, CLK_IS_ROOT, 99e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 26000000); 100e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "vctcxo", NULL); 101e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 102e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_rate(NULL, "pll1", NULL, CLK_IS_ROOT, 103e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 624000000); 104e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1", NULL); 105e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 106e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1", 107e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 108e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_2", NULL); 109e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 110e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2", 111e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 112e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_4", NULL); 113e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 114e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4", 115e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 116e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_8", NULL); 117e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 118e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8", 119e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 120e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_16", NULL); 121e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 122e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_2", 123e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 3); 124e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_6", NULL); 125e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 126e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6", 127e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 128e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_12", NULL); 129e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 130e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_24", "pll1_12", 131e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 132e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_24", NULL); 133e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 134e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_48", "pll1_24", 135e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 136e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_48", NULL); 137e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 138e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_96", "pll1_48", 139e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 2); 140e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_96", NULL); 141e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 142e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_13", "pll1", 143e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 1, 13); 144e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_13", NULL); 145e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 146e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_13_1_5", "pll1", 147e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 2, 3); 148e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_13_1_5", NULL); 149e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 150e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_2_1_5", "pll1", 151e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 2, 3); 152e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_2_1_5", NULL); 153e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 154e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_fixed_factor(NULL, "pll1_3_16", "pll1", 155e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, 3, 16); 156e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "pll1_3_16", NULL); 157e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 158e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0, 159e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie mpmu_base + MPMU_UART_PLL, 160e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie &uart_factor_masks, uart_factor_tbl, 161e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie ARRAY_SIZE(uart_factor_tbl)); 162e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_set_rate(uart_pll, 14745600); 163e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(uart_pll, "uart_pll", NULL); 164e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 165e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("twsi0", "pll1_13_1_5", 166e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_TWSI0, 10, 0, &clk_lock); 167e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0"); 168e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 169e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("twsi1", "pll1_13_1_5", 170e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_TWSI1, 10, 0, &clk_lock); 171e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1"); 172e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 173e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("gpio", "vctcxo", 174e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_GPIO, 10, 0, &clk_lock); 1752cab0292285ce3180224c130d2fb1104aee44ff1Haojian Zhuang clk_register_clkdev(clk, NULL, "mmp-gpio"); 176e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 177e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("kpc", "clk32", 178e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_KPC, 10, 0, &clk_lock); 179e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa27x-keypad"); 180e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 181e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("rtc", "clk32", 182e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_RTC, 10, 0, &clk_lock); 183e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "sa1100-rtc"); 184e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 185e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("pwm0", "pll1_48", 186e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_PWM0, 10, 0, &clk_lock); 187e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa168-pwm.0"); 188e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 189e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("pwm1", "pll1_48", 190e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_PWM1, 10, 0, &clk_lock); 191e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa168-pwm.1"); 192e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 193e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("pwm2", "pll1_48", 194e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_PWM2, 10, 0, &clk_lock); 195e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa168-pwm.2"); 196e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 197e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("pwm3", "pll1_48", 198e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_PWM3, 10, 0, &clk_lock); 199e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa168-pwm.3"); 200e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 201e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "uart0_mux", uart_parent, 202819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(uart_parent), 203819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 204e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART0, 4, 3, 0, &clk_lock); 205e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_set_parent(clk, uart_pll); 206e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "uart_mux.0", NULL); 207e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 208e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("uart0", "uart0_mux", 209e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART0, 10, 0, &clk_lock); 210e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa2xx-uart.0"); 211e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 212e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "uart1_mux", uart_parent, 213819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(uart_parent), 214819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 215e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART1, 4, 3, 0, &clk_lock); 216e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_set_parent(clk, uart_pll); 217e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "uart_mux.1", NULL); 218e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 219e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("uart1", "uart1_mux", 220e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART1, 10, 0, &clk_lock); 221e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa2xx-uart.1"); 222e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 223e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "uart2_mux", uart_parent, 224819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(uart_parent), 225819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 226e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART2, 4, 3, 0, &clk_lock); 227e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_set_parent(clk, uart_pll); 228e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "uart_mux.2", NULL); 229e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 230e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("uart2", "uart2_mux", 231e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_UART2, 10, 0, &clk_lock); 232e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa2xx-uart.2"); 233e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 234e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent, 235819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ssp_parent), 236819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 237e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock); 238e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "uart_mux.0", NULL); 239e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 240e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("ssp0", "ssp0_mux", apbc_base + APBC_SSP0, 241e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 0, &clk_lock); 242e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "mmp-ssp.0"); 243e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 244e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent, 245819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ssp_parent), 246819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 247e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock); 248e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ssp_mux.1", NULL); 249e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 250e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("ssp1", "ssp1_mux", apbc_base + APBC_SSP1, 251e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 0, &clk_lock); 252e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "mmp-ssp.1"); 253e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 254e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent, 255819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ssp_parent), 256819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 257e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock); 258e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ssp_mux.2", NULL); 259e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 260e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("ssp2", "ssp1_mux", apbc_base + APBC_SSP2, 261e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 0, &clk_lock); 262e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "mmp-ssp.2"); 263e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 264e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent, 265819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ssp_parent), 266819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 267e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock); 268e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ssp_mux.3", NULL); 269e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 270e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("ssp3", "ssp1_mux", apbc_base + APBC_SSP3, 271e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 0, &clk_lock); 272e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "mmp-ssp.3"); 273e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 274e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent, 275819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ssp_parent), 276819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 277e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock); 278e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ssp_mux.4", NULL); 279e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 280e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apbc("ssp4", "ssp1_mux", apbc_base + APBC_SSP4, 281e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 0, &clk_lock); 282e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "mmp-ssp.4"); 283e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 284e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("dfc", "pll1_4", apmu_base + APMU_DFC, 285e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 0x19b, &clk_lock); 286e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "pxa3xx-nand.0"); 287e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 288e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent, 289819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(sdh_parent), 290819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 291e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock); 292e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "sdh0_mux", NULL); 293e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 294e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("sdh0", "sdh_mux", apmu_base + APMU_SDH0, 295e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 0x1b, &clk_lock); 296e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "sdhci-pxa.0"); 297e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 298e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent, 299819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(sdh_parent), 300819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 301e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock); 302e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "sdh1_mux", NULL); 303e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 304e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("sdh1", "sdh1_mux", apmu_base + APMU_SDH1, 305e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 0x1b, &clk_lock); 306e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, NULL, "sdhci-pxa.1"); 307e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 308e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("usb", "usb_pll", apmu_base + APMU_USB, 309e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 0x9, &clk_lock); 310e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "usb_clk", NULL); 311e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 312e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("sph", "usb_pll", apmu_base + APMU_USB, 313e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 0x12, &clk_lock); 314e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "sph_clk", NULL); 315e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 316e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "disp0_mux", disp_parent, 317819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(disp_parent), 318819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 319e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock); 320e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "disp_mux.0", NULL); 321e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 322e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("disp0", "disp0_mux", 323e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_DISP0, 0x1b, &clk_lock); 324e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "fnclk", "mmp-disp.0"); 325e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 326e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("disp0_hclk", "disp0_mux", 327e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_DISP0, 0x24, &clk_lock); 328e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "hclk", "mmp-disp.0"); 329e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 330e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent, 331819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan ARRAY_SIZE(ccic_parent), 332819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 333e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock); 334e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ccic_mux.0", NULL); 335e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 336e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("ccic0", "ccic0_mux", 337e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_CCIC0, 0x1b, &clk_lock); 338e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "fnclk", "mmp-ccic.0"); 339e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 340e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent, 341e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie ARRAY_SIZE(ccic_phy_parent), 342819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, 343819c1de344c5b8350bffd35be9a0fa74541292d3James Hogan apmu_base + APMU_CCIC0, 7, 1, 0, &clk_lock); 344e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "ccic_phy_mux.0", NULL); 345e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 346e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux", 347e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_CCIC0, 0x24, &clk_lock); 348e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "phyclk", "mmp-ccic.0"); 349e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 350e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_mux", 351e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0, 352e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 10, 5, 0, &clk_lock); 353e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "sphyclk_div", NULL); 354e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie 355e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div", 356e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie apmu_base + APMU_CCIC0, 0x300, &clk_lock); 357e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0"); 358e1b53b3d0fba5f052d3306bfac01ee40dc3c0d37Chao Xie} 359