aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r--drivers/clk/clk.c89
1 files changed, 54 insertions, 35 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 2dd20c01134d..c81803b9ba35 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1169,26 +1169,6 @@ EXPORT_SYMBOL_GPL(clk_set_parent);
1169 * 1169 *
1170 * Initializes the lists in struct clk, queries the hardware for the 1170 * Initializes the lists in struct clk, queries the hardware for the
1171 * parent and rate and sets them both. 1171 * parent and rate and sets them both.
1172 *
1173 * Any struct clk passed into __clk_init must have the following members
1174 * populated:
1175 * .name
1176 * .ops
1177 * .hw
1178 * .parent_names
1179 * .num_parents
1180 * .flags
1181 *
1182 * Essentially, everything that would normally be passed into clk_register is
1183 * assumed to be initialized already in __clk_init. The other members may be
1184 * populated, but are optional.
1185 *
1186 * __clk_init is only exposed via clk-private.h and is intended for use with
1187 * very large numbers of clocks that need to be statically initialized. It is
1188 * a layering violation to include clk-private.h from any code which implements
1189 * a clock's .ops; as such any statically initialized clock data MUST be in a
1190 * separate C file from the logic that implements it's operations. Returns 0
1191 * on success, otherwise an error code.
1192 */ 1172 */
1193int __clk_init(struct device *dev, struct clk *clk) 1173int __clk_init(struct device *dev, struct clk *clk)
1194{ 1174{
@@ -1321,14 +1301,47 @@ out:
1321} 1301}
1322 1302
1323/** 1303/**
1304 * __clk_register - register a clock and return a cookie.
1305 *
1306 * Same as clk_register, except that the .clk field inside hw shall point to a
1307 * preallocated (generally statically allocated) struct clk. None of the fields
1308 * of the struct clk need to be initialized.
1309 *
1310 * The data pointed to by .init and .clk field shall NOT be marked as init
1311 * data.
1312 *
1313 * __clk_register is only exposed via clk-private.h and is intended for use with
1314 * very large numbers of clocks that need to be statically initialized. It is
1315 * a layering violation to include clk-private.h from any code which implements
1316 * a clock's .ops; as such any statically initialized clock data MUST be in a
1317 * separate C file from the logic that implements it's operations. Returns 0
1318 * on success, otherwise an error code.
1319 */
1320struct clk *__clk_register(struct device *dev, struct clk_hw *hw)
1321{
1322 int ret;
1323 struct clk *clk;
1324
1325 clk = hw->clk;
1326 clk->name = hw->init->name;
1327 clk->ops = hw->init->ops;
1328 clk->hw = hw;
1329 clk->flags = hw->init->flags;
1330 clk->parent_names = hw->init->parent_names;
1331 clk->num_parents = hw->init->num_parents;
1332
1333 ret = __clk_init(dev, clk);
1334 if (ret)
1335 return ERR_PTR(ret);
1336
1337 return clk;
1338}
1339EXPORT_SYMBOL_GPL(__clk_register);
1340
1341/**
1324 * clk_register - allocate a new clock, register it and return an opaque cookie 1342 * clk_register - allocate a new clock, register it and return an opaque cookie
1325 * @dev: device that is registering this clock 1343 * @dev: device that is registering this clock
1326 * @name: clock name
1327 * @ops: operations this clock supports
1328 * @hw: link to hardware-specific clock data 1344 * @hw: link to hardware-specific clock data
1329 * @parent_names: array of string names for all possible parents
1330 * @num_parents: number of possible parents
1331 * @flags: framework-level hints and quirks
1332 * 1345 *
1333 * clk_register is the primary interface for populating the clock tree with new 1346 * clk_register is the primary interface for populating the clock tree with new
1334 * clock nodes. It returns a pointer to the newly allocated struct clk which 1347 * clock nodes. It returns a pointer to the newly allocated struct clk which
@@ -1336,9 +1349,7 @@ out:
1336 * rest of the clock API. In the event of an error clk_register will return an 1349 * rest of the clock API. In the event of an error clk_register will return an
1337 * error code; drivers must test for an error code after calling clk_register. 1350 * error code; drivers must test for an error code after calling clk_register.
1338 */ 1351 */
1339struct clk *clk_register(struct device *dev, const char *name, 1352struct clk *clk_register(struct device *dev, struct clk_hw *hw)
1340 const struct clk_ops *ops, struct clk_hw *hw,
1341 const char **parent_names, u8 num_parents, unsigned long flags)
1342{ 1353{
1343 int i, ret; 1354 int i, ret;
1344 struct clk *clk; 1355 struct clk *clk;
@@ -1350,15 +1361,20 @@ struct clk *clk_register(struct device *dev, const char *name,
1350 goto fail_out; 1361 goto fail_out;
1351 } 1362 }
1352 1363
1353 clk->name = name; 1364 clk->name = kstrdup(hw->init->name, GFP_KERNEL);
1354 clk->ops = ops; 1365 if (!clk->name) {
1366 pr_err("%s: could not allocate clk->name\n", __func__);
1367 ret = -ENOMEM;
1368 goto fail_name;
1369 }
1370 clk->ops = hw->init->ops;
1355 clk->hw = hw; 1371 clk->hw = hw;
1356 clk->flags = flags; 1372 clk->flags = hw->init->flags;
1357 clk->num_parents = num_parents; 1373 clk->num_parents = hw->init->num_parents;
1358 hw->clk = clk; 1374 hw->clk = clk;
1359 1375
1360 /* allocate local copy in case parent_names is __initdata */ 1376 /* allocate local copy in case parent_names is __initdata */
1361 clk->parent_names = kzalloc((sizeof(char*) * num_parents), 1377 clk->parent_names = kzalloc((sizeof(char*) * clk->num_parents),
1362 GFP_KERNEL); 1378 GFP_KERNEL);
1363 1379
1364 if (!clk->parent_names) { 1380 if (!clk->parent_names) {
@@ -1369,8 +1385,9 @@ struct clk *clk_register(struct device *dev, const char *name,
1369 1385
1370 1386
1371 /* copy each string name in case parent_names is __initdata */ 1387 /* copy each string name in case parent_names is __initdata */
1372 for (i = 0; i < num_parents; i++) { 1388 for (i = 0; i < clk->num_parents; i++) {
1373 clk->parent_names[i] = kstrdup(parent_names[i], GFP_KERNEL); 1389 clk->parent_names[i] = kstrdup(hw->init->parent_names[i],
1390 GFP_KERNEL);
1374 if (!clk->parent_names[i]) { 1391 if (!clk->parent_names[i]) {
1375 pr_err("%s: could not copy parent_names\n", __func__); 1392 pr_err("%s: could not copy parent_names\n", __func__);
1376 ret = -ENOMEM; 1393 ret = -ENOMEM;
@@ -1387,6 +1404,8 @@ fail_parent_names_copy:
1387 kfree(clk->parent_names[i]); 1404 kfree(clk->parent_names[i]);
1388 kfree(clk->parent_names); 1405 kfree(clk->parent_names);
1389fail_parent_names: 1406fail_parent_names:
1407 kfree(clk->name);
1408fail_name:
1390 kfree(clk); 1409 kfree(clk);
1391fail_out: 1410fail_out:
1392 return ERR_PTR(ret); 1411 return ERR_PTR(ret);