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

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>

authored by

Stephen Boyd and committed by
Stephen Boyd
b19f009d f4e87150

+58 -55
+12 -16
drivers/clk/bcm/clk-bcm2835-aux.c
··· 25 25 static int bcm2835_aux_clk_probe(struct platform_device *pdev) 26 26 { 27 27 struct device *dev = &pdev->dev; 28 - struct clk_onecell_data *onecell; 28 + struct clk_hw_onecell_data *onecell; 29 29 const char *parent; 30 30 struct clk *parent_clk; 31 31 struct resource *res; ··· 41 41 if (IS_ERR(reg)) 42 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 46 if (!onecell) 46 47 return -ENOMEM; 47 - onecell->clk_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; 48 + onecell->num = BCM2835_AUX_CLOCK_COUNT; 52 49 53 50 gate = reg + BCM2835_AUXENB; 54 - onecell->clks[BCM2835_AUX_CLOCK_UART] = 55 - clk_register_gate(dev, "aux_uart", parent, 0, gate, 0, 0, NULL); 51 + onecell->hws[BCM2835_AUX_CLOCK_UART] = 52 + clk_hw_register_gate(dev, "aux_uart", parent, 0, gate, 0, 0, NULL); 56 53 57 - onecell->clks[BCM2835_AUX_CLOCK_SPI1] = 58 - clk_register_gate(dev, "aux_spi1", parent, 0, gate, 1, 0, NULL); 54 + onecell->hws[BCM2835_AUX_CLOCK_SPI1] = 55 + clk_hw_register_gate(dev, "aux_spi1", parent, 0, gate, 1, 0, NULL); 59 56 60 - onecell->clks[BCM2835_AUX_CLOCK_SPI2] = 61 - clk_register_gate(dev, "aux_spi2", parent, 0, gate, 2, 0, NULL); 57 + onecell->hws[BCM2835_AUX_CLOCK_SPI2] = 58 + clk_hw_register_gate(dev, "aux_spi2", parent, 0, gate, 2, 0, NULL); 62 59 63 - of_clk_add_provider(pdev->dev.of_node, of_clk_src_onecell_get, onecell); 64 - 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 64 static const struct of_device_id bcm2835_aux_clk_of_match[] = {
+46 -39
drivers/clk/bcm/clk-bcm2835.c
··· 303 303 spinlock_t regs_lock; /* spinlock for all clocks */ 304 304 const char *osc_name; 305 305 306 - struct clk_onecell_data onecell; 307 - struct clk *clks[]; 306 + /* Must be last */ 307 + struct clk_hw_onecell_data onecell; 308 308 }; 309 309 310 310 static inline void cprman_write(struct bcm2835_cprman *cprman, u32 reg, u32 val) ··· 345 345 */ 346 346 void __init bcm2835_init_clocks(void) 347 347 { 348 - struct clk *clk; 348 + struct clk_hw *hw; 349 349 int ret; 350 350 351 - clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 126000000); 352 - if (IS_ERR(clk)) 351 + hw = clk_hw_register_fixed_rate(NULL, "apb_pclk", NULL, 0, 126000000); 352 + if (IS_ERR(hw)) 353 353 pr_err("apb_pclk not registered\n"); 354 354 355 - clk = clk_register_fixed_rate(NULL, "uart0_pclk", NULL, 0, 3000000); 356 - if (IS_ERR(clk)) 355 + hw = clk_hw_register_fixed_rate(NULL, "uart0_pclk", NULL, 0, 3000000); 356 + if (IS_ERR(hw)) 357 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 359 if (ret) 360 360 pr_err("uart0_pclk alias not registered\n"); 361 361 362 - clk = clk_register_fixed_rate(NULL, "uart1_pclk", NULL, 0, 125000000); 363 - if (IS_ERR(clk)) 362 + hw = clk_hw_register_fixed_rate(NULL, "uart1_pclk", NULL, 0, 125000000); 363 + if (IS_ERR(hw)) 364 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 366 if (ret) 367 367 pr_err("uart1_pclk alias not registered\n"); 368 368 } ··· 1147 1147 .debug_init = bcm2835_clock_debug_init, 1148 1148 }; 1149 1149 1150 - static struct clk *bcm2835_register_pll(struct bcm2835_cprman *cprman, 1151 - const struct bcm2835_pll_data *data) 1150 + static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, 1151 + const struct bcm2835_pll_data *data) 1152 1152 { 1153 1153 struct bcm2835_pll *pll; 1154 1154 struct clk_init_data init; 1155 + int ret; 1155 1156 1156 1157 memset(&init, 0, sizeof(init)); 1157 1158 ··· 1171 1170 pll->data = data; 1172 1171 pll->hw.init = &init; 1173 1172 1174 - return devm_clk_register(cprman->dev, &pll->hw); 1173 + ret = devm_clk_hw_register(cprman->dev, &pll->hw); 1174 + if (ret) 1175 + return NULL; 1176 + return &pll->hw; 1175 1177 } 1176 1178 1177 - static struct clk * 1179 + static struct clk_hw * 1178 1180 bcm2835_register_pll_divider(struct bcm2835_cprman *cprman, 1179 1181 const struct bcm2835_pll_divider_data *data) 1180 1182 { 1181 1183 struct bcm2835_pll_divider *divider; 1182 1184 struct clk_init_data init; 1183 - struct clk *clk; 1184 1185 const char *divider_name; 1186 + int ret; 1185 1187 1186 1188 if (data->fixed_divider != 1) { 1187 1189 divider_name = devm_kasprintf(cprman->dev, GFP_KERNEL, ··· 1218 1214 divider->cprman = cprman; 1219 1215 divider->data = data; 1220 1216 1221 - clk = devm_clk_register(cprman->dev, &divider->div.hw); 1222 - if (IS_ERR(clk)) 1223 - return clk; 1217 + ret = devm_clk_hw_register(cprman->dev, &divider->div.hw); 1218 + if (ret) 1219 + return ERR_PTR(ret); 1224 1220 1225 1221 /* 1226 1222 * PLLH's channels have a fixed divide by 10 afterwards, which 1227 1223 * is what our consumers are actually using. 1228 1224 */ 1229 1225 if (data->fixed_divider != 1) { 1230 - return clk_register_fixed_factor(cprman->dev, data->name, 1231 - divider_name, 1232 - CLK_SET_RATE_PARENT, 1233 - 1, 1234 - data->fixed_divider); 1226 + return clk_hw_register_fixed_factor(cprman->dev, data->name, 1227 + divider_name, 1228 + CLK_SET_RATE_PARENT, 1229 + 1, 1230 + data->fixed_divider); 1235 1231 } 1236 1232 1237 - return clk; 1233 + return &divider->div.hw; 1238 1234 } 1239 1235 1240 - static struct clk *bcm2835_register_clock(struct bcm2835_cprman *cprman, 1236 + static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, 1241 1237 const struct bcm2835_clock_data *data) 1242 1238 { 1243 1239 struct bcm2835_clock *clock; 1244 1240 struct clk_init_data init; 1245 1241 const char *parents[1 << CM_SRC_BITS]; 1246 1242 size_t i; 1243 + int ret; 1247 1244 1248 1245 /* 1249 1246 * Replace our "xosc" references with the oscillator's ··· 1284 1279 clock->data = data; 1285 1280 clock->hw.init = &init; 1286 1281 1287 - return devm_clk_register(cprman->dev, &clock->hw); 1282 + ret = devm_clk_hw_register(cprman->dev, &clock->hw); 1283 + if (ret) 1284 + return ERR_PTR(ret); 1285 + return &clock->hw; 1288 1286 } 1289 1287 1290 1288 static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, ··· 1299 1291 CM_GATE_BIT, 0, &cprman->regs_lock); 1300 1292 } 1301 1293 1302 - typedef struct clk *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, 1303 - const void *data); 1294 + typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman, 1295 + const void *data); 1304 1296 struct bcm2835_clk_desc { 1305 1297 bcm2835_clk_register clk_register; 1306 1298 const void *data; ··· 1855 1847 static int bcm2835_clk_probe(struct platform_device *pdev) 1856 1848 { 1857 1849 struct device *dev = &pdev->dev; 1858 - struct clk **clks; 1850 + struct clk_hw **hws; 1859 1851 struct bcm2835_cprman *cprman; 1860 1852 struct resource *res; 1861 1853 const struct bcm2835_clk_desc *desc; ··· 1863 1855 size_t i; 1864 1856 int ret; 1865 1857 1866 - cprman = devm_kzalloc(dev, 1867 - sizeof(*cprman) + asize * sizeof(*clks), 1858 + cprman = devm_kzalloc(dev, sizeof(*cprman) + 1859 + sizeof(*cprman->onecell.hws) * asize, 1868 1860 GFP_KERNEL); 1869 1861 if (!cprman) 1870 1862 return -ENOMEM; ··· 1882 1874 1883 1875 platform_set_drvdata(pdev, cprman); 1884 1876 1885 - cprman->onecell.clk_num = asize; 1886 - cprman->onecell.clks = cprman->clks; 1887 - clks = cprman->clks; 1877 + cprman->onecell.num = asize; 1878 + hws = cprman->onecell.hws; 1888 1879 1889 1880 for (i = 0; i < asize; i++) { 1890 1881 desc = &clk_desc_array[i]; 1891 1882 if (desc->clk_register && desc->data) 1892 - clks[i] = desc->clk_register(cprman, desc->data); 1883 + hws[i] = desc->clk_register(cprman, desc->data); 1893 1884 } 1894 1885 1895 - ret = bcm2835_mark_sdc_parent_critical(clks[BCM2835_CLOCK_SDRAM]); 1886 + ret = bcm2835_mark_sdc_parent_critical(hws[BCM2835_CLOCK_SDRAM]->clk); 1896 1887 if (ret) 1897 1888 return ret; 1898 1889 1899 - return of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, 1900 - &cprman->onecell); 1890 + return of_clk_add_hw_provider(dev->of_node, of_clk_hw_onecell_get, 1891 + &cprman->onecell); 1901 1892 } 1902 1893 1903 1894 static const struct of_device_id bcm2835_clk_of_match[] = {