diff options
author | Stephen Boyd <stephen.boyd@linaro.org> | 2016-06-01 19:15:03 -0400 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2016-09-14 20:35:48 -0400 |
commit | b19f009d451060ee820deffa1afba029797fa654 (patch) | |
tree | 2867650d95e2b8804a89b62e5bbc95e6da1ebf01 | |
parent | f4e871509959b77debcac8f0dcbad85d6dbde06e (diff) |
clk: bcm2835: Migrate to clk_hw based registration and OF APIs
Now that we have clk_hw based provider APIs to register clks, we
can get rid of struct clk pointers while registering clks in
these drivers, allowing us to move closer to a clear split of
consumer and provider clk APIs.
Cc: Eric Anholt <eric@anholt.net>
Cc: Martin Sperl <kernel@martin.sperl.org>
Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org>
-rw-r--r-- | drivers/clk/bcm/clk-bcm2835-aux.c | 28 | ||||
-rw-r--r-- | drivers/clk/bcm/clk-bcm2835.c | 85 |
2 files changed, 58 insertions, 55 deletions
diff --git a/drivers/clk/bcm/clk-bcm2835-aux.c b/drivers/clk/bcm/clk-bcm2835-aux.c index 3a177ade6e6c..bd750cf2238d 100644 --- a/drivers/clk/bcm/clk-bcm2835-aux.c +++ b/drivers/clk/bcm/clk-bcm2835-aux.c | |||
@@ -25,7 +25,7 @@ | |||
25 | static int bcm2835_aux_clk_probe(struct platform_device *pdev) | 25 | static int bcm2835_aux_clk_probe(struct platform_device *pdev) |
26 | { | 26 | { |
27 | struct device *dev = &pdev->dev; | 27 | struct device *dev = &pdev->dev; |
28 | struct clk_onecell_data *onecell; | 28 | struct clk_hw_onecell_data *onecell; |
29 | const char *parent; | 29 | const char *parent; |
30 | struct clk *parent_clk; | 30 | struct clk *parent_clk; |
31 | struct resource *res; | 31 | struct resource *res; |
@@ -41,28 +41,24 @@ static int bcm2835_aux_clk_probe(struct platform_device *pdev) | |||
41 | if (IS_ERR(reg)) | 41 | if (IS_ERR(reg)) |
42 | return PTR_ERR(reg); | 42 | return PTR_ERR(reg); |
43 | 43 | ||
44 | onecell = devm_kmalloc(dev, sizeof(*onecell), GFP_KERNEL); | 44 | onecell = devm_kmalloc(dev, sizeof(*onecell) + sizeof(*onecell->hws) * |
45 | BCM2835_AUX_CLOCK_COUNT, GFP_KERNEL); | ||
45 | if (!onecell) | 46 | if (!onecell) |
46 | return -ENOMEM; | 47 | return -ENOMEM; |
47 | onecell->clk_num = BCM2835_AUX_CLOCK_COUNT; | 48 | onecell->num = BCM2835_AUX_CLOCK_COUNT; |
48 | onecell->clks = devm_kcalloc(dev, BCM2835_AUX_CLOCK_COUNT, | ||
49 | sizeof(*onecell->clks), GFP_KERNEL); | ||
50 | if (!onecell->clks) | ||
51 | return -ENOMEM; | ||
52 | 49 | ||
53 | gate = reg + BCM2835_AUXENB; | 50 | gate = reg + BCM2835_AUXENB; |
54 | onecell->clks[BCM2835_AUX_CLOCK_UART] = | 51 | onecell->hws[BCM2835_AUX_CLOCK_UART] = |
55 | clk_register_gate(dev, "aux_uart", parent, 0, gate, 0, 0, NULL); | 52 | clk_hw_register_gate(dev, "aux_uart", parent, 0, gate, 0, 0, NULL); |
56 | |||
57 | onecell->clks[BCM2835_AUX_CLOCK_SPI1] = | ||
58 | clk_register_gate(dev, "aux_spi1", parent, 0, gate, 1, 0, NULL); | ||
59 | 53 | ||
60 | onecell->clks[BCM2835_AUX_CLOCK_SPI2] = | 54 | onecell->hws[BCM2835_AUX_CLOCK_SPI1] = |
61 | clk_register_gate(dev, "aux_spi2", parent, 0, gate, 2, 0, NULL); | 55 | clk_hw_register_gate(dev, "aux_spi1", parent, 0, gate, 1, 0, NULL); |
62 | 56 | ||
63 | of_clk_add_provider(pdev->dev.of_node, of_clk_src_onecell_get, onecell); | 57 | onecell->hws[BCM2835_AUX_CLOCK_SPI2] = |
58 | clk_hw_register_gate(dev, "aux_spi2", parent, 0, gate, 2, 0, NULL); | ||
64 | 59 | ||
65 | return 0; | 60 | return of_clk_add_hw_provider(pdev->dev.of_node, of_clk_hw_onecell_get, |
61 | onecell); | ||
66 | } | 62 | } |
67 | 63 | ||
68 | static const struct of_device_id bcm2835_aux_clk_of_match[] = { | 64 | static const struct of_device_id bcm2835_aux_clk_of_match[] = { |
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index e8a9646afd6d..b68bf573dcfb 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c | |||
@@ -303,8 +303,8 @@ struct bcm2835_cprman { | |||
303 | spinlock_t regs_lock; /* spinlock for all clocks */ | 303 | spinlock_t regs_lock; /* spinlock for all clocks */ |
304 | const char *osc_name; | 304 | const char *osc_name; |
305 | 305 | ||
306 | struct clk_onecell_data onecell; | 306 | /* Must be last */ |
307 | struct clk *clks[]; | 307 | struct clk_hw_onecell_data onecell; |
308 | }; | 308 | }; |
309 | 309 | ||
310 | static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val) | 310 | static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val) |
@@ -345,24 +345,24 @@ static int bcm2835_debugfs_regset(struct bcm2835_cprman *cprman, u32 base, | |||
345 | */ | 345 | */ |
346 | void __init bcm2835_init_clocks(void) | 346 | void __init bcm2835_init_clocks(void) |
347 | { | 347 | { |
348 | struct clk *clk; | 348 | struct clk_hw *hw; |
349 | int ret; | 349 | int ret; |
350 | 350 | ||
351 | clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 126000000); | 351 | hw = clk_hw_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 126000000); |
352 | if (IS_ERR(clk)) | 352 | if (IS_ERR(hw)) |
353 | pr_err("apb_pclk not registered\n"); | 353 | pr_err("apb_pclk not registered\n"); |
354 | 354 | ||
355 | clk = clk_register_fixed_rate(NULL, "uart0_pclk", NULL, 0, 3000000); | 355 | hw = clk_hw_register_fixed_rate(NULL, "uart0_pclk", NULL, 0, 3000000); |
356 | if (IS_ERR(clk)) | 356 | if (IS_ERR(hw)) |
357 | pr_err("uart0_pclk not registered\n"); | 357 | pr_err("uart0_pclk not registered\n"); |
358 | ret = clk_register_clkdev(clk, NULL, "20201000.uart"); | 358 | ret = clk_hw_register_clkdev(hw, NULL, "20201000.uart"); |
359 | if (ret) | 359 | if (ret) |
360 | pr_err("uart0_pclk alias not registered\n"); | 360 | pr_err("uart0_pclk alias not registered\n"); |
361 | 361 | ||
362 | clk = clk_register_fixed_rate(NULL, "uart1_pclk", NULL, 0, 125000000); | 362 | hw = clk_hw_register_fixed_rate(NULL, "uart1_pclk", NULL, 0, 125000000); |
363 | if (IS_ERR(clk)) | 363 | if (IS_ERR(hw)) |
364 | pr_err("uart1_pclk not registered\n"); | 364 | pr_err("uart1_pclk not registered\n"); |
365 | ret = clk_register_clkdev(clk, NULL, "20215000.uart"); | 365 | ret = clk_hw_register_clkdev(hw, NULL, "20215000.uart"); |
366 | if (ret) | 366 | if (ret) |
367 | pr_err("uart1_pclk alias not registered\n"); | 367 | pr_err("uart1_pclk alias not registered\n"); |
368 | } | 368 | } |
@@ -1147,11 +1147,12 @@ static const struct clk_ops bcm2835_vpu_clock_clk_ops = { | |||
1147 | .debug_init = bcm2835_clock_debug_init, | 1147 | .debug_init = bcm2835_clock_debug_init, |
1148 | }; | 1148 | }; |
1149 | 1149 | ||
1150 | static struct clk *bcm2835_register_pll(struct bcm2835_cprman *cprman, | 1150 | static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, |
1151 | const struct bcm2835_pll_data *data) | 1151 | const struct bcm2835_pll_data *data) |
1152 | { | 1152 | { |
1153 | struct bcm2835_pll *pll; | 1153 | struct bcm2835_pll *pll; |
1154 | struct clk_init_data init; | 1154 | struct clk_init_data init; |
1155 | int ret; | ||
1155 | 1156 | ||
1156 | memset(&init, 0, sizeof(init)); | 1157 | memset(&init, 0, sizeof(init)); |
1157 | 1158 | ||
@@ -1170,17 +1171,20 @@ static struct clk *bcm2835_register_pll(struct bcm2835_cprman *cprman, | |||
1170 | pll->data = data; | 1171 | pll->data = data; |
1171 | pll->hw.init = &init; | 1172 | pll->hw.init = &init; |
1172 | 1173 | ||
1173 | return devm_clk_register(cprman->dev, &pll->hw); | 1174 | ret = devm_clk_hw_register(cprman->dev, &pll->hw); |
1175 | if (ret) | ||
1176 | return NULL; | ||
1177 | return &pll->hw; | ||
1174 | } | 1178 | } |
1175 | 1179 | ||
1176 | static struct clk * | 1180 | static struct clk_hw * |
1177 | bcm2835_register_pll_divider(struct bcm2835_cprman *cprman, | 1181 | bcm2835_register_pll_divider(struct bcm2835_cprman *cprman, |
1178 | const struct bcm2835_pll_divider_data *data) | 1182 | const struct bcm2835_pll_divider_data *data) |
1179 | { | 1183 | { |
1180 | struct bcm2835_pll_divider *divider; | 1184 | struct bcm2835_pll_divider *divider; |
1181 | struct clk_init_data init; | 1185 | struct clk_init_data init; |
1182 | struct clk *clk; | ||
1183 | const char *divider_name; | 1186 | const char *divider_name; |
1187 | int ret; | ||
1184 | 1188 | ||
1185 | if (data->fixed_divider != 1) { | 1189 | if (data->fixed_divider != 1) { |
1186 | divider_name = devm_kasprintf(cprman->dev, GFP_KERNEL, | 1190 | divider_name = devm_kasprintf(cprman->dev, GFP_KERNEL, |
@@ -1214,32 +1218,33 @@ bcm2835_register_pll_divider(struct bcm2835_cprman *cprman, | |||
1214 | divider->cprman = cprman; | 1218 | divider->cprman = cprman; |
1215 | divider->data = data; | 1219 | divider->data = data; |
1216 | 1220 | ||
1217 | clk = devm_clk_register(cprman->dev, ÷r->div.hw); | 1221 | ret = devm_clk_hw_register(cprman->dev, ÷r->div.hw); |
1218 | if (IS_ERR(clk)) | 1222 | if (ret) |
1219 | return clk; | 1223 | return ERR_PTR(ret); |
1220 | 1224 | ||
1221 | /* | 1225 | /* |
1222 | * PLLH's channels have a fixed divide by 10 afterwards, which | 1226 | * PLLH's channels have a fixed divide by 10 afterwards, which |
1223 | * is what our consumers are actually using. | 1227 | * is what our consumers are actually using. |
1224 | */ | 1228 | */ |
1225 | if (data->fixed_divider != 1) { | 1229 | if (data->fixed_divider != 1) { |
1226 | return clk_register_fixed_factor(cprman->dev, data->name, | 1230 | return clk_hw_register_fixed_factor(cprman->dev, data->name, |
1227 | divider_name, | 1231 | divider_name, |
1228 | CLK_SET_RATE_PARENT, | 1232 | CLK_SET_RATE_PARENT, |
1229 | 1, | 1233 | 1, |
1230 | data->fixed_divider); | 1234 | data->fixed_divider); |
1231 | } | 1235 | } |
1232 | 1236 | ||
1233 | return clk; | 1237 | return ÷r->div.hw; |
1234 | } | 1238 | } |
1235 | 1239 | ||
1236 | static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman, | 1240 | static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, |
1237 | const struct bcm2835_clock_data *data) | 1241 | const struct bcm2835_clock_data *data) |
1238 | { | 1242 | { |
1239 | struct bcm2835_clock *clock; | 1243 | struct bcm2835_clock *clock; |
1240 | struct clk_init_data init; | 1244 | struct clk_init_data init; |
1241 | const char *parents[1 << CM_SRC_BITS]; | 1245 | const char *parents[1 << CM_SRC_BITS]; |
1242 | size_t i; | 1246 | size_t i; |
1247 | int ret; | ||
1243 | 1248 | ||
1244 | /* | 1249 | /* |
1245 | * Replace our "xosc" references with the oscillator's | 1250 | * Replace our "xosc" references with the oscillator's |
@@ -1279,7 +1284,10 @@ static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman, | |||
1279 | clock->data = data; | 1284 | clock->data = data; |
1280 | clock->hw.init = &init; | 1285 | clock->hw.init = &init; |
1281 | 1286 | ||
1282 | return devm_clk_register(cprman->dev, &clock->hw); | 1287 | ret = devm_clk_hw_register(cprman->dev, &clock->hw); |
1288 | if (ret) | ||
1289 | return ERR_PTR(ret); | ||
1290 | return &clock->hw; | ||
1283 | } | 1291 | } |
1284 | 1292 | ||
1285 | static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, | 1293 | static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, |
@@ -1291,8 +1299,8 @@ static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, | |||
1291 | CM_GATE_BIT, 0, &cprman->regs_lock); | 1299 | CM_GATE_BIT, 0, &cprman->regs_lock); |
1292 | } | 1300 | } |
1293 | 1301 | ||
1294 | typedef struct clk *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, | 1302 | typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, |
1295 | const void *data); | 1303 | const void *data); |
1296 | struct bcm2835_clk_desc { | 1304 | struct bcm2835_clk_desc { |
1297 | bcm2835_clk_register clk_register; | 1305 | bcm2835_clk_register clk_register; |
1298 | const void *data; | 1306 | const void *data; |
@@ -1847,7 +1855,7 @@ static int bcm2835_mark_sdc_parent_critical(struct clk *sdc) | |||
1847 | static int bcm2835_clk_probe(struct platform_device *pdev) | 1855 | static int bcm2835_clk_probe(struct platform_device *pdev) |
1848 | { | 1856 | { |
1849 | struct device *dev = &pdev->dev; | 1857 | struct device *dev = &pdev->dev; |
1850 | struct clk **clks; | 1858 | struct clk_hw **hws; |
1851 | struct bcm2835_cprman *cprman; | 1859 | struct bcm2835_cprman *cprman; |
1852 | struct resource *res; | 1860 | struct resource *res; |
1853 | const struct bcm2835_clk_desc *desc; | 1861 | const struct bcm2835_clk_desc *desc; |
@@ -1855,8 +1863,8 @@ static int bcm2835_clk_probe(struct platform_device *pdev) | |||
1855 | size_t i; | 1863 | size_t i; |
1856 | int ret; | 1864 | int ret; |
1857 | 1865 | ||
1858 | cprman = devm_kzalloc(dev, | 1866 | cprman = devm_kzalloc(dev, sizeof(*cprman) + |
1859 | sizeof(*cprman) + asize * sizeof(*clks), | 1867 | sizeof(*cprman->onecell.hws) * asize, |
1860 | GFP_KERNEL); | 1868 | GFP_KERNEL); |
1861 | if (!cprman) | 1869 | if (!cprman) |
1862 | return -ENOMEM; | 1870 | return -ENOMEM; |
@@ -1874,22 +1882,21 @@ static int bcm2835_clk_probe(struct platform_device *pdev) | |||
1874 | 1882 | ||
1875 | platform_set_drvdata(pdev, cprman); | 1883 | platform_set_drvdata(pdev, cprman); |
1876 | 1884 | ||
1877 | cprman->onecell.clk_num = asize; | 1885 | cprman->onecell.num = asize; |
1878 | cprman->onecell.clks = cprman->clks; | 1886 | hws = cprman->onecell.hws; |
1879 | clks = cprman->clks; | ||
1880 | 1887 | ||
1881 | for (i = 0; i < asize; i++) { | 1888 | for (i = 0; i < asize; i++) { |
1882 | desc = &clk_desc_array[i]; | 1889 | desc = &clk_desc_array[i]; |
1883 | if (desc->clk_register && desc->data) | 1890 | if (desc->clk_register && desc->data) |
1884 | clks[i] = desc->clk_register(cprman, desc->data); | 1891 | hws[i] = desc->clk_register(cprman, desc->data); |
1885 | } | 1892 | } |
1886 | 1893 | ||
1887 | ret = bcm2835_mark_sdc_parent_critical(clks[BCM2835_CLOCK_SDRAM]); | 1894 | ret = bcm2835_mark_sdc_parent_critical(hws[BCM2835_CLOCK_SDRAM]->clk); |
1888 | if (ret) | 1895 | if (ret) |
1889 | return ret; | 1896 | return ret; |
1890 | 1897 | ||
1891 | return of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, | 1898 | return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, |
1892 | &cprman->onecell); | 1899 | &cprman->onecell); |
1893 | } | 1900 | } |
1894 | 1901 | ||
1895 | static const struct of_device_id bcm2835_clk_of_match[] = { | 1902 | static const struct of_device_id bcm2835_clk_of_match[] = { |