aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <stephen.boyd@linaro.org>2016-06-01 19:15:03 -0400
committerStephen Boyd <sboyd@codeaurora.org>2016-09-14 20:35:48 -0400
commitb19f009d451060ee820deffa1afba029797fa654 (patch)
tree2867650d95e2b8804a89b62e5bbc95e6da1ebf01
parentf4e871509959b77debcac8f0dcbad85d6dbde06e (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.c28
-rw-r--r--drivers/clk/bcm/clk-bcm2835.c85
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 @@
25static int bcm2835_aux_clk_probe(struct platform_device *pdev) 25static 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
68static const struct of_device_id bcm2835_aux_clk_of_match[] = { 64static 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
310static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val) 310static 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 */
346void __init bcm2835_init_clocks(void) 346void __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
1150static struct clk *bcm2835_register_pll(struct bcm2835_cprman *cprman, 1150static 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
1176static struct clk * 1180static struct clk_hw *
1177bcm2835_register_pll_divider(struct bcm2835_cprman *cprman, 1181bcm2835_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, &divider->div.hw); 1221 ret = devm_clk_hw_register(cprman->dev, &divider->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 &divider->div.hw;
1234} 1238}
1235 1239
1236static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman, 1240static 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
1285static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, 1293static 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
1294typedef struct clk *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, 1302typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
1295 const void *data); 1303 const void *data);
1296struct bcm2835_clk_desc { 1304struct 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)
1847static int bcm2835_clk_probe(struct platform_device *pdev) 1855static 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
1895static const struct of_device_id bcm2835_clk_of_match[] = { 1902static const struct of_device_id bcm2835_clk_of_match[] = {