Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'clk-hisi-for-v3.16' of https://git.kernel.org/pub/scm/linux/kernel/git/hzhuang1/linux into clk-next-hisilicon

enable hix5hd2 clock

+231 -5
+31
Documentation/devicetree/bindings/clock/hix5hd2-clock.txt
··· 1 + * Hisilicon Hix5hd2 Clock Controller 2 + 3 + The hix5hd2 clock controller generates and supplies clock to various 4 + controllers within the hix5hd2 SoC. 5 + 6 + Required Properties: 7 + 8 + - compatible: should be "hisilicon,hix5hd2-clock" 9 + - reg: Address and length of the register set 10 + - #clock-cells: Should be <1> 11 + 12 + Each clock is assigned an identifier and client nodes use this identifier 13 + to specify the clock which they consume. 14 + 15 + All these identifier could be found in <dt-bindings/clock/hix5hd2-clock.h>. 16 + 17 + Examples: 18 + clock: clock@f8a22000 { 19 + compatible = "hisilicon,hix5hd2-clock"; 20 + reg = <0xf8a22000 0x1000>; 21 + #clock-cells = <1>; 22 + }; 23 + 24 + uart0: uart@f8b00000 { 25 + compatible = "arm,pl011", "arm,primecell"; 26 + reg = <0xf8b00000 0x1000>; 27 + interrupts = <0 49 4>; 28 + clocks = <&clock HIX5HD2_FIXED_83M>; 29 + clock-names = "apb_pclk"; 30 + status = "disabled"; 31 + };
+1
drivers/clk/Makefile
··· 33 33 obj-$(CONFIG_ARCH_BCM_MOBILE) += bcm/ 34 34 obj-$(CONFIG_ARCH_HI3xxx) += hisilicon/ 35 35 obj-$(CONFIG_ARCH_HIP04) += hisilicon/ 36 + obj-$(CONFIG_ARCH_HIX5HD2) += hisilicon/ 36 37 obj-$(CONFIG_COMMON_CLK_KEYSTONE) += keystone/ 37 38 ifeq ($(CONFIG_COMMON_CLK), y) 38 39 obj-$(CONFIG_ARCH_MMP) += mmp/
+1
drivers/clk/hisilicon/Makefile
··· 6 6 7 7 obj-$(CONFIG_ARCH_HI3xxx) += clk-hi3620.o 8 8 obj-$(CONFIG_ARCH_HIP04) += clk-hip04.o 9 + obj-$(CONFIG_ARCH_HIX5HD2) += clk-hix5hd2.o
+101
drivers/clk/hisilicon/clk-hix5hd2.c
··· 1 + /* 2 + * Copyright (c) 2014 Linaro Ltd. 3 + * Copyright (c) 2014 Hisilicon Limited. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + */ 9 + 10 + #include <linux/of_address.h> 11 + #include <dt-bindings/clock/hix5hd2-clock.h> 12 + #include "clk.h" 13 + 14 + static struct hisi_fixed_rate_clock hix5hd2_fixed_rate_clks[] __initdata = { 15 + { HIX5HD2_FIXED_1200M, "1200m", NULL, CLK_IS_ROOT, 1200000000, }, 16 + { HIX5HD2_FIXED_400M, "400m", NULL, CLK_IS_ROOT, 400000000, }, 17 + { HIX5HD2_FIXED_48M, "48m", NULL, CLK_IS_ROOT, 48000000, }, 18 + { HIX5HD2_FIXED_24M, "24m", NULL, CLK_IS_ROOT, 24000000, }, 19 + { HIX5HD2_FIXED_600M, "600m", NULL, CLK_IS_ROOT, 600000000, }, 20 + { HIX5HD2_FIXED_300M, "300m", NULL, CLK_IS_ROOT, 300000000, }, 21 + { HIX5HD2_FIXED_75M, "75m", NULL, CLK_IS_ROOT, 75000000, }, 22 + { HIX5HD2_FIXED_200M, "200m", NULL, CLK_IS_ROOT, 200000000, }, 23 + { HIX5HD2_FIXED_100M, "100m", NULL, CLK_IS_ROOT, 100000000, }, 24 + { HIX5HD2_FIXED_40M, "40m", NULL, CLK_IS_ROOT, 40000000, }, 25 + { HIX5HD2_FIXED_150M, "150m", NULL, CLK_IS_ROOT, 150000000, }, 26 + { HIX5HD2_FIXED_1728M, "1728m", NULL, CLK_IS_ROOT, 1728000000, }, 27 + { HIX5HD2_FIXED_28P8M, "28p8m", NULL, CLK_IS_ROOT, 28000000, }, 28 + { HIX5HD2_FIXED_432M, "432m", NULL, CLK_IS_ROOT, 432000000, }, 29 + { HIX5HD2_FIXED_345P6M, "345p6m", NULL, CLK_IS_ROOT, 345000000, }, 30 + { HIX5HD2_FIXED_288M, "288m", NULL, CLK_IS_ROOT, 288000000, }, 31 + { HIX5HD2_FIXED_60M, "60m", NULL, CLK_IS_ROOT, 60000000, }, 32 + { HIX5HD2_FIXED_750M, "750m", NULL, CLK_IS_ROOT, 750000000, }, 33 + { HIX5HD2_FIXED_500M, "500m", NULL, CLK_IS_ROOT, 500000000, }, 34 + { HIX5HD2_FIXED_54M, "54m", NULL, CLK_IS_ROOT, 54000000, }, 35 + { HIX5HD2_FIXED_27M, "27m", NULL, CLK_IS_ROOT, 27000000, }, 36 + { HIX5HD2_FIXED_1500M, "1500m", NULL, CLK_IS_ROOT, 1500000000, }, 37 + { HIX5HD2_FIXED_375M, "375m", NULL, CLK_IS_ROOT, 375000000, }, 38 + { HIX5HD2_FIXED_187M, "187m", NULL, CLK_IS_ROOT, 187000000, }, 39 + { HIX5HD2_FIXED_250M, "250m", NULL, CLK_IS_ROOT, 250000000, }, 40 + { HIX5HD2_FIXED_125M, "125m", NULL, CLK_IS_ROOT, 125000000, }, 41 + { HIX5HD2_FIXED_2P02M, "2m", NULL, CLK_IS_ROOT, 2000000, }, 42 + { HIX5HD2_FIXED_50M, "50m", NULL, CLK_IS_ROOT, 50000000, }, 43 + { HIX5HD2_FIXED_25M, "25m", NULL, CLK_IS_ROOT, 25000000, }, 44 + { HIX5HD2_FIXED_83M, "83m", NULL, CLK_IS_ROOT, 83333333, }, 45 + }; 46 + 47 + static const char *sfc_mux_p[] __initconst = { 48 + "24m", "150m", "200m", "100m", "75m", }; 49 + static u32 sfc_mux_table[] = {0, 4, 5, 6, 7}; 50 + 51 + static const char *sdio1_mux_p[] __initconst = { 52 + "75m", "100m", "50m", "15m", }; 53 + static u32 sdio1_mux_table[] = {0, 1, 2, 3}; 54 + 55 + static const char *fephy_mux_p[] __initconst = { "25m", "125m"}; 56 + static u32 fephy_mux_table[] = {0, 1}; 57 + 58 + 59 + static struct hisi_mux_clock hix5hd2_mux_clks[] __initdata = { 60 + { HIX5HD2_SFC_MUX, "sfc_mux", sfc_mux_p, ARRAY_SIZE(sfc_mux_p), 61 + CLK_SET_RATE_PARENT, 0x5c, 8, 3, 0, sfc_mux_table, }, 62 + { HIX5HD2_MMC_MUX, "mmc_mux", sdio1_mux_p, ARRAY_SIZE(sdio1_mux_p), 63 + CLK_SET_RATE_PARENT, 0xa0, 8, 2, 0, sdio1_mux_table, }, 64 + { HIX5HD2_FEPHY_MUX, "fephy_mux", 65 + fephy_mux_p, ARRAY_SIZE(fephy_mux_p), 66 + CLK_SET_RATE_PARENT, 0x120, 8, 2, 0, fephy_mux_table, }, 67 + }; 68 + 69 + static struct hisi_gate_clock hix5hd2_gate_clks[] __initdata = { 70 + /*sfc*/ 71 + { HIX5HD2_SFC_CLK, "clk_sfc", "sfc_mux", 72 + CLK_SET_RATE_PARENT, 0x5c, 0, 0, }, 73 + { HIX5HD2_SFC_RST, "rst_sfc", "clk_sfc", 74 + CLK_SET_RATE_PARENT, 0x5c, 4, CLK_GATE_SET_TO_DISABLE, }, 75 + /*sdio1*/ 76 + { HIX5HD2_MMC_BIU_CLK, "clk_mmc_biu", "200m", 77 + CLK_SET_RATE_PARENT, 0xa0, 0, 0, }, 78 + { HIX5HD2_MMC_CIU_CLK, "clk_mmc_ciu", "mmc_mux", 79 + CLK_SET_RATE_PARENT, 0xa0, 1, 0, }, 80 + { HIX5HD2_MMC_CIU_RST, "rst_mmc_ciu", "clk_mmc_ciu", 81 + CLK_SET_RATE_PARENT, 0xa0, 4, CLK_GATE_SET_TO_DISABLE, }, 82 + }; 83 + 84 + static void __init hix5hd2_clk_init(struct device_node *np) 85 + { 86 + struct hisi_clock_data *clk_data; 87 + 88 + clk_data = hisi_clk_init(np, HIX5HD2_NR_CLKS); 89 + if (!clk_data) 90 + return; 91 + 92 + hisi_clk_register_fixed_rate(hix5hd2_fixed_rate_clks, 93 + ARRAY_SIZE(hix5hd2_fixed_rate_clks), 94 + clk_data); 95 + hisi_clk_register_mux(hix5hd2_mux_clks, ARRAY_SIZE(hix5hd2_mux_clks), 96 + clk_data); 97 + hisi_clk_register_gate(hix5hd2_gate_clks, 98 + ARRAY_SIZE(hix5hd2_gate_clks), clk_data); 99 + } 100 + 101 + CLK_OF_DECLARE(hix5hd2_clk, "hisilicon,hix5hd2-clock", hix5hd2_clk_init);
+36 -5
drivers/clk/hisilicon/clk.c
··· 127 127 int i; 128 128 129 129 for (i = 0; i < nums; i++) { 130 - clk = clk_register_mux(NULL, clks[i].name, clks[i].parent_names, 131 - clks[i].num_parents, clks[i].flags, 132 - base + clks[i].offset, clks[i].shift, 133 - clks[i].width, clks[i].mux_flags, 134 - &hisi_clk_lock); 130 + u32 mask = BIT(clks[i].width) - 1; 131 + 132 + clk = clk_register_mux_table(NULL, clks[i].name, 133 + clks[i].parent_names, 134 + clks[i].num_parents, clks[i].flags, 135 + base + clks[i].offset, clks[i].shift, 136 + mask, clks[i].mux_flags, 137 + clks[i].table, &hisi_clk_lock); 135 138 if (IS_ERR(clk)) { 136 139 pr_err("%s: failed to register clock %s\n", 137 140 __func__, clks[i].name); ··· 164 161 clks[i].div_flags, 165 162 clks[i].table, 166 163 &hisi_clk_lock); 164 + if (IS_ERR(clk)) { 165 + pr_err("%s: failed to register clock %s\n", 166 + __func__, clks[i].name); 167 + continue; 168 + } 169 + 170 + if (clks[i].alias) 171 + clk_register_clkdev(clk, clks[i].alias, NULL); 172 + 173 + data->clk_data.clks[clks[i].id] = clk; 174 + } 175 + } 176 + 177 + void __init hisi_clk_register_gate(struct hisi_gate_clock *clks, 178 + int nums, struct hisi_clock_data *data) 179 + { 180 + struct clk *clk; 181 + void __iomem *base = data->base; 182 + int i; 183 + 184 + for (i = 0; i < nums; i++) { 185 + clk = clk_register_gate(NULL, clks[i].name, 186 + clks[i].parent_name, 187 + clks[i].flags, 188 + base + clks[i].offset, 189 + clks[i].bit_idx, 190 + clks[i].gate_flags, 191 + &hisi_clk_lock); 167 192 if (IS_ERR(clk)) { 168 193 pr_err("%s: failed to register clock %s\n", 169 194 __func__, clks[i].name);
+3
drivers/clk/hisilicon/clk.h
··· 62 62 u8 shift; 63 63 u8 width; 64 64 u8 mux_flags; 65 + u32 *table; 65 66 const char *alias; 66 67 }; 67 68 ··· 104 103 struct hisi_clock_data *); 105 104 void __init hisi_clk_register_divider(struct hisi_divider_clock *, 106 105 int, struct hisi_clock_data *); 106 + void __init hisi_clk_register_gate(struct hisi_gate_clock *, 107 + int, struct hisi_clock_data *); 107 108 void __init hisi_clk_register_gate_sep(struct hisi_gate_clock *, 108 109 int, struct hisi_clock_data *); 109 110 #endif /* __HISI_CLK_H */
+58
include/dt-bindings/clock/hix5hd2-clock.h
··· 1 + /* 2 + * Copyright (c) 2014 Linaro Ltd. 3 + * Copyright (c) 2014 Hisilicon Limited. 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms and conditions of the GNU General Public License, 7 + * version 2, as published by the Free Software Foundation. 8 + */ 9 + 10 + #ifndef __DTS_HIX5HD2_CLOCK_H 11 + #define __DTS_HIX5HD2_CLOCK_H 12 + 13 + /* fixed rate */ 14 + #define HIX5HD2_FIXED_1200M 1 15 + #define HIX5HD2_FIXED_400M 2 16 + #define HIX5HD2_FIXED_48M 3 17 + #define HIX5HD2_FIXED_24M 4 18 + #define HIX5HD2_FIXED_600M 5 19 + #define HIX5HD2_FIXED_300M 6 20 + #define HIX5HD2_FIXED_75M 7 21 + #define HIX5HD2_FIXED_200M 8 22 + #define HIX5HD2_FIXED_100M 9 23 + #define HIX5HD2_FIXED_40M 10 24 + #define HIX5HD2_FIXED_150M 11 25 + #define HIX5HD2_FIXED_1728M 12 26 + #define HIX5HD2_FIXED_28P8M 13 27 + #define HIX5HD2_FIXED_432M 14 28 + #define HIX5HD2_FIXED_345P6M 15 29 + #define HIX5HD2_FIXED_288M 16 30 + #define HIX5HD2_FIXED_60M 17 31 + #define HIX5HD2_FIXED_750M 18 32 + #define HIX5HD2_FIXED_500M 19 33 + #define HIX5HD2_FIXED_54M 20 34 + #define HIX5HD2_FIXED_27M 21 35 + #define HIX5HD2_FIXED_1500M 22 36 + #define HIX5HD2_FIXED_375M 23 37 + #define HIX5HD2_FIXED_187M 24 38 + #define HIX5HD2_FIXED_250M 25 39 + #define HIX5HD2_FIXED_125M 26 40 + #define HIX5HD2_FIXED_2P02M 27 41 + #define HIX5HD2_FIXED_50M 28 42 + #define HIX5HD2_FIXED_25M 29 43 + #define HIX5HD2_FIXED_83M 30 44 + 45 + /* mux clocks */ 46 + #define HIX5HD2_SFC_MUX 64 47 + #define HIX5HD2_MMC_MUX 65 48 + #define HIX5HD2_FEPHY_MUX 66 49 + 50 + /* gate clocks */ 51 + #define HIX5HD2_SFC_RST 128 52 + #define HIX5HD2_SFC_CLK 129 53 + #define HIX5HD2_MMC_CIU_CLK 130 54 + #define HIX5HD2_MMC_BIU_CLK 131 55 + #define HIX5HD2_MMC_CIU_RST 132 56 + 57 + #define HIX5HD2_NR_CLKS 256 58 + #endif /* __DTS_HIX5HD2_CLOCK_H */