diff options
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r-- | drivers/clk/clk.c | 89 |
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 | */ |
1193 | int __clk_init(struct device *dev, struct clk *clk) | 1173 | int __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 | */ | ||
1320 | struct 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 | } | ||
1339 | EXPORT_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 | */ |
1339 | struct clk *clk_register(struct device *dev, const char *name, | 1352 | struct 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); |
1389 | fail_parent_names: | 1406 | fail_parent_names: |
1407 | kfree(clk->name); | ||
1408 | fail_name: | ||
1390 | kfree(clk); | 1409 | kfree(clk); |
1391 | fail_out: | 1410 | fail_out: |
1392 | return ERR_PTR(ret); | 1411 | return ERR_PTR(ret); |