core.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2024 Linaro Ltd.
  4. */
  5. #include <linux/bug.h>
  6. #include <linux/cleanup.h>
  7. #include <linux/debugfs.h>
  8. #include <linux/device.h>
  9. #include <linux/err.h>
  10. #include <linux/export.h>
  11. #include <linux/idr.h>
  12. #include <linux/kernel.h>
  13. #include <linux/kref.h>
  14. #include <linux/list.h>
  15. #include <linux/lockdep.h>
  16. #include <linux/module.h>
  17. #include <linux/mutex.h>
  18. #include <linux/property.h>
  19. #include <linux/pwrseq/consumer.h>
  20. #include <linux/pwrseq/provider.h>
  21. #include <linux/radix-tree.h>
  22. #include <linux/rwsem.h>
  23. #include <linux/slab.h>
  24. /*
  25. * Power-sequencing framework for linux.
  26. *
  27. * This subsystem allows power sequence providers to register a set of targets
  28. * that consumers may request and power-up/down.
  29. *
  30. * Glossary:
  31. *
  32. * Unit - a unit is a discreet chunk of a power sequence. For instance one unit
  33. * may enable a set of regulators, another may enable a specific GPIO. Units
  34. * can define dependencies in the form of other units that must be enabled
  35. * before it itself can be.
  36. *
  37. * Target - a target is a set of units (composed of the "final" unit and its
  38. * dependencies) that a consumer selects by its name when requesting a handle
  39. * to the power sequencer. Via the dependency system, multiple targets may
  40. * share the same parts of a power sequence but ignore parts that are
  41. * irrelevant.
  42. *
  43. * Descriptor - a handle passed by the pwrseq core to every consumer that
  44. * serves as the entry point to the provider layer. It ensures coherence
  45. * between different users and keeps reference counting consistent.
  46. *
  47. * Each provider must define a .match() callback whose role is to determine
  48. * whether a potential consumer is in fact associated with this sequencer.
  49. * This allows creating abstraction layers on top of regular device-tree
  50. * resources like regulators, clocks and other nodes connected to the consumer
  51. * via phandle.
  52. */
  53. static DEFINE_IDA(pwrseq_ida);
  54. /*
  55. * Protects the device list on the pwrseq bus from concurrent modifications
  56. * but allows simultaneous read-only access.
  57. */
  58. static DECLARE_RWSEM(pwrseq_sem);
  59. /**
  60. * struct pwrseq_unit - Private power-sequence unit data.
  61. * @ref: Reference count for this object. When it goes to 0, the object is
  62. * destroyed.
  63. * @name: Name of this target.
  64. * @list: Link to siblings on the list of all units of a single sequencer.
  65. * @deps: List of units on which this unit depends.
  66. * @enable: Callback running the part of the power-on sequence provided by
  67. * this unit.
  68. * @disable: Callback running the part of the power-off sequence provided
  69. * by this unit.
  70. * @enable_count: Current number of users that enabled this unit. May be the
  71. * consumer of the power sequencer or other units that depend
  72. * on this one.
  73. */
  74. struct pwrseq_unit {
  75. struct kref ref;
  76. const char *name;
  77. struct list_head list;
  78. struct list_head deps;
  79. pwrseq_power_state_func enable;
  80. pwrseq_power_state_func disable;
  81. unsigned int enable_count;
  82. };
  83. static struct pwrseq_unit *pwrseq_unit_new(const struct pwrseq_unit_data *data)
  84. {
  85. struct pwrseq_unit *unit;
  86. unit = kzalloc_obj(*unit);
  87. if (!unit)
  88. return NULL;
  89. unit->name = kstrdup_const(data->name, GFP_KERNEL);
  90. if (!unit->name) {
  91. kfree(unit);
  92. return NULL;
  93. }
  94. kref_init(&unit->ref);
  95. INIT_LIST_HEAD(&unit->deps);
  96. unit->enable = data->enable;
  97. unit->disable = data->disable;
  98. return unit;
  99. }
  100. static struct pwrseq_unit *pwrseq_unit_get(struct pwrseq_unit *unit)
  101. {
  102. kref_get(&unit->ref);
  103. return unit;
  104. }
  105. static void pwrseq_unit_release(struct kref *ref);
  106. static void pwrseq_unit_put(struct pwrseq_unit *unit)
  107. {
  108. kref_put(&unit->ref, pwrseq_unit_release);
  109. }
  110. /**
  111. * struct pwrseq_unit_dep - Wrapper around a reference to the unit structure
  112. * allowing to keep it on multiple dependency lists
  113. * in different units.
  114. * @list: Siblings on the list.
  115. * @unit: Address of the referenced unit.
  116. */
  117. struct pwrseq_unit_dep {
  118. struct list_head list;
  119. struct pwrseq_unit *unit;
  120. };
  121. static struct pwrseq_unit_dep *pwrseq_unit_dep_new(struct pwrseq_unit *unit)
  122. {
  123. struct pwrseq_unit_dep *dep;
  124. dep = kzalloc_obj(*dep);
  125. if (!dep)
  126. return NULL;
  127. dep->unit = unit;
  128. return dep;
  129. }
  130. static void pwrseq_unit_dep_free(struct pwrseq_unit_dep *ref)
  131. {
  132. pwrseq_unit_put(ref->unit);
  133. kfree(ref);
  134. }
  135. static void pwrseq_unit_free_deps(struct list_head *list)
  136. {
  137. struct pwrseq_unit_dep *dep, *next;
  138. list_for_each_entry_safe(dep, next, list, list) {
  139. list_del(&dep->list);
  140. pwrseq_unit_dep_free(dep);
  141. }
  142. }
  143. static void pwrseq_unit_release(struct kref *ref)
  144. {
  145. struct pwrseq_unit *unit = container_of(ref, struct pwrseq_unit, ref);
  146. pwrseq_unit_free_deps(&unit->deps);
  147. list_del(&unit->list);
  148. kfree_const(unit->name);
  149. kfree(unit);
  150. }
  151. /**
  152. * struct pwrseq_target - Private power-sequence target data.
  153. * @list: Siblings on the list of all targets exposed by a power sequencer.
  154. * @name: Name of the target.
  155. * @unit: Final unit for this target.
  156. * @post_enable: Callback run after the target unit has been enabled, *after*
  157. * the state lock has been released. It's useful for implementing
  158. * boot-up delays without blocking other users from powering up
  159. * using the same power sequencer.
  160. */
  161. struct pwrseq_target {
  162. struct list_head list;
  163. const char *name;
  164. struct pwrseq_unit *unit;
  165. pwrseq_power_state_func post_enable;
  166. };
  167. static struct pwrseq_target *
  168. pwrseq_target_new(const struct pwrseq_target_data *data)
  169. {
  170. struct pwrseq_target *target;
  171. target = kzalloc_obj(*target);
  172. if (!target)
  173. return NULL;
  174. target->name = kstrdup_const(data->name, GFP_KERNEL);
  175. if (!target->name) {
  176. kfree(target);
  177. return NULL;
  178. }
  179. target->post_enable = data->post_enable;
  180. return target;
  181. }
  182. static void pwrseq_target_free(struct pwrseq_target *target)
  183. {
  184. if (!IS_ERR_OR_NULL(target->unit))
  185. pwrseq_unit_put(target->unit);
  186. kfree_const(target->name);
  187. kfree(target);
  188. }
  189. /**
  190. * struct pwrseq_device - Private power sequencing data.
  191. * @dev: Device struct associated with this sequencer.
  192. * @id: Device ID.
  193. * @owner: Prevents removal of active power sequencing providers.
  194. * @rw_lock: Protects the device from being unregistered while in use.
  195. * @state_lock: Prevents multiple users running the power sequence at the same
  196. * time.
  197. * @match: Power sequencer matching callback.
  198. * @targets: List of targets exposed by this sequencer.
  199. * @units: List of all units supported by this sequencer.
  200. */
  201. struct pwrseq_device {
  202. struct device dev;
  203. int id;
  204. struct module *owner;
  205. struct rw_semaphore rw_lock;
  206. struct mutex state_lock;
  207. pwrseq_match_func match;
  208. struct list_head targets;
  209. struct list_head units;
  210. };
  211. static struct pwrseq_device *to_pwrseq_device(struct device *dev)
  212. {
  213. return container_of(dev, struct pwrseq_device, dev);
  214. }
  215. static struct pwrseq_device *pwrseq_device_get(struct pwrseq_device *pwrseq)
  216. {
  217. get_device(&pwrseq->dev);
  218. return pwrseq;
  219. }
  220. static void pwrseq_device_put(struct pwrseq_device *pwrseq)
  221. {
  222. put_device(&pwrseq->dev);
  223. }
  224. /**
  225. * struct pwrseq_desc - Wraps access to the pwrseq_device and ensures that one
  226. * user cannot break the reference counting for others.
  227. * @pwrseq: Reference to the power sequencing device.
  228. * @target: Reference to the target this descriptor allows to control.
  229. * @powered_on: Power state set by the holder of the descriptor (not necessarily
  230. * corresponding to the actual power state of the device).
  231. */
  232. struct pwrseq_desc {
  233. struct pwrseq_device *pwrseq;
  234. struct pwrseq_target *target;
  235. bool powered_on;
  236. };
  237. static const struct bus_type pwrseq_bus = {
  238. .name = "pwrseq",
  239. };
  240. static void pwrseq_release(struct device *dev)
  241. {
  242. struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
  243. struct pwrseq_target *target, *pos;
  244. list_for_each_entry_safe(target, pos, &pwrseq->targets, list) {
  245. list_del(&target->list);
  246. pwrseq_target_free(target);
  247. }
  248. mutex_destroy(&pwrseq->state_lock);
  249. ida_free(&pwrseq_ida, pwrseq->id);
  250. kfree(pwrseq);
  251. }
  252. static const struct device_type pwrseq_device_type = {
  253. .name = "power_sequencer",
  254. .release = pwrseq_release,
  255. };
  256. static int pwrseq_check_unit_deps(const struct pwrseq_unit_data *data,
  257. struct radix_tree_root *visited_units)
  258. {
  259. const struct pwrseq_unit_data *tmp, **cur;
  260. int ret;
  261. ret = radix_tree_insert(visited_units, (unsigned long)data,
  262. (void *)data);
  263. if (ret)
  264. return ret;
  265. for (cur = data->deps; cur && *cur; cur++) {
  266. tmp = radix_tree_lookup(visited_units, (unsigned long)*cur);
  267. if (tmp) {
  268. WARN(1, "Circular dependency in power sequencing flow detected!\n");
  269. return -EINVAL;
  270. }
  271. ret = pwrseq_check_unit_deps(*cur, visited_units);
  272. if (ret)
  273. return ret;
  274. }
  275. return 0;
  276. }
  277. static int pwrseq_check_target_deps(const struct pwrseq_target_data *data)
  278. {
  279. struct radix_tree_root visited_units;
  280. struct radix_tree_iter iter;
  281. void __rcu **slot;
  282. int ret;
  283. if (!data->unit)
  284. return -EINVAL;
  285. INIT_RADIX_TREE(&visited_units, GFP_KERNEL);
  286. ret = pwrseq_check_unit_deps(data->unit, &visited_units);
  287. radix_tree_for_each_slot(slot, &visited_units, &iter, 0)
  288. radix_tree_delete(&visited_units, iter.index);
  289. return ret;
  290. }
  291. static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
  292. struct list_head *dep_list,
  293. struct list_head *unit_list,
  294. struct radix_tree_root *processed_units);
  295. static struct pwrseq_unit *
  296. pwrseq_unit_setup(const struct pwrseq_unit_data *data,
  297. struct list_head *unit_list,
  298. struct radix_tree_root *processed_units)
  299. {
  300. struct pwrseq_unit *unit;
  301. int ret;
  302. unit = radix_tree_lookup(processed_units, (unsigned long)data);
  303. if (unit)
  304. return pwrseq_unit_get(unit);
  305. unit = pwrseq_unit_new(data);
  306. if (!unit)
  307. return ERR_PTR(-ENOMEM);
  308. if (data->deps) {
  309. ret = pwrseq_unit_setup_deps(data->deps, &unit->deps,
  310. unit_list, processed_units);
  311. if (ret) {
  312. pwrseq_unit_put(unit);
  313. return ERR_PTR(ret);
  314. }
  315. }
  316. ret = radix_tree_insert(processed_units, (unsigned long)data, unit);
  317. if (ret) {
  318. pwrseq_unit_put(unit);
  319. return ERR_PTR(ret);
  320. }
  321. list_add_tail(&unit->list, unit_list);
  322. return unit;
  323. }
  324. static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
  325. struct list_head *dep_list,
  326. struct list_head *unit_list,
  327. struct radix_tree_root *processed_units)
  328. {
  329. const struct pwrseq_unit_data *pos;
  330. struct pwrseq_unit_dep *dep;
  331. struct pwrseq_unit *unit;
  332. int i;
  333. for (i = 0; data[i]; i++) {
  334. pos = data[i];
  335. unit = pwrseq_unit_setup(pos, unit_list, processed_units);
  336. if (IS_ERR(unit))
  337. return PTR_ERR(unit);
  338. dep = pwrseq_unit_dep_new(unit);
  339. if (!dep) {
  340. pwrseq_unit_put(unit);
  341. return -ENOMEM;
  342. }
  343. list_add_tail(&dep->list, dep_list);
  344. }
  345. return 0;
  346. }
  347. static int pwrseq_do_setup_targets(const struct pwrseq_target_data **data,
  348. struct pwrseq_device *pwrseq,
  349. struct radix_tree_root *processed_units)
  350. {
  351. const struct pwrseq_target_data *pos;
  352. struct pwrseq_target *target;
  353. int ret, i;
  354. for (i = 0; data[i]; i++) {
  355. pos = data[i];
  356. ret = pwrseq_check_target_deps(pos);
  357. if (ret)
  358. return ret;
  359. target = pwrseq_target_new(pos);
  360. if (!target)
  361. return -ENOMEM;
  362. target->unit = pwrseq_unit_setup(pos->unit, &pwrseq->units,
  363. processed_units);
  364. if (IS_ERR(target->unit)) {
  365. ret = PTR_ERR(target->unit);
  366. pwrseq_target_free(target);
  367. return ret;
  368. }
  369. list_add_tail(&target->list, &pwrseq->targets);
  370. }
  371. return 0;
  372. }
  373. static int pwrseq_setup_targets(const struct pwrseq_target_data **targets,
  374. struct pwrseq_device *pwrseq)
  375. {
  376. struct radix_tree_root processed_units;
  377. struct radix_tree_iter iter;
  378. void __rcu **slot;
  379. int ret;
  380. INIT_RADIX_TREE(&processed_units, GFP_KERNEL);
  381. ret = pwrseq_do_setup_targets(targets, pwrseq, &processed_units);
  382. radix_tree_for_each_slot(slot, &processed_units, &iter, 0)
  383. radix_tree_delete(&processed_units, iter.index);
  384. return ret;
  385. }
  386. /**
  387. * pwrseq_device_register() - Register a new power sequencer.
  388. * @config: Configuration of the new power sequencing device.
  389. *
  390. * The config structure is only used during the call and can be freed after
  391. * the function returns. The config structure *must* have the parent device
  392. * as well as the match() callback and at least one target set.
  393. *
  394. * Returns:
  395. * Returns the address of the new pwrseq device or ERR_PTR() on failure.
  396. */
  397. struct pwrseq_device *
  398. pwrseq_device_register(const struct pwrseq_config *config)
  399. {
  400. struct pwrseq_device *pwrseq;
  401. int ret, id;
  402. if (!config->parent || !config->match || !config->targets ||
  403. !config->targets[0])
  404. return ERR_PTR(-EINVAL);
  405. pwrseq = kzalloc(sizeof(*pwrseq), GFP_KERNEL);
  406. if (!pwrseq)
  407. return ERR_PTR(-ENOMEM);
  408. pwrseq->dev.type = &pwrseq_device_type;
  409. pwrseq->dev.bus = &pwrseq_bus;
  410. pwrseq->dev.parent = config->parent;
  411. device_set_node(&pwrseq->dev, dev_fwnode(config->parent));
  412. dev_set_drvdata(&pwrseq->dev, config->drvdata);
  413. id = ida_alloc(&pwrseq_ida, GFP_KERNEL);
  414. if (id < 0) {
  415. kfree(pwrseq);
  416. return ERR_PTR(id);
  417. }
  418. pwrseq->id = id;
  419. /*
  420. * From this point onwards the device's release() callback is
  421. * responsible for freeing resources.
  422. */
  423. device_initialize(&pwrseq->dev);
  424. ret = dev_set_name(&pwrseq->dev, "pwrseq.%d", pwrseq->id);
  425. if (ret)
  426. goto err_put_pwrseq;
  427. pwrseq->owner = config->owner ?: THIS_MODULE;
  428. pwrseq->match = config->match;
  429. init_rwsem(&pwrseq->rw_lock);
  430. mutex_init(&pwrseq->state_lock);
  431. INIT_LIST_HEAD(&pwrseq->targets);
  432. INIT_LIST_HEAD(&pwrseq->units);
  433. ret = pwrseq_setup_targets(config->targets, pwrseq);
  434. if (ret)
  435. goto err_put_pwrseq;
  436. scoped_guard(rwsem_write, &pwrseq_sem) {
  437. ret = device_add(&pwrseq->dev);
  438. if (ret)
  439. goto err_put_pwrseq;
  440. }
  441. return pwrseq;
  442. err_put_pwrseq:
  443. pwrseq_device_put(pwrseq);
  444. return ERR_PTR(ret);
  445. }
  446. EXPORT_SYMBOL_GPL(pwrseq_device_register);
  447. /**
  448. * pwrseq_device_unregister() - Unregister the power sequencer.
  449. * @pwrseq: Power sequencer to unregister.
  450. */
  451. void pwrseq_device_unregister(struct pwrseq_device *pwrseq)
  452. {
  453. struct device *dev = &pwrseq->dev;
  454. struct pwrseq_target *target;
  455. scoped_guard(mutex, &pwrseq->state_lock) {
  456. guard(rwsem_write)(&pwrseq->rw_lock);
  457. list_for_each_entry(target, &pwrseq->targets, list)
  458. WARN(target->unit->enable_count,
  459. "REMOVING POWER SEQUENCER WITH ACTIVE USERS\n");
  460. guard(rwsem_write)(&pwrseq_sem);
  461. device_del(dev);
  462. }
  463. pwrseq_device_put(pwrseq);
  464. }
  465. EXPORT_SYMBOL_GPL(pwrseq_device_unregister);
  466. static void devm_pwrseq_device_unregister(void *data)
  467. {
  468. struct pwrseq_device *pwrseq = data;
  469. pwrseq_device_unregister(pwrseq);
  470. }
  471. /**
  472. * devm_pwrseq_device_register() - Managed variant of pwrseq_device_register().
  473. * @dev: Managing device.
  474. * @config: Configuration of the new power sequencing device.
  475. *
  476. * Returns:
  477. * Returns the address of the new pwrseq device or ERR_PTR() on failure.
  478. */
  479. struct pwrseq_device *
  480. devm_pwrseq_device_register(struct device *dev,
  481. const struct pwrseq_config *config)
  482. {
  483. struct pwrseq_device *pwrseq;
  484. int ret;
  485. pwrseq = pwrseq_device_register(config);
  486. if (IS_ERR(pwrseq))
  487. return pwrseq;
  488. ret = devm_add_action_or_reset(dev, devm_pwrseq_device_unregister,
  489. pwrseq);
  490. if (ret)
  491. return ERR_PTR(ret);
  492. return pwrseq;
  493. }
  494. EXPORT_SYMBOL_GPL(devm_pwrseq_device_register);
  495. /**
  496. * pwrseq_device_get_drvdata() - Get the driver private data associated with
  497. * this sequencer.
  498. * @pwrseq: Power sequencer object.
  499. *
  500. * Returns:
  501. * Address of the private driver data.
  502. */
  503. void *pwrseq_device_get_drvdata(struct pwrseq_device *pwrseq)
  504. {
  505. return dev_get_drvdata(&pwrseq->dev);
  506. }
  507. EXPORT_SYMBOL_GPL(pwrseq_device_get_drvdata);
  508. struct pwrseq_match_data {
  509. struct pwrseq_desc *desc;
  510. struct device *dev;
  511. const char *target;
  512. };
  513. static int pwrseq_match_device(struct device *pwrseq_dev, void *data)
  514. {
  515. struct pwrseq_device *pwrseq = to_pwrseq_device(pwrseq_dev);
  516. struct pwrseq_match_data *match_data = data;
  517. struct pwrseq_target *target;
  518. int ret;
  519. lockdep_assert_held_read(&pwrseq_sem);
  520. guard(rwsem_read)(&pwrseq->rw_lock);
  521. if (!device_is_registered(&pwrseq->dev))
  522. return 0;
  523. ret = pwrseq->match(pwrseq, match_data->dev);
  524. if (ret == PWRSEQ_NO_MATCH || ret < 0)
  525. return ret;
  526. /* We got the matching device, let's find the right target. */
  527. list_for_each_entry(target, &pwrseq->targets, list) {
  528. if (strcmp(target->name, match_data->target))
  529. continue;
  530. match_data->desc->target = target;
  531. }
  532. /*
  533. * This device does not have this target. No point in deferring as it
  534. * will not get a new target dynamically later.
  535. */
  536. if (!match_data->desc->target)
  537. return -ENOENT;
  538. if (!try_module_get(pwrseq->owner))
  539. return -EPROBE_DEFER;
  540. match_data->desc->pwrseq = pwrseq_device_get(pwrseq);
  541. return PWRSEQ_MATCH_OK;
  542. }
  543. /**
  544. * pwrseq_get() - Get the power sequencer associated with this device.
  545. * @dev: Device for which to get the sequencer.
  546. * @target: Name of the target exposed by the sequencer this device wants to
  547. * reach.
  548. *
  549. * Returns:
  550. * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
  551. * on failure.
  552. */
  553. struct pwrseq_desc *pwrseq_get(struct device *dev, const char *target)
  554. {
  555. struct pwrseq_match_data match_data;
  556. int ret;
  557. struct pwrseq_desc *desc __free(kfree) = kzalloc_obj(*desc);
  558. if (!desc)
  559. return ERR_PTR(-ENOMEM);
  560. match_data.desc = desc;
  561. match_data.dev = dev;
  562. match_data.target = target;
  563. guard(rwsem_read)(&pwrseq_sem);
  564. ret = bus_for_each_dev(&pwrseq_bus, NULL, &match_data,
  565. pwrseq_match_device);
  566. if (ret < 0)
  567. return ERR_PTR(ret);
  568. if (ret == PWRSEQ_NO_MATCH)
  569. /* No device matched. */
  570. return ERR_PTR(-EPROBE_DEFER);
  571. return_ptr(desc);
  572. }
  573. EXPORT_SYMBOL_GPL(pwrseq_get);
  574. /**
  575. * pwrseq_put() - Release the power sequencer descriptor.
  576. * @desc: Descriptor to release.
  577. */
  578. void pwrseq_put(struct pwrseq_desc *desc)
  579. {
  580. struct pwrseq_device *pwrseq;
  581. if (!desc)
  582. return;
  583. pwrseq = desc->pwrseq;
  584. if (desc->powered_on)
  585. pwrseq_power_off(desc);
  586. kfree(desc);
  587. module_put(pwrseq->owner);
  588. pwrseq_device_put(pwrseq);
  589. }
  590. EXPORT_SYMBOL_GPL(pwrseq_put);
  591. static void devm_pwrseq_put(void *data)
  592. {
  593. struct pwrseq_desc *desc = data;
  594. pwrseq_put(desc);
  595. }
  596. /**
  597. * devm_pwrseq_get() - Managed variant of pwrseq_get().
  598. * @dev: Device for which to get the sequencer and which also manages its
  599. * lifetime.
  600. * @target: Name of the target exposed by the sequencer this device wants to
  601. * reach.
  602. *
  603. * Returns:
  604. * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
  605. * on failure.
  606. */
  607. struct pwrseq_desc *devm_pwrseq_get(struct device *dev, const char *target)
  608. {
  609. struct pwrseq_desc *desc;
  610. int ret;
  611. desc = pwrseq_get(dev, target);
  612. if (IS_ERR(desc))
  613. return desc;
  614. ret = devm_add_action_or_reset(dev, devm_pwrseq_put, desc);
  615. if (ret)
  616. return ERR_PTR(ret);
  617. return desc;
  618. }
  619. EXPORT_SYMBOL_GPL(devm_pwrseq_get);
  620. static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
  621. struct pwrseq_unit *target);
  622. static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
  623. struct pwrseq_unit *target);
  624. static int pwrseq_unit_enable_deps(struct pwrseq_device *pwrseq,
  625. struct list_head *list)
  626. {
  627. struct pwrseq_unit_dep *pos;
  628. int ret = 0;
  629. list_for_each_entry(pos, list, list) {
  630. ret = pwrseq_unit_enable(pwrseq, pos->unit);
  631. if (ret) {
  632. list_for_each_entry_continue_reverse(pos, list, list)
  633. pwrseq_unit_disable(pwrseq, pos->unit);
  634. break;
  635. }
  636. }
  637. return ret;
  638. }
  639. static int pwrseq_unit_disable_deps(struct pwrseq_device *pwrseq,
  640. struct list_head *list)
  641. {
  642. struct pwrseq_unit_dep *pos;
  643. int ret = 0;
  644. list_for_each_entry_reverse(pos, list, list) {
  645. ret = pwrseq_unit_disable(pwrseq, pos->unit);
  646. if (ret) {
  647. list_for_each_entry_continue(pos, list, list)
  648. pwrseq_unit_enable(pwrseq, pos->unit);
  649. break;
  650. }
  651. }
  652. return ret;
  653. }
  654. static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
  655. struct pwrseq_unit *unit)
  656. {
  657. int ret;
  658. lockdep_assert_held_read(&pwrseq->rw_lock);
  659. lockdep_assert_held(&pwrseq->state_lock);
  660. if (unit->enable_count != 0) {
  661. unit->enable_count++;
  662. return 0;
  663. }
  664. ret = pwrseq_unit_enable_deps(pwrseq, &unit->deps);
  665. if (ret) {
  666. dev_err(&pwrseq->dev,
  667. "Failed to enable dependencies before power-on for target '%s': %d\n",
  668. unit->name, ret);
  669. return ret;
  670. }
  671. if (unit->enable) {
  672. ret = unit->enable(pwrseq);
  673. if (ret) {
  674. dev_err(&pwrseq->dev,
  675. "Failed to enable target '%s': %d\n",
  676. unit->name, ret);
  677. pwrseq_unit_disable_deps(pwrseq, &unit->deps);
  678. return ret;
  679. }
  680. }
  681. unit->enable_count++;
  682. return 0;
  683. }
  684. static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
  685. struct pwrseq_unit *unit)
  686. {
  687. int ret;
  688. lockdep_assert_held_read(&pwrseq->rw_lock);
  689. lockdep_assert_held(&pwrseq->state_lock);
  690. if (unit->enable_count == 0) {
  691. WARN(1, "Unmatched power-off for target '%s'\n",
  692. unit->name);
  693. return -EBUSY;
  694. }
  695. if (unit->enable_count != 1) {
  696. unit->enable_count--;
  697. return 0;
  698. }
  699. if (unit->disable) {
  700. ret = unit->disable(pwrseq);
  701. if (ret) {
  702. dev_err(&pwrseq->dev,
  703. "Failed to disable target '%s': %d\n",
  704. unit->name, ret);
  705. return ret;
  706. }
  707. }
  708. ret = pwrseq_unit_disable_deps(pwrseq, &unit->deps);
  709. if (ret) {
  710. dev_err(&pwrseq->dev,
  711. "Failed to disable dependencies after power-off for target '%s': %d\n",
  712. unit->name, ret);
  713. if (unit->enable)
  714. unit->enable(pwrseq);
  715. return ret;
  716. }
  717. unit->enable_count--;
  718. return 0;
  719. }
  720. /**
  721. * pwrseq_power_on() - Issue a power-on request on behalf of the consumer
  722. * device.
  723. * @desc: Descriptor referencing the power sequencer.
  724. *
  725. * This function tells the power sequencer that the consumer wants to be
  726. * powered-up. The sequencer may already have powered-up the device in which
  727. * case the function returns 0. If the power-up sequence is already in
  728. * progress, the function will block until it's done and return 0. If this is
  729. * the first request, the device will be powered up.
  730. *
  731. * Returns:
  732. * 0 on success, negative error number on failure.
  733. */
  734. int pwrseq_power_on(struct pwrseq_desc *desc)
  735. {
  736. struct pwrseq_device *pwrseq;
  737. struct pwrseq_target *target;
  738. struct pwrseq_unit *unit;
  739. int ret;
  740. might_sleep();
  741. if (!desc || desc->powered_on)
  742. return 0;
  743. pwrseq = desc->pwrseq;
  744. target = desc->target;
  745. unit = target->unit;
  746. guard(rwsem_read)(&pwrseq->rw_lock);
  747. if (!device_is_registered(&pwrseq->dev))
  748. return -ENODEV;
  749. scoped_guard(mutex, &pwrseq->state_lock) {
  750. ret = pwrseq_unit_enable(pwrseq, unit);
  751. if (!ret)
  752. desc->powered_on = true;
  753. }
  754. if (target->post_enable) {
  755. ret = target->post_enable(pwrseq);
  756. if (ret) {
  757. scoped_guard(mutex, &pwrseq->state_lock) {
  758. pwrseq_unit_disable(pwrseq, unit);
  759. desc->powered_on = false;
  760. }
  761. }
  762. }
  763. return ret;
  764. }
  765. EXPORT_SYMBOL_GPL(pwrseq_power_on);
  766. /**
  767. * pwrseq_power_off() - Issue a power-off request on behalf of the consumer
  768. * device.
  769. * @desc: Descriptor referencing the power sequencer.
  770. *
  771. * This undoes the effects of pwrseq_power_on(). It issues a power-off request
  772. * on behalf of the consumer and when the last remaining user does so, the
  773. * power-down sequence will be started. If one is in progress, the function
  774. * will block until it's complete and then return.
  775. *
  776. * Returns:
  777. * 0 on success, negative error number on failure.
  778. */
  779. int pwrseq_power_off(struct pwrseq_desc *desc)
  780. {
  781. struct pwrseq_device *pwrseq;
  782. struct pwrseq_unit *unit;
  783. int ret;
  784. might_sleep();
  785. if (!desc || !desc->powered_on)
  786. return 0;
  787. pwrseq = desc->pwrseq;
  788. unit = desc->target->unit;
  789. guard(rwsem_read)(&pwrseq->rw_lock);
  790. if (!device_is_registered(&pwrseq->dev))
  791. return -ENODEV;
  792. guard(mutex)(&pwrseq->state_lock);
  793. ret = pwrseq_unit_disable(pwrseq, unit);
  794. if (!ret)
  795. desc->powered_on = false;
  796. return ret;
  797. }
  798. EXPORT_SYMBOL_GPL(pwrseq_power_off);
  799. #if IS_ENABLED(CONFIG_DEBUG_FS)
  800. struct pwrseq_debugfs_count_ctx {
  801. struct device *dev;
  802. loff_t index;
  803. };
  804. static int pwrseq_debugfs_seq_count(struct device *dev, void *data)
  805. {
  806. struct pwrseq_debugfs_count_ctx *ctx = data;
  807. ctx->dev = dev;
  808. return ctx->index-- ? 0 : 1;
  809. }
  810. static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos)
  811. {
  812. struct pwrseq_debugfs_count_ctx ctx;
  813. ctx.dev = NULL;
  814. ctx.index = *pos;
  815. /*
  816. * We're holding the lock for the entire printout so no need to fiddle
  817. * with device reference count.
  818. */
  819. down_read(&pwrseq_sem);
  820. bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count);
  821. if (!ctx.index)
  822. return NULL;
  823. return ctx.dev;
  824. }
  825. static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data,
  826. loff_t *pos)
  827. {
  828. struct device *curr = data;
  829. ++*pos;
  830. struct device *next __free(put_device) =
  831. bus_find_next_device(&pwrseq_bus, curr);
  832. return next;
  833. }
  834. static void pwrseq_debugfs_seq_show_target(struct seq_file *seq,
  835. struct pwrseq_target *target)
  836. {
  837. seq_printf(seq, " target: [%s] (target unit: [%s])\n",
  838. target->name, target->unit->name);
  839. }
  840. static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq,
  841. struct pwrseq_unit *unit)
  842. {
  843. struct pwrseq_unit_dep *ref;
  844. seq_printf(seq, " unit: [%s] - enable count: %u\n",
  845. unit->name, unit->enable_count);
  846. if (list_empty(&unit->deps))
  847. return;
  848. seq_puts(seq, " dependencies:\n");
  849. list_for_each_entry(ref, &unit->deps, list)
  850. seq_printf(seq, " [%s]\n", ref->unit->name);
  851. }
  852. static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data)
  853. {
  854. struct device *dev = data;
  855. struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
  856. struct pwrseq_target *target;
  857. struct pwrseq_unit *unit;
  858. seq_printf(seq, "%s:\n", dev_name(dev));
  859. seq_puts(seq, " targets:\n");
  860. list_for_each_entry(target, &pwrseq->targets, list)
  861. pwrseq_debugfs_seq_show_target(seq, target);
  862. seq_puts(seq, " units:\n");
  863. list_for_each_entry(unit, &pwrseq->units, list)
  864. pwrseq_debugfs_seq_show_unit(seq, unit);
  865. return 0;
  866. }
  867. static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data)
  868. {
  869. up_read(&pwrseq_sem);
  870. }
  871. static const struct seq_operations pwrseq_debugfs_sops = {
  872. .start = pwrseq_debugfs_seq_start,
  873. .next = pwrseq_debugfs_seq_next,
  874. .show = pwrseq_debugfs_seq_show,
  875. .stop = pwrseq_debugfs_seq_stop,
  876. };
  877. DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs);
  878. static struct dentry *pwrseq_debugfs_dentry;
  879. #endif /* CONFIG_DEBUG_FS */
  880. static int __init pwrseq_init(void)
  881. {
  882. int ret;
  883. ret = bus_register(&pwrseq_bus);
  884. if (ret) {
  885. pr_err("Failed to register the power sequencer bus\n");
  886. return ret;
  887. }
  888. #if IS_ENABLED(CONFIG_DEBUG_FS)
  889. pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL,
  890. &pwrseq_debugfs_fops);
  891. #endif /* CONFIG_DEBUG_FS */
  892. return 0;
  893. }
  894. subsys_initcall(pwrseq_init);
  895. static void __exit pwrseq_exit(void)
  896. {
  897. #if IS_ENABLED(CONFIG_DEBUG_FS)
  898. debugfs_remove_recursive(pwrseq_debugfs_dentry);
  899. #endif /* CONFIG_DEBUG_FS */
  900. bus_unregister(&pwrseq_bus);
  901. }
  902. module_exit(pwrseq_exit);
  903. MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
  904. MODULE_DESCRIPTION("Power Sequencing subsystem core");
  905. MODULE_LICENSE("GPL");