core.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106
  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(sizeof(*unit), GFP_KERNEL);
  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(sizeof(*dep), GFP_KERNEL);
  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(sizeof(*target), GFP_KERNEL);
  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 <= 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 1;
  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(sizeof(*desc),
  558. GFP_KERNEL);
  559. if (!desc)
  560. return ERR_PTR(-ENOMEM);
  561. match_data.desc = desc;
  562. match_data.dev = dev;
  563. match_data.target = target;
  564. guard(rwsem_read)(&pwrseq_sem);
  565. ret = bus_for_each_dev(&pwrseq_bus, NULL, &match_data,
  566. pwrseq_match_device);
  567. if (ret < 0)
  568. return ERR_PTR(ret);
  569. if (ret == 0)
  570. /* No device matched. */
  571. return ERR_PTR(-EPROBE_DEFER);
  572. return_ptr(desc);
  573. }
  574. EXPORT_SYMBOL_GPL(pwrseq_get);
  575. /**
  576. * pwrseq_put() - Release the power sequencer descriptor.
  577. * @desc: Descriptor to release.
  578. */
  579. void pwrseq_put(struct pwrseq_desc *desc)
  580. {
  581. struct pwrseq_device *pwrseq;
  582. if (!desc)
  583. return;
  584. pwrseq = desc->pwrseq;
  585. if (desc->powered_on)
  586. pwrseq_power_off(desc);
  587. kfree(desc);
  588. module_put(pwrseq->owner);
  589. pwrseq_device_put(pwrseq);
  590. }
  591. EXPORT_SYMBOL_GPL(pwrseq_put);
  592. static void devm_pwrseq_put(void *data)
  593. {
  594. struct pwrseq_desc *desc = data;
  595. pwrseq_put(desc);
  596. }
  597. /**
  598. * devm_pwrseq_get() - Managed variant of pwrseq_get().
  599. * @dev: Device for which to get the sequencer and which also manages its
  600. * lifetime.
  601. * @target: Name of the target exposed by the sequencer this device wants to
  602. * reach.
  603. *
  604. * Returns:
  605. * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
  606. * on failure.
  607. */
  608. struct pwrseq_desc *devm_pwrseq_get(struct device *dev, const char *target)
  609. {
  610. struct pwrseq_desc *desc;
  611. int ret;
  612. desc = pwrseq_get(dev, target);
  613. if (IS_ERR(desc))
  614. return desc;
  615. ret = devm_add_action_or_reset(dev, devm_pwrseq_put, desc);
  616. if (ret)
  617. return ERR_PTR(ret);
  618. return desc;
  619. }
  620. EXPORT_SYMBOL_GPL(devm_pwrseq_get);
  621. static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
  622. struct pwrseq_unit *target);
  623. static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
  624. struct pwrseq_unit *target);
  625. static int pwrseq_unit_enable_deps(struct pwrseq_device *pwrseq,
  626. struct list_head *list)
  627. {
  628. struct pwrseq_unit_dep *pos;
  629. int ret = 0;
  630. list_for_each_entry(pos, list, list) {
  631. ret = pwrseq_unit_enable(pwrseq, pos->unit);
  632. if (ret) {
  633. list_for_each_entry_continue_reverse(pos, list, list)
  634. pwrseq_unit_disable(pwrseq, pos->unit);
  635. break;
  636. }
  637. }
  638. return ret;
  639. }
  640. static int pwrseq_unit_disable_deps(struct pwrseq_device *pwrseq,
  641. struct list_head *list)
  642. {
  643. struct pwrseq_unit_dep *pos;
  644. int ret = 0;
  645. list_for_each_entry_reverse(pos, list, list) {
  646. ret = pwrseq_unit_disable(pwrseq, pos->unit);
  647. if (ret) {
  648. list_for_each_entry_continue(pos, list, list)
  649. pwrseq_unit_enable(pwrseq, pos->unit);
  650. break;
  651. }
  652. }
  653. return ret;
  654. }
  655. static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
  656. struct pwrseq_unit *unit)
  657. {
  658. int ret;
  659. lockdep_assert_held_read(&pwrseq->rw_lock);
  660. lockdep_assert_held(&pwrseq->state_lock);
  661. if (unit->enable_count != 0) {
  662. unit->enable_count++;
  663. return 0;
  664. }
  665. ret = pwrseq_unit_enable_deps(pwrseq, &unit->deps);
  666. if (ret) {
  667. dev_err(&pwrseq->dev,
  668. "Failed to enable dependencies before power-on for target '%s': %d\n",
  669. unit->name, ret);
  670. return ret;
  671. }
  672. if (unit->enable) {
  673. ret = unit->enable(pwrseq);
  674. if (ret) {
  675. dev_err(&pwrseq->dev,
  676. "Failed to enable target '%s': %d\n",
  677. unit->name, ret);
  678. pwrseq_unit_disable_deps(pwrseq, &unit->deps);
  679. return ret;
  680. }
  681. }
  682. unit->enable_count++;
  683. return 0;
  684. }
  685. static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
  686. struct pwrseq_unit *unit)
  687. {
  688. int ret;
  689. lockdep_assert_held_read(&pwrseq->rw_lock);
  690. lockdep_assert_held(&pwrseq->state_lock);
  691. if (unit->enable_count == 0) {
  692. WARN(1, "Unmatched power-off for target '%s'\n",
  693. unit->name);
  694. return -EBUSY;
  695. }
  696. if (unit->enable_count != 1) {
  697. unit->enable_count--;
  698. return 0;
  699. }
  700. if (unit->disable) {
  701. ret = unit->disable(pwrseq);
  702. if (ret) {
  703. dev_err(&pwrseq->dev,
  704. "Failed to disable target '%s': %d\n",
  705. unit->name, ret);
  706. return ret;
  707. }
  708. }
  709. ret = pwrseq_unit_disable_deps(pwrseq, &unit->deps);
  710. if (ret) {
  711. dev_err(&pwrseq->dev,
  712. "Failed to disable dependencies after power-off for target '%s': %d\n",
  713. unit->name, ret);
  714. if (unit->enable)
  715. unit->enable(pwrseq);
  716. return ret;
  717. }
  718. unit->enable_count--;
  719. return 0;
  720. }
  721. /**
  722. * pwrseq_power_on() - Issue a power-on request on behalf of the consumer
  723. * device.
  724. * @desc: Descriptor referencing the power sequencer.
  725. *
  726. * This function tells the power sequencer that the consumer wants to be
  727. * powered-up. The sequencer may already have powered-up the device in which
  728. * case the function returns 0. If the power-up sequence is already in
  729. * progress, the function will block until it's done and return 0. If this is
  730. * the first request, the device will be powered up.
  731. *
  732. * Returns:
  733. * 0 on success, negative error number on failure.
  734. */
  735. int pwrseq_power_on(struct pwrseq_desc *desc)
  736. {
  737. struct pwrseq_device *pwrseq;
  738. struct pwrseq_target *target;
  739. struct pwrseq_unit *unit;
  740. int ret;
  741. might_sleep();
  742. if (!desc || desc->powered_on)
  743. return 0;
  744. pwrseq = desc->pwrseq;
  745. target = desc->target;
  746. unit = target->unit;
  747. guard(rwsem_read)(&pwrseq->rw_lock);
  748. if (!device_is_registered(&pwrseq->dev))
  749. return -ENODEV;
  750. scoped_guard(mutex, &pwrseq->state_lock) {
  751. ret = pwrseq_unit_enable(pwrseq, unit);
  752. if (!ret)
  753. desc->powered_on = true;
  754. }
  755. if (target->post_enable) {
  756. ret = target->post_enable(pwrseq);
  757. if (ret) {
  758. pwrseq_unit_disable(pwrseq, unit);
  759. desc->powered_on = false;
  760. }
  761. }
  762. return ret;
  763. }
  764. EXPORT_SYMBOL_GPL(pwrseq_power_on);
  765. /**
  766. * pwrseq_power_off() - Issue a power-off request on behalf of the consumer
  767. * device.
  768. * @desc: Descriptor referencing the power sequencer.
  769. *
  770. * This undoes the effects of pwrseq_power_on(). It issues a power-off request
  771. * on behalf of the consumer and when the last remaining user does so, the
  772. * power-down sequence will be started. If one is in progress, the function
  773. * will block until it's complete and then return.
  774. *
  775. * Returns:
  776. * 0 on success, negative error number on failure.
  777. */
  778. int pwrseq_power_off(struct pwrseq_desc *desc)
  779. {
  780. struct pwrseq_device *pwrseq;
  781. struct pwrseq_unit *unit;
  782. int ret;
  783. might_sleep();
  784. if (!desc || !desc->powered_on)
  785. return 0;
  786. pwrseq = desc->pwrseq;
  787. unit = desc->target->unit;
  788. guard(rwsem_read)(&pwrseq->rw_lock);
  789. if (!device_is_registered(&pwrseq->dev))
  790. return -ENODEV;
  791. guard(mutex)(&pwrseq->state_lock);
  792. ret = pwrseq_unit_disable(pwrseq, unit);
  793. if (!ret)
  794. desc->powered_on = false;
  795. return ret;
  796. }
  797. EXPORT_SYMBOL_GPL(pwrseq_power_off);
  798. #if IS_ENABLED(CONFIG_DEBUG_FS)
  799. struct pwrseq_debugfs_count_ctx {
  800. struct device *dev;
  801. loff_t index;
  802. };
  803. static int pwrseq_debugfs_seq_count(struct device *dev, void *data)
  804. {
  805. struct pwrseq_debugfs_count_ctx *ctx = data;
  806. ctx->dev = dev;
  807. return ctx->index-- ? 0 : 1;
  808. }
  809. static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos)
  810. {
  811. struct pwrseq_debugfs_count_ctx ctx;
  812. ctx.dev = NULL;
  813. ctx.index = *pos;
  814. /*
  815. * We're holding the lock for the entire printout so no need to fiddle
  816. * with device reference count.
  817. */
  818. down_read(&pwrseq_sem);
  819. bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count);
  820. if (!ctx.index)
  821. return NULL;
  822. return ctx.dev;
  823. }
  824. static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data,
  825. loff_t *pos)
  826. {
  827. struct device *curr = data;
  828. ++*pos;
  829. struct device *next __free(put_device) =
  830. bus_find_next_device(&pwrseq_bus, curr);
  831. return next;
  832. }
  833. static void pwrseq_debugfs_seq_show_target(struct seq_file *seq,
  834. struct pwrseq_target *target)
  835. {
  836. seq_printf(seq, " target: [%s] (target unit: [%s])\n",
  837. target->name, target->unit->name);
  838. }
  839. static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq,
  840. struct pwrseq_unit *unit)
  841. {
  842. struct pwrseq_unit_dep *ref;
  843. seq_printf(seq, " unit: [%s] - enable count: %u\n",
  844. unit->name, unit->enable_count);
  845. if (list_empty(&unit->deps))
  846. return;
  847. seq_puts(seq, " dependencies:\n");
  848. list_for_each_entry(ref, &unit->deps, list)
  849. seq_printf(seq, " [%s]\n", ref->unit->name);
  850. }
  851. static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data)
  852. {
  853. struct device *dev = data;
  854. struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
  855. struct pwrseq_target *target;
  856. struct pwrseq_unit *unit;
  857. seq_printf(seq, "%s:\n", dev_name(dev));
  858. seq_puts(seq, " targets:\n");
  859. list_for_each_entry(target, &pwrseq->targets, list)
  860. pwrseq_debugfs_seq_show_target(seq, target);
  861. seq_puts(seq, " units:\n");
  862. list_for_each_entry(unit, &pwrseq->units, list)
  863. pwrseq_debugfs_seq_show_unit(seq, unit);
  864. return 0;
  865. }
  866. static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data)
  867. {
  868. up_read(&pwrseq_sem);
  869. }
  870. static const struct seq_operations pwrseq_debugfs_sops = {
  871. .start = pwrseq_debugfs_seq_start,
  872. .next = pwrseq_debugfs_seq_next,
  873. .show = pwrseq_debugfs_seq_show,
  874. .stop = pwrseq_debugfs_seq_stop,
  875. };
  876. DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs);
  877. static struct dentry *pwrseq_debugfs_dentry;
  878. #endif /* CONFIG_DEBUG_FS */
  879. static int __init pwrseq_init(void)
  880. {
  881. int ret;
  882. ret = bus_register(&pwrseq_bus);
  883. if (ret) {
  884. pr_err("Failed to register the power sequencer bus\n");
  885. return ret;
  886. }
  887. #if IS_ENABLED(CONFIG_DEBUG_FS)
  888. pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL,
  889. &pwrseq_debugfs_fops);
  890. #endif /* CONFIG_DEBUG_FS */
  891. return 0;
  892. }
  893. subsys_initcall(pwrseq_init);
  894. static void __exit pwrseq_exit(void)
  895. {
  896. #if IS_ENABLED(CONFIG_DEBUG_FS)
  897. debugfs_remove_recursive(pwrseq_debugfs_dentry);
  898. #endif /* CONFIG_DEBUG_FS */
  899. bus_unregister(&pwrseq_bus);
  900. }
  901. module_exit(pwrseq_exit);
  902. MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
  903. MODULE_DESCRIPTION("Power Sequencing subsystem core");
  904. MODULE_LICENSE("GPL");