rpmh-regulator.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */
  3. /* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved. */
  4. #define pr_fmt(fmt) "%s: " fmt, __func__
  5. #include <linux/bitops.h>
  6. #include <linux/err.h>
  7. #include <linux/ipc_logging.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/of_device.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/slab.h>
  14. #include <linux/string.h>
  15. #include <linux/regulator/debug-regulator.h>
  16. #include <linux/regulator/driver.h>
  17. #include <linux/regulator/machine.h>
  18. #include <linux/regulator/of_regulator.h>
  19. #include <linux/regulator/proxy-consumer.h>
  20. #include <soc/qcom/cmd-db.h>
  21. #include <soc/qcom/rpmh.h>
  22. #include <dt-bindings/regulator/qcom,rpmh-regulator-levels.h>
  23. /**
  24. * enum rpmh_regulator_type - supported RPMh accelerator types
  25. * %RPMH_REGULATOR_TYPE_VRM: RPMh VRM accelerator which supports voting on
  26. * enable, voltage, mode, and headroom voltage of
  27. * LDO, SMPS, VS, and BOB type PMIC regulators.
  28. * %RPMH_REGULATOR_TYPE_ARC: RPMh ARC accelerator which supports voting on
  29. * the CPR managed voltage level of LDO and SMPS
  30. * type PMIC regulators.
  31. * %RPMH_REGULATOR_TYPE_XOB: RPMh XOB accelerator which supports voting on
  32. * the enable state of PMIC regulators.
  33. */
  34. enum rpmh_regulator_type {
  35. RPMH_REGULATOR_TYPE_VRM,
  36. RPMH_REGULATOR_TYPE_ARC,
  37. RPMH_REGULATOR_TYPE_XOB,
  38. };
  39. /**
  40. * enum rpmh_regulator_hw_type - supported PMIC regulator hardware types
  41. * This enum defines the specific regulator type along with its PMIC family.
  42. */
  43. enum rpmh_regulator_hw_type {
  44. RPMH_REGULATOR_HW_TYPE_UNKNOWN,
  45. RPMH_REGULATOR_HW_TYPE_PMIC4_LDO,
  46. RPMH_REGULATOR_HW_TYPE_PMIC4_HFSMPS,
  47. RPMH_REGULATOR_HW_TYPE_PMIC4_FTSMPS,
  48. RPMH_REGULATOR_HW_TYPE_PMIC4_BOB,
  49. RPMH_REGULATOR_HW_TYPE_PMIC5_LDO,
  50. RPMH_REGULATOR_HW_TYPE_PMIC5_HFSMPS,
  51. RPMH_REGULATOR_HW_TYPE_PMIC5_FTSMPS,
  52. RPMH_REGULATOR_HW_TYPE_PMIC5_BOB,
  53. RPMH_REGULATOR_HW_TYPE_MAX,
  54. };
  55. /**
  56. * enum rpmh_regulator_reg_index - RPMh accelerator register indices
  57. * %RPMH_REGULATOR_REG_VRM_VOLTAGE: VRM voltage voting register index
  58. * %RPMH_REGULATOR_REG_ARC_LEVEL: ARC voltage level voting register index
  59. * %RPMH_REGULATOR_REG_VRM_ENABLE: VRM enable voltage voting register index
  60. * %RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE: Place-holder for enable aggregation.
  61. * ARC does not have a specific register
  62. * for enable voting. Instead, ARC level
  63. * 0 corresponds to "disabled" for a given
  64. * ARC regulator resource if supported.
  65. * %RPMH_REGULATOR_REG_XOB_ENABLE: XOB enable voting register index
  66. * %RPMH_REGULATOR_REG_ENABLE: Common enable index used in callback
  67. * functions for both ARC and VRM.
  68. * %RPMH_REGULATOR_REG_VRM_MODE: VRM regulator mode voting register index
  69. * %RPMH_REGULATOR_REG_VRM_HEADROOM: VRM headroom voltage voting register
  70. * index
  71. * %RPMH_REGULATOR_REG_ARC_REAL_MAX: Upper limit of real existent ARC
  72. * register indices
  73. * %RPMH_REGULATOR_REG_ARC_MAX: Exclusive upper limit of ARC register
  74. * indices
  75. * %RPMH_REGULATOR_REG_XOB_MAX: Exclusive upper limit of XOB register
  76. * indices
  77. * %RPMH_REGULATOR_REG_VRM_MAX: Exclusive upper limit of VRM register
  78. * indices
  79. * %RPMH_REGULATOR_REG_MAX: Combined exclusive upper limit of ARC
  80. * and VRM register indices
  81. *
  82. * Register addresses are calculated as: base_addr + sizeof(u32) * reg_index
  83. */
  84. enum rpmh_regulator_reg_index {
  85. RPMH_REGULATOR_REG_VRM_VOLTAGE = 0,
  86. RPMH_REGULATOR_REG_ARC_LEVEL = 0,
  87. RPMH_REGULATOR_REG_VRM_ENABLE = 1,
  88. RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE = RPMH_REGULATOR_REG_VRM_ENABLE,
  89. RPMH_REGULATOR_REG_XOB_ENABLE = RPMH_REGULATOR_REG_VRM_ENABLE,
  90. RPMH_REGULATOR_REG_ENABLE = RPMH_REGULATOR_REG_VRM_ENABLE,
  91. RPMH_REGULATOR_REG_VRM_MODE = 2,
  92. RPMH_REGULATOR_REG_VRM_HEADROOM = 3,
  93. RPMH_REGULATOR_REG_ARC_REAL_MAX = 1,
  94. RPMH_REGULATOR_REG_ARC_MAX = 2,
  95. RPMH_REGULATOR_REG_XOB_MAX = 2,
  96. RPMH_REGULATOR_REG_VRM_MAX = 4,
  97. RPMH_REGULATOR_REG_MAX = 4,
  98. };
  99. /*
  100. * This is the number of bytes used for each command DB aux data entry of an
  101. * ARC resource.
  102. */
  103. #define RPMH_ARC_LEVEL_SIZE 2
  104. /*
  105. * This is the maximum number of voltage levels that may be defined for an ARC
  106. * resource.
  107. */
  108. #define RPMH_ARC_MAX_LEVELS 16
  109. #define RPMH_REGULATOR_LEVEL_OFF 0
  110. /* Min and max limits of VRM resource request parameters */
  111. #define RPMH_VRM_MIN_UV 0
  112. #define RPMH_VRM_MAX_UV 8191000
  113. #define RPMH_VRM_HEADROOM_MIN_UV 0
  114. #define RPMH_VRM_HEADROOM_MAX_UV 511000
  115. #define RPMH_VRM_MODE_MIN 0
  116. #define RPMH_VRM_MODE_MAX 7
  117. /* XOB voting registers are found in the VRM hardware module */
  118. #define CMD_DB_HW_XOB CMD_DB_HW_VRM
  119. #define IPC_LOG_PAGES 10
  120. #define rpmh_reg_dbg(fmt, ...) \
  121. do { \
  122. ipc_log_string(rpmh_reg_ipc_log, fmt, ##__VA_ARGS__); \
  123. pr_debug(fmt, ##__VA_ARGS__); \
  124. } while (0)
  125. static void *rpmh_reg_ipc_log;
  126. /**
  127. * struct rpmh_regulator_request - rpmh request data
  128. * @reg: Array of RPMh accelerator register values
  129. * @valid: Bitmask identifying which of the register values
  130. * are valid/initialized
  131. */
  132. struct rpmh_regulator_request {
  133. u32 reg[RPMH_REGULATOR_REG_MAX];
  134. u32 valid;
  135. };
  136. /**
  137. * struct rpmh_regulator_mode - RPMh VRM mode attributes
  138. * @pmic_mode: Raw PMIC mode value written into VRM mode voting
  139. * register (i.e. RPMH_REGULATOR_MODE_*)
  140. * @framework_mode: Regulator framework mode value
  141. * (i.e. REGULATOR_MODE_*)
  142. * @min_load_ua: The minimum load current in microamps which
  143. * would utilize this mode
  144. *
  145. * Software selects the lowest mode for which aggr_load_ua >= min_load_ua.
  146. */
  147. struct rpmh_regulator_mode {
  148. u32 pmic_mode;
  149. u32 framework_mode;
  150. int min_load_ua;
  151. };
  152. struct rpmh_vreg;
  153. /**
  154. * struct rpmh_aggr_vreg - top level aggregated rpmh regulator resource data
  155. * structure
  156. * @dev: Device pointer to the rpmh aggregated regulator
  157. * device
  158. * @resource_name: Name of rpmh regulator resource which is mapped
  159. * to an RPMh accelerator address via command DB.
  160. * This name must match to one that is defined by
  161. * the bootloader.
  162. * @addr: Base address of the regulator resource within
  163. * an RPMh accelerator
  164. * @lock: Mutex lock used for locking between regulators
  165. * common to a single aggregated resource
  166. * @regulator_type: RPMh accelerator type for this regulator
  167. * resource
  168. * @regulator_hw_type: The regulator hardware type (e.g. LDO or SMPS)
  169. * along with PMIC family (i.e. PMIC4 or PMIC5)
  170. * @level: Mapping from ARC resource specific voltage
  171. * levels (0 to RPMH_ARC_MAX_LEVELS - 1) to common
  172. * consumer voltage levels (i.e.
  173. * RPMH_REGULATOR_LEVEL_*). These values are read
  174. * out of the AUX data found in command DB for a
  175. * given ARC resource.
  176. * @level_count: The number of valid entries in the level array
  177. * @always_wait_for_ack: Boolean flag indicating if a request must always
  178. * wait for an ACK from RPMh before continuing even
  179. * if it corresponds to a strictly lower power
  180. * state (e.g. enabled --> disabled).
  181. * @next_wait_for_ack: Boolean flag indicating that the next request
  182. * sent must wait for an ACK. This is used to
  183. * ensure that the driver waits for the voltage to
  184. * slew down in the case that the requested max_uV
  185. * value is lower than the last requested voltage.
  186. * @sleep_request_sent: Boolean flag indicating that a sleep set request
  187. * has been sent at some point due to it diverging
  188. * from the active set request. After that point,
  189. * the sleep set requests must always be sent for
  190. * a given resource.
  191. * @vreg: Array of rpmh regulator structs representing the
  192. * individual regulators sharing the aggregated
  193. * regulator resource.
  194. * @vreg_count: The number of entries in the vreg array.
  195. * @mode: An array of modes supported by an RPMh VRM
  196. * regulator resource.
  197. * @mode_count: The number of entries in the mode array.
  198. * @disable_pmic_mode: PMIC mode optionally set when aggregated regulator resource
  199. * gets disabled, overriding existing aggregated mode.
  200. * @aggr_req_active: Aggregated active set RPMh accelerator register
  201. * request
  202. * @aggr_req_sleep: Aggregated sleep set RPMh accelerator register
  203. * request
  204. */
  205. struct rpmh_aggr_vreg {
  206. struct device *dev;
  207. const char *resource_name;
  208. u32 addr;
  209. struct mutex lock;
  210. enum rpmh_regulator_type regulator_type;
  211. enum rpmh_regulator_hw_type regulator_hw_type;
  212. u32 level[RPMH_ARC_MAX_LEVELS];
  213. int level_count;
  214. bool always_wait_for_ack;
  215. bool next_wait_for_ack;
  216. bool sleep_request_sent;
  217. struct rpmh_vreg *vreg;
  218. int vreg_count;
  219. struct rpmh_regulator_mode *mode;
  220. int mode_count;
  221. int disable_pmic_mode;
  222. struct rpmh_regulator_request aggr_req_active;
  223. struct rpmh_regulator_request aggr_req_sleep;
  224. };
  225. /**
  226. * struct rpmh_vreg - individual rpmh regulator data structure encapsulating a
  227. * regulator framework regulator device and its corresponding
  228. * rpmh request
  229. * @of_node: Device node pointer for the individual rpmh
  230. * regulator
  231. * @name: Name of the regulator
  232. * @rdesc: Regulator descriptor
  233. * @rdev: Regulator device pointer returned by
  234. * devm_regulator_register()
  235. * @aggr_vreg: Pointer to the aggregated rpmh regulator
  236. * resource
  237. * @set_active: Boolean flag indicating that requests made by
  238. * this regulator should take affect in the active
  239. * set
  240. * @set_sleep: Boolean flag indicating that requests made by
  241. * this regulator should take affect in the sleep
  242. * set
  243. * @req: RPMh accelerator register request
  244. * @mode_index: RPMh VRM regulator mode selected by index into
  245. * aggr_vreg->mode
  246. */
  247. struct rpmh_vreg {
  248. struct device_node *of_node;
  249. struct regulator_desc rdesc;
  250. struct regulator_dev *rdev;
  251. struct rpmh_aggr_vreg *aggr_vreg;
  252. bool set_active;
  253. bool set_sleep;
  254. struct rpmh_regulator_request req;
  255. int mode_index;
  256. };
  257. #define RPMH_REGULATOR_MODE_COUNT 5
  258. #define RPMH_REGULATOR_MODE_PMIC4_LDO_RM 4
  259. #define RPMH_REGULATOR_MODE_PMIC4_LDO_LPM 5
  260. #define RPMH_REGULATOR_MODE_PMIC4_LDO_HPM 7
  261. #define RPMH_REGULATOR_MODE_PMIC4_SMPS_RM 4
  262. #define RPMH_REGULATOR_MODE_PMIC4_SMPS_PFM 5
  263. #define RPMH_REGULATOR_MODE_PMIC4_SMPS_AUTO 6
  264. #define RPMH_REGULATOR_MODE_PMIC4_SMPS_PWM 7
  265. #define RPMH_REGULATOR_MODE_PMIC4_BOB_PASS 0
  266. #define RPMH_REGULATOR_MODE_PMIC4_BOB_PFM 1
  267. #define RPMH_REGULATOR_MODE_PMIC4_BOB_AUTO 2
  268. #define RPMH_REGULATOR_MODE_PMIC4_BOB_PWM 3
  269. #define RPMH_REGULATOR_MODE_PMIC5_LDO_RM 3
  270. #define RPMH_REGULATOR_MODE_PMIC5_LDO_LPM 4
  271. #define RPMH_REGULATOR_MODE_PMIC5_LDO_HPM 7
  272. #define RPMH_REGULATOR_MODE_PMIC5_HFSMPS_RM 3
  273. #define RPMH_REGULATOR_MODE_PMIC5_HFSMPS_PFM 4
  274. #define RPMH_REGULATOR_MODE_PMIC5_HFSMPS_AUTO 6
  275. #define RPMH_REGULATOR_MODE_PMIC5_HFSMPS_PWM 7
  276. #define RPMH_REGULATOR_MODE_PMIC5_FTSMPS_RM 3
  277. #define RPMH_REGULATOR_MODE_PMIC5_FTSMPS_PWM 7
  278. #define RPMH_REGULATOR_MODE_PMIC5_BOB_PASS 2
  279. #define RPMH_REGULATOR_MODE_PMIC5_BOB_PFM 4
  280. #define RPMH_REGULATOR_MODE_PMIC5_BOB_AUTO 6
  281. #define RPMH_REGULATOR_MODE_PMIC5_BOB_PWM 7
  282. /*
  283. * Mappings from RPMh generic modes to VRM accelerator modes and regulator
  284. * framework modes for each regulator type.
  285. */
  286. static const struct rpmh_regulator_mode
  287. rpmh_regulator_mode_map_pmic4_ldo[RPMH_REGULATOR_MODE_COUNT] = {
  288. [RPMH_REGULATOR_MODE_RET] = {
  289. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_LDO_RM,
  290. .framework_mode = REGULATOR_MODE_STANDBY,
  291. },
  292. [RPMH_REGULATOR_MODE_LPM] = {
  293. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_LDO_LPM,
  294. .framework_mode = REGULATOR_MODE_IDLE,
  295. },
  296. [RPMH_REGULATOR_MODE_HPM] = {
  297. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_LDO_HPM,
  298. .framework_mode = REGULATOR_MODE_FAST,
  299. },
  300. };
  301. static const struct rpmh_regulator_mode
  302. rpmh_regulator_mode_map_pmic4_smps[RPMH_REGULATOR_MODE_COUNT] = {
  303. [RPMH_REGULATOR_MODE_RET] = {
  304. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_SMPS_RM,
  305. .framework_mode = REGULATOR_MODE_STANDBY,
  306. },
  307. [RPMH_REGULATOR_MODE_LPM] = {
  308. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_SMPS_PFM,
  309. .framework_mode = REGULATOR_MODE_IDLE,
  310. },
  311. [RPMH_REGULATOR_MODE_AUTO] = {
  312. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_SMPS_AUTO,
  313. .framework_mode = REGULATOR_MODE_NORMAL,
  314. },
  315. [RPMH_REGULATOR_MODE_HPM] = {
  316. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_SMPS_PWM,
  317. .framework_mode = REGULATOR_MODE_FAST,
  318. },
  319. };
  320. static const struct rpmh_regulator_mode
  321. rpmh_regulator_mode_map_pmic4_bob[RPMH_REGULATOR_MODE_COUNT] = {
  322. [RPMH_REGULATOR_MODE_PASS] = {
  323. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_BOB_PASS,
  324. .framework_mode = REGULATOR_MODE_STANDBY,
  325. },
  326. [RPMH_REGULATOR_MODE_LPM] = {
  327. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_BOB_PFM,
  328. .framework_mode = REGULATOR_MODE_IDLE,
  329. },
  330. [RPMH_REGULATOR_MODE_AUTO] = {
  331. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_BOB_AUTO,
  332. .framework_mode = REGULATOR_MODE_NORMAL,
  333. },
  334. [RPMH_REGULATOR_MODE_HPM] = {
  335. .pmic_mode = RPMH_REGULATOR_MODE_PMIC4_BOB_PWM,
  336. .framework_mode = REGULATOR_MODE_FAST,
  337. },
  338. };
  339. static const struct rpmh_regulator_mode
  340. rpmh_regulator_mode_map_pmic5_ldo[RPMH_REGULATOR_MODE_COUNT] = {
  341. [RPMH_REGULATOR_MODE_RET] = {
  342. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_LDO_RM,
  343. .framework_mode = REGULATOR_MODE_STANDBY,
  344. },
  345. [RPMH_REGULATOR_MODE_LPM] = {
  346. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_LDO_LPM,
  347. .framework_mode = REGULATOR_MODE_IDLE,
  348. },
  349. [RPMH_REGULATOR_MODE_HPM] = {
  350. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_LDO_HPM,
  351. .framework_mode = REGULATOR_MODE_FAST,
  352. },
  353. };
  354. static const struct rpmh_regulator_mode
  355. rpmh_regulator_mode_map_pmic5_hfsmps[RPMH_REGULATOR_MODE_COUNT] = {
  356. [RPMH_REGULATOR_MODE_RET] = {
  357. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_HFSMPS_RM,
  358. .framework_mode = REGULATOR_MODE_STANDBY,
  359. },
  360. [RPMH_REGULATOR_MODE_LPM] = {
  361. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_HFSMPS_PFM,
  362. .framework_mode = REGULATOR_MODE_IDLE,
  363. },
  364. [RPMH_REGULATOR_MODE_AUTO] = {
  365. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_HFSMPS_AUTO,
  366. .framework_mode = REGULATOR_MODE_NORMAL,
  367. },
  368. [RPMH_REGULATOR_MODE_HPM] = {
  369. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_HFSMPS_PWM,
  370. .framework_mode = REGULATOR_MODE_FAST,
  371. },
  372. };
  373. static const struct rpmh_regulator_mode
  374. rpmh_regulator_mode_map_pmic5_ftsmps[RPMH_REGULATOR_MODE_COUNT] = {
  375. [RPMH_REGULATOR_MODE_RET] = {
  376. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_FTSMPS_RM,
  377. .framework_mode = REGULATOR_MODE_STANDBY,
  378. },
  379. [RPMH_REGULATOR_MODE_HPM] = {
  380. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_FTSMPS_PWM,
  381. .framework_mode = REGULATOR_MODE_FAST,
  382. },
  383. };
  384. static const struct rpmh_regulator_mode
  385. rpmh_regulator_mode_map_pmic5_bob[RPMH_REGULATOR_MODE_COUNT] = {
  386. [RPMH_REGULATOR_MODE_PASS] = {
  387. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_BOB_PASS,
  388. .framework_mode = REGULATOR_MODE_STANDBY,
  389. },
  390. [RPMH_REGULATOR_MODE_LPM] = {
  391. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_BOB_PFM,
  392. .framework_mode = REGULATOR_MODE_IDLE,
  393. },
  394. [RPMH_REGULATOR_MODE_AUTO] = {
  395. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_BOB_AUTO,
  396. .framework_mode = REGULATOR_MODE_NORMAL,
  397. },
  398. [RPMH_REGULATOR_MODE_HPM] = {
  399. .pmic_mode = RPMH_REGULATOR_MODE_PMIC5_BOB_PWM,
  400. .framework_mode = REGULATOR_MODE_FAST,
  401. },
  402. };
  403. static const struct rpmh_regulator_mode * const
  404. rpmh_regulator_mode_map[RPMH_REGULATOR_HW_TYPE_MAX] = {
  405. [RPMH_REGULATOR_HW_TYPE_PMIC4_LDO]
  406. = rpmh_regulator_mode_map_pmic4_ldo,
  407. [RPMH_REGULATOR_HW_TYPE_PMIC4_HFSMPS]
  408. = rpmh_regulator_mode_map_pmic4_smps,
  409. [RPMH_REGULATOR_HW_TYPE_PMIC4_FTSMPS]
  410. = rpmh_regulator_mode_map_pmic4_smps,
  411. [RPMH_REGULATOR_HW_TYPE_PMIC4_BOB]
  412. = rpmh_regulator_mode_map_pmic4_bob,
  413. [RPMH_REGULATOR_HW_TYPE_PMIC5_LDO]
  414. = rpmh_regulator_mode_map_pmic5_ldo,
  415. [RPMH_REGULATOR_HW_TYPE_PMIC5_HFSMPS]
  416. = rpmh_regulator_mode_map_pmic5_hfsmps,
  417. [RPMH_REGULATOR_HW_TYPE_PMIC5_FTSMPS]
  418. = rpmh_regulator_mode_map_pmic5_ftsmps,
  419. [RPMH_REGULATOR_HW_TYPE_PMIC5_BOB]
  420. = rpmh_regulator_mode_map_pmic5_bob,
  421. };
  422. /*
  423. * This voltage in uV is returned by get_voltage functions when there is no way
  424. * to determine the current voltage level. It is needed because the regulator
  425. * framework treats a 0 uV voltage as an error.
  426. */
  427. #define VOLTAGE_UNKNOWN 1
  428. #define vreg_err(vreg, message, ...) \
  429. pr_err("%s: " message, (vreg)->rdesc.name, ##__VA_ARGS__)
  430. #define vreg_info(vreg, message, ...) \
  431. pr_info("%s: " message, (vreg)->rdesc.name, ##__VA_ARGS__)
  432. #define vreg_debug(vreg, message, ...) \
  433. pr_debug("%s: " message, (vreg)->rdesc.name, ##__VA_ARGS__)
  434. #define aggr_vreg_err(aggr_vreg, message, ...) \
  435. pr_err("%s: " message, (aggr_vreg)->resource_name, ##__VA_ARGS__)
  436. #define aggr_vreg_info(aggr_vreg, message, ...) \
  437. pr_info("%s: " message, (aggr_vreg)->resource_name, ##__VA_ARGS__)
  438. #define aggr_vreg_debug(aggr_vreg, message, ...) \
  439. pr_debug("%s: " message, (aggr_vreg)->resource_name, ##__VA_ARGS__)
  440. #define DEBUG_PRINT_BUFFER_SIZE 256
  441. static const char *const rpmh_regulator_state_names[] = {
  442. [RPMH_SLEEP_STATE] = "sleep ",
  443. [RPMH_WAKE_ONLY_STATE] = "wake ",
  444. [RPMH_ACTIVE_ONLY_STATE] = "active",
  445. };
  446. static const char *const rpmh_regulator_vrm_param_names[] = {
  447. [RPMH_REGULATOR_REG_VRM_VOLTAGE] = "mv",
  448. [RPMH_REGULATOR_REG_VRM_ENABLE] = "en",
  449. [RPMH_REGULATOR_REG_VRM_MODE] = "mode",
  450. [RPMH_REGULATOR_REG_VRM_HEADROOM] = "hr_mv",
  451. };
  452. static const char *const rpmh_regulator_arc_param_names[] = {
  453. [RPMH_REGULATOR_REG_ARC_LEVEL] = "hlvl",
  454. };
  455. static const char *const rpmh_regulator_xob_param_names[] = {
  456. [RPMH_REGULATOR_REG_XOB_ENABLE] = "en",
  457. };
  458. static const int max_reg_index_map[] = {
  459. [RPMH_REGULATOR_TYPE_VRM] = RPMH_REGULATOR_REG_VRM_MAX,
  460. [RPMH_REGULATOR_TYPE_ARC] = RPMH_REGULATOR_REG_ARC_MAX,
  461. [RPMH_REGULATOR_TYPE_XOB] = RPMH_REGULATOR_REG_XOB_MAX,
  462. };
  463. /**
  464. * rpmh_regulator_get_max_reg_index() - return the number of registers
  465. * associated with the rpmh resource
  466. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  467. *
  468. * Return: max number of registers for the aggr_vreg rpmh resource
  469. */
  470. static int rpmh_regulator_get_max_reg_index(struct rpmh_aggr_vreg *aggr_vreg)
  471. {
  472. if (aggr_vreg->regulator_type >= ARRAY_SIZE(max_reg_index_map))
  473. return -EINVAL;
  474. else
  475. return max_reg_index_map[aggr_vreg->regulator_type];
  476. }
  477. /**
  478. * rpmh_regulator_req() - print the rpmh regulator request to the kernel log
  479. * @vreg: Pointer to the RPMh regulator
  480. * @current_req: Pointer to the new request
  481. * @prev_req: Pointer to the last request
  482. * @sent_mask: Bitmask which specifies the parameters sent in this
  483. * request
  484. * @state: The rpmh state that the request was sent for
  485. *
  486. * Return: none
  487. */
  488. static void rpmh_regulator_req(struct rpmh_vreg *vreg,
  489. struct rpmh_regulator_request *current_req,
  490. struct rpmh_regulator_request *prev_req,
  491. u32 sent_mask,
  492. enum rpmh_state state)
  493. {
  494. struct rpmh_aggr_vreg *aggr_vreg = vreg->aggr_vreg;
  495. char buf[DEBUG_PRINT_BUFFER_SIZE];
  496. size_t buflen = DEBUG_PRINT_BUFFER_SIZE;
  497. const char *const *param_name;
  498. int i, max_reg_index;
  499. int pos = 0;
  500. u32 valid;
  501. bool first;
  502. switch (aggr_vreg->regulator_type) {
  503. case RPMH_REGULATOR_TYPE_VRM:
  504. max_reg_index = RPMH_REGULATOR_REG_VRM_MAX;
  505. param_name = rpmh_regulator_vrm_param_names;
  506. break;
  507. case RPMH_REGULATOR_TYPE_ARC:
  508. max_reg_index = RPMH_REGULATOR_REG_ARC_REAL_MAX;
  509. param_name = rpmh_regulator_arc_param_names;
  510. break;
  511. case RPMH_REGULATOR_TYPE_XOB:
  512. max_reg_index = RPMH_REGULATOR_REG_XOB_MAX;
  513. param_name = rpmh_regulator_xob_param_names;
  514. break;
  515. default:
  516. return;
  517. }
  518. pos += scnprintf(buf + pos, buflen - pos,
  519. "%s (%s), addr=0x%05X: s=%s; sent: ",
  520. aggr_vreg->resource_name, vreg->rdesc.name,
  521. aggr_vreg->addr, rpmh_regulator_state_names[state]);
  522. valid = sent_mask;
  523. first = true;
  524. for (i = 0; i < max_reg_index; i++) {
  525. if (valid & BIT(i)) {
  526. pos += scnprintf(buf + pos, buflen - pos, "%s%s=%u",
  527. (first ? "" : ", "), param_name[i],
  528. current_req->reg[i]);
  529. first = false;
  530. if (aggr_vreg->regulator_type
  531. == RPMH_REGULATOR_TYPE_ARC
  532. && i == RPMH_REGULATOR_REG_ARC_LEVEL)
  533. pos += scnprintf(buf + pos, buflen - pos,
  534. " (vlvl=%u)",
  535. aggr_vreg->level[current_req->reg[i]]);
  536. }
  537. }
  538. valid = prev_req->valid & ~sent_mask;
  539. if (valid)
  540. pos += scnprintf(buf + pos, buflen - pos, "; prev: ");
  541. first = true;
  542. for (i = 0; i < max_reg_index; i++) {
  543. if (valid & BIT(i)) {
  544. pos += scnprintf(buf + pos, buflen - pos, "%s%s=%u",
  545. (first ? "" : ", "), param_name[i],
  546. current_req->reg[i]);
  547. first = false;
  548. if (aggr_vreg->regulator_type
  549. == RPMH_REGULATOR_TYPE_ARC
  550. && i == RPMH_REGULATOR_REG_ARC_LEVEL)
  551. pos += scnprintf(buf + pos, buflen - pos,
  552. " (vlvl=%u)",
  553. aggr_vreg->level[current_req->reg[i]]);
  554. }
  555. }
  556. rpmh_reg_dbg("%s\n", buf);
  557. }
  558. /**
  559. * rpmh_regulator_handle_arc_enable() - handle masking of the voltage level
  560. * request based on the pseudo-enable value
  561. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  562. * @req Pointer to the newly aggregated request
  563. *
  564. * Return: none
  565. */
  566. static void rpmh_regulator_handle_arc_enable(struct rpmh_aggr_vreg *aggr_vreg,
  567. struct rpmh_regulator_request *req)
  568. {
  569. if (aggr_vreg->regulator_type != RPMH_REGULATOR_TYPE_ARC)
  570. return;
  571. /*
  572. * Mask the voltage level if "off" level is supported and the regulator
  573. * has not been enabled.
  574. */
  575. if (aggr_vreg->level[0] == RPMH_REGULATOR_LEVEL_OFF) {
  576. if (req->valid & BIT(RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE)) {
  577. if (!req->reg[RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE])
  578. req->reg[RPMH_REGULATOR_REG_ARC_LEVEL] = 0;
  579. } else {
  580. /* Invalidate voltage level if enable is invalid. */
  581. req->valid &= ~BIT(RPMH_REGULATOR_REG_ARC_LEVEL);
  582. }
  583. }
  584. /*
  585. * Mark the pseudo enable bit as invalid so that it is not accidentally
  586. * included in an RPMh command.
  587. */
  588. req->valid &= ~BIT(RPMH_REGULATOR_REG_ARC_PSEUDO_ENABLE);
  589. }
  590. static void rpmh_regulator_handle_disable_mode(struct rpmh_aggr_vreg *aggr_vreg,
  591. struct rpmh_regulator_request *req)
  592. {
  593. if (aggr_vreg->regulator_type != RPMH_REGULATOR_TYPE_VRM
  594. || aggr_vreg->disable_pmic_mode <= 0)
  595. return;
  596. if ((req->valid & BIT(RPMH_REGULATOR_REG_ENABLE))
  597. && !req->reg[RPMH_REGULATOR_REG_ENABLE]) {
  598. req->reg[RPMH_REGULATOR_REG_VRM_MODE] = aggr_vreg->disable_pmic_mode;
  599. req->valid |= RPMH_REGULATOR_REG_VRM_MODE;
  600. }
  601. }
  602. /**
  603. * rpmh_regulator_aggregate_requests() - aggregate the requests from all
  604. * regulators associated with an RPMh resource
  605. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  606. * @req_active: Pointer to active set request output
  607. * @req_sleep: Pointer to sleep set request output
  608. *
  609. * This function aggregates the requests from the different regulators
  610. * associated with the aggr_vreg resource independently in both the active set
  611. * and sleep set. The aggregated results are stored in req_active and
  612. * req_sleep.
  613. *
  614. * Return: none
  615. */
  616. static void rpmh_regulator_aggregate_requests(struct rpmh_aggr_vreg *aggr_vreg,
  617. struct rpmh_regulator_request *req_active,
  618. struct rpmh_regulator_request *req_sleep)
  619. {
  620. int i, j, max_reg_index;
  621. max_reg_index = rpmh_regulator_get_max_reg_index(aggr_vreg);
  622. /*
  623. * Perform max aggregration of each register value across all regulators
  624. * which use this RPMh resource.
  625. */
  626. for (i = 0; i < aggr_vreg->vreg_count; i++) {
  627. if (aggr_vreg->vreg[i].set_active) {
  628. for (j = 0; j < max_reg_index; j++)
  629. req_active->reg[j] = max(req_active->reg[j],
  630. aggr_vreg->vreg[i].req.reg[j]);
  631. req_active->valid |= aggr_vreg->vreg[i].req.valid;
  632. }
  633. if (aggr_vreg->vreg[i].set_sleep) {
  634. for (j = 0; j < max_reg_index; j++)
  635. req_sleep->reg[j] = max(req_sleep->reg[j],
  636. aggr_vreg->vreg[i].req.reg[j]);
  637. req_sleep->valid |= aggr_vreg->vreg[i].req.valid;
  638. }
  639. }
  640. rpmh_regulator_handle_arc_enable(aggr_vreg, req_active);
  641. rpmh_regulator_handle_arc_enable(aggr_vreg, req_sleep);
  642. rpmh_regulator_handle_disable_mode(aggr_vreg, req_active);
  643. rpmh_regulator_handle_disable_mode(aggr_vreg, req_sleep);
  644. }
  645. static void swap_cmds(struct tcs_cmd *cmd1, struct tcs_cmd *cmd2)
  646. {
  647. struct tcs_cmd cmd_temp;
  648. if (cmd1 == cmd2)
  649. return;
  650. cmd_temp = *cmd1;
  651. *cmd1 = *cmd2;
  652. *cmd2 = cmd_temp;
  653. }
  654. /**
  655. * rpmh_regulator_reorder_cmds() - reorder tcs commands to ensure safe regulator
  656. * state transitions
  657. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  658. * @cmd: TCS command array
  659. * @len: Number of elements in 'cmd' array
  660. *
  661. * LDO regulators can accidentally trigger over-current protection (OCP) when
  662. * RPMh regulator requests are processed if the commands in the request are in
  663. * an order that temporarily places the LDO in an incorrect state. For example,
  664. * if an LDO is disabled with mode=LPM, then executing the request
  665. * [en=ON, mode=HPM] can trigger OCP after the first command is executed since
  666. * it will result in the overall state: en=ON, mode=LPM. This issue can be
  667. * avoided by reordering the commands: [mode=HPM, en=ON].
  668. *
  669. * This function reorders the request command sequence to avoid invalid
  670. * transient LDO states.
  671. *
  672. * Return: none
  673. */
  674. static void rpmh_regulator_reorder_cmds(struct rpmh_aggr_vreg *aggr_vreg,
  675. struct tcs_cmd *cmd, int len)
  676. {
  677. enum rpmh_regulator_reg_index reg_index;
  678. int i;
  679. if (len == 1 || aggr_vreg->regulator_type != RPMH_REGULATOR_TYPE_VRM)
  680. return;
  681. for (i = 0; i < len; i++) {
  682. reg_index = (cmd[i].addr - aggr_vreg->addr) >> 2;
  683. if (reg_index == RPMH_REGULATOR_REG_VRM_ENABLE) {
  684. if (cmd[i].data) {
  685. /* Move enable command to end */
  686. swap_cmds(&cmd[i], &cmd[len - 1]);
  687. } else {
  688. /* Move disable command to start */
  689. swap_cmds(&cmd[i], &cmd[0]);
  690. }
  691. break;
  692. }
  693. }
  694. }
  695. /**
  696. * rpmh_regulator_send_aggregate_requests() - aggregate the requests from all
  697. * regulators associated with an RPMh resource and send the request
  698. * to RPMh
  699. * @vreg: Pointer to the RPMh regulator
  700. *
  701. * This function aggregates the requests from the different regulators
  702. * associated with the aggr_vreg resource independently in both the active set
  703. * and sleep set. The requests are only sent for the sleep set if they differ,
  704. * or have differed in the past, from those of the active set.
  705. *
  706. * Return: 0 on success, errno on failure
  707. */
  708. static int
  709. rpmh_regulator_send_aggregate_requests(struct rpmh_vreg *vreg)
  710. {
  711. struct rpmh_aggr_vreg *aggr_vreg = vreg->aggr_vreg;
  712. struct rpmh_regulator_request req_active = { {0} };
  713. struct rpmh_regulator_request req_sleep = { {0} };
  714. struct tcs_cmd cmd[RPMH_REGULATOR_REG_MAX] = { {0} };
  715. bool sleep_set_differs = aggr_vreg->sleep_request_sent;
  716. bool wait_for_ack = aggr_vreg->always_wait_for_ack
  717. || aggr_vreg->next_wait_for_ack;
  718. bool resend_active = false;
  719. int i, j, max_reg_index, rc;
  720. enum rpmh_state state;
  721. u32 sent_mask;
  722. max_reg_index = rpmh_regulator_get_max_reg_index(aggr_vreg);
  723. rpmh_regulator_aggregate_requests(aggr_vreg, &req_active, &req_sleep);
  724. /*
  725. * Check if the aggregated sleep set parameter values differ from the
  726. * aggregated active set parameter values.
  727. */
  728. if (!aggr_vreg->sleep_request_sent) {
  729. for (i = 0; i < max_reg_index; i++) {
  730. if ((req_active.reg[i] != req_sleep.reg[i])
  731. && (req_sleep.valid & BIT(i))) {
  732. sleep_set_differs = true;
  733. /*
  734. * Resend full active set request so that
  735. * all parameters are specified in the wake-only
  736. * state request.
  737. */
  738. resend_active = true;
  739. break;
  740. }
  741. }
  742. }
  743. if (sleep_set_differs) {
  744. /*
  745. * Generate an rpmh command consisting of only those registers
  746. * which have new values or which have never been touched before
  747. * (i.e. those that were previously not valid).
  748. */
  749. sent_mask = 0;
  750. for (i = 0, j = 0; i < max_reg_index; i++) {
  751. if ((req_sleep.valid & BIT(i))
  752. && (!(aggr_vreg->aggr_req_sleep.valid & BIT(i))
  753. || aggr_vreg->aggr_req_sleep.reg[i]
  754. != req_sleep.reg[i])) {
  755. cmd[j].addr = aggr_vreg->addr + i * 4;
  756. cmd[j].data = req_sleep.reg[i];
  757. cmd[j].wait = true;
  758. j++;
  759. sent_mask |= BIT(i);
  760. }
  761. }
  762. /* Send the rpmh command if any register values differ. */
  763. if (j > 0) {
  764. rpmh_regulator_reorder_cmds(aggr_vreg, cmd, j);
  765. rc = rpmh_write_async(aggr_vreg->dev,
  766. RPMH_SLEEP_STATE, cmd, j);
  767. if (rc) {
  768. aggr_vreg_err(aggr_vreg, "sleep state rpmh_write_async() failed, rc=%d\n",
  769. rc);
  770. return rc;
  771. }
  772. rpmh_regulator_req(vreg, &req_sleep,
  773. &aggr_vreg->aggr_req_sleep,
  774. sent_mask,
  775. RPMH_SLEEP_STATE);
  776. aggr_vreg->sleep_request_sent = true;
  777. aggr_vreg->aggr_req_sleep = req_sleep;
  778. }
  779. }
  780. /*
  781. * Generate an rpmh command consisting of only those registers
  782. * which have new values or which have never been touched before
  783. * (i.e. those that were previously not valid).
  784. */
  785. sent_mask = 0;
  786. for (i = 0, j = 0; i < max_reg_index; i++) {
  787. if ((req_active.valid & BIT(i))
  788. && (!(aggr_vreg->aggr_req_active.valid & BIT(i))
  789. || aggr_vreg->aggr_req_active.reg[i]
  790. != req_active.reg[i] || resend_active)) {
  791. cmd[j].addr = aggr_vreg->addr + i * 4;
  792. cmd[j].data = req_active.reg[i];
  793. cmd[j].wait = true;
  794. j++;
  795. sent_mask |= BIT(i);
  796. /*
  797. * Must wait for ACK from RPMh if power state is
  798. * increasing
  799. */
  800. if (req_active.reg[i]
  801. > aggr_vreg->aggr_req_active.reg[i])
  802. wait_for_ack = true;
  803. }
  804. }
  805. /* Send the rpmh command if any register values differ. */
  806. if (j > 0) {
  807. rpmh_regulator_reorder_cmds(aggr_vreg, cmd, j);
  808. if (sleep_set_differs) {
  809. state = RPMH_WAKE_ONLY_STATE;
  810. rc = rpmh_write_async(aggr_vreg->dev, state, cmd, j);
  811. if (rc) {
  812. aggr_vreg_err(aggr_vreg, "%s state rpmh_write_async() failed, rc=%d\n",
  813. rpmh_regulator_state_names[state], rc);
  814. return rc;
  815. }
  816. rpmh_regulator_req(vreg, &req_active,
  817. &aggr_vreg->aggr_req_active, sent_mask, state);
  818. }
  819. state = RPMH_ACTIVE_ONLY_STATE;
  820. if (wait_for_ack)
  821. rc = rpmh_write(aggr_vreg->dev, state, cmd, j);
  822. else
  823. rc = rpmh_write_async(aggr_vreg->dev, state,
  824. cmd, j);
  825. if (rc) {
  826. aggr_vreg_err(aggr_vreg, "%s state rpmh_write() failed, rc=%d\n",
  827. rpmh_regulator_state_names[state], rc);
  828. return rc;
  829. }
  830. rpmh_regulator_req(vreg, &req_active,
  831. &aggr_vreg->aggr_req_active, sent_mask, state);
  832. aggr_vreg->aggr_req_active = req_active;
  833. aggr_vreg->next_wait_for_ack = false;
  834. }
  835. return 0;
  836. }
  837. /**
  838. * rpmh_regulator_set_reg() - set a register value within the request for an
  839. * RPMh regulator and return the previous value
  840. * @vreg: Pointer to the RPMh regulator
  841. * @reg_index: Index of the register value to update
  842. * @value: New register value to set
  843. *
  844. * Return: old register value
  845. */
  846. static u32 rpmh_regulator_set_reg(struct rpmh_vreg *vreg, int reg_index,
  847. u32 value)
  848. {
  849. u32 old_value;
  850. old_value = vreg->req.reg[reg_index];
  851. vreg->req.reg[reg_index] = value;
  852. vreg->req.valid |= BIT(reg_index);
  853. return old_value;
  854. }
  855. /**
  856. * rpmh_regulator_check_param_max() - sets if the next request must wait for
  857. * an ACK based on the previously sent reg[index] value and the new
  858. * max value
  859. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  860. * @index: Register index
  861. * @new_max: Newly requested maximum allowed value for the parameter
  862. *
  863. * This function is used to handle the case when a consumer makes a new
  864. * (min_uv, max_uv) range request in which the new max_uv is lower than the
  865. * previously requested min_uv. In this case, the driver must wait for an ACK
  866. * from RPMh to ensure that the voltage has completed reducing to the new min_uv
  867. * value since the consumer cannot operate at the old min_uv value.
  868. *
  869. * Return: none
  870. */
  871. static void rpmh_regulator_check_param_max(struct rpmh_aggr_vreg *aggr_vreg,
  872. int index, u32 new_max)
  873. {
  874. if ((aggr_vreg->aggr_req_active.valid & BIT(index))
  875. && aggr_vreg->aggr_req_active.reg[index] > new_max)
  876. aggr_vreg->next_wait_for_ack = true;
  877. }
  878. /**
  879. * rpmh_regulator_is_enabled() - return the enable state of the RPMh
  880. * regulator
  881. * @rdev: Regulator device pointer for the rpmh-regulator
  882. *
  883. * This function is passed as a callback function into the regulator ops that
  884. * are registered for each rpmh-regulator device.
  885. *
  886. * Note that for ARC resources, this value is effectively a flag indicating if
  887. * the requested voltage level is masked or unmasked since "disabled" = voltage
  888. * level 0 (if supported).
  889. *
  890. * Return: true if regulator is enabled, false if regulator is disabled
  891. */
  892. static int rpmh_regulator_is_enabled(struct regulator_dev *rdev)
  893. {
  894. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  895. return !!vreg->req.reg[RPMH_REGULATOR_REG_ENABLE];
  896. }
  897. /**
  898. * rpmh_regulator_enable() - enable the RPMh regulator
  899. * @rdev: Regulator device pointer for the rpmh-regulator
  900. *
  901. * This function is passed as a callback function into the regulator ops that
  902. * are registered for each rpmh-regulator device.
  903. *
  904. * Note that for ARC devices the enable state is handled via the voltage level
  905. * parameter. Therefore, this enable value effectively masks or unmasks the
  906. * enabled voltage level.
  907. *
  908. * Return: 0 on success, errno on failure
  909. */
  910. static int rpmh_regulator_enable(struct regulator_dev *rdev)
  911. {
  912. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  913. u32 prev_enable;
  914. int rc;
  915. mutex_lock(&vreg->aggr_vreg->lock);
  916. prev_enable
  917. = rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ENABLE, 1);
  918. rc = rpmh_regulator_send_aggregate_requests(vreg);
  919. if (rc) {
  920. vreg_err(vreg, "enable failed, rc=%d\n", rc);
  921. rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ENABLE,
  922. prev_enable);
  923. }
  924. mutex_unlock(&vreg->aggr_vreg->lock);
  925. return rc;
  926. }
  927. /**
  928. * rpmh_regulator_disable() - disable the RPMh regulator
  929. * @rdev: Regulator device pointer for the rpmh-regulator
  930. *
  931. * This function is passed as a callback function into the regulator ops that
  932. * are registered for each rpmh-regulator device.
  933. *
  934. * Note that for ARC devices the enable state is handled via the voltage level
  935. * parameter. Therefore, this enable value effectively masks or unmasks the
  936. * enabled voltage level.
  937. *
  938. * Return: 0 on success, errno on failure
  939. */
  940. static int rpmh_regulator_disable(struct regulator_dev *rdev)
  941. {
  942. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  943. u32 prev_enable;
  944. int rc;
  945. mutex_lock(&vreg->aggr_vreg->lock);
  946. prev_enable
  947. = rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ENABLE, 0);
  948. rc = rpmh_regulator_send_aggregate_requests(vreg);
  949. if (rc) {
  950. vreg_err(vreg, "disable failed, rc=%d\n", rc);
  951. rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ENABLE,
  952. prev_enable);
  953. }
  954. mutex_unlock(&vreg->aggr_vreg->lock);
  955. return rc;
  956. }
  957. /**
  958. * rpmh_regulator_vrm_set_voltage() - set the voltage of the VRM rpmh-regulator
  959. * @rdev: Regulator device pointer for the rpmh-regulator
  960. * @min_uv: New voltage in microvolts to set
  961. * @max_uv: Maximum voltage in microvolts allowed
  962. * @selector: Unused
  963. *
  964. * This function is passed as a callback function into the regulator ops that
  965. * are registered for each VRM rpmh-regulator device.
  966. *
  967. * Return: 0 on success, errno on failure
  968. */
  969. static int rpmh_regulator_vrm_set_voltage(struct regulator_dev *rdev,
  970. int min_uv, int max_uv, unsigned int *selector)
  971. {
  972. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  973. u32 prev_voltage;
  974. int mv;
  975. int rc = 0;
  976. mv = DIV_ROUND_UP(min_uv, 1000);
  977. if (mv * 1000 > max_uv) {
  978. vreg_err(vreg, "no set points available in range %d-%d uV\n",
  979. min_uv, max_uv);
  980. return -EINVAL;
  981. }
  982. mutex_lock(&vreg->aggr_vreg->lock);
  983. prev_voltage
  984. = rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_VRM_VOLTAGE, mv);
  985. rpmh_regulator_check_param_max(vreg->aggr_vreg,
  986. RPMH_REGULATOR_REG_VRM_VOLTAGE, max_uv);
  987. rc = rpmh_regulator_send_aggregate_requests(vreg);
  988. if (rc) {
  989. vreg_err(vreg, "set voltage=%d mV failed, rc=%d\n", mv, rc);
  990. rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_VRM_VOLTAGE,
  991. prev_voltage);
  992. }
  993. mutex_unlock(&vreg->aggr_vreg->lock);
  994. return rc;
  995. }
  996. /**
  997. * rpmh_regulator_vrm_get_voltage() - get the voltage of the VRM rpmh-regulator
  998. * @rdev: Regulator device pointer for the rpmh-regulator
  999. *
  1000. * This function is passed as a callback function into the regulator ops that
  1001. * are registered for each VRM rpmh-regulator device.
  1002. *
  1003. * Return: regulator voltage in microvolts
  1004. */
  1005. static int rpmh_regulator_vrm_get_voltage(struct regulator_dev *rdev)
  1006. {
  1007. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1008. int uv;
  1009. uv = vreg->req.reg[RPMH_REGULATOR_REG_VRM_VOLTAGE] * 1000;
  1010. if (uv == 0)
  1011. uv = VOLTAGE_UNKNOWN;
  1012. return uv;
  1013. }
  1014. /**
  1015. * rpmh_regulator_vrm_set_mode_index() - set the mode of a VRM regulator to the
  1016. * mode mapped to mode_index
  1017. * @vreg: Pointer to the RPMh regulator
  1018. * @mode_index: Index into aggr_vreg->mode[] array
  1019. *
  1020. * Return: 0 on success, errno on failure
  1021. */
  1022. static int rpmh_regulator_vrm_set_mode_index(struct rpmh_vreg *vreg,
  1023. int mode_index)
  1024. {
  1025. u32 prev_mode;
  1026. int rc;
  1027. mutex_lock(&vreg->aggr_vreg->lock);
  1028. prev_mode = rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_VRM_MODE,
  1029. vreg->aggr_vreg->mode[mode_index].pmic_mode);
  1030. rc = rpmh_regulator_send_aggregate_requests(vreg);
  1031. if (rc) {
  1032. vreg_err(vreg, "set mode=%u failed, rc=%d\n",
  1033. vreg->req.reg[RPMH_REGULATOR_REG_VRM_MODE],
  1034. rc);
  1035. rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_VRM_MODE,
  1036. prev_mode);
  1037. } else {
  1038. vreg->mode_index = mode_index;
  1039. }
  1040. mutex_unlock(&vreg->aggr_vreg->lock);
  1041. return rc;
  1042. }
  1043. /**
  1044. * rpmh_regulator_vrm_set_mode() - set the mode of the VRM rpmh-regulator
  1045. * @rdev: Regulator device pointer for the rpmh-regulator
  1046. * @mode: The regulator framework mode to set
  1047. *
  1048. * This function is passed as a callback function into the regulator ops that
  1049. * are registered for each VRM rpmh-regulator device.
  1050. *
  1051. * This function sets the PMIC mode corresponding to the specified framework
  1052. * mode. The set of PMIC modes allowed is defined in device tree for a given
  1053. * RPMh regulator resource. The full mapping from generic modes to PMIC modes
  1054. * and framework modes is defined in the rpmh_regulator_mode_map[] array. The
  1055. * RPMh resource specific mapping is defined in the aggr_vreg->mode[] array.
  1056. *
  1057. * Return: 0 on success, errno on failure
  1058. */
  1059. static int rpmh_regulator_vrm_set_mode(struct regulator_dev *rdev,
  1060. unsigned int mode)
  1061. {
  1062. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1063. int i;
  1064. for (i = 0; i < vreg->aggr_vreg->mode_count; i++)
  1065. if (vreg->aggr_vreg->mode[i].framework_mode == mode)
  1066. break;
  1067. if (i >= vreg->aggr_vreg->mode_count) {
  1068. vreg_err(vreg, "invalid mode=%u\n", mode);
  1069. return -EINVAL;
  1070. }
  1071. return rpmh_regulator_vrm_set_mode_index(vreg, i);
  1072. }
  1073. /**
  1074. * rpmh_regulator_vrm_get_mode() - get the mode of the VRM rpmh-regulator
  1075. * @rdev: Regulator device pointer for the rpmh-regulator
  1076. *
  1077. * This function is passed as a callback function into the regulator ops that
  1078. * are registered for each VRM rpmh-regulator device.
  1079. *
  1080. * Return: the regulator framework mode of the regulator
  1081. */
  1082. static unsigned int rpmh_regulator_vrm_get_mode(struct regulator_dev *rdev)
  1083. {
  1084. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1085. return vreg->aggr_vreg->mode[vreg->mode_index].framework_mode;
  1086. }
  1087. /**
  1088. * rpmh_regulator_vrm_set_load() - set the PMIC mode based upon the maximum load
  1089. * required from the VRM rpmh-regulator
  1090. * @rdev: Regulator device pointer for the rpmh-regulator
  1091. * @load_ua: Maximum current required from all consumers in microamps
  1092. *
  1093. * This function is passed as a callback function into the regulator ops that
  1094. * are registered for each VRM rpmh-regulator device.
  1095. *
  1096. * This function sets the mode of the regulator to that which has the highest
  1097. * min support load less than or equal to load_ua. Example:
  1098. * mode_count = 3
  1099. * mode[].min_load_ua = 0, 100000, 6000000
  1100. *
  1101. * load_ua = 10000 --> mode_index = 0
  1102. * load_ua = 250000 --> mode_index = 1
  1103. * load_ua = 7000000 --> mode_index = 2
  1104. *
  1105. * Return: 0 on success, errno on failure
  1106. */
  1107. static int rpmh_regulator_vrm_set_load(struct regulator_dev *rdev, int load_ua)
  1108. {
  1109. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1110. int i;
  1111. /* No need to check element 0 as it will be the default. */
  1112. for (i = vreg->aggr_vreg->mode_count - 1; i > 0; i--)
  1113. if (vreg->aggr_vreg->mode[i].min_load_ua <= load_ua)
  1114. break;
  1115. return rpmh_regulator_vrm_set_mode_index(vreg, i);
  1116. }
  1117. /**
  1118. * rpmh_regulator_arc_set_voltage_sel() - set the voltage level of the ARC
  1119. * rpmh-regulator device
  1120. * @rdev: Regulator device pointer for the rpmh-regulator
  1121. * @selector: ARC voltage level to set
  1122. *
  1123. * This function is passed as a callback function into the regulator ops that
  1124. * are registered for each ARC rpmh-regulator device.
  1125. *
  1126. * Return: 0 on success, errno on failure
  1127. */
  1128. static int rpmh_regulator_arc_set_voltage_sel(struct regulator_dev *rdev,
  1129. unsigned int selector)
  1130. {
  1131. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1132. u32 prev_level;
  1133. int rc;
  1134. mutex_lock(&vreg->aggr_vreg->lock);
  1135. prev_level = rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ARC_LEVEL,
  1136. selector);
  1137. rc = rpmh_regulator_send_aggregate_requests(vreg);
  1138. if (rc) {
  1139. vreg_err(vreg, "set level=%d failed, rc=%d\n",
  1140. vreg->req.reg[RPMH_REGULATOR_REG_ARC_LEVEL],
  1141. rc);
  1142. rpmh_regulator_set_reg(vreg, RPMH_REGULATOR_REG_ARC_LEVEL,
  1143. prev_level);
  1144. }
  1145. mutex_unlock(&vreg->aggr_vreg->lock);
  1146. return rc;
  1147. }
  1148. /**
  1149. * rpmh_regulator_arc_get_voltage_sel() - get the voltage level of the ARC
  1150. * rpmh-regulator device
  1151. * @rdev: Regulator device pointer for the rpmh-regulator
  1152. *
  1153. * This function is passed as a callback function into the regulator ops that
  1154. * are registered for each ARC rpmh-regulator device.
  1155. *
  1156. * Return: ARC voltage level
  1157. */
  1158. static int rpmh_regulator_arc_get_voltage_sel(struct regulator_dev *rdev)
  1159. {
  1160. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1161. return vreg->req.reg[RPMH_REGULATOR_REG_ARC_LEVEL];
  1162. }
  1163. /**
  1164. * rpmh_regulator_arc_list_voltage() - return the consumer voltage level mapped
  1165. * to a given ARC voltage level
  1166. * @rdev: Regulator device pointer for the rpmh-regulator
  1167. * @selector: ARC voltage level
  1168. *
  1169. * This function is passed as a callback function into the regulator ops that
  1170. * are registered for each ARC rpmh-regulator device.
  1171. *
  1172. * Data ranges:
  1173. * ARC voltage level: 0 - 15 (fixed in hardware)
  1174. * Consumer voltage level: 1 - 513 (could be expanded to larger values)
  1175. *
  1176. * Return: consumer voltage level
  1177. */
  1178. static int rpmh_regulator_arc_list_voltage(struct regulator_dev *rdev,
  1179. unsigned int selector)
  1180. {
  1181. struct rpmh_vreg *vreg = rdev_get_drvdata(rdev);
  1182. if (selector >= vreg->aggr_vreg->level_count)
  1183. return 0;
  1184. return vreg->aggr_vreg->level[selector];
  1185. }
  1186. static const struct regulator_ops rpmh_regulator_vrm_ops = {
  1187. .enable = rpmh_regulator_enable,
  1188. .disable = rpmh_regulator_disable,
  1189. .is_enabled = rpmh_regulator_is_enabled,
  1190. .set_voltage = rpmh_regulator_vrm_set_voltage,
  1191. .get_voltage = rpmh_regulator_vrm_get_voltage,
  1192. .set_mode = rpmh_regulator_vrm_set_mode,
  1193. .get_mode = rpmh_regulator_vrm_get_mode,
  1194. .set_load = rpmh_regulator_vrm_set_load,
  1195. };
  1196. static const struct regulator_ops rpmh_regulator_arc_ops = {
  1197. .enable = rpmh_regulator_enable,
  1198. .disable = rpmh_regulator_disable,
  1199. .is_enabled = rpmh_regulator_is_enabled,
  1200. .set_voltage_sel = rpmh_regulator_arc_set_voltage_sel,
  1201. .get_voltage_sel = rpmh_regulator_arc_get_voltage_sel,
  1202. .list_voltage = rpmh_regulator_arc_list_voltage,
  1203. };
  1204. static const struct regulator_ops rpmh_regulator_xob_ops = {
  1205. .enable = rpmh_regulator_enable,
  1206. .disable = rpmh_regulator_disable,
  1207. .is_enabled = rpmh_regulator_is_enabled,
  1208. };
  1209. static const struct regulator_ops *rpmh_regulator_ops[] = {
  1210. [RPMH_REGULATOR_TYPE_VRM] = &rpmh_regulator_vrm_ops,
  1211. [RPMH_REGULATOR_TYPE_ARC] = &rpmh_regulator_arc_ops,
  1212. [RPMH_REGULATOR_TYPE_XOB] = &rpmh_regulator_xob_ops,
  1213. };
  1214. /**
  1215. * rpmh_regulator_load_arc_level_mapping() - load the RPMh ARC resource's
  1216. * voltage level mapping from command db
  1217. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  1218. *
  1219. * The set of supported RPMH_REGULATOR_LEVEL_* voltage levels (0 - ~512) that
  1220. * map to ARC operating levels (0 - 15) is defined in aux data per ARC resource
  1221. * in the command db SMEM data structure. It is in a u16 array with 1 to 16
  1222. * elements. Note that the aux data array may be zero padded at the end for
  1223. * data alignment purposes. Such padding entries are invalid and must be
  1224. * ignored.
  1225. *
  1226. * Return: 0 on success, errno on failure
  1227. */
  1228. static int
  1229. rpmh_regulator_load_arc_level_mapping(struct rpmh_aggr_vreg *aggr_vreg)
  1230. {
  1231. size_t len = 0;
  1232. int i, j;
  1233. const u8 *buf;
  1234. buf = cmd_db_read_aux_data(aggr_vreg->resource_name, &len);
  1235. if (IS_ERR(buf)) {
  1236. aggr_vreg_err(aggr_vreg, "could not retrieve ARC aux data, rc=%ld\n",
  1237. PTR_ERR(buf));
  1238. return PTR_ERR(buf);
  1239. } else if (len == 0) {
  1240. aggr_vreg_err(aggr_vreg, "ARC level mapping data missing in command db\n");
  1241. return -EINVAL;
  1242. } else if (len > RPMH_ARC_MAX_LEVELS * RPMH_ARC_LEVEL_SIZE) {
  1243. aggr_vreg_err(aggr_vreg, "more ARC levels defined than allowed: %zd > %d\n",
  1244. len, RPMH_ARC_MAX_LEVELS * RPMH_ARC_LEVEL_SIZE);
  1245. return -EINVAL;
  1246. } else if (len % RPMH_ARC_LEVEL_SIZE) {
  1247. aggr_vreg_err(aggr_vreg, "invalid ARC aux data size: %zd\n",
  1248. len);
  1249. return -EINVAL;
  1250. }
  1251. aggr_vreg->level_count = len / RPMH_ARC_LEVEL_SIZE;
  1252. for (i = 0; i < aggr_vreg->level_count; i++) {
  1253. for (j = 0; j < RPMH_ARC_LEVEL_SIZE; j++)
  1254. aggr_vreg->level[i] |=
  1255. buf[i * RPMH_ARC_LEVEL_SIZE + j] << (8 * j);
  1256. /*
  1257. * The AUX data may be zero padded. These 0 valued entries at
  1258. * the end of the map must be ignored.
  1259. */
  1260. if (i > 0 && aggr_vreg->level[i] == 0) {
  1261. aggr_vreg->level_count = i;
  1262. break;
  1263. }
  1264. aggr_vreg_debug(aggr_vreg, "ARC hlvl=%2d --> vlvl=%4u\n",
  1265. i, aggr_vreg->level[i]);
  1266. }
  1267. return 0;
  1268. }
  1269. /**
  1270. * rpmh_regulator_parse_vrm_modes() - parse the supported mode configurations
  1271. * for a VRM RPMh resource from device tree
  1272. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  1273. *
  1274. * This function initializes the mode[] array of aggr_vreg based upon the values
  1275. * of optional device tree properties.
  1276. *
  1277. * Return: 0 on success, errno on failure
  1278. */
  1279. static int rpmh_regulator_parse_vrm_modes(struct rpmh_aggr_vreg *aggr_vreg)
  1280. {
  1281. struct device_node *node = aggr_vreg->dev->of_node;
  1282. const char *type = "";
  1283. const struct rpmh_regulator_mode *map;
  1284. const char *prop;
  1285. int i, len, rc;
  1286. u32 *buf, disable_mode;
  1287. aggr_vreg->regulator_hw_type = RPMH_REGULATOR_HW_TYPE_UNKNOWN;
  1288. aggr_vreg->disable_pmic_mode = -EINVAL;
  1289. /* qcom,regulator-type is optional */
  1290. prop = "qcom,regulator-type";
  1291. if (!of_find_property(node, prop, &len))
  1292. return 0;
  1293. rc = of_property_read_string(node, prop, &type);
  1294. if (rc) {
  1295. aggr_vreg_err(aggr_vreg, "unable to read %s, rc=%d\n",
  1296. prop, rc);
  1297. return rc;
  1298. }
  1299. if (!strcmp(type, "pmic4-ldo")) {
  1300. aggr_vreg->regulator_hw_type
  1301. = RPMH_REGULATOR_HW_TYPE_PMIC4_LDO;
  1302. } else if (!strcmp(type, "pmic4-hfsmps")) {
  1303. aggr_vreg->regulator_hw_type
  1304. = RPMH_REGULATOR_HW_TYPE_PMIC4_HFSMPS;
  1305. } else if (!strcmp(type, "pmic4-ftsmps")) {
  1306. aggr_vreg->regulator_hw_type
  1307. = RPMH_REGULATOR_HW_TYPE_PMIC4_FTSMPS;
  1308. } else if (!strcmp(type, "pmic4-bob")) {
  1309. aggr_vreg->regulator_hw_type
  1310. = RPMH_REGULATOR_HW_TYPE_PMIC4_BOB;
  1311. } else if (!strcmp(type, "pmic5-ldo")) {
  1312. aggr_vreg->regulator_hw_type
  1313. = RPMH_REGULATOR_HW_TYPE_PMIC5_LDO;
  1314. } else if (!strcmp(type, "pmic5-hfsmps")) {
  1315. aggr_vreg->regulator_hw_type
  1316. = RPMH_REGULATOR_HW_TYPE_PMIC5_HFSMPS;
  1317. } else if (!strcmp(type, "pmic5-ftsmps")) {
  1318. aggr_vreg->regulator_hw_type
  1319. = RPMH_REGULATOR_HW_TYPE_PMIC5_FTSMPS;
  1320. } else if (!strcmp(type, "pmic5-bob")) {
  1321. aggr_vreg->regulator_hw_type
  1322. = RPMH_REGULATOR_HW_TYPE_PMIC5_BOB;
  1323. } else {
  1324. aggr_vreg_err(aggr_vreg, "unknown %s = %s\n",
  1325. prop, type);
  1326. return -EINVAL;
  1327. }
  1328. map = rpmh_regulator_mode_map[aggr_vreg->regulator_hw_type];
  1329. prop = "qcom,disable-mode";
  1330. if (!of_property_read_u32(node, prop, &disable_mode)) {
  1331. if (disable_mode >= RPMH_REGULATOR_MODE_COUNT) {
  1332. aggr_vreg_err(aggr_vreg, "qcom,disable-mode value %u is invalid\n",
  1333. disable_mode);
  1334. return -EINVAL;
  1335. }
  1336. if (!map[disable_mode].framework_mode) {
  1337. aggr_vreg_err(aggr_vreg, "qcom,disable-mode value %u is invalid for regulator type = %s\n",
  1338. disable_mode, type);
  1339. return -EINVAL;
  1340. }
  1341. aggr_vreg->disable_pmic_mode = map[disable_mode].pmic_mode;
  1342. }
  1343. /* qcom,supported-modes is optional */
  1344. prop = "qcom,supported-modes";
  1345. if (!of_find_property(node, prop, &len))
  1346. return 0;
  1347. len /= sizeof(u32);
  1348. aggr_vreg->mode = devm_kcalloc(aggr_vreg->dev, len,
  1349. sizeof(*aggr_vreg->mode), GFP_KERNEL);
  1350. if (!aggr_vreg->mode)
  1351. return -ENOMEM;
  1352. aggr_vreg->mode_count = len;
  1353. buf = kcalloc(len, sizeof(*buf), GFP_KERNEL);
  1354. if (!buf)
  1355. return -ENOMEM;
  1356. rc = of_property_read_u32_array(node, prop, buf, len);
  1357. if (rc) {
  1358. aggr_vreg_err(aggr_vreg, "unable to read %s, rc=%d\n",
  1359. prop, rc);
  1360. goto done;
  1361. }
  1362. for (i = 0; i < len; i++) {
  1363. if (buf[i] >= RPMH_REGULATOR_MODE_COUNT) {
  1364. aggr_vreg_err(aggr_vreg, "element %d of %s = %u is invalid\n",
  1365. i, prop, buf[i]);
  1366. rc = -EINVAL;
  1367. goto done;
  1368. }
  1369. if (!map[buf[i]].framework_mode) {
  1370. aggr_vreg_err(aggr_vreg, "element %d of %s = %u is invalid for regulator type = %s\n",
  1371. i, prop, buf[i], type);
  1372. rc = -EINVAL;
  1373. goto done;
  1374. }
  1375. aggr_vreg->mode[i].pmic_mode = map[buf[i]].pmic_mode;
  1376. aggr_vreg->mode[i].framework_mode = map[buf[i]].framework_mode;
  1377. if (i > 0 && aggr_vreg->mode[i].pmic_mode
  1378. <= aggr_vreg->mode[i - 1].pmic_mode) {
  1379. aggr_vreg_err(aggr_vreg, "%s elements are not in ascending order\n",
  1380. prop);
  1381. rc = -EINVAL;
  1382. goto done;
  1383. }
  1384. }
  1385. prop = "qcom,mode-threshold-currents";
  1386. rc = of_property_read_u32_array(node, prop, buf, len);
  1387. if (rc) {
  1388. aggr_vreg_err(aggr_vreg, "unable to read %s, rc=%d\n",
  1389. prop, rc);
  1390. goto done;
  1391. }
  1392. for (i = 0; i < len; i++) {
  1393. aggr_vreg->mode[i].min_load_ua = buf[i];
  1394. if (i > 0 && aggr_vreg->mode[i].min_load_ua
  1395. <= aggr_vreg->mode[i - 1].min_load_ua) {
  1396. aggr_vreg_err(aggr_vreg, "%s elements are not in ascending order\n",
  1397. prop);
  1398. rc = -EINVAL;
  1399. goto done;
  1400. }
  1401. }
  1402. done:
  1403. kfree(buf);
  1404. return rc;
  1405. }
  1406. /**
  1407. * rpmh_regulator_allocate_vreg() - allocate space for the regulators associated
  1408. * with the RPMh regulator resource and initialize important
  1409. * pointers for each regulator
  1410. * @aggr_vreg: Pointer to the aggregated rpmh regulator resource
  1411. *
  1412. * Return: 0 on success, errno on failure
  1413. */
  1414. static int rpmh_regulator_allocate_vreg(struct rpmh_aggr_vreg *aggr_vreg)
  1415. {
  1416. struct device_node *node;
  1417. int i, rc;
  1418. aggr_vreg->vreg_count = 0;
  1419. for_each_available_child_of_node(aggr_vreg->dev->of_node, node) {
  1420. /* Skip child nodes handled by other drivers. */
  1421. if (of_find_property(node, "compatible", NULL))
  1422. continue;
  1423. aggr_vreg->vreg_count++;
  1424. }
  1425. if (aggr_vreg->vreg_count == 0) {
  1426. aggr_vreg_err(aggr_vreg, "could not find any regulator subnodes\n");
  1427. return -ENODEV;
  1428. }
  1429. aggr_vreg->vreg = devm_kcalloc(aggr_vreg->dev, aggr_vreg->vreg_count,
  1430. sizeof(*aggr_vreg->vreg), GFP_KERNEL);
  1431. if (!aggr_vreg->vreg)
  1432. return -ENOMEM;
  1433. i = 0;
  1434. for_each_available_child_of_node(aggr_vreg->dev->of_node, node) {
  1435. /* Skip child nodes handled by other drivers. */
  1436. if (of_find_property(node, "compatible", NULL))
  1437. continue;
  1438. aggr_vreg->vreg[i].of_node = node;
  1439. aggr_vreg->vreg[i].aggr_vreg = aggr_vreg;
  1440. rc = of_property_read_string(node, "regulator-name",
  1441. &aggr_vreg->vreg[i].rdesc.name);
  1442. if (rc) {
  1443. aggr_vreg_err(aggr_vreg, "could not read regulator-name property, rc=%d\n",
  1444. rc);
  1445. return rc;
  1446. }
  1447. i++;
  1448. }
  1449. return 0;
  1450. }
  1451. /**
  1452. * rpmh_regulator_load_default_parameters() - initialize the RPMh resource
  1453. * request for this regulator based on optional device tree
  1454. * properties
  1455. * @vreg: Pointer to the RPMh regulator
  1456. *
  1457. * Return: 0 on success, errno on failure
  1458. */
  1459. static int rpmh_regulator_load_default_parameters(struct rpmh_vreg *vreg)
  1460. {
  1461. enum rpmh_regulator_type type = vreg->aggr_vreg->regulator_type;
  1462. const struct rpmh_regulator_mode *map;
  1463. const char *prop;
  1464. int i, rc;
  1465. u32 temp;
  1466. if (type == RPMH_REGULATOR_TYPE_ARC) {
  1467. prop = "qcom,init-voltage-level";
  1468. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1469. if (!rc) {
  1470. for (i = 0; i < vreg->aggr_vreg->level_count; i++)
  1471. if (temp <= vreg->aggr_vreg->level[i])
  1472. break;
  1473. if (i < vreg->aggr_vreg->level_count) {
  1474. rpmh_regulator_set_reg(vreg,
  1475. RPMH_REGULATOR_REG_ARC_LEVEL, i);
  1476. } else {
  1477. vreg_err(vreg, "%s=%u is invalid\n",
  1478. prop, temp);
  1479. return -EINVAL;
  1480. }
  1481. }
  1482. prop = "qcom,min-dropout-voltage-level";
  1483. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1484. if (!rc)
  1485. vreg->rdesc.min_dropout_uV = temp;
  1486. } else if (type == RPMH_REGULATOR_TYPE_VRM) {
  1487. prop = "qcom,init-enable";
  1488. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1489. if (!rc)
  1490. rpmh_regulator_set_reg(vreg,
  1491. RPMH_REGULATOR_REG_VRM_ENABLE,
  1492. !!temp);
  1493. prop = "qcom,init-voltage";
  1494. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1495. if (!rc) {
  1496. if (temp < RPMH_VRM_MIN_UV || temp > RPMH_VRM_MAX_UV) {
  1497. vreg_err(vreg, "%s=%u is invalid\n",
  1498. prop, temp);
  1499. return -EINVAL;
  1500. }
  1501. rpmh_regulator_set_reg(vreg,
  1502. RPMH_REGULATOR_REG_VRM_VOLTAGE,
  1503. temp / 1000);
  1504. }
  1505. prop = "qcom,init-mode";
  1506. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1507. if (!rc) {
  1508. if (temp >= RPMH_REGULATOR_MODE_COUNT) {
  1509. vreg_err(vreg, "%s=%u is invalid\n",
  1510. prop, temp);
  1511. return -EINVAL;
  1512. } else if (vreg->aggr_vreg->regulator_hw_type
  1513. == RPMH_REGULATOR_HW_TYPE_UNKNOWN) {
  1514. vreg_err(vreg, "qcom,regulator-type missing so %s cannot be used\n",
  1515. prop);
  1516. return -EINVAL;
  1517. }
  1518. map = rpmh_regulator_mode_map[
  1519. vreg->aggr_vreg->regulator_hw_type];
  1520. if (!map[temp].framework_mode) {
  1521. vreg_err(vreg, "%s=%u is not supported by type = %d\n",
  1522. prop, temp,
  1523. vreg->aggr_vreg->regulator_hw_type);
  1524. return -EINVAL;
  1525. }
  1526. rpmh_regulator_set_reg(vreg,
  1527. RPMH_REGULATOR_REG_VRM_MODE,
  1528. map[temp].pmic_mode);
  1529. for (i = 0; i < vreg->aggr_vreg->mode_count; i++) {
  1530. if (vreg->aggr_vreg->mode[i].pmic_mode
  1531. == map[temp].pmic_mode) {
  1532. vreg->mode_index = i;
  1533. break;
  1534. }
  1535. }
  1536. }
  1537. prop = "qcom,init-headroom-voltage";
  1538. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1539. if (!rc) {
  1540. if (temp < RPMH_VRM_HEADROOM_MIN_UV ||
  1541. temp > RPMH_VRM_HEADROOM_MAX_UV) {
  1542. vreg_err(vreg, "%s=%u is invalid\n",
  1543. prop, temp);
  1544. return -EINVAL;
  1545. }
  1546. rpmh_regulator_set_reg(vreg,
  1547. RPMH_REGULATOR_REG_VRM_HEADROOM,
  1548. temp / 1000);
  1549. }
  1550. prop = "qcom,min-dropout-voltage";
  1551. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1552. if (!rc)
  1553. vreg->rdesc.min_dropout_uV = temp;
  1554. } else if (type == RPMH_REGULATOR_TYPE_XOB) {
  1555. prop = "qcom,init-enable";
  1556. rc = of_property_read_u32(vreg->of_node, prop, &temp);
  1557. if (!rc)
  1558. rpmh_regulator_set_reg(vreg,
  1559. RPMH_REGULATOR_REG_XOB_ENABLE,
  1560. !!temp);
  1561. }
  1562. return 0;
  1563. }
  1564. /**
  1565. * rpmh_regulator_init_vreg_supply() - initialize the regulator's parent supply
  1566. * mapping based on optional DT parent supply property
  1567. * @vreg: Pointer to the RPMh regulator
  1568. *
  1569. * Return: 0 on success, errno on failure
  1570. */
  1571. static int rpmh_regulator_init_vreg_supply(struct rpmh_vreg *vreg)
  1572. {
  1573. char *buf;
  1574. size_t len;
  1575. len = strlen(vreg->rdesc.name) + 16;
  1576. buf = kzalloc(len, GFP_KERNEL);
  1577. if (!buf)
  1578. return -ENOMEM;
  1579. scnprintf(buf, len, "%s-parent-supply", vreg->rdesc.name);
  1580. if (of_find_property(vreg->aggr_vreg->dev->of_node, buf, NULL) ||
  1581. of_find_property(vreg->of_node, buf, NULL)) {
  1582. kfree(buf);
  1583. len = strlen(vreg->rdesc.name) + 10;
  1584. buf = devm_kzalloc(vreg->aggr_vreg->dev, len, GFP_KERNEL);
  1585. if (!buf)
  1586. return -ENOMEM;
  1587. scnprintf(buf, len, "%s-parent", vreg->rdesc.name);
  1588. vreg->rdesc.supply_name = buf;
  1589. } else if (of_find_property(vreg->of_node, "vin-supply", NULL)) {
  1590. kfree(buf);
  1591. vreg->rdesc.supply_name = "vin";
  1592. } else {
  1593. kfree(buf);
  1594. }
  1595. return 0;
  1596. }
  1597. /**
  1598. * rpmh_regulator_init_vreg() - initialize all abbributes of an rpmh-regulator
  1599. * @vreg: Pointer to the RPMh regulator
  1600. *
  1601. * Return: 0 on success, errno on failure
  1602. */
  1603. static int rpmh_regulator_init_vreg(struct rpmh_vreg *vreg)
  1604. {
  1605. struct device *dev = vreg->aggr_vreg->dev;
  1606. enum rpmh_regulator_type type = vreg->aggr_vreg->regulator_type;
  1607. struct regulator_config reg_config = {};
  1608. struct regulator_init_data *init_data;
  1609. struct regulator_ops *ops;
  1610. int rc, i;
  1611. u32 set;
  1612. ops = devm_kzalloc(dev, sizeof(*ops), GFP_KERNEL);
  1613. if (!ops)
  1614. return -ENOMEM;
  1615. *ops = *rpmh_regulator_ops[type];
  1616. vreg->rdesc.owner = THIS_MODULE;
  1617. vreg->rdesc.type = REGULATOR_VOLTAGE;
  1618. vreg->rdesc.ops = ops;
  1619. init_data = of_get_regulator_init_data(dev,
  1620. vreg->of_node, &vreg->rdesc);
  1621. if (init_data == NULL)
  1622. return -ENOMEM;
  1623. init_data->constraints.input_uV = init_data->constraints.max_uV;
  1624. if (type == RPMH_REGULATOR_TYPE_VRM) {
  1625. init_data->constraints.min_uV
  1626. = max(init_data->constraints.min_uV, RPMH_VRM_MIN_UV);
  1627. init_data->constraints.min_uV
  1628. = min(init_data->constraints.min_uV, RPMH_VRM_MAX_UV);
  1629. init_data->constraints.max_uV
  1630. = max(init_data->constraints.max_uV, RPMH_VRM_MIN_UV);
  1631. init_data->constraints.max_uV
  1632. = min(init_data->constraints.max_uV, RPMH_VRM_MAX_UV);
  1633. }
  1634. if (ops->set_voltage || ops->set_voltage_sel)
  1635. init_data->constraints.valid_ops_mask
  1636. |= REGULATOR_CHANGE_VOLTAGE;
  1637. if (type == RPMH_REGULATOR_TYPE_XOB
  1638. && init_data->constraints.min_uV == init_data->constraints.max_uV)
  1639. vreg->rdesc.fixed_uV = init_data->constraints.min_uV;
  1640. if (vreg->aggr_vreg->mode_count) {
  1641. init_data->constraints.valid_ops_mask
  1642. |= REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_DRMS;
  1643. for (i = 0; i < vreg->aggr_vreg->mode_count; i++)
  1644. init_data->constraints.valid_modes_mask
  1645. |= vreg->aggr_vreg->mode[i].framework_mode;
  1646. } else {
  1647. ops->get_mode = NULL;
  1648. ops->set_mode = NULL;
  1649. ops->set_load = NULL;
  1650. }
  1651. /*
  1652. * Remove enable state control if the ARC resource does not support the
  1653. * off level.
  1654. */
  1655. if (type == RPMH_REGULATOR_TYPE_ARC
  1656. && vreg->aggr_vreg->level[0] != RPMH_REGULATOR_LEVEL_OFF) {
  1657. ops->enable = NULL;
  1658. ops->disable = NULL;
  1659. ops->is_enabled = NULL;
  1660. }
  1661. if (ops->enable)
  1662. init_data->constraints.valid_ops_mask
  1663. |= REGULATOR_CHANGE_STATUS;
  1664. switch (type) {
  1665. case RPMH_REGULATOR_TYPE_VRM:
  1666. vreg->rdesc.n_voltages = 2;
  1667. break;
  1668. case RPMH_REGULATOR_TYPE_ARC:
  1669. vreg->rdesc.n_voltages = vreg->aggr_vreg->level_count;
  1670. break;
  1671. case RPMH_REGULATOR_TYPE_XOB:
  1672. vreg->rdesc.n_voltages = 1;
  1673. break;
  1674. default:
  1675. return -EINVAL;
  1676. }
  1677. rc = of_property_read_u32(vreg->of_node, "qcom,set", &set);
  1678. if (rc) {
  1679. vreg_err(vreg, "qcom,set property missing, rc=%d\n", rc);
  1680. return rc;
  1681. } else if (!(set & RPMH_REGULATOR_SET_ALL)) {
  1682. vreg_err(vreg, "qcom,set=%u property is invalid\n", set);
  1683. return rc;
  1684. }
  1685. vreg->set_active = !!(set & RPMH_REGULATOR_SET_ACTIVE);
  1686. vreg->set_sleep = !!(set & RPMH_REGULATOR_SET_SLEEP);
  1687. rc = rpmh_regulator_init_vreg_supply(vreg);
  1688. if (rc) {
  1689. vreg_err(vreg, "unable to initialize regulator supply name, rc=%d\n",
  1690. rc);
  1691. return rc;
  1692. }
  1693. reg_config.dev = dev;
  1694. reg_config.init_data = init_data;
  1695. reg_config.of_node = vreg->of_node;
  1696. reg_config.driver_data = vreg;
  1697. rc = rpmh_regulator_load_default_parameters(vreg);
  1698. if (rc) {
  1699. vreg_err(vreg, "unable to load default parameters, rc=%d\n",
  1700. rc);
  1701. return rc;
  1702. }
  1703. vreg->rdev = devm_regulator_register(dev, &vreg->rdesc, &reg_config);
  1704. if (IS_ERR(vreg->rdev)) {
  1705. rc = PTR_ERR(vreg->rdev);
  1706. vreg->rdev = NULL;
  1707. vreg_err(vreg, "devm_regulator_register() failed, rc=%d\n", rc);
  1708. return rc;
  1709. }
  1710. rc = devm_regulator_proxy_consumer_register(dev, vreg->of_node);
  1711. if (rc)
  1712. vreg_err(vreg, "failed to register proxy consumer, rc=%d\n",
  1713. rc);
  1714. rc = devm_regulator_debug_register(dev, vreg->rdev);
  1715. if (rc)
  1716. vreg_err(vreg, "failed to register debug regulator, rc=%d\n",
  1717. rc);
  1718. vreg_debug(vreg, "successfully registered; set=%s\n",
  1719. vreg->set_active && vreg->set_sleep
  1720. ? "active + sleep"
  1721. : vreg->set_active ? "active" : "sleep");
  1722. return 0;
  1723. }
  1724. static const struct of_device_id rpmh_regulator_match_table[] = {
  1725. {
  1726. .compatible = "qcom,rpmh-vrm-regulator",
  1727. .data = (void *)(uintptr_t)RPMH_REGULATOR_TYPE_VRM,
  1728. },
  1729. {
  1730. .compatible = "qcom,rpmh-arc-regulator",
  1731. .data = (void *)(uintptr_t)RPMH_REGULATOR_TYPE_ARC,
  1732. },
  1733. {
  1734. .compatible = "qcom,rpmh-xob-regulator",
  1735. .data = (void *)(uintptr_t)RPMH_REGULATOR_TYPE_XOB,
  1736. },
  1737. {}
  1738. };
  1739. /**
  1740. * rpmh_regulator_probe() - probe an aggregated RPMh regulator resource and
  1741. * register regulators for each of the regulator nodes associated
  1742. * with it
  1743. * @pdev: Pointer to the platform device of the aggregated rpmh
  1744. * regulator resource
  1745. *
  1746. * Return: 0 on success, errno on failure
  1747. */
  1748. static int rpmh_regulator_probe(struct platform_device *pdev)
  1749. {
  1750. struct device *dev = &pdev->dev;
  1751. const struct of_device_id *match;
  1752. struct rpmh_aggr_vreg *aggr_vreg;
  1753. struct device_node *node;
  1754. int rc, i, sid;
  1755. node = dev->of_node;
  1756. if (!node) {
  1757. dev_err(dev, "Device tree node is missing\n");
  1758. return -EINVAL;
  1759. }
  1760. aggr_vreg = devm_kzalloc(dev, sizeof(*aggr_vreg), GFP_KERNEL);
  1761. if (!aggr_vreg)
  1762. return -ENOMEM;
  1763. aggr_vreg->dev = dev;
  1764. mutex_init(&aggr_vreg->lock);
  1765. match = of_match_node(rpmh_regulator_match_table, node);
  1766. if (match) {
  1767. aggr_vreg->regulator_type = (uintptr_t)match->data;
  1768. } else {
  1769. dev_err(dev, "could not find compatible string match\n");
  1770. return -ENODEV;
  1771. }
  1772. rc = of_property_read_string(node, "qcom,resource-name",
  1773. &aggr_vreg->resource_name);
  1774. if (rc) {
  1775. dev_err(dev, "qcom,resource-name missing in DT node\n");
  1776. return rc;
  1777. }
  1778. aggr_vreg->addr = cmd_db_read_addr(aggr_vreg->resource_name);
  1779. if (!aggr_vreg->addr) {
  1780. aggr_vreg_err(aggr_vreg, "could not find RPMh address for resource\n");
  1781. return -ENODEV;
  1782. }
  1783. sid = cmd_db_read_slave_id(aggr_vreg->resource_name);
  1784. if (sid < 0) {
  1785. aggr_vreg_err(aggr_vreg, "could not find RPMh slave id for resource, rc=%d\n",
  1786. sid);
  1787. return sid;
  1788. }
  1789. /* Confirm slave ID listed in command DB matches DT configuration. */
  1790. if ((aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_ARC
  1791. && sid != CMD_DB_HW_ARC)
  1792. || (aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_VRM
  1793. && sid != CMD_DB_HW_VRM)
  1794. || (aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_XOB
  1795. && sid != CMD_DB_HW_XOB)) {
  1796. aggr_vreg_err(aggr_vreg, "RPMh slave ID mismatch; config=%d (%s) != cmd-db=%d\n",
  1797. aggr_vreg->regulator_type,
  1798. aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_ARC
  1799. ? "ARC" : (aggr_vreg->regulator_type
  1800. == RPMH_REGULATOR_TYPE_VRM
  1801. ? "VRM" : "XOB"),
  1802. sid);
  1803. return -EINVAL;
  1804. }
  1805. if (aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_ARC) {
  1806. rc = rpmh_regulator_load_arc_level_mapping(aggr_vreg);
  1807. if (rc) {
  1808. aggr_vreg_err(aggr_vreg, "could not load arc level mapping, rc=%d\n",
  1809. rc);
  1810. return rc;
  1811. }
  1812. } else if (aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_VRM) {
  1813. rc = rpmh_regulator_parse_vrm_modes(aggr_vreg);
  1814. if (rc) {
  1815. aggr_vreg_err(aggr_vreg, "could not parse vrm mode mapping, rc=%d\n",
  1816. rc);
  1817. return rc;
  1818. }
  1819. }
  1820. aggr_vreg->always_wait_for_ack
  1821. = of_property_read_bool(node, "qcom,always-wait-for-ack");
  1822. rc = rpmh_regulator_allocate_vreg(aggr_vreg);
  1823. if (rc) {
  1824. aggr_vreg_err(aggr_vreg, "failed to allocate regulator subnode array, rc=%d\n",
  1825. rc);
  1826. return rc;
  1827. }
  1828. for (i = 0; i < aggr_vreg->vreg_count; i++) {
  1829. rc = rpmh_regulator_init_vreg(&aggr_vreg->vreg[i]);
  1830. if (rc) {
  1831. pr_err("unable to initialize rpmh-regulator vreg %s for resource %s, rc=%d\n",
  1832. aggr_vreg->vreg[i].rdesc.name,
  1833. aggr_vreg->resource_name, rc);
  1834. return rc;
  1835. }
  1836. }
  1837. if (of_property_read_bool(node, "qcom,send-defaults")) {
  1838. mutex_lock(&aggr_vreg->lock);
  1839. rc = rpmh_regulator_send_aggregate_requests(
  1840. &aggr_vreg->vreg[0]);
  1841. if (rc) {
  1842. aggr_vreg_err(aggr_vreg, "error while sending default request, rc=%d\n",
  1843. rc);
  1844. mutex_unlock(&aggr_vreg->lock);
  1845. return rc;
  1846. }
  1847. mutex_unlock(&aggr_vreg->lock);
  1848. }
  1849. of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
  1850. platform_set_drvdata(pdev, aggr_vreg);
  1851. aggr_vreg_debug(aggr_vreg, "successfully probed; addr=0x%05X, type=%s\n",
  1852. aggr_vreg->addr,
  1853. aggr_vreg->regulator_type == RPMH_REGULATOR_TYPE_ARC
  1854. ? "ARC"
  1855. : (aggr_vreg->regulator_type
  1856. == RPMH_REGULATOR_TYPE_VRM
  1857. ? "VRM" : "XOB"));
  1858. return rc;
  1859. }
  1860. static struct platform_driver rpmh_regulator_driver = {
  1861. .driver = {
  1862. .name = "qcom,rpmh-regulator",
  1863. .of_match_table = rpmh_regulator_match_table,
  1864. .sync_state = regulator_proxy_consumer_sync_state,
  1865. },
  1866. .probe = rpmh_regulator_probe,
  1867. };
  1868. static int rpmh_regulator_init(void)
  1869. {
  1870. rpmh_reg_ipc_log = ipc_log_context_create(IPC_LOG_PAGES, "rpmh_regulator", 0);
  1871. return platform_driver_register(&rpmh_regulator_driver);
  1872. }
  1873. static void rpmh_regulator_exit(void)
  1874. {
  1875. if (rpmh_reg_ipc_log)
  1876. ipc_log_context_destroy(rpmh_reg_ipc_log);
  1877. platform_driver_unregister(&rpmh_regulator_driver);
  1878. }
  1879. MODULE_DESCRIPTION("RPMh regulator driver");
  1880. MODULE_LICENSE("GPL v2");
  1881. arch_initcall(rpmh_regulator_init);
  1882. module_exit(rpmh_regulator_exit);