diff options
| -rw-r--r-- | drivers/clk/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/clk/Makefile | 1 | ||||
| -rw-r--r-- | drivers/clk/bcm/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/clk/bcm/Makefile | 3 | ||||
| -rw-r--r-- | drivers/clk/bcm/clk-bcm281xx.c | 416 | ||||
| -rw-r--r-- | drivers/clk/bcm/clk-kona-setup.c | 769 | ||||
| -rw-r--r-- | drivers/clk/bcm/clk-kona.c | 1033 | ||||
| -rw-r--r-- | drivers/clk/bcm/clk-kona.h | 410 | ||||
| -rw-r--r-- | include/dt-bindings/clock/bcm281xx.h | 65 |
9 files changed, 2707 insertions, 0 deletions
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 7641965d208d..f9f605695e40 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig | |||
| @@ -111,4 +111,5 @@ source "drivers/clk/qcom/Kconfig" | |||
| 111 | 111 | ||
| 112 | endmenu | 112 | endmenu |
| 113 | 113 | ||
| 114 | source "drivers/clk/bcm/Kconfig" | ||
| 114 | source "drivers/clk/mvebu/Kconfig" | 115 | source "drivers/clk/mvebu/Kconfig" |
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index a367a9831717..88af4a399d6c 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile | |||
| @@ -29,6 +29,7 @@ obj-$(CONFIG_ARCH_VT8500) += clk-vt8500.o | |||
| 29 | obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o | 29 | obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o |
| 30 | obj-$(CONFIG_COMMON_CLK_XGENE) += clk-xgene.o | 30 | obj-$(CONFIG_COMMON_CLK_XGENE) += clk-xgene.o |
| 31 | obj-$(CONFIG_COMMON_CLK_AT91) += at91/ | 31 | obj-$(CONFIG_COMMON_CLK_AT91) += at91/ |
| 32 | obj-$(CONFIG_ARCH_BCM_MOBILE) += bcm/ | ||
| 32 | obj-$(CONFIG_ARCH_HI3xxx) += hisilicon/ | 33 | obj-$(CONFIG_ARCH_HI3xxx) += hisilicon/ |
| 33 | obj-$(CONFIG_COMMON_CLK_KEYSTONE) += keystone/ | 34 | obj-$(CONFIG_COMMON_CLK_KEYSTONE) += keystone/ |
| 34 | ifeq ($(CONFIG_COMMON_CLK), y) | 35 | ifeq ($(CONFIG_COMMON_CLK), y) |
diff --git a/drivers/clk/bcm/Kconfig b/drivers/clk/bcm/Kconfig new file mode 100644 index 000000000000..a7262fb8ce55 --- /dev/null +++ b/drivers/clk/bcm/Kconfig | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | config CLK_BCM_KONA | ||
| 2 | bool "Broadcom Kona CCU clock support" | ||
| 3 | depends on ARCH_BCM_MOBILE | ||
| 4 | depends on COMMON_CLK | ||
| 5 | default y | ||
| 6 | help | ||
| 7 | Enable common clock framework support for Broadcom SoCs | ||
| 8 | using "Kona" style clock control units, including those | ||
| 9 | in the BCM281xx family. | ||
diff --git a/drivers/clk/bcm/Makefile b/drivers/clk/bcm/Makefile new file mode 100644 index 000000000000..cf93359aa862 --- /dev/null +++ b/drivers/clk/bcm/Makefile | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | obj-$(CONFIG_CLK_BCM_KONA) += clk-kona.o | ||
| 2 | obj-$(CONFIG_CLK_BCM_KONA) += clk-kona-setup.o | ||
| 3 | obj-$(CONFIG_CLK_BCM_KONA) += clk-bcm281xx.o | ||
diff --git a/drivers/clk/bcm/clk-bcm281xx.c b/drivers/clk/bcm/clk-bcm281xx.c new file mode 100644 index 000000000000..3c66de696aeb --- /dev/null +++ b/drivers/clk/bcm/clk-bcm281xx.c | |||
| @@ -0,0 +1,416 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Broadcom Corporation | ||
| 3 | * Copyright 2013 Linaro Limited | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation version 2. | ||
| 8 | * | ||
| 9 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 10 | * kind, whether express or implied; without even the implied warranty | ||
| 11 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include "clk-kona.h" | ||
| 16 | #include "dt-bindings/clock/bcm281xx.h" | ||
| 17 | |||
| 18 | /* bcm11351 CCU device tree "compatible" strings */ | ||
| 19 | #define BCM11351_DT_ROOT_CCU_COMPAT "brcm,bcm11351-root-ccu" | ||
| 20 | #define BCM11351_DT_AON_CCU_COMPAT "brcm,bcm11351-aon-ccu" | ||
| 21 | #define BCM11351_DT_HUB_CCU_COMPAT "brcm,bcm11351-hub-ccu" | ||
| 22 | #define BCM11351_DT_MASTER_CCU_COMPAT "brcm,bcm11351-master-ccu" | ||
| 23 | #define BCM11351_DT_SLAVE_CCU_COMPAT "brcm,bcm11351-slave-ccu" | ||
| 24 | |||
| 25 | /* Root CCU clocks */ | ||
| 26 | |||
| 27 | static struct peri_clk_data frac_1m_data = { | ||
| 28 | .gate = HW_SW_GATE(0x214, 16, 0, 1), | ||
| 29 | .trig = TRIGGER(0x0e04, 0), | ||
| 30 | .div = FRAC_DIVIDER(0x0e00, 0, 22, 16), | ||
| 31 | .clocks = CLOCKS("ref_crystal"), | ||
| 32 | }; | ||
| 33 | |||
| 34 | /* AON CCU clocks */ | ||
| 35 | |||
| 36 | static struct peri_clk_data hub_timer_data = { | ||
| 37 | .gate = HW_SW_GATE(0x0414, 16, 0, 1), | ||
| 38 | .clocks = CLOCKS("bbl_32k", | ||
| 39 | "frac_1m", | ||
| 40 | "dft_19_5m"), | ||
| 41 | .sel = SELECTOR(0x0a10, 0, 2), | ||
| 42 | .trig = TRIGGER(0x0a40, 4), | ||
| 43 | }; | ||
| 44 | |||
| 45 | static struct peri_clk_data pmu_bsc_data = { | ||
| 46 | .gate = HW_SW_GATE(0x0418, 16, 0, 1), | ||
| 47 | .clocks = CLOCKS("ref_crystal", | ||
| 48 | "pmu_bsc_var", | ||
| 49 | "bbl_32k"), | ||
| 50 | .sel = SELECTOR(0x0a04, 0, 2), | ||
| 51 | .div = DIVIDER(0x0a04, 3, 4), | ||
| 52 | .trig = TRIGGER(0x0a40, 0), | ||
| 53 | }; | ||
| 54 | |||
| 55 | static struct peri_clk_data pmu_bsc_var_data = { | ||
| 56 | .clocks = CLOCKS("var_312m", | ||
| 57 | "ref_312m"), | ||
| 58 | .sel = SELECTOR(0x0a00, 0, 2), | ||
| 59 | .div = DIVIDER(0x0a00, 4, 5), | ||
| 60 | .trig = TRIGGER(0x0a40, 2), | ||
| 61 | }; | ||
| 62 | |||
| 63 | /* Hub CCU clocks */ | ||
| 64 | |||
| 65 | static struct peri_clk_data tmon_1m_data = { | ||
| 66 | .gate = HW_SW_GATE(0x04a4, 18, 2, 3), | ||
| 67 | .clocks = CLOCKS("ref_crystal", | ||
| 68 | "frac_1m"), | ||
| 69 | .sel = SELECTOR(0x0e74, 0, 2), | ||
| 70 | .trig = TRIGGER(0x0e84, 1), | ||
| 71 | }; | ||
| 72 | |||
| 73 | /* Master CCU clocks */ | ||
| 74 | |||
| 75 | static struct peri_clk_data sdio1_data = { | ||
| 76 | .gate = HW_SW_GATE(0x0358, 18, 2, 3), | ||
| 77 | .clocks = CLOCKS("ref_crystal", | ||
| 78 | "var_52m", | ||
| 79 | "ref_52m", | ||
| 80 | "var_96m", | ||
| 81 | "ref_96m"), | ||
| 82 | .sel = SELECTOR(0x0a28, 0, 3), | ||
| 83 | .div = DIVIDER(0x0a28, 4, 14), | ||
| 84 | .trig = TRIGGER(0x0afc, 9), | ||
| 85 | }; | ||
| 86 | |||
| 87 | static struct peri_clk_data sdio2_data = { | ||
| 88 | .gate = HW_SW_GATE(0x035c, 18, 2, 3), | ||
| 89 | .clocks = CLOCKS("ref_crystal", | ||
| 90 | "var_52m", | ||
| 91 | "ref_52m", | ||
| 92 | "var_96m", | ||
| 93 | "ref_96m"), | ||
| 94 | .sel = SELECTOR(0x0a2c, 0, 3), | ||
| 95 | .div = DIVIDER(0x0a2c, 4, 14), | ||
| 96 | .trig = TRIGGER(0x0afc, 10), | ||
| 97 | }; | ||
| 98 | |||
| 99 | static struct peri_clk_data sdio3_data = { | ||
| 100 | .gate = HW_SW_GATE(0x0364, 18, 2, 3), | ||
| 101 | .clocks = CLOCKS("ref_crystal", | ||
| 102 | "var_52m", | ||
| 103 | "ref_52m", | ||
| 104 | "var_96m", | ||
| 105 | "ref_96m"), | ||
| 106 | .sel = SELECTOR(0x0a34, 0, 3), | ||
| 107 | .div = DIVIDER(0x0a34, 4, 14), | ||
| 108 | .trig = TRIGGER(0x0afc, 12), | ||
| 109 | }; | ||
| 110 | |||
| 111 | static struct peri_clk_data sdio4_data = { | ||
| 112 | .gate = HW_SW_GATE(0x0360, 18, 2, 3), | ||
| 113 | .clocks = CLOCKS("ref_crystal", | ||
| 114 | "var_52m", | ||
| 115 | "ref_52m", | ||
| 116 | "var_96m", | ||
| 117 | "ref_96m"), | ||
| 118 | .sel = SELECTOR(0x0a30, 0, 3), | ||
| 119 | .div = DIVIDER(0x0a30, 4, 14), | ||
| 120 | .trig = TRIGGER(0x0afc, 11), | ||
| 121 | }; | ||
| 122 | |||
| 123 | static struct peri_clk_data usb_ic_data = { | ||
| 124 | .gate = HW_SW_GATE(0x0354, 18, 2, 3), | ||
| 125 | .clocks = CLOCKS("ref_crystal", | ||
| 126 | "var_96m", | ||
| 127 | "ref_96m"), | ||
| 128 | .div = FIXED_DIVIDER(2), | ||
| 129 | .sel = SELECTOR(0x0a24, 0, 2), | ||
| 130 | .trig = TRIGGER(0x0afc, 7), | ||
| 131 | }; | ||
| 132 | |||
| 133 | /* also called usbh_48m */ | ||
| 134 | static struct peri_clk_data hsic2_48m_data = { | ||
| 135 | .gate = HW_SW_GATE(0x0370, 18, 2, 3), | ||
| 136 | .clocks = CLOCKS("ref_crystal", | ||
| 137 | "var_96m", | ||
| 138 | "ref_96m"), | ||
| 139 | .sel = SELECTOR(0x0a38, 0, 2), | ||
| 140 | .div = FIXED_DIVIDER(2), | ||
| 141 | .trig = TRIGGER(0x0afc, 5), | ||
| 142 | }; | ||
| 143 | |||
| 144 | /* also called usbh_12m */ | ||
| 145 | static struct peri_clk_data hsic2_12m_data = { | ||
| 146 | .gate = HW_SW_GATE(0x0370, 20, 4, 5), | ||
| 147 | .div = DIVIDER(0x0a38, 12, 2), | ||
| 148 | .clocks = CLOCKS("ref_crystal", | ||
| 149 | "var_96m", | ||
| 150 | "ref_96m"), | ||
| 151 | .pre_div = FIXED_DIVIDER(2), | ||
| 152 | .sel = SELECTOR(0x0a38, 0, 2), | ||
| 153 | .trig = TRIGGER(0x0afc, 5), | ||
| 154 | }; | ||
| 155 | |||
| 156 | /* Slave CCU clocks */ | ||
| 157 | |||
| 158 | static struct peri_clk_data uartb_data = { | ||
| 159 | .gate = HW_SW_GATE(0x0400, 18, 2, 3), | ||
| 160 | .clocks = CLOCKS("ref_crystal", | ||
| 161 | "var_156m", | ||
| 162 | "ref_156m"), | ||
| 163 | .sel = SELECTOR(0x0a10, 0, 2), | ||
| 164 | .div = FRAC_DIVIDER(0x0a10, 4, 12, 8), | ||
| 165 | .trig = TRIGGER(0x0afc, 2), | ||
| 166 | }; | ||
| 167 | |||
| 168 | static struct peri_clk_data uartb2_data = { | ||
| 169 | .gate = HW_SW_GATE(0x0404, 18, 2, 3), | ||
| 170 | .clocks = CLOCKS("ref_crystal", | ||
| 171 | "var_156m", | ||
| 172 | "ref_156m"), | ||
| 173 | .sel = SELECTOR(0x0a14, 0, 2), | ||
| 174 | .div = FRAC_DIVIDER(0x0a14, 4, 12, 8), | ||
| 175 | .trig = TRIGGER(0x0afc, 3), | ||
| 176 | }; | ||
| 177 | |||
| 178 | static struct peri_clk_data uartb3_data = { | ||
| 179 | .gate = HW_SW_GATE(0x0408, 18, 2, 3), | ||
| 180 | .clocks = CLOCKS("ref_crystal", | ||
| 181 | "var_156m", | ||
| 182 | "ref_156m"), | ||
| 183 | .sel = SELECTOR(0x0a18, 0, 2), | ||
| 184 | .div = FRAC_DIVIDER(0x0a18, 4, 12, 8), | ||
| 185 | .trig = TRIGGER(0x0afc, 4), | ||
| 186 | }; | ||
| 187 | |||
| 188 | static struct peri_clk_data uartb4_data = { | ||
| 189 | .gate = HW_SW_GATE(0x0408, 18, 2, 3), | ||
| 190 | .clocks = CLOCKS("ref_crystal", | ||
| 191 | "var_156m", | ||
| 192 | "ref_156m"), | ||
| 193 | .sel = SELECTOR(0x0a1c, 0, 2), | ||
| 194 | .div = FRAC_DIVIDER(0x0a1c, 4, 12, 8), | ||
| 195 | .trig = TRIGGER(0x0afc, 5), | ||
| 196 | }; | ||
| 197 | |||
| 198 | static struct peri_clk_data ssp0_data = { | ||
| 199 | .gate = HW_SW_GATE(0x0410, 18, 2, 3), | ||
| 200 | .clocks = CLOCKS("ref_crystal", | ||
| 201 | "var_104m", | ||
| 202 | "ref_104m", | ||
| 203 | "var_96m", | ||
| 204 | "ref_96m"), | ||
| 205 | .sel = SELECTOR(0x0a20, 0, 3), | ||
| 206 | .div = DIVIDER(0x0a20, 4, 14), | ||
| 207 | .trig = TRIGGER(0x0afc, 6), | ||
| 208 | }; | ||
| 209 | |||
| 210 | static struct peri_clk_data ssp2_data = { | ||
| 211 | .gate = HW_SW_GATE(0x0418, 18, 2, 3), | ||
| 212 | .clocks = CLOCKS("ref_crystal", | ||
| 213 | "var_104m", | ||
| 214 | "ref_104m", | ||
| 215 | "var_96m", | ||
| 216 | "ref_96m"), | ||
| 217 | .sel = SELECTOR(0x0a28, 0, 3), | ||
| 218 | .div = DIVIDER(0x0a28, 4, 14), | ||
| 219 | .trig = TRIGGER(0x0afc, 8), | ||
| 220 | }; | ||
| 221 | |||
| 222 | static struct peri_clk_data bsc1_data = { | ||
| 223 | .gate = HW_SW_GATE(0x0458, 18, 2, 3), | ||
| 224 | .clocks = CLOCKS("ref_crystal", | ||
| 225 | "var_104m", | ||
| 226 | "ref_104m", | ||
| 227 | "var_13m", | ||
| 228 | "ref_13m"), | ||
| 229 | .sel = SELECTOR(0x0a64, 0, 3), | ||
| 230 | .trig = TRIGGER(0x0afc, 23), | ||
| 231 | }; | ||
| 232 | |||
| 233 | static struct peri_clk_data bsc2_data = { | ||
| 234 | .gate = HW_SW_GATE(0x045c, 18, 2, 3), | ||
| 235 | .clocks = CLOCKS("ref_crystal", | ||
| 236 | "var_104m", | ||
| 237 | "ref_104m", | ||
| 238 | "var_13m", | ||
| 239 | "ref_13m"), | ||
| 240 | .sel = SELECTOR(0x0a68, 0, 3), | ||
| 241 | .trig = TRIGGER(0x0afc, 24), | ||
| 242 | }; | ||
| 243 | |||
| 244 | static struct peri_clk_data bsc3_data = { | ||
| 245 | .gate = HW_SW_GATE(0x0484, 18, 2, 3), | ||
| 246 | .clocks = CLOCKS("ref_crystal", | ||
| 247 | "var_104m", | ||
| 248 | "ref_104m", | ||
| 249 | "var_13m", | ||
| 250 | "ref_13m"), | ||
| 251 | .sel = SELECTOR(0x0a84, 0, 3), | ||
| 252 | .trig = TRIGGER(0x0b00, 2), | ||
| 253 | }; | ||
| 254 | |||
| 255 | static struct peri_clk_data pwm_data = { | ||
| 256 | .gate = HW_SW_GATE(0x0468, 18, 2, 3), | ||
| 257 | .clocks = CLOCKS("ref_crystal", | ||
| 258 | "var_104m"), | ||
| 259 | .sel = SELECTOR(0x0a70, 0, 2), | ||
| 260 | .div = DIVIDER(0x0a70, 4, 3), | ||
| 261 | .trig = TRIGGER(0x0afc, 15), | ||
| 262 | }; | ||
| 263 | |||
| 264 | /* | ||
| 265 | * CCU setup routines | ||
| 266 | * | ||
| 267 | * These are called from kona_dt_ccu_setup() to initialize the array | ||
| 268 | * of clocks provided by the CCU. Once allocated, the entries in | ||
| 269 | * the array are initialized by calling kona_clk_setup() with the | ||
| 270 | * initialization data for each clock. They return 0 if successful | ||
| 271 | * or an error code otherwise. | ||
| 272 | */ | ||
| 273 | static int __init bcm281xx_root_ccu_clks_setup(struct ccu_data *ccu) | ||
| 274 | { | ||
| 275 | struct clk **clks; | ||
| 276 | size_t count = BCM281XX_ROOT_CCU_CLOCK_COUNT; | ||
| 277 | |||
| 278 | clks = kzalloc(count * sizeof(*clks), GFP_KERNEL); | ||
| 279 | if (!clks) { | ||
| 280 | pr_err("%s: failed to allocate root clocks\n", __func__); | ||
| 281 | return -ENOMEM; | ||
| 282 | } | ||
| 283 | ccu->data.clks = clks; | ||
| 284 | ccu->data.clk_num = count; | ||
| 285 | |||
| 286 | PERI_CLK_SETUP(clks, ccu, BCM281XX_ROOT_CCU_FRAC_1M, frac_1m); | ||
| 287 | |||
| 288 | return 0; | ||
| 289 | } | ||
| 290 | |||
| 291 | static int __init bcm281xx_aon_ccu_clks_setup(struct ccu_data *ccu) | ||
| 292 | { | ||
| 293 | struct clk **clks; | ||
| 294 | size_t count = BCM281XX_AON_CCU_CLOCK_COUNT; | ||
| 295 | |||
| 296 | clks = kzalloc(count * sizeof(*clks), GFP_KERNEL); | ||
| 297 | if (!clks) { | ||
| 298 | pr_err("%s: failed to allocate aon clocks\n", __func__); | ||
| 299 | return -ENOMEM; | ||
| 300 | } | ||
| 301 | ccu->data.clks = clks; | ||
| 302 | ccu->data.clk_num = count; | ||
| 303 | |||
| 304 | PERI_CLK_SETUP(clks, ccu, BCM281XX_AON_CCU_HUB_TIMER, hub_timer); | ||
| 305 | PERI_CLK_SETUP(clks, ccu, BCM281XX_AON_CCU_PMU_BSC, pmu_bsc); | ||
| 306 | PERI_CLK_SETUP(clks, ccu, BCM281XX_AON_CCU_PMU_BSC_VAR, pmu_bsc_var); | ||
| 307 | |||
| 308 | return 0; | ||
| 309 | } | ||
| 310 | |||
| 311 | static int __init bcm281xx_hub_ccu_clks_setup(struct ccu_data *ccu) | ||
| 312 | { | ||
| 313 | struct clk **clks; | ||
| 314 | size_t count = BCM281XX_HUB_CCU_CLOCK_COUNT; | ||
| 315 | |||
| 316 | clks = kzalloc(count * sizeof(*clks), GFP_KERNEL); | ||
| 317 | if (!clks) { | ||
| 318 | pr_err("%s: failed to allocate hub clocks\n", __func__); | ||
| 319 | return -ENOMEM; | ||
| 320 | } | ||
| 321 | ccu->data.clks = clks; | ||
| 322 | ccu->data.clk_num = count; | ||
| 323 | |||
| 324 | PERI_CLK_SETUP(clks, ccu, BCM281XX_HUB_CCU_TMON_1M, tmon_1m); | ||
| 325 | |||
| 326 | return 0; | ||
| 327 | } | ||
| 328 | |||
| 329 | static int __init bcm281xx_master_ccu_clks_setup(struct ccu_data *ccu) | ||
| 330 | { | ||
| 331 | struct clk **clks; | ||
| 332 | size_t count = BCM281XX_MASTER_CCU_CLOCK_COUNT; | ||
| 333 | |||
| 334 | clks = kzalloc(count * sizeof(*clks), GFP_KERNEL); | ||
| 335 | if (!clks) { | ||
| 336 | pr_err("%s: failed to allocate master clocks\n", __func__); | ||
| 337 | return -ENOMEM; | ||
| 338 | } | ||
| 339 | ccu->data.clks = clks; | ||
| 340 | ccu->data.clk_num = count; | ||
| 341 | |||
| 342 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_SDIO1, sdio1); | ||
| 343 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_SDIO2, sdio2); | ||
| 344 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_SDIO3, sdio3); | ||
| 345 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_SDIO4, sdio4); | ||
| 346 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_USB_IC, usb_ic); | ||
| 347 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_HSIC2_48M, hsic2_48m); | ||
| 348 | PERI_CLK_SETUP(clks, ccu, BCM281XX_MASTER_CCU_HSIC2_12M, hsic2_12m); | ||
| 349 | |||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | static int __init bcm281xx_slave_ccu_clks_setup(struct ccu_data *ccu) | ||
| 354 | { | ||
| 355 | struct clk **clks; | ||
| 356 | size_t count = BCM281XX_SLAVE_CCU_CLOCK_COUNT; | ||
| 357 | |||
| 358 | clks = kzalloc(count * sizeof(*clks), GFP_KERNEL); | ||
| 359 | if (!clks) { | ||
| 360 | pr_err("%s: failed to allocate slave clocks\n", __func__); | ||
| 361 | return -ENOMEM; | ||
| 362 | } | ||
| 363 | ccu->data.clks = clks; | ||
| 364 | ccu->data.clk_num = count; | ||
| 365 | |||
| 366 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_UARTB, uartb); | ||
| 367 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_UARTB2, uartb2); | ||
| 368 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_UARTB3, uartb3); | ||
| 369 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_UARTB4, uartb4); | ||
| 370 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_SSP0, ssp0); | ||
| 371 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_SSP2, ssp2); | ||
| 372 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_BSC1, bsc1); | ||
| 373 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_BSC2, bsc2); | ||
| 374 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_BSC3, bsc3); | ||
| 375 | PERI_CLK_SETUP(clks, ccu, BCM281XX_SLAVE_CCU_PWM, pwm); | ||
| 376 | |||
| 377 | return 0; | ||
| 378 | } | ||
| 379 | |||
| 380 | /* Device tree match table callback functions */ | ||
| 381 | |||
| 382 | static void __init kona_dt_root_ccu_setup(struct device_node *node) | ||
| 383 | { | ||
| 384 | kona_dt_ccu_setup(node, bcm281xx_root_ccu_clks_setup); | ||
| 385 | } | ||
| 386 | |||
| 387 | static void __init kona_dt_aon_ccu_setup(struct device_node *node) | ||
| 388 | { | ||
| 389 | kona_dt_ccu_setup(node, bcm281xx_aon_ccu_clks_setup); | ||
| 390 | } | ||
| 391 | |||
| 392 | static void __init kona_dt_hub_ccu_setup(struct device_node *node) | ||
| 393 | { | ||
| 394 | kona_dt_ccu_setup(node, bcm281xx_hub_ccu_clks_setup); | ||
| 395 | } | ||
| 396 | |||
| 397 | static void __init kona_dt_master_ccu_setup(struct device_node *node) | ||
| 398 | { | ||
| 399 | kona_dt_ccu_setup(node, bcm281xx_master_ccu_clks_setup); | ||
| 400 | } | ||
| 401 | |||
| 402 | static void __init kona_dt_slave_ccu_setup(struct device_node *node) | ||
| 403 | { | ||
| 404 | kona_dt_ccu_setup(node, bcm281xx_slave_ccu_clks_setup); | ||
| 405 | } | ||
| 406 | |||
| 407 | CLK_OF_DECLARE(bcm11351_root_ccu, BCM11351_DT_ROOT_CCU_COMPAT, | ||
| 408 | kona_dt_root_ccu_setup); | ||
| 409 | CLK_OF_DECLARE(bcm11351_aon_ccu, BCM11351_DT_AON_CCU_COMPAT, | ||
| 410 | kona_dt_aon_ccu_setup); | ||
| 411 | CLK_OF_DECLARE(bcm11351_hub_ccu, BCM11351_DT_HUB_CCU_COMPAT, | ||
| 412 | kona_dt_hub_ccu_setup); | ||
| 413 | CLK_OF_DECLARE(bcm11351_master_ccu, BCM11351_DT_MASTER_CCU_COMPAT, | ||
| 414 | kona_dt_master_ccu_setup); | ||
| 415 | CLK_OF_DECLARE(bcm11351_slave_ccu, BCM11351_DT_SLAVE_CCU_COMPAT, | ||
| 416 | kona_dt_slave_ccu_setup); | ||
diff --git a/drivers/clk/bcm/clk-kona-setup.c b/drivers/clk/bcm/clk-kona-setup.c new file mode 100644 index 000000000000..c7607feb18dd --- /dev/null +++ b/drivers/clk/bcm/clk-kona-setup.c | |||
| @@ -0,0 +1,769 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Broadcom Corporation | ||
| 3 | * Copyright 2013 Linaro Limited | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation version 2. | ||
| 8 | * | ||
| 9 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 10 | * kind, whether express or implied; without even the implied warranty | ||
| 11 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/io.h> | ||
| 16 | #include <linux/of_address.h> | ||
| 17 | |||
| 18 | #include "clk-kona.h" | ||
| 19 | |||
| 20 | /* These are used when a selector or trigger is found to be unneeded */ | ||
| 21 | #define selector_clear_exists(sel) ((sel)->width = 0) | ||
| 22 | #define trigger_clear_exists(trig) FLAG_CLEAR(trig, TRIG, EXISTS) | ||
| 23 | |||
| 24 | LIST_HEAD(ccu_list); /* The list of set up CCUs */ | ||
| 25 | |||
| 26 | /* Validity checking */ | ||
| 27 | |||
| 28 | static bool clk_requires_trigger(struct kona_clk *bcm_clk) | ||
| 29 | { | ||
| 30 | struct peri_clk_data *peri = bcm_clk->peri; | ||
| 31 | struct bcm_clk_sel *sel; | ||
| 32 | struct bcm_clk_div *div; | ||
| 33 | |||
| 34 | if (bcm_clk->type != bcm_clk_peri) | ||
| 35 | return false; | ||
| 36 | |||
| 37 | sel = &peri->sel; | ||
| 38 | if (sel->parent_count && selector_exists(sel)) | ||
| 39 | return true; | ||
| 40 | |||
| 41 | div = &peri->div; | ||
| 42 | if (!divider_exists(div)) | ||
| 43 | return false; | ||
| 44 | |||
| 45 | /* Fixed dividers don't need triggers */ | ||
| 46 | if (!divider_is_fixed(div)) | ||
| 47 | return true; | ||
| 48 | |||
| 49 | div = &peri->pre_div; | ||
| 50 | |||
| 51 | return divider_exists(div) && !divider_is_fixed(div); | ||
| 52 | } | ||
| 53 | |||
| 54 | static bool peri_clk_data_offsets_valid(struct kona_clk *bcm_clk) | ||
| 55 | { | ||
| 56 | struct peri_clk_data *peri; | ||
| 57 | struct bcm_clk_gate *gate; | ||
| 58 | struct bcm_clk_div *div; | ||
| 59 | struct bcm_clk_sel *sel; | ||
| 60 | struct bcm_clk_trig *trig; | ||
| 61 | const char *name; | ||
| 62 | u32 range; | ||
| 63 | u32 limit; | ||
| 64 | |||
| 65 | BUG_ON(bcm_clk->type != bcm_clk_peri); | ||
| 66 | peri = bcm_clk->peri; | ||
| 67 | name = bcm_clk->name; | ||
| 68 | range = bcm_clk->ccu->range; | ||
| 69 | |||
| 70 | limit = range - sizeof(u32); | ||
| 71 | limit = round_down(limit, sizeof(u32)); | ||
| 72 | |||
| 73 | gate = &peri->gate; | ||
| 74 | if (gate_exists(gate)) { | ||
| 75 | if (gate->offset > limit) { | ||
| 76 | pr_err("%s: bad gate offset for %s (%u > %u)\n", | ||
| 77 | __func__, name, gate->offset, limit); | ||
| 78 | return false; | ||
| 79 | } | ||
| 80 | } | ||
| 81 | |||
| 82 | div = &peri->div; | ||
| 83 | if (divider_exists(div)) { | ||
| 84 | if (div->offset > limit) { | ||
| 85 | pr_err("%s: bad divider offset for %s (%u > %u)\n", | ||
| 86 | __func__, name, div->offset, limit); | ||
| 87 | return false; | ||
| 88 | } | ||
| 89 | } | ||
| 90 | |||
| 91 | div = &peri->pre_div; | ||
| 92 | if (divider_exists(div)) { | ||
| 93 | if (div->offset > limit) { | ||
| 94 | pr_err("%s: bad pre-divider offset for %s " | ||
| 95 | "(%u > %u)\n", | ||
| 96 | __func__, name, div->offset, limit); | ||
| 97 | return false; | ||
| 98 | } | ||
| 99 | } | ||
| 100 | |||
| 101 | sel = &peri->sel; | ||
| 102 | if (selector_exists(sel)) { | ||
| 103 | if (sel->offset > limit) { | ||
| 104 | pr_err("%s: bad selector offset for %s (%u > %u)\n", | ||
| 105 | __func__, name, sel->offset, limit); | ||
| 106 | return false; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | trig = &peri->trig; | ||
| 111 | if (trigger_exists(trig)) { | ||
| 112 | if (trig->offset > limit) { | ||
| 113 | pr_err("%s: bad trigger offset for %s (%u > %u)\n", | ||
| 114 | __func__, name, trig->offset, limit); | ||
| 115 | return false; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | |||
| 119 | trig = &peri->pre_trig; | ||
| 120 | if (trigger_exists(trig)) { | ||
| 121 | if (trig->offset > limit) { | ||
| 122 | pr_err("%s: bad pre-trigger offset for %s (%u > %u)\n", | ||
| 123 | __func__, name, trig->offset, limit); | ||
| 124 | return false; | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | return true; | ||
| 129 | } | ||
| 130 | |||
| 131 | /* A bit position must be less than the number of bits in a 32-bit register. */ | ||
| 132 | static bool bit_posn_valid(u32 bit_posn, const char *field_name, | ||
| 133 | const char *clock_name) | ||
| 134 | { | ||
| 135 | u32 limit = BITS_PER_BYTE * sizeof(u32) - 1; | ||
| 136 | |||
| 137 | if (bit_posn > limit) { | ||
| 138 | pr_err("%s: bad %s bit for %s (%u > %u)\n", __func__, | ||
| 139 | field_name, clock_name, bit_posn, limit); | ||
| 140 | return false; | ||
| 141 | } | ||
| 142 | return true; | ||
| 143 | } | ||
| 144 | |||
| 145 | /* | ||
| 146 | * A bitfield must be at least 1 bit wide. Both the low-order and | ||
| 147 | * high-order bits must lie within a 32-bit register. We require | ||
| 148 | * fields to be less than 32 bits wide, mainly because we use | ||
| 149 | * shifting to produce field masks, and shifting a full word width | ||
| 150 | * is not well-defined by the C standard. | ||
| 151 | */ | ||
| 152 | static bool bitfield_valid(u32 shift, u32 width, const char *field_name, | ||
| 153 | const char *clock_name) | ||
| 154 | { | ||
| 155 | u32 limit = BITS_PER_BYTE * sizeof(u32); | ||
| 156 | |||
| 157 | if (!width) { | ||
| 158 | pr_err("%s: bad %s field width 0 for %s\n", __func__, | ||
| 159 | field_name, clock_name); | ||
| 160 | return false; | ||
| 161 | } | ||
| 162 | if (shift + width > limit) { | ||
| 163 | pr_err("%s: bad %s for %s (%u + %u > %u)\n", __func__, | ||
| 164 | field_name, clock_name, shift, width, limit); | ||
| 165 | return false; | ||
| 166 | } | ||
| 167 | return true; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* | ||
| 171 | * All gates, if defined, have a status bit, and for hardware-only | ||
| 172 | * gates, that's it. Gates that can be software controlled also | ||
| 173 | * have an enable bit. And a gate that can be hardware or software | ||
| 174 | * controlled will have a hardware/software select bit. | ||
| 175 | */ | ||
| 176 | static bool gate_valid(struct bcm_clk_gate *gate, const char *field_name, | ||
| 177 | const char *clock_name) | ||
| 178 | { | ||
| 179 | if (!bit_posn_valid(gate->status_bit, "gate status", clock_name)) | ||
| 180 | return false; | ||
| 181 | |||
| 182 | if (gate_is_sw_controllable(gate)) { | ||
| 183 | if (!bit_posn_valid(gate->en_bit, "gate enable", clock_name)) | ||
| 184 | return false; | ||
| 185 | |||
| 186 | if (gate_is_hw_controllable(gate)) { | ||
| 187 | if (!bit_posn_valid(gate->hw_sw_sel_bit, | ||
| 188 | "gate hw/sw select", | ||
| 189 | clock_name)) | ||
| 190 | return false; | ||
| 191 | } | ||
| 192 | } else { | ||
| 193 | BUG_ON(!gate_is_hw_controllable(gate)); | ||
| 194 | } | ||
| 195 | |||
| 196 | return true; | ||
| 197 | } | ||
| 198 | |||
| 199 | /* | ||
| 200 | * A selector bitfield must be valid. Its parent_sel array must | ||
| 201 | * also be reasonable for the field. | ||
| 202 | */ | ||
| 203 | static bool sel_valid(struct bcm_clk_sel *sel, const char *field_name, | ||
| 204 | const char *clock_name) | ||
| 205 | { | ||
| 206 | if (!bitfield_valid(sel->shift, sel->width, field_name, clock_name)) | ||
| 207 | return false; | ||
| 208 | |||
| 209 | if (sel->parent_count) { | ||
| 210 | u32 max_sel; | ||
| 211 | u32 limit; | ||
| 212 | |||
| 213 | /* | ||
| 214 | * Make sure the selector field can hold all the | ||
| 215 | * selector values we expect to be able to use. A | ||
| 216 | * clock only needs to have a selector defined if it | ||
| 217 | * has more than one parent. And in that case the | ||
| 218 | * highest selector value will be in the last entry | ||
| 219 | * in the array. | ||
| 220 | */ | ||
| 221 | max_sel = sel->parent_sel[sel->parent_count - 1]; | ||
| 222 | limit = (1 << sel->width) - 1; | ||
| 223 | if (max_sel > limit) { | ||
| 224 | pr_err("%s: bad selector for %s " | ||
| 225 | "(%u needs > %u bits)\n", | ||
| 226 | __func__, clock_name, max_sel, | ||
| 227 | sel->width); | ||
| 228 | return false; | ||
| 229 | } | ||
| 230 | } else { | ||
| 231 | pr_warn("%s: ignoring selector for %s (no parents)\n", | ||
| 232 | __func__, clock_name); | ||
| 233 | selector_clear_exists(sel); | ||
| 234 | kfree(sel->parent_sel); | ||
| 235 | sel->parent_sel = NULL; | ||
| 236 | } | ||
| 237 | |||
| 238 | return true; | ||
| 239 | } | ||
| 240 | |||
| 241 | /* | ||
| 242 | * A fixed divider just needs to be non-zero. A variable divider | ||
| 243 | * has to have a valid divider bitfield, and if it has a fraction, | ||
| 244 | * the width of the fraction must not be no more than the width of | ||
| 245 | * the divider as a whole. | ||
| 246 | */ | ||
| 247 | static bool div_valid(struct bcm_clk_div *div, const char *field_name, | ||
| 248 | const char *clock_name) | ||
| 249 | { | ||
| 250 | if (divider_is_fixed(div)) { | ||
| 251 | /* Any fixed divider value but 0 is OK */ | ||
| 252 | if (div->fixed == 0) { | ||
| 253 | pr_err("%s: bad %s fixed value 0 for %s\n", __func__, | ||
| 254 | field_name, clock_name); | ||
| 255 | return false; | ||
| 256 | } | ||
| 257 | return true; | ||
| 258 | } | ||
| 259 | if (!bitfield_valid(div->shift, div->width, field_name, clock_name)) | ||
| 260 | return false; | ||
| 261 | |||
| 262 | if (divider_has_fraction(div)) | ||
| 263 | if (div->frac_width > div->width) { | ||
| 264 | pr_warn("%s: bad %s fraction width for %s (%u > %u)\n", | ||
| 265 | __func__, field_name, clock_name, | ||
| 266 | div->frac_width, div->width); | ||
| 267 | return false; | ||
| 268 | } | ||
| 269 | |||
| 270 | return true; | ||
| 271 | } | ||
| 272 | |||
| 273 | /* | ||
| 274 | * If a clock has two dividers, the combined number of fractional | ||
| 275 | * bits must be representable in a 32-bit unsigned value. This | ||
| 276 | * is because we scale up a dividend using both dividers before | ||
| 277 | * dividing to improve accuracy, and we need to avoid overflow. | ||
| 278 | */ | ||
| 279 | static bool kona_dividers_valid(struct kona_clk *bcm_clk) | ||
| 280 | { | ||
| 281 | struct peri_clk_data *peri = bcm_clk->peri; | ||
| 282 | struct bcm_clk_div *div; | ||
| 283 | struct bcm_clk_div *pre_div; | ||
| 284 | u32 limit; | ||
| 285 | |||
| 286 | BUG_ON(bcm_clk->type != bcm_clk_peri); | ||
| 287 | |||
| 288 | if (!divider_exists(&peri->div) || !divider_exists(&peri->pre_div)) | ||
| 289 | return true; | ||
| 290 | |||
| 291 | div = &peri->div; | ||
| 292 | pre_div = &peri->pre_div; | ||
| 293 | if (divider_is_fixed(div) || divider_is_fixed(pre_div)) | ||
| 294 | return true; | ||
| 295 | |||
| 296 | limit = BITS_PER_BYTE * sizeof(u32); | ||
| 297 | |||
| 298 | return div->frac_width + pre_div->frac_width <= limit; | ||
| 299 | } | ||
| 300 | |||
| 301 | |||
| 302 | /* A trigger just needs to represent a valid bit position */ | ||
| 303 | static bool trig_valid(struct bcm_clk_trig *trig, const char *field_name, | ||
| 304 | const char *clock_name) | ||
| 305 | { | ||
| 306 | return bit_posn_valid(trig->bit, field_name, clock_name); | ||
| 307 | } | ||
| 308 | |||
| 309 | /* Determine whether the set of peripheral clock registers are valid. */ | ||
| 310 | static bool | ||
| 311 | peri_clk_data_valid(struct kona_clk *bcm_clk) | ||
| 312 | { | ||
| 313 | struct peri_clk_data *peri; | ||
| 314 | struct bcm_clk_gate *gate; | ||
| 315 | struct bcm_clk_sel *sel; | ||
| 316 | struct bcm_clk_div *div; | ||
| 317 | struct bcm_clk_div *pre_div; | ||
| 318 | struct bcm_clk_trig *trig; | ||
| 319 | const char *name; | ||
| 320 | |||
| 321 | BUG_ON(bcm_clk->type != bcm_clk_peri); | ||
| 322 | |||
| 323 | /* | ||
| 324 | * First validate register offsets. This is the only place | ||
| 325 | * where we need something from the ccu, so we do these | ||
| 326 | * together. | ||
| 327 | */ | ||
| 328 | if (!peri_clk_data_offsets_valid(bcm_clk)) | ||
| 329 | return false; | ||
| 330 | |||
| 331 | peri = bcm_clk->peri; | ||
| 332 | name = bcm_clk->name; | ||
| 333 | gate = &peri->gate; | ||
| 334 | if (gate_exists(gate) && !gate_valid(gate, "gate", name)) | ||
| 335 | return false; | ||
| 336 | |||
| 337 | sel = &peri->sel; | ||
| 338 | if (selector_exists(sel)) { | ||
| 339 | if (!sel_valid(sel, "selector", name)) | ||
| 340 | return false; | ||
| 341 | |||
| 342 | } else if (sel->parent_count > 1) { | ||
| 343 | pr_err("%s: multiple parents but no selector for %s\n", | ||
| 344 | __func__, name); | ||
| 345 | |||
| 346 | return false; | ||
| 347 | } | ||
| 348 | |||
| 349 | div = &peri->div; | ||
| 350 | pre_div = &peri->pre_div; | ||
| 351 | if (divider_exists(div)) { | ||
| 352 | if (!div_valid(div, "divider", name)) | ||
| 353 | return false; | ||
| 354 | |||
| 355 | if (divider_exists(pre_div)) | ||
| 356 | if (!div_valid(pre_div, "pre-divider", name)) | ||
| 357 | return false; | ||
| 358 | } else if (divider_exists(pre_div)) { | ||
| 359 | pr_err("%s: pre-divider but no divider for %s\n", __func__, | ||
| 360 | name); | ||
| 361 | return false; | ||
| 362 | } | ||
| 363 | |||
| 364 | trig = &peri->trig; | ||
| 365 | if (trigger_exists(trig)) { | ||
| 366 | if (!trig_valid(trig, "trigger", name)) | ||
| 367 | return false; | ||
| 368 | |||
| 369 | if (trigger_exists(&peri->pre_trig)) { | ||
| 370 | if (!trig_valid(trig, "pre-trigger", name)) { | ||
| 371 | return false; | ||
| 372 | } | ||
| 373 | } | ||
| 374 | if (!clk_requires_trigger(bcm_clk)) { | ||
| 375 | pr_warn("%s: ignoring trigger for %s (not needed)\n", | ||
| 376 | __func__, name); | ||
| 377 | trigger_clear_exists(trig); | ||
| 378 | } | ||
| 379 | } else if (trigger_exists(&peri->pre_trig)) { | ||
| 380 | pr_err("%s: pre-trigger but no trigger for %s\n", __func__, | ||
| 381 | name); | ||
| 382 | return false; | ||
| 383 | } else if (clk_requires_trigger(bcm_clk)) { | ||
| 384 | pr_err("%s: required trigger missing for %s\n", __func__, | ||
| 385 | name); | ||
| 386 | return false; | ||
| 387 | } | ||
| 388 | |||
| 389 | return kona_dividers_valid(bcm_clk); | ||
| 390 | } | ||
| 391 | |||
| 392 | static bool kona_clk_valid(struct kona_clk *bcm_clk) | ||
| 393 | { | ||
| 394 | switch (bcm_clk->type) { | ||
| 395 | case bcm_clk_peri: | ||
| 396 | if (!peri_clk_data_valid(bcm_clk)) | ||
| 397 | return false; | ||
| 398 | break; | ||
| 399 | default: | ||
| 400 | pr_err("%s: unrecognized clock type (%d)\n", __func__, | ||
| 401 | (int)bcm_clk->type); | ||
| 402 | return false; | ||
| 403 | } | ||
| 404 | return true; | ||
| 405 | } | ||
| 406 | |||
| 407 | /* | ||
| 408 | * Scan an array of parent clock names to determine whether there | ||
| 409 | * are any entries containing BAD_CLK_NAME. Such entries are | ||
| 410 | * placeholders for non-supported clocks. Keep track of the | ||
| 411 | * position of each clock name in the original array. | ||
| 412 | * | ||
| 413 | * Allocates an array of pointers to to hold the names of all | ||
| 414 | * non-null entries in the original array, and returns a pointer to | ||
| 415 | * that array in *names. This will be used for registering the | ||
| 416 | * clock with the common clock code. On successful return, | ||
| 417 | * *count indicates how many entries are in that names array. | ||
| 418 | * | ||
| 419 | * If there is more than one entry in the resulting names array, | ||
| 420 | * another array is allocated to record the parent selector value | ||
| 421 | * for each (defined) parent clock. This is the value that | ||
| 422 | * represents this parent clock in the clock's source selector | ||
| 423 | * register. The position of the clock in the original parent array | ||
| 424 | * defines that selector value. The number of entries in this array | ||
| 425 | * is the same as the number of entries in the parent names array. | ||
| 426 | * | ||
| 427 | * The array of selector values is returned. If the clock has no | ||
| 428 | * parents, no selector is required and a null pointer is returned. | ||
| 429 | * | ||
| 430 | * Returns a null pointer if the clock names array supplied was | ||
| 431 | * null. (This is not an error.) | ||
| 432 | * | ||
| 433 | * Returns a pointer-coded error if an error occurs. | ||
| 434 | */ | ||
| 435 | static u32 *parent_process(const char *clocks[], | ||
| 436 | u32 *count, const char ***names) | ||
| 437 | { | ||
| 438 | static const char **parent_names; | ||
| 439 | static u32 *parent_sel; | ||
| 440 | const char **clock; | ||
| 441 | u32 parent_count; | ||
| 442 | u32 bad_count = 0; | ||
| 443 | u32 orig_count; | ||
| 444 | u32 i; | ||
| 445 | u32 j; | ||
| 446 | |||
| 447 | *count = 0; /* In case of early return */ | ||
| 448 | *names = NULL; | ||
| 449 | if (!clocks) | ||
| 450 | return NULL; | ||
| 451 | |||
| 452 | /* | ||
| 453 | * Count the number of names in the null-terminated array, | ||
| 454 | * and find out how many of those are actually clock names. | ||
| 455 | */ | ||
| 456 | for (clock = clocks; *clock; clock++) | ||
| 457 | if (*clock == BAD_CLK_NAME) | ||
| 458 | bad_count++; | ||
| 459 | orig_count = (u32)(clock - clocks); | ||
| 460 | parent_count = orig_count - bad_count; | ||
| 461 | |||
| 462 | /* If all clocks are unsupported, we treat it as no clock */ | ||
| 463 | if (!parent_count) | ||
| 464 | return NULL; | ||
| 465 | |||
| 466 | /* Avoid exceeding our parent clock limit */ | ||
| 467 | if (parent_count > PARENT_COUNT_MAX) { | ||
| 468 | pr_err("%s: too many parents (%u > %u)\n", __func__, | ||
| 469 | parent_count, PARENT_COUNT_MAX); | ||
| 470 | return ERR_PTR(-EINVAL); | ||
| 471 | } | ||
| 472 | |||
| 473 | /* | ||
| 474 | * There is one parent name for each defined parent clock. | ||
| 475 | * We also maintain an array containing the selector value | ||
| 476 | * for each defined clock. If there's only one clock, the | ||
| 477 | * selector is not required, but we allocate space for the | ||
| 478 | * array anyway to keep things simple. | ||
| 479 | */ | ||
| 480 | parent_names = kmalloc(parent_count * sizeof(parent_names), GFP_KERNEL); | ||
| 481 | if (!parent_names) { | ||
| 482 | pr_err("%s: error allocating %u parent names\n", __func__, | ||
| 483 | parent_count); | ||
| 484 | return ERR_PTR(-ENOMEM); | ||
| 485 | } | ||
| 486 | |||
| 487 | /* There is at least one parent, so allocate a selector array */ | ||
| 488 | |||
| 489 | parent_sel = kmalloc(parent_count * sizeof(*parent_sel), GFP_KERNEL); | ||
| 490 | if (!parent_sel) { | ||
| 491 | pr_err("%s: error allocating %u parent selectors\n", __func__, | ||
| 492 | parent_count); | ||
| 493 | kfree(parent_names); | ||
| 494 | |||
| 495 | return ERR_PTR(-ENOMEM); | ||
| 496 | } | ||
| 497 | |||
| 498 | /* Now fill in the parent names and selector arrays */ | ||
| 499 | for (i = 0, j = 0; i < orig_count; i++) { | ||
| 500 | if (clocks[i] != BAD_CLK_NAME) { | ||
| 501 | parent_names[j] = clocks[i]; | ||
| 502 | parent_sel[j] = i; | ||
| 503 | j++; | ||
| 504 | } | ||
| 505 | } | ||
| 506 | *names = parent_names; | ||
| 507 | *count = parent_count; | ||
| 508 | |||
| 509 | return parent_sel; | ||
| 510 | } | ||
| 511 | |||
| 512 | static int | ||
| 513 | clk_sel_setup(const char **clocks, struct bcm_clk_sel *sel, | ||
| 514 | struct clk_init_data *init_data) | ||
| 515 | { | ||
| 516 | const char **parent_names = NULL; | ||
| 517 | u32 parent_count = 0; | ||
| 518 | u32 *parent_sel; | ||
| 519 | |||
| 520 | /* | ||
| 521 | * If a peripheral clock has multiple parents, the value | ||
| 522 | * used by the hardware to select that parent is represented | ||
| 523 | * by the parent clock's position in the "clocks" list. Some | ||
| 524 | * values don't have defined or supported clocks; these will | ||
| 525 | * have BAD_CLK_NAME entries in the parents[] array. The | ||
| 526 | * list is terminated by a NULL entry. | ||
| 527 | * | ||
| 528 | * We need to supply (only) the names of defined parent | ||
| 529 | * clocks when registering a clock though, so we use an | ||
| 530 | * array of parent selector values to map between the | ||
| 531 | * indexes the common clock code uses and the selector | ||
| 532 | * values we need. | ||
| 533 | */ | ||
| 534 | parent_sel = parent_process(clocks, &parent_count, &parent_names); | ||
| 535 | if (IS_ERR(parent_sel)) { | ||
| 536 | int ret = PTR_ERR(parent_sel); | ||
| 537 | |||
| 538 | pr_err("%s: error processing parent clocks for %s (%d)\n", | ||
| 539 | __func__, init_data->name, ret); | ||
| 540 | |||
| 541 | return ret; | ||
| 542 | } | ||
| 543 | |||
| 544 | init_data->parent_names = parent_names; | ||
| 545 | init_data->num_parents = parent_count; | ||
| 546 | |||
| 547 | sel->parent_count = parent_count; | ||
| 548 | sel->parent_sel = parent_sel; | ||
| 549 | |||
| 550 | return 0; | ||
| 551 | } | ||
| 552 | |||
| 553 | static void clk_sel_teardown(struct bcm_clk_sel *sel, | ||
| 554 | struct clk_init_data *init_data) | ||
| 555 | { | ||
| 556 | kfree(sel->parent_sel); | ||
| 557 | sel->parent_sel = NULL; | ||
| 558 | sel->parent_count = 0; | ||
| 559 | |||
| 560 | init_data->num_parents = 0; | ||
| 561 | kfree(init_data->parent_names); | ||
| 562 | init_data->parent_names = NULL; | ||
| 563 | } | ||
| 564 | |||
| 565 | static void peri_clk_teardown(struct peri_clk_data *data, | ||
| 566 | struct clk_init_data *init_data) | ||
| 567 | { | ||
| 568 | clk_sel_teardown(&data->sel, init_data); | ||
| 569 | init_data->ops = NULL; | ||
| 570 | } | ||
| 571 | |||
| 572 | /* | ||
| 573 | * Caller is responsible for freeing the parent_names[] and | ||
| 574 | * parent_sel[] arrays in the peripheral clock's "data" structure | ||
| 575 | * that can be assigned if the clock has one or more parent clocks | ||
| 576 | * associated with it. | ||
| 577 | */ | ||
| 578 | static int peri_clk_setup(struct ccu_data *ccu, struct peri_clk_data *data, | ||
| 579 | struct clk_init_data *init_data) | ||
| 580 | { | ||
| 581 | init_data->ops = &kona_peri_clk_ops; | ||
| 582 | init_data->flags = CLK_IGNORE_UNUSED; | ||
| 583 | |||
| 584 | return clk_sel_setup(data->clocks, &data->sel, init_data); | ||
| 585 | } | ||
| 586 | |||
| 587 | static void bcm_clk_teardown(struct kona_clk *bcm_clk) | ||
| 588 | { | ||
| 589 | switch (bcm_clk->type) { | ||
| 590 | case bcm_clk_peri: | ||
| 591 | peri_clk_teardown(bcm_clk->data, &bcm_clk->init_data); | ||
| 592 | break; | ||
| 593 | default: | ||
| 594 | break; | ||
| 595 | } | ||
| 596 | bcm_clk->data = NULL; | ||
| 597 | bcm_clk->type = bcm_clk_none; | ||
| 598 | } | ||
| 599 | |||
| 600 | static void kona_clk_teardown(struct clk *clk) | ||
| 601 | { | ||
| 602 | struct clk_hw *hw; | ||
| 603 | struct kona_clk *bcm_clk; | ||
| 604 | |||
| 605 | if (!clk) | ||
| 606 | return; | ||
| 607 | |||
| 608 | hw = __clk_get_hw(clk); | ||
| 609 | if (!hw) { | ||
| 610 | pr_err("%s: clk %p has null hw pointer\n", __func__, clk); | ||
| 611 | return; | ||
| 612 | } | ||
| 613 | clk_unregister(clk); | ||
| 614 | |||
| 615 | bcm_clk = to_kona_clk(hw); | ||
| 616 | bcm_clk_teardown(bcm_clk); | ||
| 617 | } | ||
| 618 | |||
| 619 | struct clk *kona_clk_setup(struct ccu_data *ccu, const char *name, | ||
| 620 | enum bcm_clk_type type, void *data) | ||
| 621 | { | ||
| 622 | struct kona_clk *bcm_clk; | ||
| 623 | struct clk_init_data *init_data; | ||
| 624 | struct clk *clk = NULL; | ||
| 625 | |||
| 626 | bcm_clk = kzalloc(sizeof(*bcm_clk), GFP_KERNEL); | ||
| 627 | if (!bcm_clk) { | ||
| 628 | pr_err("%s: failed to allocate bcm_clk for %s\n", __func__, | ||
| 629 | name); | ||
| 630 | return NULL; | ||
| 631 | } | ||
| 632 | bcm_clk->ccu = ccu; | ||
| 633 | bcm_clk->name = name; | ||
| 634 | |||
| 635 | init_data = &bcm_clk->init_data; | ||
| 636 | init_data->name = name; | ||
| 637 | switch (type) { | ||
| 638 | case bcm_clk_peri: | ||
| 639 | if (peri_clk_setup(ccu, data, init_data)) | ||
| 640 | goto out_free; | ||
| 641 | break; | ||
| 642 | default: | ||
| 643 | data = NULL; | ||
| 644 | break; | ||
| 645 | } | ||
| 646 | bcm_clk->type = type; | ||
| 647 | bcm_clk->data = data; | ||
| 648 | |||
| 649 | /* Make sure everything makes sense before we set it up */ | ||
| 650 | if (!kona_clk_valid(bcm_clk)) { | ||
| 651 | pr_err("%s: clock data invalid for %s\n", __func__, name); | ||
| 652 | goto out_teardown; | ||
| 653 | } | ||
| 654 | |||
| 655 | bcm_clk->hw.init = init_data; | ||
| 656 | clk = clk_register(NULL, &bcm_clk->hw); | ||
| 657 | if (IS_ERR(clk)) { | ||
| 658 | pr_err("%s: error registering clock %s (%ld)\n", __func__, | ||
| 659 | name, PTR_ERR(clk)); | ||
| 660 | goto out_teardown; | ||
| 661 | } | ||
| 662 | BUG_ON(!clk); | ||
| 663 | |||
| 664 | return clk; | ||
| 665 | out_teardown: | ||
| 666 | bcm_clk_teardown(bcm_clk); | ||
| 667 | out_free: | ||
| 668 | kfree(bcm_clk); | ||
| 669 | |||
| 670 | return NULL; | ||
| 671 | } | ||
| 672 | |||
| 673 | static void ccu_clks_teardown(struct ccu_data *ccu) | ||
| 674 | { | ||
| 675 | u32 i; | ||
| 676 | |||
| 677 | for (i = 0; i < ccu->data.clk_num; i++) | ||
| 678 | kona_clk_teardown(ccu->data.clks[i]); | ||
| 679 | kfree(ccu->data.clks); | ||
| 680 | } | ||
| 681 | |||
| 682 | static void kona_ccu_teardown(struct ccu_data *ccu) | ||
| 683 | { | ||
| 684 | if (!ccu) | ||
| 685 | return; | ||
| 686 | |||
| 687 | if (!ccu->base) | ||
| 688 | goto done; | ||
| 689 | |||
| 690 | of_clk_del_provider(ccu->node); /* safe if never added */ | ||
| 691 | ccu_clks_teardown(ccu); | ||
| 692 | list_del(&ccu->links); | ||
| 693 | of_node_put(ccu->node); | ||
| 694 | iounmap(ccu->base); | ||
| 695 | done: | ||
| 696 | kfree(ccu->name); | ||
| 697 | kfree(ccu); | ||
| 698 | } | ||
| 699 | |||
| 700 | /* | ||
| 701 | * Set up a CCU. Call the provided ccu_clks_setup callback to | ||
| 702 | * initialize the array of clocks provided by the CCU. | ||
| 703 | */ | ||
| 704 | void __init kona_dt_ccu_setup(struct device_node *node, | ||
| 705 | int (*ccu_clks_setup)(struct ccu_data *)) | ||
| 706 | { | ||
| 707 | struct ccu_data *ccu; | ||
| 708 | struct resource res = { 0 }; | ||
| 709 | resource_size_t range; | ||
| 710 | int ret; | ||
| 711 | |||
| 712 | ccu = kzalloc(sizeof(*ccu), GFP_KERNEL); | ||
| 713 | if (ccu) | ||
| 714 | ccu->name = kstrdup(node->name, GFP_KERNEL); | ||
| 715 | if (!ccu || !ccu->name) { | ||
| 716 | pr_err("%s: unable to allocate CCU struct for %s\n", | ||
| 717 | __func__, node->name); | ||
| 718 | kfree(ccu); | ||
| 719 | |||
| 720 | return; | ||
| 721 | } | ||
| 722 | |||
| 723 | ret = of_address_to_resource(node, 0, &res); | ||
| 724 | if (ret) { | ||
| 725 | pr_err("%s: no valid CCU registers found for %s\n", __func__, | ||
| 726 | node->name); | ||
| 727 | goto out_err; | ||
| 728 | } | ||
| 729 | |||
| 730 | range = resource_size(&res); | ||
| 731 | if (range > (resource_size_t)U32_MAX) { | ||
| 732 | pr_err("%s: address range too large for %s\n", __func__, | ||
| 733 | node->name); | ||
| 734 | goto out_err; | ||
| 735 | } | ||
| 736 | |||
| 737 | ccu->range = (u32)range; | ||
| 738 | ccu->base = ioremap(res.start, ccu->range); | ||
| 739 | if (!ccu->base) { | ||
| 740 | pr_err("%s: unable to map CCU registers for %s\n", __func__, | ||
| 741 | node->name); | ||
| 742 | goto out_err; | ||
| 743 | } | ||
| 744 | |||
| 745 | spin_lock_init(&ccu->lock); | ||
| 746 | INIT_LIST_HEAD(&ccu->links); | ||
| 747 | ccu->node = of_node_get(node); | ||
| 748 | |||
| 749 | list_add_tail(&ccu->links, &ccu_list); | ||
| 750 | |||
| 751 | /* Set up clocks array (in ccu->data) */ | ||
| 752 | if (ccu_clks_setup(ccu)) | ||
| 753 | goto out_err; | ||
| 754 | |||
| 755 | ret = of_clk_add_provider(node, of_clk_src_onecell_get, &ccu->data); | ||
| 756 | if (ret) { | ||
| 757 | pr_err("%s: error adding ccu %s as provider (%d)\n", __func__, | ||
| 758 | node->name, ret); | ||
| 759 | goto out_err; | ||
| 760 | } | ||
| 761 | |||
| 762 | if (!kona_ccu_init(ccu)) | ||
| 763 | pr_err("Broadcom %s initialization had errors\n", node->name); | ||
| 764 | |||
| 765 | return; | ||
| 766 | out_err: | ||
| 767 | kona_ccu_teardown(ccu); | ||
| 768 | pr_err("Broadcom %s setup aborted\n", node->name); | ||
| 769 | } | ||
diff --git a/drivers/clk/bcm/clk-kona.c b/drivers/clk/bcm/clk-kona.c new file mode 100644 index 000000000000..e3d339e08309 --- /dev/null +++ b/drivers/clk/bcm/clk-kona.c | |||
| @@ -0,0 +1,1033 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Broadcom Corporation | ||
| 3 | * Copyright 2013 Linaro Limited | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation version 2. | ||
| 8 | * | ||
| 9 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 10 | * kind, whether express or implied; without even the implied warranty | ||
| 11 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include "clk-kona.h" | ||
| 16 | |||
| 17 | #include <linux/delay.h> | ||
| 18 | |||
| 19 | #define CCU_ACCESS_PASSWORD 0xA5A500 | ||
| 20 | #define CLK_GATE_DELAY_LOOP 2000 | ||
| 21 | |||
| 22 | /* Bitfield operations */ | ||
| 23 | |||
| 24 | /* Produces a mask of set bits covering a range of a 32-bit value */ | ||
| 25 | static inline u32 bitfield_mask(u32 shift, u32 width) | ||
| 26 | { | ||
| 27 | return ((1 << width) - 1) << shift; | ||
| 28 | } | ||
| 29 | |||
| 30 | /* Extract the value of a bitfield found within a given register value */ | ||
| 31 | static inline u32 bitfield_extract(u32 reg_val, u32 shift, u32 width) | ||
| 32 | { | ||
| 33 | return (reg_val & bitfield_mask(shift, width)) >> shift; | ||
| 34 | } | ||
| 35 | |||
| 36 | /* Replace the value of a bitfield found within a given register value */ | ||
| 37 | static inline u32 bitfield_replace(u32 reg_val, u32 shift, u32 width, u32 val) | ||
| 38 | { | ||
| 39 | u32 mask = bitfield_mask(shift, width); | ||
| 40 | |||
| 41 | return (reg_val & ~mask) | (val << shift); | ||
| 42 | } | ||
| 43 | |||
| 44 | /* Divider and scaling helpers */ | ||
| 45 | |||
| 46 | /* | ||
| 47 | * Implement DIV_ROUND_CLOSEST() for 64-bit dividend and both values | ||
| 48 | * unsigned. Note that unlike do_div(), the remainder is discarded | ||
| 49 | * and the return value is the quotient (not the remainder). | ||
| 50 | */ | ||
| 51 | u64 do_div_round_closest(u64 dividend, unsigned long divisor) | ||
| 52 | { | ||
| 53 | u64 result; | ||
| 54 | |||
| 55 | result = dividend + ((u64)divisor >> 1); | ||
| 56 | (void)do_div(result, divisor); | ||
| 57 | |||
| 58 | return result; | ||
| 59 | } | ||
| 60 | |||
| 61 | /* Convert a divider into the scaled divisor value it represents. */ | ||
| 62 | static inline u64 scaled_div_value(struct bcm_clk_div *div, u32 reg_div) | ||
| 63 | { | ||
| 64 | return (u64)reg_div + ((u64)1 << div->frac_width); | ||
| 65 | } | ||
| 66 | |||
| 67 | /* | ||
| 68 | * Build a scaled divider value as close as possible to the | ||
| 69 | * given whole part (div_value) and fractional part (expressed | ||
| 70 | * in billionths). | ||
| 71 | */ | ||
| 72 | u64 scaled_div_build(struct bcm_clk_div *div, u32 div_value, u32 billionths) | ||
| 73 | { | ||
| 74 | u64 combined; | ||
| 75 | |||
| 76 | BUG_ON(!div_value); | ||
| 77 | BUG_ON(billionths >= BILLION); | ||
| 78 | |||
| 79 | combined = (u64)div_value * BILLION + billionths; | ||
| 80 | combined <<= div->frac_width; | ||
| 81 | |||
| 82 | return do_div_round_closest(combined, BILLION); | ||
| 83 | } | ||
| 84 | |||
| 85 | /* The scaled minimum divisor representable by a divider */ | ||
| 86 | static inline u64 | ||
| 87 | scaled_div_min(struct bcm_clk_div *div) | ||
| 88 | { | ||
| 89 | if (divider_is_fixed(div)) | ||
| 90 | return (u64)div->fixed; | ||
| 91 | |||
| 92 | return scaled_div_value(div, 0); | ||
| 93 | } | ||
| 94 | |||
| 95 | /* The scaled maximum divisor representable by a divider */ | ||
| 96 | u64 scaled_div_max(struct bcm_clk_div *div) | ||
| 97 | { | ||
| 98 | u32 reg_div; | ||
| 99 | |||
| 100 | if (divider_is_fixed(div)) | ||
| 101 | return (u64)div->fixed; | ||
| 102 | |||
| 103 | reg_div = ((u32)1 << div->width) - 1; | ||
| 104 | |||
| 105 | return scaled_div_value(div, reg_div); | ||
| 106 | } | ||
| 107 | |||
| 108 | /* | ||
| 109 | * Convert a scaled divisor into its divider representation as | ||
| 110 | * stored in a divider register field. | ||
| 111 | */ | ||
| 112 | static inline u32 | ||
| 113 | divider(struct bcm_clk_div *div, u64 scaled_div) | ||
| 114 | { | ||
| 115 | BUG_ON(scaled_div < scaled_div_min(div)); | ||
| 116 | BUG_ON(scaled_div > scaled_div_max(div)); | ||
| 117 | |||
| 118 | return (u32)(scaled_div - ((u64)1 << div->frac_width)); | ||
| 119 | } | ||
| 120 | |||
| 121 | /* Return a rate scaled for use when dividing by a scaled divisor. */ | ||
| 122 | static inline u64 | ||
| 123 | scale_rate(struct bcm_clk_div *div, u32 rate) | ||
| 124 | { | ||
| 125 | if (divider_is_fixed(div)) | ||
| 126 | return (u64)rate; | ||
| 127 | |||
| 128 | return (u64)rate << div->frac_width; | ||
| 129 | } | ||
| 130 | |||
| 131 | /* CCU access */ | ||
| 132 | |||
| 133 | /* Read a 32-bit register value from a CCU's address space. */ | ||
| 134 | static inline u32 __ccu_read(struct ccu_data *ccu, u32 reg_offset) | ||
| 135 | { | ||
| 136 | return readl(ccu->base + reg_offset); | ||
| 137 | } | ||
| 138 | |||
| 139 | /* Write a 32-bit register value into a CCU's address space. */ | ||
| 140 | static inline void | ||
| 141 | __ccu_write(struct ccu_data *ccu, u32 reg_offset, u32 reg_val) | ||
| 142 | { | ||
| 143 | writel(reg_val, ccu->base + reg_offset); | ||
| 144 | } | ||
| 145 | |||
| 146 | static inline unsigned long ccu_lock(struct ccu_data *ccu) | ||
| 147 | { | ||
| 148 | unsigned long flags; | ||
| 149 | |||
| 150 | spin_lock_irqsave(&ccu->lock, flags); | ||
| 151 | |||
| 152 | return flags; | ||
| 153 | } | ||
| 154 | static inline void ccu_unlock(struct ccu_data *ccu, unsigned long flags) | ||
| 155 | { | ||
| 156 | spin_unlock_irqrestore(&ccu->lock, flags); | ||
| 157 | } | ||
| 158 | |||
| 159 | /* | ||
| 160 | * Enable/disable write access to CCU protected registers. The | ||
| 161 | * WR_ACCESS register for all CCUs is at offset 0. | ||
| 162 | */ | ||
| 163 | static inline void __ccu_write_enable(struct ccu_data *ccu) | ||
| 164 | { | ||
| 165 | if (ccu->write_enabled) { | ||
| 166 | pr_err("%s: access already enabled for %s\n", __func__, | ||
| 167 | ccu->name); | ||
| 168 | return; | ||
| 169 | } | ||
| 170 | ccu->write_enabled = true; | ||
| 171 | __ccu_write(ccu, 0, CCU_ACCESS_PASSWORD | 1); | ||
| 172 | } | ||
| 173 | |||
| 174 | static inline void __ccu_write_disable(struct ccu_data *ccu) | ||
| 175 | { | ||
| 176 | if (!ccu->write_enabled) { | ||
| 177 | pr_err("%s: access wasn't enabled for %s\n", __func__, | ||
| 178 | ccu->name); | ||
| 179 | return; | ||
| 180 | } | ||
| 181 | |||
| 182 | __ccu_write(ccu, 0, CCU_ACCESS_PASSWORD); | ||
| 183 | ccu->write_enabled = false; | ||
| 184 | } | ||
| 185 | |||
| 186 | /* | ||
| 187 | * Poll a register in a CCU's address space, returning when the | ||
| 188 | * specified bit in that register's value is set (or clear). Delay | ||
| 189 | * a microsecond after each read of the register. Returns true if | ||
| 190 | * successful, or false if we gave up trying. | ||
| 191 | * | ||
| 192 | * Caller must ensure the CCU lock is held. | ||
| 193 | */ | ||
| 194 | static inline bool | ||
| 195 | __ccu_wait_bit(struct ccu_data *ccu, u32 reg_offset, u32 bit, bool want) | ||
| 196 | { | ||
| 197 | unsigned int tries; | ||
| 198 | u32 bit_mask = 1 << bit; | ||
| 199 | |||
| 200 | for (tries = 0; tries < CLK_GATE_DELAY_LOOP; tries++) { | ||
| 201 | u32 val; | ||
| 202 | bool bit_val; | ||
| 203 | |||
| 204 | val = __ccu_read(ccu, reg_offset); | ||
| 205 | bit_val = (val & bit_mask) != 0; | ||
| 206 | if (bit_val == want) | ||
| 207 | return true; | ||
| 208 | udelay(1); | ||
| 209 | } | ||
| 210 | return false; | ||
| 211 | } | ||
| 212 | |||
| 213 | /* Gate operations */ | ||
| 214 | |||
| 215 | /* Determine whether a clock is gated. CCU lock must be held. */ | ||
| 216 | static bool | ||
| 217 | __is_clk_gate_enabled(struct ccu_data *ccu, struct bcm_clk_gate *gate) | ||
| 218 | { | ||
| 219 | u32 bit_mask; | ||
| 220 | u32 reg_val; | ||
| 221 | |||
| 222 | /* If there is no gate we can assume it's enabled. */ | ||
| 223 | if (!gate_exists(gate)) | ||
| 224 | return true; | ||
| 225 | |||
| 226 | bit_mask = 1 << gate->status_bit; | ||
| 227 | reg_val = __ccu_read(ccu, gate->offset); | ||
| 228 | |||
| 229 | return (reg_val & bit_mask) != 0; | ||
| 230 | } | ||
| 231 | |||
| 232 | /* Determine whether a clock is gated. */ | ||
| 233 | static bool | ||
| 234 | is_clk_gate_enabled(struct ccu_data *ccu, struct bcm_clk_gate *gate) | ||
| 235 | { | ||
| 236 | long flags; | ||
| 237 | bool ret; | ||
| 238 | |||
| 239 | /* Avoid taking the lock if we can */ | ||
| 240 | if (!gate_exists(gate)) | ||
| 241 | return true; | ||
| 242 | |||
| 243 | flags = ccu_lock(ccu); | ||
| 244 | ret = __is_clk_gate_enabled(ccu, gate); | ||
| 245 | ccu_unlock(ccu, flags); | ||
| 246 | |||
| 247 | return ret; | ||
| 248 | } | ||
| 249 | |||
| 250 | /* | ||
| 251 | * Commit our desired gate state to the hardware. | ||
| 252 | * Returns true if successful, false otherwise. | ||
| 253 | */ | ||
| 254 | static bool | ||
| 255 | __gate_commit(struct ccu_data *ccu, struct bcm_clk_gate *gate) | ||
| 256 | { | ||
| 257 | u32 reg_val; | ||
| 258 | u32 mask; | ||
| 259 | bool enabled = false; | ||
| 260 | |||
| 261 | BUG_ON(!gate_exists(gate)); | ||
| 262 | if (!gate_is_sw_controllable(gate)) | ||
| 263 | return true; /* Nothing we can change */ | ||
| 264 | |||
| 265 | reg_val = __ccu_read(ccu, gate->offset); | ||
| 266 | |||
| 267 | /* For a hardware/software gate, set which is in control */ | ||
| 268 | if (gate_is_hw_controllable(gate)) { | ||
| 269 | mask = (u32)1 << gate->hw_sw_sel_bit; | ||
| 270 | if (gate_is_sw_managed(gate)) | ||
| 271 | reg_val |= mask; | ||
| 272 | else | ||
| 273 | reg_val &= ~mask; | ||
| 274 | } | ||
| 275 | |||
| 276 | /* | ||
| 277 | * If software is in control, enable or disable the gate. | ||
| 278 | * If hardware is, clear the enabled bit for good measure. | ||
| 279 | * If a software controlled gate can't be disabled, we're | ||
| 280 | * required to write a 0 into the enable bit (but the gate | ||
| 281 | * will be enabled). | ||
| 282 | */ | ||
| 283 | mask = (u32)1 << gate->en_bit; | ||
| 284 | if (gate_is_sw_managed(gate) && (enabled = gate_is_enabled(gate)) && | ||
| 285 | !gate_is_no_disable(gate)) | ||
| 286 | reg_val |= mask; | ||
| 287 | else | ||
| 288 | reg_val &= ~mask; | ||
| 289 | |||
| 290 | __ccu_write(ccu, gate->offset, reg_val); | ||
| 291 | |||
| 292 | /* For a hardware controlled gate, we're done */ | ||
| 293 | if (!gate_is_sw_managed(gate)) | ||
| 294 | return true; | ||
| 295 | |||
| 296 | /* Otherwise wait for the gate to be in desired state */ | ||
| 297 | return __ccu_wait_bit(ccu, gate->offset, gate->status_bit, enabled); | ||
| 298 | } | ||
| 299 | |||
| 300 | /* | ||
| 301 | * Initialize a gate. Our desired state (hardware/software select, | ||
| 302 | * and if software, its enable state) is committed to hardware | ||
| 303 | * without the usual checks to see if it's already set up that way. | ||
| 304 | * Returns true if successful, false otherwise. | ||
| 305 | */ | ||
| 306 | static bool gate_init(struct ccu_data *ccu, struct bcm_clk_gate *gate) | ||
| 307 | { | ||
| 308 | if (!gate_exists(gate)) | ||
| 309 | return true; | ||
| 310 | return __gate_commit(ccu, gate); | ||
| 311 | } | ||
| 312 | |||
| 313 | /* | ||
| 314 | * Set a gate to enabled or disabled state. Does nothing if the | ||
| 315 | * gate is not currently under software control, or if it is already | ||
| 316 | * in the requested state. Returns true if successful, false | ||
| 317 | * otherwise. CCU lock must be held. | ||
| 318 | */ | ||
| 319 | static bool | ||
| 320 | __clk_gate(struct ccu_data *ccu, struct bcm_clk_gate *gate, bool enable) | ||
| 321 | { | ||
| 322 | bool ret; | ||
| 323 | |||
| 324 | if (!gate_exists(gate) || !gate_is_sw_managed(gate)) | ||
| 325 | return true; /* Nothing to do */ | ||
| 326 | |||
| 327 | if (!enable && gate_is_no_disable(gate)) { | ||
| 328 | pr_warn("%s: invalid gate disable request (ignoring)\n", | ||
| 329 | __func__); | ||
| 330 | return true; | ||
| 331 | } | ||
| 332 | |||
| 333 | if (enable == gate_is_enabled(gate)) | ||
| 334 | return true; /* No change */ | ||
| 335 | |||
| 336 | gate_flip_enabled(gate); | ||
| 337 | ret = __gate_commit(ccu, gate); | ||
| 338 | if (!ret) | ||
| 339 | gate_flip_enabled(gate); /* Revert the change */ | ||
| 340 | |||
| 341 | return ret; | ||
| 342 | } | ||
| 343 | |||
| 344 | /* Enable or disable a gate. Returns 0 if successful, -EIO otherwise */ | ||
| 345 | static int clk_gate(struct ccu_data *ccu, const char *name, | ||
| 346 | struct bcm_clk_gate *gate, bool enable) | ||
| 347 | { | ||
| 348 | unsigned long flags; | ||
| 349 | bool success; | ||
| 350 | |||
| 351 | /* | ||
| 352 | * Avoid taking the lock if we can. We quietly ignore | ||
| 353 | * requests to change state that don't make sense. | ||
| 354 | */ | ||
| 355 | if (!gate_exists(gate) || !gate_is_sw_managed(gate)) | ||
| 356 | return 0; | ||
| 357 | if (!enable && gate_is_no_disable(gate)) | ||
| 358 | return 0; | ||
| 359 | |||
| 360 | flags = ccu_lock(ccu); | ||
| 361 | __ccu_write_enable(ccu); | ||
| 362 | |||
| 363 | success = __clk_gate(ccu, gate, enable); | ||
| 364 | |||
| 365 | __ccu_write_disable(ccu); | ||
| 366 | ccu_unlock(ccu, flags); | ||
| 367 | |||
| 368 | if (success) | ||
| 369 | return 0; | ||
| 370 | |||
| 371 | pr_err("%s: failed to %s gate for %s\n", __func__, | ||
| 372 | enable ? "enable" : "disable", name); | ||
| 373 | |||
| 374 | return -EIO; | ||
| 375 | } | ||
| 376 | |||
| 377 | /* Trigger operations */ | ||
| 378 | |||
| 379 | /* | ||
| 380 | * Caller must ensure CCU lock is held and access is enabled. | ||
| 381 | * Returns true if successful, false otherwise. | ||
| 382 | */ | ||
| 383 | static bool __clk_trigger(struct ccu_data *ccu, struct bcm_clk_trig *trig) | ||
| 384 | { | ||
| 385 | /* Trigger the clock and wait for it to finish */ | ||
| 386 | __ccu_write(ccu, trig->offset, 1 << trig->bit); | ||
| 387 | |||
| 388 | return __ccu_wait_bit(ccu, trig->offset, trig->bit, false); | ||
| 389 | } | ||
| 390 | |||
| 391 | /* Divider operations */ | ||
| 392 | |||
| 393 | /* Read a divider value and return the scaled divisor it represents. */ | ||
| 394 | static u64 divider_read_scaled(struct ccu_data *ccu, struct bcm_clk_div *div) | ||
| 395 | { | ||
| 396 | unsigned long flags; | ||
| 397 | u32 reg_val; | ||
| 398 | u32 reg_div; | ||
| 399 | |||
| 400 | if (divider_is_fixed(div)) | ||
| 401 | return (u64)div->fixed; | ||
| 402 | |||
| 403 | flags = ccu_lock(ccu); | ||
| 404 | reg_val = __ccu_read(ccu, div->offset); | ||
| 405 | ccu_unlock(ccu, flags); | ||
| 406 | |||
| 407 | /* Extract the full divider field from the register value */ | ||
| 408 | reg_div = bitfield_extract(reg_val, div->shift, div->width); | ||
| 409 | |||
| 410 | /* Return the scaled divisor value it represents */ | ||
| 411 | return scaled_div_value(div, reg_div); | ||
| 412 | } | ||
| 413 | |||
| 414 | /* | ||
| 415 | * Convert a divider's scaled divisor value into its recorded form | ||
| 416 | * and commit it into the hardware divider register. | ||
| 417 | * | ||
| 418 | * Returns 0 on success. Returns -EINVAL for invalid arguments. | ||
| 419 | * Returns -ENXIO if gating failed, and -EIO if a trigger failed. | ||
| 420 | */ | ||
| 421 | static int __div_commit(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 422 | struct bcm_clk_div *div, struct bcm_clk_trig *trig) | ||
| 423 | { | ||
| 424 | bool enabled; | ||
| 425 | u32 reg_div; | ||
| 426 | u32 reg_val; | ||
| 427 | int ret = 0; | ||
| 428 | |||
| 429 | BUG_ON(divider_is_fixed(div)); | ||
| 430 | |||
| 431 | /* | ||
| 432 | * If we're just initializing the divider, and no initial | ||
| 433 | * state was defined in the device tree, we just find out | ||
| 434 | * what its current value is rather than updating it. | ||
| 435 | */ | ||
| 436 | if (div->scaled_div == BAD_SCALED_DIV_VALUE) { | ||
| 437 | reg_val = __ccu_read(ccu, div->offset); | ||
| 438 | reg_div = bitfield_extract(reg_val, div->shift, div->width); | ||
| 439 | div->scaled_div = scaled_div_value(div, reg_div); | ||
| 440 | |||
| 441 | return 0; | ||
| 442 | } | ||
| 443 | |||
| 444 | /* Convert the scaled divisor to the value we need to record */ | ||
| 445 | reg_div = divider(div, div->scaled_div); | ||
| 446 | |||
| 447 | /* Clock needs to be enabled before changing the rate */ | ||
| 448 | enabled = __is_clk_gate_enabled(ccu, gate); | ||
| 449 | if (!enabled && !__clk_gate(ccu, gate, true)) { | ||
| 450 | ret = -ENXIO; | ||
| 451 | goto out; | ||
| 452 | } | ||
| 453 | |||
| 454 | /* Replace the divider value and record the result */ | ||
| 455 | reg_val = __ccu_read(ccu, div->offset); | ||
| 456 | reg_val = bitfield_replace(reg_val, div->shift, div->width, reg_div); | ||
| 457 | __ccu_write(ccu, div->offset, reg_val); | ||
| 458 | |||
| 459 | /* If the trigger fails we still want to disable the gate */ | ||
| 460 | if (!__clk_trigger(ccu, trig)) | ||
| 461 | ret = -EIO; | ||
| 462 | |||
| 463 | /* Disable the clock again if it was disabled to begin with */ | ||
| 464 | if (!enabled && !__clk_gate(ccu, gate, false)) | ||
| 465 | ret = ret ? ret : -ENXIO; /* return first error */ | ||
| 466 | out: | ||
| 467 | return ret; | ||
| 468 | } | ||
| 469 | |||
| 470 | /* | ||
| 471 | * Initialize a divider by committing our desired state to hardware | ||
| 472 | * without the usual checks to see if it's already set up that way. | ||
| 473 | * Returns true if successful, false otherwise. | ||
| 474 | */ | ||
| 475 | static bool div_init(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 476 | struct bcm_clk_div *div, struct bcm_clk_trig *trig) | ||
| 477 | { | ||
| 478 | if (!divider_exists(div) || divider_is_fixed(div)) | ||
| 479 | return true; | ||
| 480 | return !__div_commit(ccu, gate, div, trig); | ||
| 481 | } | ||
| 482 | |||
| 483 | static int divider_write(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 484 | struct bcm_clk_div *div, struct bcm_clk_trig *trig, | ||
| 485 | u64 scaled_div) | ||
| 486 | { | ||
| 487 | unsigned long flags; | ||
| 488 | u64 previous; | ||
| 489 | int ret; | ||
| 490 | |||
| 491 | BUG_ON(divider_is_fixed(div)); | ||
| 492 | |||
| 493 | previous = div->scaled_div; | ||
| 494 | if (previous == scaled_div) | ||
| 495 | return 0; /* No change */ | ||
| 496 | |||
| 497 | div->scaled_div = scaled_div; | ||
| 498 | |||
| 499 | flags = ccu_lock(ccu); | ||
| 500 | __ccu_write_enable(ccu); | ||
| 501 | |||
| 502 | ret = __div_commit(ccu, gate, div, trig); | ||
| 503 | |||
| 504 | __ccu_write_disable(ccu); | ||
| 505 | ccu_unlock(ccu, flags); | ||
| 506 | |||
| 507 | if (ret) | ||
| 508 | div->scaled_div = previous; /* Revert the change */ | ||
| 509 | |||
| 510 | return ret; | ||
| 511 | |||
| 512 | } | ||
| 513 | |||
| 514 | /* Common clock rate helpers */ | ||
| 515 | |||
| 516 | /* | ||
| 517 | * Implement the common clock framework recalc_rate method, taking | ||
| 518 | * into account a divider and an optional pre-divider. The | ||
| 519 | * pre-divider register pointer may be NULL. | ||
| 520 | */ | ||
| 521 | static unsigned long clk_recalc_rate(struct ccu_data *ccu, | ||
| 522 | struct bcm_clk_div *div, struct bcm_clk_div *pre_div, | ||
| 523 | unsigned long parent_rate) | ||
| 524 | { | ||
| 525 | u64 scaled_parent_rate; | ||
| 526 | u64 scaled_div; | ||
| 527 | u64 result; | ||
| 528 | |||
| 529 | if (!divider_exists(div)) | ||
| 530 | return parent_rate; | ||
| 531 | |||
| 532 | if (parent_rate > (unsigned long)LONG_MAX) | ||
| 533 | return 0; /* actually this would be a caller bug */ | ||
| 534 | |||
| 535 | /* | ||
| 536 | * If there is a pre-divider, divide the scaled parent rate | ||
| 537 | * by the pre-divider value first. In this case--to improve | ||
| 538 | * accuracy--scale the parent rate by *both* the pre-divider | ||
| 539 | * value and the divider before actually computing the | ||
| 540 | * result of the pre-divider. | ||
| 541 | * | ||
| 542 | * If there's only one divider, just scale the parent rate. | ||
| 543 | */ | ||
| 544 | if (pre_div && divider_exists(pre_div)) { | ||
| 545 | u64 scaled_rate; | ||
| 546 | |||
| 547 | scaled_rate = scale_rate(pre_div, parent_rate); | ||
| 548 | scaled_rate = scale_rate(div, scaled_rate); | ||
| 549 | scaled_div = divider_read_scaled(ccu, pre_div); | ||
| 550 | scaled_parent_rate = do_div_round_closest(scaled_rate, | ||
| 551 | scaled_div); | ||
| 552 | } else { | ||
| 553 | scaled_parent_rate = scale_rate(div, parent_rate); | ||
| 554 | } | ||
| 555 | |||
| 556 | /* | ||
| 557 | * Get the scaled divisor value, and divide the scaled | ||
| 558 | * parent rate by that to determine this clock's resulting | ||
| 559 | * rate. | ||
| 560 | */ | ||
| 561 | scaled_div = divider_read_scaled(ccu, div); | ||
| 562 | result = do_div_round_closest(scaled_parent_rate, scaled_div); | ||
| 563 | |||
| 564 | return (unsigned long)result; | ||
| 565 | } | ||
| 566 | |||
| 567 | /* | ||
| 568 | * Compute the output rate produced when a given parent rate is fed | ||
| 569 | * into two dividers. The pre-divider can be NULL, and even if it's | ||
| 570 | * non-null it may be nonexistent. It's also OK for the divider to | ||
| 571 | * be nonexistent, and in that case the pre-divider is also ignored. | ||
| 572 | * | ||
| 573 | * If scaled_div is non-null, it is used to return the scaled divisor | ||
| 574 | * value used by the (downstream) divider to produce that rate. | ||
| 575 | */ | ||
| 576 | static long round_rate(struct ccu_data *ccu, struct bcm_clk_div *div, | ||
| 577 | struct bcm_clk_div *pre_div, | ||
| 578 | unsigned long rate, unsigned long parent_rate, | ||
| 579 | u64 *scaled_div) | ||
| 580 | { | ||
| 581 | u64 scaled_parent_rate; | ||
| 582 | u64 min_scaled_div; | ||
| 583 | u64 max_scaled_div; | ||
| 584 | u64 best_scaled_div; | ||
| 585 | u64 result; | ||
| 586 | |||
| 587 | BUG_ON(!divider_exists(div)); | ||
| 588 | BUG_ON(!rate); | ||
| 589 | BUG_ON(parent_rate > (u64)LONG_MAX); | ||
| 590 | |||
| 591 | /* | ||
| 592 | * If there is a pre-divider, divide the scaled parent rate | ||
| 593 | * by the pre-divider value first. In this case--to improve | ||
| 594 | * accuracy--scale the parent rate by *both* the pre-divider | ||
| 595 | * value and the divider before actually computing the | ||
| 596 | * result of the pre-divider. | ||
| 597 | * | ||
| 598 | * If there's only one divider, just scale the parent rate. | ||
| 599 | * | ||
| 600 | * For simplicity we treat the pre-divider as fixed (for now). | ||
| 601 | */ | ||
| 602 | if (divider_exists(pre_div)) { | ||
| 603 | u64 scaled_rate; | ||
| 604 | u64 scaled_pre_div; | ||
| 605 | |||
| 606 | scaled_rate = scale_rate(pre_div, parent_rate); | ||
| 607 | scaled_rate = scale_rate(div, scaled_rate); | ||
| 608 | scaled_pre_div = divider_read_scaled(ccu, pre_div); | ||
| 609 | scaled_parent_rate = do_div_round_closest(scaled_rate, | ||
| 610 | scaled_pre_div); | ||
| 611 | } else { | ||
| 612 | scaled_parent_rate = scale_rate(div, parent_rate); | ||
| 613 | } | ||
| 614 | |||
| 615 | /* | ||
| 616 | * Compute the best possible divider and ensure it is in | ||
| 617 | * range. A fixed divider can't be changed, so just report | ||
| 618 | * the best we can do. | ||
| 619 | */ | ||
| 620 | if (!divider_is_fixed(div)) { | ||
| 621 | best_scaled_div = do_div_round_closest(scaled_parent_rate, | ||
| 622 | rate); | ||
| 623 | min_scaled_div = scaled_div_min(div); | ||
| 624 | max_scaled_div = scaled_div_max(div); | ||
| 625 | if (best_scaled_div > max_scaled_div) | ||
| 626 | best_scaled_div = max_scaled_div; | ||
| 627 | else if (best_scaled_div < min_scaled_div) | ||
| 628 | best_scaled_div = min_scaled_div; | ||
| 629 | } else { | ||
| 630 | best_scaled_div = divider_read_scaled(ccu, div); | ||
| 631 | } | ||
| 632 | |||
| 633 | /* OK, figure out the resulting rate */ | ||
| 634 | result = do_div_round_closest(scaled_parent_rate, best_scaled_div); | ||
| 635 | |||
| 636 | if (scaled_div) | ||
| 637 | *scaled_div = best_scaled_div; | ||
| 638 | |||
| 639 | return (long)result; | ||
| 640 | } | ||
| 641 | |||
| 642 | /* Common clock parent helpers */ | ||
| 643 | |||
| 644 | /* | ||
| 645 | * For a given parent selector (register field) value, find the | ||
| 646 | * index into a selector's parent_sel array that contains it. | ||
| 647 | * Returns the index, or BAD_CLK_INDEX if it's not found. | ||
| 648 | */ | ||
| 649 | static u8 parent_index(struct bcm_clk_sel *sel, u8 parent_sel) | ||
| 650 | { | ||
| 651 | u8 i; | ||
| 652 | |||
| 653 | BUG_ON(sel->parent_count > (u32)U8_MAX); | ||
| 654 | for (i = 0; i < sel->parent_count; i++) | ||
| 655 | if (sel->parent_sel[i] == parent_sel) | ||
| 656 | return i; | ||
| 657 | return BAD_CLK_INDEX; | ||
| 658 | } | ||
| 659 | |||
| 660 | /* | ||
| 661 | * Fetch the current value of the selector, and translate that into | ||
| 662 | * its corresponding index in the parent array we registered with | ||
| 663 | * the clock framework. | ||
| 664 | * | ||
| 665 | * Returns parent array index that corresponds with the value found, | ||
| 666 | * or BAD_CLK_INDEX if the found value is out of range. | ||
| 667 | */ | ||
| 668 | static u8 selector_read_index(struct ccu_data *ccu, struct bcm_clk_sel *sel) | ||
| 669 | { | ||
| 670 | unsigned long flags; | ||
| 671 | u32 reg_val; | ||
| 672 | u32 parent_sel; | ||
| 673 | u8 index; | ||
| 674 | |||
| 675 | /* If there's no selector, there's only one parent */ | ||
| 676 | if (!selector_exists(sel)) | ||
| 677 | return 0; | ||
| 678 | |||
| 679 | /* Get the value in the selector register */ | ||
| 680 | flags = ccu_lock(ccu); | ||
| 681 | reg_val = __ccu_read(ccu, sel->offset); | ||
| 682 | ccu_unlock(ccu, flags); | ||
| 683 | |||
| 684 | parent_sel = bitfield_extract(reg_val, sel->shift, sel->width); | ||
| 685 | |||
| 686 | /* Look up that selector's parent array index and return it */ | ||
| 687 | index = parent_index(sel, parent_sel); | ||
| 688 | if (index == BAD_CLK_INDEX) | ||
| 689 | pr_err("%s: out-of-range parent selector %u (%s 0x%04x)\n", | ||
| 690 | __func__, parent_sel, ccu->name, sel->offset); | ||
| 691 | |||
| 692 | return index; | ||
| 693 | } | ||
| 694 | |||
| 695 | /* | ||
| 696 | * Commit our desired selector value to the hardware. | ||
| 697 | * | ||
| 698 | * Returns 0 on success. Returns -EINVAL for invalid arguments. | ||
| 699 | * Returns -ENXIO if gating failed, and -EIO if a trigger failed. | ||
| 700 | */ | ||
| 701 | static int | ||
| 702 | __sel_commit(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 703 | struct bcm_clk_sel *sel, struct bcm_clk_trig *trig) | ||
| 704 | { | ||
| 705 | u32 parent_sel; | ||
| 706 | u32 reg_val; | ||
| 707 | bool enabled; | ||
| 708 | int ret = 0; | ||
| 709 | |||
| 710 | BUG_ON(!selector_exists(sel)); | ||
| 711 | |||
| 712 | /* | ||
| 713 | * If we're just initializing the selector, and no initial | ||
| 714 | * state was defined in the device tree, we just find out | ||
| 715 | * what its current value is rather than updating it. | ||
| 716 | */ | ||
| 717 | if (sel->clk_index == BAD_CLK_INDEX) { | ||
| 718 | u8 index; | ||
| 719 | |||
| 720 | reg_val = __ccu_read(ccu, sel->offset); | ||
| 721 | parent_sel = bitfield_extract(reg_val, sel->shift, sel->width); | ||
| 722 | index = parent_index(sel, parent_sel); | ||
| 723 | if (index == BAD_CLK_INDEX) | ||
| 724 | return -EINVAL; | ||
| 725 | sel->clk_index = index; | ||
| 726 | |||
| 727 | return 0; | ||
| 728 | } | ||
| 729 | |||
| 730 | BUG_ON((u32)sel->clk_index >= sel->parent_count); | ||
| 731 | parent_sel = sel->parent_sel[sel->clk_index]; | ||
| 732 | |||
| 733 | /* Clock needs to be enabled before changing the parent */ | ||
| 734 | enabled = __is_clk_gate_enabled(ccu, gate); | ||
| 735 | if (!enabled && !__clk_gate(ccu, gate, true)) | ||
| 736 | return -ENXIO; | ||
| 737 | |||
| 738 | /* Replace the selector value and record the result */ | ||
| 739 | reg_val = __ccu_read(ccu, sel->offset); | ||
| 740 | reg_val = bitfield_replace(reg_val, sel->shift, sel->width, parent_sel); | ||
| 741 | __ccu_write(ccu, sel->offset, reg_val); | ||
| 742 | |||
| 743 | /* If the trigger fails we still want to disable the gate */ | ||
| 744 | if (!__clk_trigger(ccu, trig)) | ||
| 745 | ret = -EIO; | ||
| 746 | |||
| 747 | /* Disable the clock again if it was disabled to begin with */ | ||
| 748 | if (!enabled && !__clk_gate(ccu, gate, false)) | ||
| 749 | ret = ret ? ret : -ENXIO; /* return first error */ | ||
| 750 | |||
| 751 | return ret; | ||
| 752 | } | ||
| 753 | |||
| 754 | /* | ||
| 755 | * Initialize a selector by committing our desired state to hardware | ||
| 756 | * without the usual checks to see if it's already set up that way. | ||
| 757 | * Returns true if successful, false otherwise. | ||
| 758 | */ | ||
| 759 | static bool sel_init(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 760 | struct bcm_clk_sel *sel, struct bcm_clk_trig *trig) | ||
| 761 | { | ||
| 762 | if (!selector_exists(sel)) | ||
| 763 | return true; | ||
| 764 | return !__sel_commit(ccu, gate, sel, trig); | ||
| 765 | } | ||
| 766 | |||
| 767 | /* | ||
| 768 | * Write a new value into a selector register to switch to a | ||
| 769 | * different parent clock. Returns 0 on success, or an error code | ||
| 770 | * (from __sel_commit()) otherwise. | ||
| 771 | */ | ||
| 772 | static int selector_write(struct ccu_data *ccu, struct bcm_clk_gate *gate, | ||
| 773 | struct bcm_clk_sel *sel, struct bcm_clk_trig *trig, | ||
| 774 | u8 index) | ||
| 775 | { | ||
| 776 | unsigned long flags; | ||
| 777 | u8 previous; | ||
| 778 | int ret; | ||
| 779 | |||
| 780 | previous = sel->clk_index; | ||
| 781 | if (previous == index) | ||
| 782 | return 0; /* No change */ | ||
| 783 | |||
| 784 | sel->clk_index = index; | ||
| 785 | |||
| 786 | flags = ccu_lock(ccu); | ||
| 787 | __ccu_write_enable(ccu); | ||
| 788 | |||
| 789 | ret = __sel_commit(ccu, gate, sel, trig); | ||
| 790 | |||
| 791 | __ccu_write_disable(ccu); | ||
| 792 | ccu_unlock(ccu, flags); | ||
| 793 | |||
| 794 | if (ret) | ||
| 795 | sel->clk_index = previous; /* Revert the change */ | ||
| 796 | |||
| 797 | return ret; | ||
| 798 | } | ||
| 799 | |||
| 800 | /* Clock operations */ | ||
| 801 | |||
| 802 | static int kona_peri_clk_enable(struct clk_hw *hw) | ||
| 803 | { | ||
| 804 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 805 | struct bcm_clk_gate *gate = &bcm_clk->peri->gate; | ||
| 806 | |||
| 807 | return clk_gate(bcm_clk->ccu, bcm_clk->name, gate, true); | ||
| 808 | } | ||
| 809 | |||
| 810 | static void kona_peri_clk_disable(struct clk_hw *hw) | ||
| 811 | { | ||
| 812 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 813 | struct bcm_clk_gate *gate = &bcm_clk->peri->gate; | ||
| 814 | |||
| 815 | (void)clk_gate(bcm_clk->ccu, bcm_clk->name, gate, false); | ||
| 816 | } | ||
| 817 | |||
| 818 | static int kona_peri_clk_is_enabled(struct clk_hw *hw) | ||
| 819 | { | ||
| 820 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 821 | struct bcm_clk_gate *gate = &bcm_clk->peri->gate; | ||
| 822 | |||
| 823 | return is_clk_gate_enabled(bcm_clk->ccu, gate) ? 1 : 0; | ||
| 824 | } | ||
| 825 | |||
| 826 | static unsigned long kona_peri_clk_recalc_rate(struct clk_hw *hw, | ||
| 827 | unsigned long parent_rate) | ||
| 828 | { | ||
| 829 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 830 | struct peri_clk_data *data = bcm_clk->peri; | ||
| 831 | |||
| 832 | return clk_recalc_rate(bcm_clk->ccu, &data->div, &data->pre_div, | ||
| 833 | parent_rate); | ||
| 834 | } | ||
| 835 | |||
| 836 | static long kona_peri_clk_round_rate(struct clk_hw *hw, unsigned long rate, | ||
| 837 | unsigned long *parent_rate) | ||
| 838 | { | ||
| 839 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 840 | struct bcm_clk_div *div = &bcm_clk->peri->div; | ||
| 841 | |||
| 842 | if (!divider_exists(div)) | ||
| 843 | return __clk_get_rate(hw->clk); | ||
| 844 | |||
| 845 | /* Quietly avoid a zero rate */ | ||
| 846 | return round_rate(bcm_clk->ccu, div, &bcm_clk->peri->pre_div, | ||
| 847 | rate ? rate : 1, *parent_rate, NULL); | ||
| 848 | } | ||
| 849 | |||
| 850 | static int kona_peri_clk_set_parent(struct clk_hw *hw, u8 index) | ||
| 851 | { | ||
| 852 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 853 | struct peri_clk_data *data = bcm_clk->peri; | ||
| 854 | struct bcm_clk_sel *sel = &data->sel; | ||
| 855 | struct bcm_clk_trig *trig; | ||
| 856 | int ret; | ||
| 857 | |||
| 858 | BUG_ON(index >= sel->parent_count); | ||
| 859 | |||
| 860 | /* If there's only one parent we don't require a selector */ | ||
| 861 | if (!selector_exists(sel)) | ||
| 862 | return 0; | ||
| 863 | |||
| 864 | /* | ||
| 865 | * The regular trigger is used by default, but if there's a | ||
| 866 | * pre-trigger we want to use that instead. | ||
| 867 | */ | ||
| 868 | trig = trigger_exists(&data->pre_trig) ? &data->pre_trig | ||
| 869 | : &data->trig; | ||
| 870 | |||
| 871 | ret = selector_write(bcm_clk->ccu, &data->gate, sel, trig, index); | ||
| 872 | if (ret == -ENXIO) { | ||
| 873 | pr_err("%s: gating failure for %s\n", __func__, bcm_clk->name); | ||
| 874 | ret = -EIO; /* Don't proliferate weird errors */ | ||
| 875 | } else if (ret == -EIO) { | ||
| 876 | pr_err("%s: %strigger failed for %s\n", __func__, | ||
| 877 | trig == &data->pre_trig ? "pre-" : "", | ||
| 878 | bcm_clk->name); | ||
| 879 | } | ||
| 880 | |||
| 881 | return ret; | ||
| 882 | } | ||
| 883 | |||
| 884 | static u8 kona_peri_clk_get_parent(struct clk_hw *hw) | ||
| 885 | { | ||
| 886 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 887 | struct peri_clk_data *data = bcm_clk->peri; | ||
| 888 | u8 index; | ||
| 889 | |||
| 890 | index = selector_read_index(bcm_clk->ccu, &data->sel); | ||
| 891 | |||
| 892 | /* Not all callers would handle an out-of-range value gracefully */ | ||
| 893 | return index == BAD_CLK_INDEX ? 0 : index; | ||
| 894 | } | ||
| 895 | |||
| 896 | static int kona_peri_clk_set_rate(struct clk_hw *hw, unsigned long rate, | ||
| 897 | unsigned long parent_rate) | ||
| 898 | { | ||
| 899 | struct kona_clk *bcm_clk = to_kona_clk(hw); | ||
| 900 | struct peri_clk_data *data = bcm_clk->peri; | ||
| 901 | struct bcm_clk_div *div = &data->div; | ||
| 902 | u64 scaled_div = 0; | ||
| 903 | int ret; | ||
| 904 | |||
| 905 | if (parent_rate > (unsigned long)LONG_MAX) | ||
| 906 | return -EINVAL; | ||
| 907 | |||
| 908 | if (rate == __clk_get_rate(hw->clk)) | ||
| 909 | return 0; | ||
| 910 | |||
| 911 | if (!divider_exists(div)) | ||
| 912 | return rate == parent_rate ? 0 : -EINVAL; | ||
| 913 | |||
| 914 | /* | ||
| 915 | * A fixed divider can't be changed. (Nor can a fixed | ||
| 916 | * pre-divider be, but for now we never actually try to | ||
| 917 | * change that.) Tolerate a request for a no-op change. | ||
| 918 | */ | ||
| 919 | if (divider_is_fixed(&data->div)) | ||
| 920 | return rate == parent_rate ? 0 : -EINVAL; | ||
| 921 | |||
| 922 | /* | ||
| 923 | * Get the scaled divisor value needed to achieve a clock | ||
| 924 | * rate as close as possible to what was requested, given | ||
| 925 | * the parent clock rate supplied. | ||
| 926 | */ | ||
| 927 | (void)round_rate(bcm_clk->ccu, div, &data->pre_div, | ||
| 928 | rate ? rate : 1, parent_rate, &scaled_div); | ||
| 929 | |||
| 930 | /* | ||
| 931 | * We aren't updating any pre-divider at this point, so | ||
| 932 | * we'll use the regular trigger. | ||
| 933 | */ | ||
| 934 | ret = divider_write(bcm_clk->ccu, &data->gate, &data->div, | ||
| 935 | &data->trig, scaled_div); | ||
| 936 | if (ret == -ENXIO) { | ||
| 937 | pr_err("%s: gating failure for %s\n", __func__, bcm_clk->name); | ||
| 938 | ret = -EIO; /* Don't proliferate weird errors */ | ||
| 939 | } else if (ret == -EIO) { | ||
| 940 | pr_err("%s: trigger failed for %s\n", __func__, bcm_clk->name); | ||
| 941 | } | ||
| 942 | |||
| 943 | return ret; | ||
| 944 | } | ||
| 945 | |||
| 946 | struct clk_ops kona_peri_clk_ops = { | ||
| 947 | .enable = kona_peri_clk_enable, | ||
| 948 | .disable = kona_peri_clk_disable, | ||
| 949 | .is_enabled = kona_peri_clk_is_enabled, | ||
| 950 | .recalc_rate = kona_peri_clk_recalc_rate, | ||
| 951 | .round_rate = kona_peri_clk_round_rate, | ||
| 952 | .set_parent = kona_peri_clk_set_parent, | ||
| 953 | .get_parent = kona_peri_clk_get_parent, | ||
| 954 | .set_rate = kona_peri_clk_set_rate, | ||
| 955 | }; | ||
| 956 | |||
| 957 | /* Put a peripheral clock into its initial state */ | ||
| 958 | static bool __peri_clk_init(struct kona_clk *bcm_clk) | ||
| 959 | { | ||
| 960 | struct ccu_data *ccu = bcm_clk->ccu; | ||
| 961 | struct peri_clk_data *peri = bcm_clk->peri; | ||
| 962 | const char *name = bcm_clk->name; | ||
| 963 | struct bcm_clk_trig *trig; | ||
| 964 | |||
| 965 | BUG_ON(bcm_clk->type != bcm_clk_peri); | ||
| 966 | |||
| 967 | if (!gate_init(ccu, &peri->gate)) { | ||
| 968 | pr_err("%s: error initializing gate for %s\n", __func__, name); | ||
| 969 | return false; | ||
| 970 | } | ||
| 971 | if (!div_init(ccu, &peri->gate, &peri->div, &peri->trig)) { | ||
| 972 | pr_err("%s: error initializing divider for %s\n", __func__, | ||
| 973 | name); | ||
| 974 | return false; | ||
| 975 | } | ||
| 976 | |||
| 977 | /* | ||
| 978 | * For the pre-divider and selector, the pre-trigger is used | ||
| 979 | * if it's present, otherwise we just use the regular trigger. | ||
| 980 | */ | ||
| 981 | trig = trigger_exists(&peri->pre_trig) ? &peri->pre_trig | ||
| 982 | : &peri->trig; | ||
| 983 | |||
| 984 | if (!div_init(ccu, &peri->gate, &peri->pre_div, trig)) { | ||
| 985 | pr_err("%s: error initializing pre-divider for %s\n", __func__, | ||
| 986 | name); | ||
| 987 | return false; | ||
| 988 | } | ||
| 989 | |||
| 990 | if (!sel_init(ccu, &peri->gate, &peri->sel, trig)) { | ||
| 991 | pr_err("%s: error initializing selector for %s\n", __func__, | ||
| 992 | name); | ||
| 993 | return false; | ||
| 994 | } | ||
| 995 | |||
| 996 | return true; | ||
| 997 | } | ||
| 998 | |||
| 999 | static bool __kona_clk_init(struct kona_clk *bcm_clk) | ||
| 1000 | { | ||
| 1001 | switch (bcm_clk->type) { | ||
| 1002 | case bcm_clk_peri: | ||
| 1003 | return __peri_clk_init(bcm_clk); | ||
| 1004 | default: | ||
| 1005 | BUG(); | ||
| 1006 | } | ||
| 1007 | return -EINVAL; | ||
| 1008 | } | ||
| 1009 | |||
| 1010 | /* Set a CCU and all its clocks into their desired initial state */ | ||
| 1011 | bool __init kona_ccu_init(struct ccu_data *ccu) | ||
| 1012 | { | ||
| 1013 | unsigned long flags; | ||
| 1014 | unsigned int which; | ||
| 1015 | struct clk **clks = ccu->data.clks; | ||
| 1016 | bool success = true; | ||
| 1017 | |||
| 1018 | flags = ccu_lock(ccu); | ||
| 1019 | __ccu_write_enable(ccu); | ||
| 1020 | |||
| 1021 | for (which = 0; which < ccu->data.clk_num; which++) { | ||
| 1022 | struct kona_clk *bcm_clk; | ||
| 1023 | |||
| 1024 | if (!clks[which]) | ||
| 1025 | continue; | ||
| 1026 | bcm_clk = to_kona_clk(__clk_get_hw(clks[which])); | ||
| 1027 | success &= __kona_clk_init(bcm_clk); | ||
| 1028 | } | ||
| 1029 | |||
| 1030 | __ccu_write_disable(ccu); | ||
| 1031 | ccu_unlock(ccu, flags); | ||
| 1032 | return success; | ||
| 1033 | } | ||
diff --git a/drivers/clk/bcm/clk-kona.h b/drivers/clk/bcm/clk-kona.h new file mode 100644 index 000000000000..5e139adc3dc5 --- /dev/null +++ b/drivers/clk/bcm/clk-kona.h | |||
| @@ -0,0 +1,410 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Broadcom Corporation | ||
| 3 | * Copyright 2013 Linaro Limited | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation version 2. | ||
| 8 | * | ||
| 9 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 10 | * kind, whether express or implied; without even the implied warranty | ||
| 11 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #ifndef _CLK_KONA_H | ||
| 16 | #define _CLK_KONA_H | ||
| 17 | |||
| 18 | #include <linux/kernel.h> | ||
| 19 | #include <linux/list.h> | ||
| 20 | #include <linux/spinlock.h> | ||
| 21 | #include <linux/slab.h> | ||
| 22 | #include <linux/device.h> | ||
| 23 | #include <linux/of.h> | ||
| 24 | #include <linux/clk-provider.h> | ||
| 25 | |||
| 26 | #define BILLION 1000000000 | ||
| 27 | |||
| 28 | /* The common clock framework uses u8 to represent a parent index */ | ||
| 29 | #define PARENT_COUNT_MAX ((u32)U8_MAX) | ||
| 30 | |||
| 31 | #define BAD_CLK_INDEX U8_MAX /* Can't ever be valid */ | ||
| 32 | #define BAD_CLK_NAME ((const char *)-1) | ||
| 33 | |||
| 34 | #define BAD_SCALED_DIV_VALUE U64_MAX | ||
| 35 | |||
| 36 | /* | ||
| 37 | * Utility macros for object flag management. If possible, flags | ||
| 38 | * should be defined such that 0 is the desired default value. | ||
| 39 | */ | ||
| 40 | #define FLAG(type, flag) BCM_CLK_ ## type ## _FLAGS_ ## flag | ||
| 41 | #define FLAG_SET(obj, type, flag) ((obj)->flags |= FLAG(type, flag)) | ||
| 42 | #define FLAG_CLEAR(obj, type, flag) ((obj)->flags &= ~(FLAG(type, flag))) | ||
| 43 | #define FLAG_FLIP(obj, type, flag) ((obj)->flags ^= FLAG(type, flag)) | ||
| 44 | #define FLAG_TEST(obj, type, flag) (!!((obj)->flags & FLAG(type, flag))) | ||
| 45 | |||
| 46 | /* Clock field state tests */ | ||
| 47 | |||
| 48 | #define gate_exists(gate) FLAG_TEST(gate, GATE, EXISTS) | ||
| 49 | #define gate_is_enabled(gate) FLAG_TEST(gate, GATE, ENABLED) | ||
| 50 | #define gate_is_hw_controllable(gate) FLAG_TEST(gate, GATE, HW) | ||
| 51 | #define gate_is_sw_controllable(gate) FLAG_TEST(gate, GATE, SW) | ||
| 52 | #define gate_is_sw_managed(gate) FLAG_TEST(gate, GATE, SW_MANAGED) | ||
| 53 | #define gate_is_no_disable(gate) FLAG_TEST(gate, GATE, NO_DISABLE) | ||
| 54 | |||
| 55 | #define gate_flip_enabled(gate) FLAG_FLIP(gate, GATE, ENABLED) | ||
| 56 | |||
| 57 | #define divider_exists(div) FLAG_TEST(div, DIV, EXISTS) | ||
| 58 | #define divider_is_fixed(div) FLAG_TEST(div, DIV, FIXED) | ||
| 59 | #define divider_has_fraction(div) (!divider_is_fixed(div) && \ | ||
| 60 | (div)->frac_width > 0) | ||
| 61 | |||
| 62 | #define selector_exists(sel) ((sel)->width != 0) | ||
| 63 | #define trigger_exists(trig) FLAG_TEST(trig, TRIG, EXISTS) | ||
| 64 | |||
| 65 | /* Clock type, used to tell common block what it's part of */ | ||
| 66 | enum bcm_clk_type { | ||
| 67 | bcm_clk_none, /* undefined clock type */ | ||
| 68 | bcm_clk_bus, | ||
| 69 | bcm_clk_core, | ||
| 70 | bcm_clk_peri | ||
| 71 | }; | ||
| 72 | |||
| 73 | /* | ||
| 74 | * Each CCU defines a mapped area of memory containing registers | ||
| 75 | * used to manage clocks implemented by the CCU. Access to memory | ||
| 76 | * within the CCU's space is serialized by a spinlock. Before any | ||
| 77 | * (other) address can be written, a special access "password" value | ||
| 78 | * must be written to its WR_ACCESS register (located at the base | ||
| 79 | * address of the range). We keep track of the name of each CCU as | ||
| 80 | * it is set up, and maintain them in a list. | ||
| 81 | */ | ||
| 82 | struct ccu_data { | ||
| 83 | void __iomem *base; /* base of mapped address space */ | ||
| 84 | spinlock_t lock; /* serialization lock */ | ||
| 85 | bool write_enabled; /* write access is currently enabled */ | ||
| 86 | struct list_head links; /* for ccu_list */ | ||
| 87 | struct device_node *node; | ||
| 88 | struct clk_onecell_data data; | ||
| 89 | const char *name; | ||
| 90 | u32 range; /* byte range of address space */ | ||
| 91 | }; | ||
| 92 | |||
| 93 | /* | ||
| 94 | * Gating control and status is managed by a 32-bit gate register. | ||
| 95 | * | ||
| 96 | * There are several types of gating available: | ||
| 97 | * - (no gate) | ||
| 98 | * A clock with no gate is assumed to be always enabled. | ||
| 99 | * - hardware-only gating (auto-gating) | ||
| 100 | * Enabling or disabling clocks with this type of gate is | ||
| 101 | * managed automatically by the hardware. Such clocks can be | ||
| 102 | * considered by the software to be enabled. The current status | ||
| 103 | * of auto-gated clocks can be read from the gate status bit. | ||
| 104 | * - software-only gating | ||
| 105 | * Auto-gating is not available for this type of clock. | ||
| 106 | * Instead, software manages whether it's enabled by setting or | ||
| 107 | * clearing the enable bit. The current gate status of a gate | ||
| 108 | * under software control can be read from the gate status bit. | ||
| 109 | * To ensure a change to the gating status is complete, the | ||
| 110 | * status bit can be polled to verify that the gate has entered | ||
| 111 | * the desired state. | ||
| 112 | * - selectable hardware or software gating | ||
| 113 | * Gating for this type of clock can be configured to be either | ||
| 114 | * under software or hardware control. Which type is in use is | ||
| 115 | * determined by the hw_sw_sel bit of the gate register. | ||
| 116 | */ | ||
| 117 | struct bcm_clk_gate { | ||
| 118 | u32 offset; /* gate register offset */ | ||
| 119 | u32 status_bit; /* 0: gate is disabled; 0: gatge is enabled */ | ||
| 120 | u32 en_bit; /* 0: disable; 1: enable */ | ||
| 121 | u32 hw_sw_sel_bit; /* 0: hardware gating; 1: software gating */ | ||
| 122 | u32 flags; /* BCM_CLK_GATE_FLAGS_* below */ | ||
| 123 | }; | ||
| 124 | |||
| 125 | /* | ||
| 126 | * Gate flags: | ||
| 127 | * HW means this gate can be auto-gated | ||
| 128 | * SW means the state of this gate can be software controlled | ||
| 129 | * NO_DISABLE means this gate is (only) enabled if under software control | ||
| 130 | * SW_MANAGED means the status of this gate is under software control | ||
| 131 | * ENABLED means this software-managed gate is *supposed* to be enabled | ||
| 132 | */ | ||
| 133 | #define BCM_CLK_GATE_FLAGS_EXISTS ((u32)1 << 0) /* Gate is valid */ | ||
| 134 | #define BCM_CLK_GATE_FLAGS_HW ((u32)1 << 1) /* Can auto-gate */ | ||
| 135 | #define BCM_CLK_GATE_FLAGS_SW ((u32)1 << 2) /* Software control */ | ||
| 136 | #define BCM_CLK_GATE_FLAGS_NO_DISABLE ((u32)1 << 3) /* HW or enabled */ | ||
| 137 | #define BCM_CLK_GATE_FLAGS_SW_MANAGED ((u32)1 << 4) /* SW now in control */ | ||
| 138 | #define BCM_CLK_GATE_FLAGS_ENABLED ((u32)1 << 5) /* If SW_MANAGED */ | ||
| 139 | |||
| 140 | /* | ||
| 141 | * Gate initialization macros. | ||
| 142 | * | ||
| 143 | * Any gate initially under software control will be enabled. | ||
| 144 | */ | ||
| 145 | |||
| 146 | /* A hardware/software gate initially under software control */ | ||
| 147 | #define HW_SW_GATE(_offset, _status_bit, _en_bit, _hw_sw_sel_bit) \ | ||
| 148 | { \ | ||
| 149 | .offset = (_offset), \ | ||
| 150 | .status_bit = (_status_bit), \ | ||
| 151 | .en_bit = (_en_bit), \ | ||
| 152 | .hw_sw_sel_bit = (_hw_sw_sel_bit), \ | ||
| 153 | .flags = FLAG(GATE, HW)|FLAG(GATE, SW)| \ | ||
| 154 | FLAG(GATE, SW_MANAGED)|FLAG(GATE, ENABLED)| \ | ||
| 155 | FLAG(GATE, EXISTS), \ | ||
| 156 | } | ||
| 157 | |||
| 158 | /* A hardware/software gate initially under hardware control */ | ||
| 159 | #define HW_SW_GATE_AUTO(_offset, _status_bit, _en_bit, _hw_sw_sel_bit) \ | ||
| 160 | { \ | ||
| 161 | .offset = (_offset), \ | ||
| 162 | .status_bit = (_status_bit), \ | ||
| 163 | .en_bit = (_en_bit), \ | ||
| 164 | .hw_sw_sel_bit = (_hw_sw_sel_bit), \ | ||
| 165 | .flags = FLAG(GATE, HW)|FLAG(GATE, SW)| \ | ||
| 166 | FLAG(GATE, EXISTS), \ | ||
| 167 | } | ||
| 168 | |||
| 169 | /* A hardware-or-enabled gate (enabled if not under hardware control) */ | ||
| 170 | #define HW_ENABLE_GATE(_offset, _status_bit, _en_bit, _hw_sw_sel_bit) \ | ||
| 171 | { \ | ||
| 172 | .offset = (_offset), \ | ||
| 173 | .status_bit = (_status_bit), \ | ||
| 174 | .en_bit = (_en_bit), \ | ||
| 175 | .hw_sw_sel_bit = (_hw_sw_sel_bit), \ | ||
| 176 | .flags = FLAG(GATE, HW)|FLAG(GATE, SW)| \ | ||
| 177 | FLAG(GATE, NO_DISABLE)|FLAG(GATE, EXISTS), \ | ||
| 178 | } | ||
| 179 | |||
| 180 | /* A software-only gate */ | ||
| 181 | #define SW_ONLY_GATE(_offset, _status_bit, _en_bit) \ | ||
| 182 | { \ | ||
| 183 | .offset = (_offset), \ | ||
| 184 | .status_bit = (_status_bit), \ | ||
| 185 | .en_bit = (_en_bit), \ | ||
| 186 | .flags = FLAG(GATE, SW)|FLAG(GATE, SW_MANAGED)| \ | ||
| 187 | FLAG(GATE, ENABLED)|FLAG(GATE, EXISTS), \ | ||
| 188 | } | ||
| 189 | |||
| 190 | /* A hardware-only gate */ | ||
| 191 | #define HW_ONLY_GATE(_offset, _status_bit) \ | ||
| 192 | { \ | ||
| 193 | .offset = (_offset), \ | ||
| 194 | .status_bit = (_status_bit), \ | ||
| 195 | .flags = FLAG(GATE, HW)|FLAG(GATE, EXISTS), \ | ||
| 196 | } | ||
| 197 | |||
| 198 | /* | ||
| 199 | * Each clock can have zero, one, or two dividers which change the | ||
| 200 | * output rate of the clock. Each divider can be either fixed or | ||
| 201 | * variable. If there are two dividers, they are the "pre-divider" | ||
| 202 | * and the "regular" or "downstream" divider. If there is only one, | ||
| 203 | * there is no pre-divider. | ||
| 204 | * | ||
| 205 | * A fixed divider is any non-zero (positive) value, and it | ||
| 206 | * indicates how the input rate is affected by the divider. | ||
| 207 | * | ||
| 208 | * The value of a variable divider is maintained in a sub-field of a | ||
| 209 | * 32-bit divider register. The position of the field in the | ||
| 210 | * register is defined by its offset and width. The value recorded | ||
| 211 | * in this field is always 1 less than the value it represents. | ||
| 212 | * | ||
| 213 | * In addition, a variable divider can indicate that some subset | ||
| 214 | * of its bits represent a "fractional" part of the divider. Such | ||
| 215 | * bits comprise the low-order portion of the divider field, and can | ||
| 216 | * be viewed as representing the portion of the divider that lies to | ||
| 217 | * the right of the decimal point. Most variable dividers have zero | ||
| 218 | * fractional bits. Variable dividers with non-zero fraction width | ||
| 219 | * still record a value 1 less than the value they represent; the | ||
| 220 | * added 1 does *not* affect the low-order bit in this case, it | ||
| 221 | * affects the bits above the fractional part only. (Often in this | ||
| 222 | * code a divider field value is distinguished from the value it | ||
| 223 | * represents by referring to the latter as a "divisor".) | ||
| 224 | * | ||
| 225 | * In order to avoid dealing with fractions, divider arithmetic is | ||
| 226 | * performed using "scaled" values. A scaled value is one that's | ||
| 227 | * been left-shifted by the fractional width of a divider. Dividing | ||
| 228 | * a scaled value by a scaled divisor produces the desired quotient | ||
| 229 | * without loss of precision and without any other special handling | ||
| 230 | * for fractions. | ||
| 231 | * | ||
| 232 | * The recorded value of a variable divider can be modified. To | ||
| 233 | * modify either divider (or both), a clock must be enabled (i.e., | ||
| 234 | * using its gate). In addition, a trigger register (described | ||
| 235 | * below) must be used to commit the change, and polled to verify | ||
| 236 | * the change is complete. | ||
| 237 | */ | ||
| 238 | struct bcm_clk_div { | ||
| 239 | union { | ||
| 240 | struct { /* variable divider */ | ||
| 241 | u32 offset; /* divider register offset */ | ||
| 242 | u32 shift; /* field shift */ | ||
| 243 | u32 width; /* field width */ | ||
| 244 | u32 frac_width; /* field fraction width */ | ||
| 245 | |||
| 246 | u64 scaled_div; /* scaled divider value */ | ||
| 247 | }; | ||
| 248 | u32 fixed; /* non-zero fixed divider value */ | ||
| 249 | }; | ||
| 250 | u32 flags; /* BCM_CLK_DIV_FLAGS_* below */ | ||
| 251 | }; | ||
| 252 | |||
| 253 | /* | ||
| 254 | * Divider flags: | ||
| 255 | * EXISTS means this divider exists | ||
| 256 | * FIXED means it is a fixed-rate divider | ||
| 257 | */ | ||
| 258 | #define BCM_CLK_DIV_FLAGS_EXISTS ((u32)1 << 0) /* Divider is valid */ | ||
| 259 | #define BCM_CLK_DIV_FLAGS_FIXED ((u32)1 << 1) /* Fixed-value */ | ||
| 260 | |||
| 261 | /* Divider initialization macros */ | ||
| 262 | |||
| 263 | /* A fixed (non-zero) divider */ | ||
| 264 | #define FIXED_DIVIDER(_value) \ | ||
| 265 | { \ | ||
| 266 | .fixed = (_value), \ | ||
| 267 | .flags = FLAG(DIV, EXISTS)|FLAG(DIV, FIXED), \ | ||
| 268 | } | ||
| 269 | |||
| 270 | /* A divider with an integral divisor */ | ||
| 271 | #define DIVIDER(_offset, _shift, _width) \ | ||
| 272 | { \ | ||
| 273 | .offset = (_offset), \ | ||
| 274 | .shift = (_shift), \ | ||
| 275 | .width = (_width), \ | ||
| 276 | .scaled_div = BAD_SCALED_DIV_VALUE, \ | ||
| 277 | .flags = FLAG(DIV, EXISTS), \ | ||
| 278 | } | ||
| 279 | |||
| 280 | /* A divider whose divisor has an integer and fractional part */ | ||
| 281 | #define FRAC_DIVIDER(_offset, _shift, _width, _frac_width) \ | ||
| 282 | { \ | ||
| 283 | .offset = (_offset), \ | ||
| 284 | .shift = (_shift), \ | ||
| 285 | .width = (_width), \ | ||
| 286 | .frac_width = (_frac_width), \ | ||
| 287 | .scaled_div = BAD_SCALED_DIV_VALUE, \ | ||
| 288 | .flags = FLAG(DIV, EXISTS), \ | ||
| 289 | } | ||
| 290 | |||
| 291 | /* | ||
| 292 | * Clocks may have multiple "parent" clocks. If there is more than | ||
| 293 | * one, a selector must be specified to define which of the parent | ||
| 294 | * clocks is currently in use. The selected clock is indicated in a | ||
| 295 | * sub-field of a 32-bit selector register. The range of | ||
| 296 | * representable selector values typically exceeds the number of | ||
| 297 | * available parent clocks. Occasionally the reset value of a | ||
| 298 | * selector field is explicitly set to a (specific) value that does | ||
| 299 | * not correspond to a defined input clock. | ||
| 300 | * | ||
| 301 | * We register all known parent clocks with the common clock code | ||
| 302 | * using a packed array (i.e., no empty slots) of (parent) clock | ||
| 303 | * names, and refer to them later using indexes into that array. | ||
| 304 | * We maintain an array of selector values indexed by common clock | ||
| 305 | * index values in order to map between these common clock indexes | ||
| 306 | * and the selector values used by the hardware. | ||
| 307 | * | ||
| 308 | * Like dividers, a selector can be modified, but to do so a clock | ||
| 309 | * must be enabled, and a trigger must be used to commit the change. | ||
| 310 | */ | ||
| 311 | struct bcm_clk_sel { | ||
| 312 | u32 offset; /* selector register offset */ | ||
| 313 | u32 shift; /* field shift */ | ||
| 314 | u32 width; /* field width */ | ||
| 315 | |||
| 316 | u32 parent_count; /* number of entries in parent_sel[] */ | ||
| 317 | u32 *parent_sel; /* array of parent selector values */ | ||
| 318 | u8 clk_index; /* current selected index in parent_sel[] */ | ||
| 319 | }; | ||
| 320 | |||
| 321 | /* Selector initialization macro */ | ||
| 322 | #define SELECTOR(_offset, _shift, _width) \ | ||
| 323 | { \ | ||
| 324 | .offset = (_offset), \ | ||
| 325 | .shift = (_shift), \ | ||
| 326 | .width = (_width), \ | ||
| 327 | .clk_index = BAD_CLK_INDEX, \ | ||
| 328 | } | ||
| 329 | |||
| 330 | /* | ||
| 331 | * Making changes to a variable divider or a selector for a clock | ||
| 332 | * requires the use of a trigger. A trigger is defined by a single | ||
| 333 | * bit within a register. To signal a change, a 1 is written into | ||
| 334 | * that bit. To determine when the change has been completed, that | ||
| 335 | * trigger bit is polled; the read value will be 1 while the change | ||
| 336 | * is in progress, and 0 when it is complete. | ||
| 337 | * | ||
| 338 | * Occasionally a clock will have more than one trigger. In this | ||
| 339 | * case, the "pre-trigger" will be used when changing a clock's | ||
| 340 | * selector and/or its pre-divider. | ||
| 341 | */ | ||
| 342 | struct bcm_clk_trig { | ||
| 343 | u32 offset; /* trigger register offset */ | ||
| 344 | u32 bit; /* trigger bit */ | ||
| 345 | u32 flags; /* BCM_CLK_TRIG_FLAGS_* below */ | ||
| 346 | }; | ||
| 347 | |||
| 348 | /* | ||
| 349 | * Trigger flags: | ||
| 350 | * EXISTS means this trigger exists | ||
| 351 | */ | ||
| 352 | #define BCM_CLK_TRIG_FLAGS_EXISTS ((u32)1 << 0) /* Trigger is valid */ | ||
| 353 | |||
| 354 | /* Trigger initialization macro */ | ||
| 355 | #define TRIGGER(_offset, _bit) \ | ||
| 356 | { \ | ||
| 357 | .offset = (_offset), \ | ||
| 358 | .bit = (_bit), \ | ||
| 359 | .flags = FLAG(TRIG, EXISTS), \ | ||
| 360 | } | ||
| 361 | |||
| 362 | struct peri_clk_data { | ||
| 363 | struct bcm_clk_gate gate; | ||
| 364 | struct bcm_clk_trig pre_trig; | ||
| 365 | struct bcm_clk_div pre_div; | ||
| 366 | struct bcm_clk_trig trig; | ||
| 367 | struct bcm_clk_div div; | ||
| 368 | struct bcm_clk_sel sel; | ||
| 369 | const char *clocks[]; /* must be last; use CLOCKS() to declare */ | ||
| 370 | }; | ||
| 371 | #define CLOCKS(...) { __VA_ARGS__, NULL, } | ||
| 372 | #define NO_CLOCKS { NULL, } /* Must use of no parent clocks */ | ||
| 373 | |||
| 374 | struct kona_clk { | ||
| 375 | struct clk_hw hw; | ||
| 376 | struct clk_init_data init_data; | ||
| 377 | const char *name; /* name of this clock */ | ||
| 378 | struct ccu_data *ccu; /* ccu this clock is associated with */ | ||
| 379 | enum bcm_clk_type type; | ||
| 380 | union { | ||
| 381 | void *data; | ||
| 382 | struct peri_clk_data *peri; | ||
| 383 | }; | ||
| 384 | }; | ||
| 385 | #define to_kona_clk(_hw) \ | ||
| 386 | container_of(_hw, struct kona_clk, hw) | ||
| 387 | |||
| 388 | /* Exported globals */ | ||
| 389 | |||
| 390 | extern struct clk_ops kona_peri_clk_ops; | ||
| 391 | |||
| 392 | /* Help functions */ | ||
| 393 | |||
| 394 | #define PERI_CLK_SETUP(clks, ccu, id, name) \ | ||
| 395 | clks[id] = kona_clk_setup(ccu, #name, bcm_clk_peri, &name ## _data) | ||
| 396 | |||
| 397 | /* Externally visible functions */ | ||
| 398 | |||
| 399 | extern u64 do_div_round_closest(u64 dividend, unsigned long divisor); | ||
| 400 | extern u64 scaled_div_max(struct bcm_clk_div *div); | ||
| 401 | extern u64 scaled_div_build(struct bcm_clk_div *div, u32 div_value, | ||
| 402 | u32 billionths); | ||
| 403 | |||
| 404 | extern struct clk *kona_clk_setup(struct ccu_data *ccu, const char *name, | ||
| 405 | enum bcm_clk_type type, void *data); | ||
| 406 | extern void __init kona_dt_ccu_setup(struct device_node *node, | ||
| 407 | int (*ccu_clks_setup)(struct ccu_data *)); | ||
| 408 | extern bool __init kona_ccu_init(struct ccu_data *ccu); | ||
| 409 | |||
| 410 | #endif /* _CLK_KONA_H */ | ||
diff --git a/include/dt-bindings/clock/bcm281xx.h b/include/dt-bindings/clock/bcm281xx.h new file mode 100644 index 000000000000..e0096940886d --- /dev/null +++ b/include/dt-bindings/clock/bcm281xx.h | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Broadcom Corporation | ||
| 3 | * Copyright 2013 Linaro Limited | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation version 2. | ||
| 8 | * | ||
| 9 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
| 10 | * kind, whether express or implied; without even the implied warranty | ||
| 11 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #ifndef _CLOCK_BCM281XX_H | ||
| 16 | #define _CLOCK_BCM281XX_H | ||
| 17 | |||
| 18 | /* | ||
| 19 | * This file defines the values used to specify clocks provided by | ||
| 20 | * the clock control units (CCUs) on Broadcom BCM281XX family SoCs. | ||
| 21 | */ | ||
| 22 | |||
| 23 | /* root CCU clock ids */ | ||
| 24 | |||
| 25 | #define BCM281XX_ROOT_CCU_FRAC_1M 0 | ||
| 26 | #define BCM281XX_ROOT_CCU_CLOCK_COUNT 1 | ||
| 27 | |||
| 28 | /* aon CCU clock ids */ | ||
| 29 | |||
| 30 | #define BCM281XX_AON_CCU_HUB_TIMER 0 | ||
| 31 | #define BCM281XX_AON_CCU_PMU_BSC 1 | ||
| 32 | #define BCM281XX_AON_CCU_PMU_BSC_VAR 2 | ||
| 33 | #define BCM281XX_AON_CCU_CLOCK_COUNT 3 | ||
| 34 | |||
| 35 | /* hub CCU clock ids */ | ||
| 36 | |||
| 37 | #define BCM281XX_HUB_CCU_TMON_1M 0 | ||
| 38 | #define BCM281XX_HUB_CCU_CLOCK_COUNT 1 | ||
| 39 | |||
| 40 | /* master CCU clock ids */ | ||
| 41 | |||
| 42 | #define BCM281XX_MASTER_CCU_SDIO1 0 | ||
| 43 | #define BCM281XX_MASTER_CCU_SDIO2 1 | ||
| 44 | #define BCM281XX_MASTER_CCU_SDIO3 2 | ||
| 45 | #define BCM281XX_MASTER_CCU_SDIO4 3 | ||
| 46 | #define BCM281XX_MASTER_CCU_USB_IC 4 | ||
| 47 | #define BCM281XX_MASTER_CCU_HSIC2_48M 5 | ||
| 48 | #define BCM281XX_MASTER_CCU_HSIC2_12M 6 | ||
| 49 | #define BCM281XX_MASTER_CCU_CLOCK_COUNT 7 | ||
| 50 | |||
| 51 | /* slave CCU clock ids */ | ||
| 52 | |||
| 53 | #define BCM281XX_SLAVE_CCU_UARTB 0 | ||
| 54 | #define BCM281XX_SLAVE_CCU_UARTB2 1 | ||
| 55 | #define BCM281XX_SLAVE_CCU_UARTB3 2 | ||
| 56 | #define BCM281XX_SLAVE_CCU_UARTB4 3 | ||
| 57 | #define BCM281XX_SLAVE_CCU_SSP0 4 | ||
| 58 | #define BCM281XX_SLAVE_CCU_SSP2 5 | ||
| 59 | #define BCM281XX_SLAVE_CCU_BSC1 6 | ||
| 60 | #define BCM281XX_SLAVE_CCU_BSC2 7 | ||
| 61 | #define BCM281XX_SLAVE_CCU_BSC3 8 | ||
| 62 | #define BCM281XX_SLAVE_CCU_PWM 9 | ||
| 63 | #define BCM281XX_SLAVE_CCU_CLOCK_COUNT 10 | ||
| 64 | |||
| 65 | #endif /* _CLOCK_BCM281XX_H */ | ||
