| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Cirrus Logic CLPS711X CLK driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru> |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 8 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 9 | | - * (at your option) any later version. |
|---|
| 10 | 6 | */ |
|---|
| 11 | 7 | |
|---|
| 12 | 8 | #include <linux/clk-provider.h> |
|---|
| .. | .. |
|---|
| 32 | 28 | { .val = 1, .div = 8, }, |
|---|
| 33 | 29 | { .val = 2, .div = 2, }, |
|---|
| 34 | 30 | { .val = 3, .div = 1, }, |
|---|
| 31 | + { /* sentinel */ } |
|---|
| 35 | 32 | }; |
|---|
| 36 | 33 | |
|---|
| 37 | 34 | static const struct clk_div_table timer_div_table[] = { |
|---|
| 38 | 35 | { .val = 0, .div = 256, }, |
|---|
| 39 | 36 | { .val = 1, .div = 1, }, |
|---|
| 37 | + { /* sentinel */ } |
|---|
| 40 | 38 | }; |
|---|
| 41 | 39 | |
|---|
| 42 | 40 | struct clps711x_clk { |
|---|
| .. | .. |
|---|
| 44 | 42 | struct clk_hw_onecell_data clk_data; |
|---|
| 45 | 43 | }; |
|---|
| 46 | 44 | |
|---|
| 47 | | -static struct clps711x_clk * __init _clps711x_clk_init(void __iomem *base, |
|---|
| 48 | | - u32 fref) |
|---|
| 45 | +static void __init clps711x_clk_init_dt(struct device_node *np) |
|---|
| 49 | 46 | { |
|---|
| 50 | | - u32 tmp, f_cpu, f_pll, f_bus, f_tim, f_pwm, f_spi; |
|---|
| 47 | + u32 tmp, f_cpu, f_pll, f_bus, f_tim, f_pwm, f_spi, fref = 0; |
|---|
| 51 | 48 | struct clps711x_clk *clps711x_clk; |
|---|
| 52 | | - unsigned i; |
|---|
| 49 | + void __iomem *base; |
|---|
| 53 | 50 | |
|---|
| 54 | | - if (!base) |
|---|
| 55 | | - return ERR_PTR(-ENOMEM); |
|---|
| 51 | + WARN_ON(of_property_read_u32(np, "startup-frequency", &fref)); |
|---|
| 52 | + |
|---|
| 53 | + base = of_iomap(np, 0); |
|---|
| 54 | + BUG_ON(!base); |
|---|
| 56 | 55 | |
|---|
| 57 | 56 | clps711x_clk = kzalloc(struct_size(clps711x_clk, clk_data.hws, |
|---|
| 58 | 57 | CLPS711X_CLK_MAX), |
|---|
| 59 | 58 | GFP_KERNEL); |
|---|
| 60 | | - if (!clps711x_clk) |
|---|
| 61 | | - return ERR_PTR(-ENOMEM); |
|---|
| 59 | + BUG_ON(!clps711x_clk); |
|---|
| 62 | 60 | |
|---|
| 63 | 61 | spin_lock_init(&clps711x_clk->lock); |
|---|
| 64 | 62 | |
|---|
| .. | .. |
|---|
| 137 | 135 | clk_hw_register_fixed_factor(NULL, "uart", "bus", 0, 1, 10); |
|---|
| 138 | 136 | clps711x_clk->clk_data.hws[CLPS711X_CLK_TICK] = |
|---|
| 139 | 137 | clk_hw_register_fixed_rate(NULL, "tick", NULL, 0, 64); |
|---|
| 140 | | - for (i = 0; i < CLPS711X_CLK_MAX; i++) |
|---|
| 141 | | - if (IS_ERR(clps711x_clk->clk_data.hws[i])) |
|---|
| 138 | + for (tmp = 0; tmp < CLPS711X_CLK_MAX; tmp++) |
|---|
| 139 | + if (IS_ERR(clps711x_clk->clk_data.hws[tmp])) |
|---|
| 142 | 140 | pr_err("clk %i: register failed with %ld\n", |
|---|
| 143 | | - i, PTR_ERR(clps711x_clk->clk_data.hws[i])); |
|---|
| 144 | | - |
|---|
| 145 | | - return clps711x_clk; |
|---|
| 146 | | -} |
|---|
| 147 | | - |
|---|
| 148 | | -void __init clps711x_clk_init(void __iomem *base) |
|---|
| 149 | | -{ |
|---|
| 150 | | - struct clps711x_clk *clps711x_clk; |
|---|
| 151 | | - |
|---|
| 152 | | - clps711x_clk = _clps711x_clk_init(base, 73728000); |
|---|
| 153 | | - |
|---|
| 154 | | - BUG_ON(IS_ERR(clps711x_clk)); |
|---|
| 155 | | - |
|---|
| 156 | | - /* Clocksource */ |
|---|
| 157 | | - clk_hw_register_clkdev(clps711x_clk->clk_data.hws[CLPS711X_CLK_TIMER1], |
|---|
| 158 | | - NULL, "clps711x-timer.0"); |
|---|
| 159 | | - clk_hw_register_clkdev(clps711x_clk->clk_data.hws[CLPS711X_CLK_TIMER2], |
|---|
| 160 | | - NULL, "clps711x-timer.1"); |
|---|
| 161 | | - |
|---|
| 162 | | - /* Drivers */ |
|---|
| 163 | | - clk_hw_register_clkdev(clps711x_clk->clk_data.hws[CLPS711X_CLK_PWM], |
|---|
| 164 | | - NULL, "clps711x-pwm"); |
|---|
| 165 | | - clk_hw_register_clkdev(clps711x_clk->clk_data.hws[CLPS711X_CLK_UART], |
|---|
| 166 | | - NULL, "clps711x-uart.0"); |
|---|
| 167 | | - clk_hw_register_clkdev(clps711x_clk->clk_data.hws[CLPS711X_CLK_UART], |
|---|
| 168 | | - NULL, "clps711x-uart.1"); |
|---|
| 169 | | -} |
|---|
| 170 | | - |
|---|
| 171 | | -#ifdef CONFIG_OF |
|---|
| 172 | | -static void __init clps711x_clk_init_dt(struct device_node *np) |
|---|
| 173 | | -{ |
|---|
| 174 | | - void __iomem *base = of_iomap(np, 0); |
|---|
| 175 | | - struct clps711x_clk *clps711x_clk; |
|---|
| 176 | | - u32 fref = 0; |
|---|
| 177 | | - |
|---|
| 178 | | - WARN_ON(of_property_read_u32(np, "startup-frequency", &fref)); |
|---|
| 179 | | - |
|---|
| 180 | | - clps711x_clk = _clps711x_clk_init(base, fref); |
|---|
| 181 | | - BUG_ON(IS_ERR(clps711x_clk)); |
|---|
| 141 | + tmp, PTR_ERR(clps711x_clk->clk_data.hws[tmp])); |
|---|
| 182 | 142 | |
|---|
| 183 | 143 | clps711x_clk->clk_data.num = CLPS711X_CLK_MAX; |
|---|
| 184 | 144 | of_clk_add_hw_provider(np, of_clk_hw_onecell_get, |
|---|
| 185 | 145 | &clps711x_clk->clk_data); |
|---|
| 186 | 146 | } |
|---|
| 187 | 147 | CLK_OF_DECLARE(clps711x, "cirrus,ep7209-clk", clps711x_clk_init_dt); |
|---|
| 188 | | -#endif |
|---|