axp20x-regulator.c 63 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754
  1. /*
  2. * AXP20x regulators driver.
  3. *
  4. * Copyright (C) 2013 Carlo Caione <carlo@caione.org>
  5. *
  6. * This file is subject to the terms and conditions of the GNU General
  7. * Public License. See the file "COPYING" in the main directory of this
  8. * archive for more details.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <linux/bitops.h>
  16. #include <linux/delay.h>
  17. #include <linux/err.h>
  18. #include <linux/init.h>
  19. #include <linux/mfd/axp20x.h>
  20. #include <linux/module.h>
  21. #include <linux/of.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/regmap.h>
  24. #include <linux/regulator/driver.h>
  25. #include <linux/regulator/machine.h>
  26. #include <linux/regulator/of_regulator.h>
  27. #define AXP20X_GPIO0_FUNC_MASK GENMASK(3, 0)
  28. #define AXP20X_GPIO1_FUNC_MASK GENMASK(3, 0)
  29. #define AXP20X_IO_ENABLED 0x03
  30. #define AXP20X_IO_DISABLED 0x07
  31. #define AXP20X_WORKMODE_DCDC2_MASK BIT_MASK(2)
  32. #define AXP20X_WORKMODE_DCDC3_MASK BIT_MASK(1)
  33. #define AXP20X_FREQ_DCDC_MASK GENMASK(3, 0)
  34. #define AXP20X_VBUS_IPSOUT_MGMT_MASK BIT_MASK(2)
  35. #define AXP20X_DCDC2_V_OUT_MASK GENMASK(5, 0)
  36. #define AXP20X_DCDC3_V_OUT_MASK GENMASK(7, 0)
  37. #define AXP20X_LDO2_V_OUT_MASK GENMASK(7, 4)
  38. #define AXP20X_LDO3_V_OUT_MASK GENMASK(6, 0)
  39. #define AXP20X_LDO4_V_OUT_MASK GENMASK(3, 0)
  40. #define AXP20X_LDO5_V_OUT_MASK GENMASK(7, 4)
  41. #define AXP20X_PWR_OUT_EXTEN_MASK BIT_MASK(0)
  42. #define AXP20X_PWR_OUT_DCDC3_MASK BIT_MASK(1)
  43. #define AXP20X_PWR_OUT_LDO2_MASK BIT_MASK(2)
  44. #define AXP20X_PWR_OUT_LDO4_MASK BIT_MASK(3)
  45. #define AXP20X_PWR_OUT_DCDC2_MASK BIT_MASK(4)
  46. #define AXP20X_PWR_OUT_LDO3_MASK BIT_MASK(6)
  47. #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK BIT_MASK(0)
  48. #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(x) \
  49. ((x) << 0)
  50. #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK BIT_MASK(1)
  51. #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(x) \
  52. ((x) << 1)
  53. #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK BIT_MASK(2)
  54. #define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN BIT(2)
  55. #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK BIT_MASK(3)
  56. #define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN BIT(3)
  57. #define AXP20X_LDO4_V_OUT_1250mV_START 0x0
  58. #define AXP20X_LDO4_V_OUT_1250mV_STEPS 0
  59. #define AXP20X_LDO4_V_OUT_1250mV_END \
  60. (AXP20X_LDO4_V_OUT_1250mV_START + AXP20X_LDO4_V_OUT_1250mV_STEPS)
  61. #define AXP20X_LDO4_V_OUT_1300mV_START 0x1
  62. #define AXP20X_LDO4_V_OUT_1300mV_STEPS 7
  63. #define AXP20X_LDO4_V_OUT_1300mV_END \
  64. (AXP20X_LDO4_V_OUT_1300mV_START + AXP20X_LDO4_V_OUT_1300mV_STEPS)
  65. #define AXP20X_LDO4_V_OUT_2500mV_START 0x9
  66. #define AXP20X_LDO4_V_OUT_2500mV_STEPS 0
  67. #define AXP20X_LDO4_V_OUT_2500mV_END \
  68. (AXP20X_LDO4_V_OUT_2500mV_START + AXP20X_LDO4_V_OUT_2500mV_STEPS)
  69. #define AXP20X_LDO4_V_OUT_2700mV_START 0xa
  70. #define AXP20X_LDO4_V_OUT_2700mV_STEPS 1
  71. #define AXP20X_LDO4_V_OUT_2700mV_END \
  72. (AXP20X_LDO4_V_OUT_2700mV_START + AXP20X_LDO4_V_OUT_2700mV_STEPS)
  73. #define AXP20X_LDO4_V_OUT_3000mV_START 0xc
  74. #define AXP20X_LDO4_V_OUT_3000mV_STEPS 3
  75. #define AXP20X_LDO4_V_OUT_3000mV_END \
  76. (AXP20X_LDO4_V_OUT_3000mV_START + AXP20X_LDO4_V_OUT_3000mV_STEPS)
  77. #define AXP20X_LDO4_V_OUT_NUM_VOLTAGES 16
  78. #define AXP22X_IO_ENABLED 0x03
  79. #define AXP22X_IO_DISABLED 0x04
  80. #define AXP22X_WORKMODE_DCDCX_MASK(x) BIT_MASK(x)
  81. #define AXP22X_MISC_N_VBUSEN_FUNC BIT(4)
  82. #define AXP22X_DCDC1_V_OUT_MASK GENMASK(4, 0)
  83. #define AXP22X_DCDC2_V_OUT_MASK GENMASK(5, 0)
  84. #define AXP22X_DCDC3_V_OUT_MASK GENMASK(5, 0)
  85. #define AXP22X_DCDC4_V_OUT_MASK GENMASK(5, 0)
  86. #define AXP22X_DCDC5_V_OUT_MASK GENMASK(4, 0)
  87. #define AXP22X_DC5LDO_V_OUT_MASK GENMASK(2, 0)
  88. #define AXP22X_ALDO1_V_OUT_MASK GENMASK(4, 0)
  89. #define AXP22X_ALDO2_V_OUT_MASK GENMASK(4, 0)
  90. #define AXP22X_ALDO3_V_OUT_MASK GENMASK(4, 0)
  91. #define AXP22X_DLDO1_V_OUT_MASK GENMASK(4, 0)
  92. #define AXP22X_DLDO2_V_OUT_MASK GENMASK(4, 0)
  93. #define AXP22X_DLDO3_V_OUT_MASK GENMASK(4, 0)
  94. #define AXP22X_DLDO4_V_OUT_MASK GENMASK(4, 0)
  95. #define AXP22X_ELDO1_V_OUT_MASK GENMASK(4, 0)
  96. #define AXP22X_ELDO2_V_OUT_MASK GENMASK(4, 0)
  97. #define AXP22X_ELDO3_V_OUT_MASK GENMASK(4, 0)
  98. #define AXP22X_LDO_IO0_V_OUT_MASK GENMASK(4, 0)
  99. #define AXP22X_LDO_IO1_V_OUT_MASK GENMASK(4, 0)
  100. #define AXP22X_PWR_OUT_DC5LDO_MASK BIT_MASK(0)
  101. #define AXP22X_PWR_OUT_DCDC1_MASK BIT_MASK(1)
  102. #define AXP22X_PWR_OUT_DCDC2_MASK BIT_MASK(2)
  103. #define AXP22X_PWR_OUT_DCDC3_MASK BIT_MASK(3)
  104. #define AXP22X_PWR_OUT_DCDC4_MASK BIT_MASK(4)
  105. #define AXP22X_PWR_OUT_DCDC5_MASK BIT_MASK(5)
  106. #define AXP22X_PWR_OUT_ALDO1_MASK BIT_MASK(6)
  107. #define AXP22X_PWR_OUT_ALDO2_MASK BIT_MASK(7)
  108. #define AXP22X_PWR_OUT_SW_MASK BIT_MASK(6)
  109. #define AXP22X_PWR_OUT_DC1SW_MASK BIT_MASK(7)
  110. #define AXP22X_PWR_OUT_ELDO1_MASK BIT_MASK(0)
  111. #define AXP22X_PWR_OUT_ELDO2_MASK BIT_MASK(1)
  112. #define AXP22X_PWR_OUT_ELDO3_MASK BIT_MASK(2)
  113. #define AXP22X_PWR_OUT_DLDO1_MASK BIT_MASK(3)
  114. #define AXP22X_PWR_OUT_DLDO2_MASK BIT_MASK(4)
  115. #define AXP22X_PWR_OUT_DLDO3_MASK BIT_MASK(5)
  116. #define AXP22X_PWR_OUT_DLDO4_MASK BIT_MASK(6)
  117. #define AXP22X_PWR_OUT_ALDO3_MASK BIT_MASK(7)
  118. #define AXP313A_DCDC1_NUM_VOLTAGES 107
  119. #define AXP313A_DCDC23_NUM_VOLTAGES 88
  120. #define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0)
  121. #define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0)
  122. #define AXP717_DCDC1_NUM_VOLTAGES 88
  123. #define AXP717_DCDC2_NUM_VOLTAGES 107
  124. #define AXP717_DCDC3_NUM_VOLTAGES 103
  125. #define AXP717_DCDC_V_OUT_MASK GENMASK(6, 0)
  126. #define AXP717_LDO_V_OUT_MASK GENMASK(4, 0)
  127. #define AXP717_BOOST_V_OUT_MASK GENMASK(7, 4)
  128. #define AXP803_PWR_OUT_DCDC1_MASK BIT_MASK(0)
  129. #define AXP803_PWR_OUT_DCDC2_MASK BIT_MASK(1)
  130. #define AXP803_PWR_OUT_DCDC3_MASK BIT_MASK(2)
  131. #define AXP803_PWR_OUT_DCDC4_MASK BIT_MASK(3)
  132. #define AXP803_PWR_OUT_DCDC5_MASK BIT_MASK(4)
  133. #define AXP803_PWR_OUT_DCDC6_MASK BIT_MASK(5)
  134. #define AXP803_PWR_OUT_FLDO1_MASK BIT_MASK(2)
  135. #define AXP803_PWR_OUT_FLDO2_MASK BIT_MASK(3)
  136. #define AXP803_DCDC1_V_OUT_MASK GENMASK(4, 0)
  137. #define AXP803_DCDC2_V_OUT_MASK GENMASK(6, 0)
  138. #define AXP803_DCDC3_V_OUT_MASK GENMASK(6, 0)
  139. #define AXP803_DCDC4_V_OUT_MASK GENMASK(6, 0)
  140. #define AXP803_DCDC5_V_OUT_MASK GENMASK(6, 0)
  141. #define AXP803_DCDC6_V_OUT_MASK GENMASK(6, 0)
  142. #define AXP803_FLDO1_V_OUT_MASK GENMASK(3, 0)
  143. #define AXP803_FLDO2_V_OUT_MASK GENMASK(3, 0)
  144. #define AXP803_DCDC23_POLYPHASE_DUAL BIT(6)
  145. #define AXP803_DCDC56_POLYPHASE_DUAL BIT(5)
  146. #define AXP803_DCDC234_500mV_START 0x00
  147. #define AXP803_DCDC234_500mV_STEPS 70
  148. #define AXP803_DCDC234_500mV_END \
  149. (AXP803_DCDC234_500mV_START + AXP803_DCDC234_500mV_STEPS)
  150. #define AXP803_DCDC234_1220mV_START 0x47
  151. #define AXP803_DCDC234_1220mV_STEPS 4
  152. #define AXP803_DCDC234_1220mV_END \
  153. (AXP803_DCDC234_1220mV_START + AXP803_DCDC234_1220mV_STEPS)
  154. #define AXP803_DCDC234_NUM_VOLTAGES 76
  155. #define AXP803_DCDC5_800mV_START 0x00
  156. #define AXP803_DCDC5_800mV_STEPS 32
  157. #define AXP803_DCDC5_800mV_END \
  158. (AXP803_DCDC5_800mV_START + AXP803_DCDC5_800mV_STEPS)
  159. #define AXP803_DCDC5_1140mV_START 0x21
  160. #define AXP803_DCDC5_1140mV_STEPS 35
  161. #define AXP803_DCDC5_1140mV_END \
  162. (AXP803_DCDC5_1140mV_START + AXP803_DCDC5_1140mV_STEPS)
  163. #define AXP803_DCDC5_NUM_VOLTAGES 69
  164. #define AXP803_DCDC6_600mV_START 0x00
  165. #define AXP803_DCDC6_600mV_STEPS 50
  166. #define AXP803_DCDC6_600mV_END \
  167. (AXP803_DCDC6_600mV_START + AXP803_DCDC6_600mV_STEPS)
  168. #define AXP803_DCDC6_1120mV_START 0x33
  169. #define AXP803_DCDC6_1120mV_STEPS 20
  170. #define AXP803_DCDC6_1120mV_END \
  171. (AXP803_DCDC6_1120mV_START + AXP803_DCDC6_1120mV_STEPS)
  172. #define AXP803_DCDC6_NUM_VOLTAGES 72
  173. #define AXP803_DLDO2_700mV_START 0x00
  174. #define AXP803_DLDO2_700mV_STEPS 26
  175. #define AXP803_DLDO2_700mV_END \
  176. (AXP803_DLDO2_700mV_START + AXP803_DLDO2_700mV_STEPS)
  177. #define AXP803_DLDO2_3400mV_START 0x1b
  178. #define AXP803_DLDO2_3400mV_STEPS 4
  179. #define AXP803_DLDO2_3400mV_END \
  180. (AXP803_DLDO2_3400mV_START + AXP803_DLDO2_3400mV_STEPS)
  181. #define AXP803_DLDO2_NUM_VOLTAGES 32
  182. #define AXP806_DCDCA_V_CTRL_MASK GENMASK(6, 0)
  183. #define AXP806_DCDCB_V_CTRL_MASK GENMASK(4, 0)
  184. #define AXP806_DCDCC_V_CTRL_MASK GENMASK(6, 0)
  185. #define AXP806_DCDCD_V_CTRL_MASK GENMASK(5, 0)
  186. #define AXP806_DCDCE_V_CTRL_MASK GENMASK(4, 0)
  187. #define AXP806_ALDO1_V_CTRL_MASK GENMASK(4, 0)
  188. #define AXP806_ALDO2_V_CTRL_MASK GENMASK(4, 0)
  189. #define AXP806_ALDO3_V_CTRL_MASK GENMASK(4, 0)
  190. #define AXP806_BLDO1_V_CTRL_MASK GENMASK(3, 0)
  191. #define AXP806_BLDO2_V_CTRL_MASK GENMASK(3, 0)
  192. #define AXP806_BLDO3_V_CTRL_MASK GENMASK(3, 0)
  193. #define AXP806_BLDO4_V_CTRL_MASK GENMASK(3, 0)
  194. #define AXP806_CLDO1_V_CTRL_MASK GENMASK(4, 0)
  195. #define AXP806_CLDO2_V_CTRL_MASK GENMASK(4, 0)
  196. #define AXP806_CLDO3_V_CTRL_MASK GENMASK(4, 0)
  197. #define AXP806_PWR_OUT_DCDCA_MASK BIT_MASK(0)
  198. #define AXP806_PWR_OUT_DCDCB_MASK BIT_MASK(1)
  199. #define AXP806_PWR_OUT_DCDCC_MASK BIT_MASK(2)
  200. #define AXP806_PWR_OUT_DCDCD_MASK BIT_MASK(3)
  201. #define AXP806_PWR_OUT_DCDCE_MASK BIT_MASK(4)
  202. #define AXP806_PWR_OUT_ALDO1_MASK BIT_MASK(5)
  203. #define AXP806_PWR_OUT_ALDO2_MASK BIT_MASK(6)
  204. #define AXP806_PWR_OUT_ALDO3_MASK BIT_MASK(7)
  205. #define AXP806_PWR_OUT_BLDO1_MASK BIT_MASK(0)
  206. #define AXP806_PWR_OUT_BLDO2_MASK BIT_MASK(1)
  207. #define AXP806_PWR_OUT_BLDO3_MASK BIT_MASK(2)
  208. #define AXP806_PWR_OUT_BLDO4_MASK BIT_MASK(3)
  209. #define AXP806_PWR_OUT_CLDO1_MASK BIT_MASK(4)
  210. #define AXP806_PWR_OUT_CLDO2_MASK BIT_MASK(5)
  211. #define AXP806_PWR_OUT_CLDO3_MASK BIT_MASK(6)
  212. #define AXP806_PWR_OUT_SW_MASK BIT_MASK(7)
  213. #define AXP806_DCDCAB_POLYPHASE_DUAL 0x40
  214. #define AXP806_DCDCABC_POLYPHASE_TRI 0x80
  215. #define AXP806_DCDCABC_POLYPHASE_MASK GENMASK(7, 6)
  216. #define AXP806_DCDCDE_POLYPHASE_DUAL BIT(5)
  217. #define AXP806_DCDCA_600mV_START 0x00
  218. #define AXP806_DCDCA_600mV_STEPS 50
  219. #define AXP806_DCDCA_600mV_END \
  220. (AXP806_DCDCA_600mV_START + AXP806_DCDCA_600mV_STEPS)
  221. #define AXP806_DCDCA_1120mV_START 0x33
  222. #define AXP806_DCDCA_1120mV_STEPS 20
  223. #define AXP806_DCDCA_1120mV_END \
  224. (AXP806_DCDCA_1120mV_START + AXP806_DCDCA_1120mV_STEPS)
  225. #define AXP806_DCDCA_NUM_VOLTAGES 72
  226. #define AXP806_DCDCD_600mV_START 0x00
  227. #define AXP806_DCDCD_600mV_STEPS 45
  228. #define AXP806_DCDCD_600mV_END \
  229. (AXP806_DCDCD_600mV_START + AXP806_DCDCD_600mV_STEPS)
  230. #define AXP806_DCDCD_1600mV_START 0x2e
  231. #define AXP806_DCDCD_1600mV_STEPS 17
  232. #define AXP806_DCDCD_1600mV_END \
  233. (AXP806_DCDCD_1600mV_START + AXP806_DCDCD_1600mV_STEPS)
  234. #define AXP806_DCDCD_NUM_VOLTAGES 64
  235. #define AXP809_DCDC4_600mV_START 0x00
  236. #define AXP809_DCDC4_600mV_STEPS 47
  237. #define AXP809_DCDC4_600mV_END \
  238. (AXP809_DCDC4_600mV_START + AXP809_DCDC4_600mV_STEPS)
  239. #define AXP809_DCDC4_1800mV_START 0x30
  240. #define AXP809_DCDC4_1800mV_STEPS 8
  241. #define AXP809_DCDC4_1800mV_END \
  242. (AXP809_DCDC4_1800mV_START + AXP809_DCDC4_1800mV_STEPS)
  243. #define AXP809_DCDC4_NUM_VOLTAGES 57
  244. #define AXP813_DCDC7_V_OUT_MASK GENMASK(6, 0)
  245. #define AXP813_PWR_OUT_DCDC7_MASK BIT_MASK(6)
  246. #define AXP15060_DCDC1_V_CTRL_MASK GENMASK(4, 0)
  247. #define AXP15060_DCDC2_V_CTRL_MASK GENMASK(6, 0)
  248. #define AXP15060_DCDC3_V_CTRL_MASK GENMASK(6, 0)
  249. #define AXP15060_DCDC4_V_CTRL_MASK GENMASK(6, 0)
  250. #define AXP15060_DCDC5_V_CTRL_MASK GENMASK(6, 0)
  251. #define AXP15060_DCDC6_V_CTRL_MASK GENMASK(4, 0)
  252. #define AXP15060_ALDO1_V_CTRL_MASK GENMASK(4, 0)
  253. #define AXP15060_ALDO2_V_CTRL_MASK GENMASK(4, 0)
  254. #define AXP15060_ALDO3_V_CTRL_MASK GENMASK(4, 0)
  255. #define AXP15060_ALDO4_V_CTRL_MASK GENMASK(4, 0)
  256. #define AXP15060_ALDO5_V_CTRL_MASK GENMASK(4, 0)
  257. #define AXP15060_BLDO1_V_CTRL_MASK GENMASK(4, 0)
  258. #define AXP15060_BLDO2_V_CTRL_MASK GENMASK(4, 0)
  259. #define AXP15060_BLDO3_V_CTRL_MASK GENMASK(4, 0)
  260. #define AXP15060_BLDO4_V_CTRL_MASK GENMASK(4, 0)
  261. #define AXP15060_BLDO5_V_CTRL_MASK GENMASK(4, 0)
  262. #define AXP15060_CLDO1_V_CTRL_MASK GENMASK(4, 0)
  263. #define AXP15060_CLDO2_V_CTRL_MASK GENMASK(4, 0)
  264. #define AXP15060_CLDO3_V_CTRL_MASK GENMASK(4, 0)
  265. #define AXP15060_CLDO4_V_CTRL_MASK GENMASK(5, 0)
  266. #define AXP15060_CPUSLDO_V_CTRL_MASK GENMASK(3, 0)
  267. #define AXP15060_PWR_OUT_DCDC1_MASK BIT_MASK(0)
  268. #define AXP15060_PWR_OUT_DCDC2_MASK BIT_MASK(1)
  269. #define AXP15060_PWR_OUT_DCDC3_MASK BIT_MASK(2)
  270. #define AXP15060_PWR_OUT_DCDC4_MASK BIT_MASK(3)
  271. #define AXP15060_PWR_OUT_DCDC5_MASK BIT_MASK(4)
  272. #define AXP15060_PWR_OUT_DCDC6_MASK BIT_MASK(5)
  273. #define AXP15060_PWR_OUT_ALDO1_MASK BIT_MASK(0)
  274. #define AXP15060_PWR_OUT_ALDO2_MASK BIT_MASK(1)
  275. #define AXP15060_PWR_OUT_ALDO3_MASK BIT_MASK(2)
  276. #define AXP15060_PWR_OUT_ALDO4_MASK BIT_MASK(3)
  277. #define AXP15060_PWR_OUT_ALDO5_MASK BIT_MASK(4)
  278. #define AXP15060_PWR_OUT_BLDO1_MASK BIT_MASK(5)
  279. #define AXP15060_PWR_OUT_BLDO2_MASK BIT_MASK(6)
  280. #define AXP15060_PWR_OUT_BLDO3_MASK BIT_MASK(7)
  281. #define AXP15060_PWR_OUT_BLDO4_MASK BIT_MASK(0)
  282. #define AXP15060_PWR_OUT_BLDO5_MASK BIT_MASK(1)
  283. #define AXP15060_PWR_OUT_CLDO1_MASK BIT_MASK(2)
  284. #define AXP15060_PWR_OUT_CLDO2_MASK BIT_MASK(3)
  285. #define AXP15060_PWR_OUT_CLDO3_MASK BIT_MASK(4)
  286. #define AXP15060_PWR_OUT_CLDO4_MASK BIT_MASK(5)
  287. #define AXP15060_PWR_OUT_CPUSLDO_MASK BIT_MASK(6)
  288. #define AXP15060_PWR_OUT_SW_MASK BIT_MASK(7)
  289. #define AXP15060_DCDC23_POLYPHASE_DUAL_MASK BIT_MASK(6)
  290. #define AXP15060_DCDC46_POLYPHASE_DUAL_MASK BIT_MASK(7)
  291. #define AXP15060_DCDC234_500mV_START 0x00
  292. #define AXP15060_DCDC234_500mV_STEPS 70
  293. #define AXP15060_DCDC234_500mV_END \
  294. (AXP15060_DCDC234_500mV_START + AXP15060_DCDC234_500mV_STEPS)
  295. #define AXP15060_DCDC234_1220mV_START 0x47
  296. #define AXP15060_DCDC234_1220mV_STEPS 16
  297. #define AXP15060_DCDC234_1220mV_END \
  298. (AXP15060_DCDC234_1220mV_START + AXP15060_DCDC234_1220mV_STEPS)
  299. #define AXP15060_DCDC234_NUM_VOLTAGES 88
  300. #define AXP15060_DCDC5_800mV_START 0x00
  301. #define AXP15060_DCDC5_800mV_STEPS 32
  302. #define AXP15060_DCDC5_800mV_END \
  303. (AXP15060_DCDC5_800mV_START + AXP15060_DCDC5_800mV_STEPS)
  304. #define AXP15060_DCDC5_1140mV_START 0x21
  305. #define AXP15060_DCDC5_1140mV_STEPS 35
  306. #define AXP15060_DCDC5_1140mV_END \
  307. (AXP15060_DCDC5_1140mV_START + AXP15060_DCDC5_1140mV_STEPS)
  308. #define AXP15060_DCDC5_NUM_VOLTAGES 69
  309. #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg, \
  310. _vmask, _ereg, _emask, _enable_val, _disable_val) \
  311. [_family##_##_id] = { \
  312. .name = (_match), \
  313. .supply_name = (_supply), \
  314. .of_match = of_match_ptr(_match), \
  315. .regulators_node = of_match_ptr("regulators"), \
  316. .type = REGULATOR_VOLTAGE, \
  317. .id = _family##_##_id, \
  318. .n_voltages = (((_max) - (_min)) / (_step) + 1), \
  319. .owner = THIS_MODULE, \
  320. .min_uV = (_min) * 1000, \
  321. .uV_step = (_step) * 1000, \
  322. .vsel_reg = (_vreg), \
  323. .vsel_mask = (_vmask), \
  324. .enable_reg = (_ereg), \
  325. .enable_mask = (_emask), \
  326. .enable_val = (_enable_val), \
  327. .disable_val = (_disable_val), \
  328. .ops = &axp20x_ops, \
  329. }
  330. #define AXP_DESC_DELAY(_family, _id, _match, _supply, _min, _max, _step, _vreg, \
  331. _vmask, _ereg, _emask, _ramp_delay) \
  332. [_family##_##_id] = { \
  333. .name = (_match), \
  334. .supply_name = (_supply), \
  335. .of_match = of_match_ptr(_match), \
  336. .regulators_node = of_match_ptr("regulators"), \
  337. .type = REGULATOR_VOLTAGE, \
  338. .id = _family##_##_id, \
  339. .n_voltages = (((_max) - (_min)) / (_step) + 1), \
  340. .owner = THIS_MODULE, \
  341. .min_uV = (_min) * 1000, \
  342. .uV_step = (_step) * 1000, \
  343. .vsel_reg = (_vreg), \
  344. .vsel_mask = (_vmask), \
  345. .enable_reg = (_ereg), \
  346. .enable_mask = (_emask), \
  347. .ramp_delay = (_ramp_delay), \
  348. .ops = &axp20x_ops, \
  349. }
  350. #define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg, \
  351. _vmask, _ereg, _emask) \
  352. AXP_DESC_DELAY(_family, _id, _match, _supply, _min, _max, _step, _vreg, \
  353. _vmask, _ereg, _emask, 0)
  354. #define AXP_DESC_SW(_family, _id, _match, _supply, _ereg, _emask) \
  355. [_family##_##_id] = { \
  356. .name = (_match), \
  357. .supply_name = (_supply), \
  358. .of_match = of_match_ptr(_match), \
  359. .regulators_node = of_match_ptr("regulators"), \
  360. .type = REGULATOR_VOLTAGE, \
  361. .id = _family##_##_id, \
  362. .owner = THIS_MODULE, \
  363. .enable_reg = (_ereg), \
  364. .enable_mask = (_emask), \
  365. .ops = &axp20x_ops_sw, \
  366. }
  367. #define AXP_DESC_FIXED(_family, _id, _match, _supply, _volt) \
  368. [_family##_##_id] = { \
  369. .name = (_match), \
  370. .supply_name = (_supply), \
  371. .of_match = of_match_ptr(_match), \
  372. .regulators_node = of_match_ptr("regulators"), \
  373. .type = REGULATOR_VOLTAGE, \
  374. .id = _family##_##_id, \
  375. .n_voltages = 1, \
  376. .owner = THIS_MODULE, \
  377. .min_uV = (_volt) * 1000, \
  378. .ops = &axp20x_ops_fixed \
  379. }
  380. #define AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, _n_voltages, \
  381. _vreg, _vmask, _ereg, _emask, _ramp_delay) \
  382. [_family##_##_id] = { \
  383. .name = (_match), \
  384. .supply_name = (_supply), \
  385. .of_match = of_match_ptr(_match), \
  386. .regulators_node = of_match_ptr("regulators"), \
  387. .type = REGULATOR_VOLTAGE, \
  388. .id = _family##_##_id, \
  389. .n_voltages = (_n_voltages), \
  390. .owner = THIS_MODULE, \
  391. .vsel_reg = (_vreg), \
  392. .vsel_mask = (_vmask), \
  393. .enable_reg = (_ereg), \
  394. .enable_mask = (_emask), \
  395. .linear_ranges = (_ranges), \
  396. .n_linear_ranges = ARRAY_SIZE(_ranges), \
  397. .ramp_delay = (_ramp_delay), \
  398. .ops = &axp20x_ops_range, \
  399. }
  400. #define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltages, \
  401. _vreg, _vmask, _ereg, _emask) \
  402. AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, \
  403. _n_voltages, _vreg, _vmask, _ereg, _emask, 0)
  404. static const int axp209_dcdc2_ldo3_slew_rates[] = {
  405. 1600,
  406. 800,
  407. };
  408. static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp)
  409. {
  410. struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
  411. int id = rdev_get_id(rdev);
  412. u8 reg, mask, enable, cfg = 0xff;
  413. const int *slew_rates;
  414. int rate_count = 0;
  415. switch (axp20x->variant) {
  416. case AXP209_ID:
  417. if (id == AXP20X_DCDC2) {
  418. slew_rates = axp209_dcdc2_ldo3_slew_rates;
  419. rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
  420. reg = AXP20X_DCDC2_LDO3_V_RAMP;
  421. mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK |
  422. AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK;
  423. enable = (ramp > 0) ?
  424. AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN : 0;
  425. break;
  426. }
  427. if (id == AXP20X_LDO3) {
  428. slew_rates = axp209_dcdc2_ldo3_slew_rates;
  429. rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates);
  430. reg = AXP20X_DCDC2_LDO3_V_RAMP;
  431. mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK |
  432. AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK;
  433. enable = (ramp > 0) ?
  434. AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN : 0;
  435. break;
  436. }
  437. if (rate_count > 0)
  438. break;
  439. fallthrough;
  440. default:
  441. /* Not supported for this regulator */
  442. return -ENOTSUPP;
  443. }
  444. if (ramp == 0) {
  445. cfg = enable;
  446. } else {
  447. int i;
  448. for (i = 0; i < rate_count; i++) {
  449. if (ramp > slew_rates[i])
  450. break;
  451. if (id == AXP20X_DCDC2)
  452. cfg = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(i);
  453. else
  454. cfg = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(i);
  455. }
  456. if (cfg == 0xff) {
  457. dev_err(axp20x->dev, "unsupported ramp value %d", ramp);
  458. return -EINVAL;
  459. }
  460. cfg |= enable;
  461. }
  462. return regmap_update_bits(axp20x->regmap, reg, mask, cfg);
  463. }
  464. static int axp20x_regulator_enable_regmap(struct regulator_dev *rdev)
  465. {
  466. struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
  467. int id = rdev_get_id(rdev);
  468. switch (axp20x->variant) {
  469. case AXP209_ID:
  470. if ((id == AXP20X_LDO3) &&
  471. rdev->constraints && rdev->constraints->soft_start) {
  472. int v_out;
  473. int ret;
  474. /*
  475. * On some boards, the LDO3 can be overloaded when
  476. * turning on, causing the entire PMIC to shutdown
  477. * without warning. Turning it on at the minimal voltage
  478. * and then setting the voltage to the requested value
  479. * works reliably.
  480. */
  481. if (regulator_is_enabled_regmap(rdev))
  482. break;
  483. v_out = regulator_get_voltage_sel_regmap(rdev);
  484. if (v_out < 0)
  485. return v_out;
  486. if (v_out == 0)
  487. break;
  488. ret = regulator_set_voltage_sel_regmap(rdev, 0x00);
  489. /*
  490. * A small pause is needed between
  491. * setting the voltage and enabling the LDO to give the
  492. * internal state machine time to process the request.
  493. */
  494. usleep_range(1000, 5000);
  495. ret |= regulator_enable_regmap(rdev);
  496. ret |= regulator_set_voltage_sel_regmap(rdev, v_out);
  497. return ret;
  498. }
  499. break;
  500. default:
  501. /* No quirks */
  502. break;
  503. }
  504. return regulator_enable_regmap(rdev);
  505. };
  506. static const struct regulator_ops axp20x_ops_fixed = {
  507. .list_voltage = regulator_list_voltage_linear,
  508. };
  509. static const struct regulator_ops axp20x_ops_range = {
  510. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  511. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  512. .list_voltage = regulator_list_voltage_linear_range,
  513. .enable = regulator_enable_regmap,
  514. .disable = regulator_disable_regmap,
  515. .is_enabled = regulator_is_enabled_regmap,
  516. };
  517. static const struct regulator_ops axp20x_ops = {
  518. .set_voltage_sel = regulator_set_voltage_sel_regmap,
  519. .get_voltage_sel = regulator_get_voltage_sel_regmap,
  520. .list_voltage = regulator_list_voltage_linear,
  521. .enable = axp20x_regulator_enable_regmap,
  522. .disable = regulator_disable_regmap,
  523. .is_enabled = regulator_is_enabled_regmap,
  524. .set_ramp_delay = axp20x_set_ramp_delay,
  525. };
  526. static const struct regulator_ops axp20x_ops_sw = {
  527. .enable = regulator_enable_regmap,
  528. .disable = regulator_disable_regmap,
  529. .is_enabled = regulator_is_enabled_regmap,
  530. };
  531. static const struct linear_range axp20x_ldo4_ranges[] = {
  532. REGULATOR_LINEAR_RANGE(1250000,
  533. AXP20X_LDO4_V_OUT_1250mV_START,
  534. AXP20X_LDO4_V_OUT_1250mV_END,
  535. 0),
  536. REGULATOR_LINEAR_RANGE(1300000,
  537. AXP20X_LDO4_V_OUT_1300mV_START,
  538. AXP20X_LDO4_V_OUT_1300mV_END,
  539. 100000),
  540. REGULATOR_LINEAR_RANGE(2500000,
  541. AXP20X_LDO4_V_OUT_2500mV_START,
  542. AXP20X_LDO4_V_OUT_2500mV_END,
  543. 0),
  544. REGULATOR_LINEAR_RANGE(2700000,
  545. AXP20X_LDO4_V_OUT_2700mV_START,
  546. AXP20X_LDO4_V_OUT_2700mV_END,
  547. 100000),
  548. REGULATOR_LINEAR_RANGE(3000000,
  549. AXP20X_LDO4_V_OUT_3000mV_START,
  550. AXP20X_LDO4_V_OUT_3000mV_END,
  551. 100000),
  552. };
  553. static const struct regulator_desc axp20x_regulators[] = {
  554. AXP_DESC(AXP20X, DCDC2, "dcdc2", "vin2", 700, 2275, 25,
  555. AXP20X_DCDC2_V_OUT, AXP20X_DCDC2_V_OUT_MASK,
  556. AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC2_MASK),
  557. AXP_DESC(AXP20X, DCDC3, "dcdc3", "vin3", 700, 3500, 25,
  558. AXP20X_DCDC3_V_OUT, AXP20X_DCDC3_V_OUT_MASK,
  559. AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC3_MASK),
  560. AXP_DESC_FIXED(AXP20X, LDO1, "ldo1", "acin", 1300),
  561. AXP_DESC(AXP20X, LDO2, "ldo2", "ldo24in", 1800, 3300, 100,
  562. AXP20X_LDO24_V_OUT, AXP20X_LDO2_V_OUT_MASK,
  563. AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO2_MASK),
  564. AXP_DESC(AXP20X, LDO3, "ldo3", "ldo3in", 700, 3500, 25,
  565. AXP20X_LDO3_V_OUT, AXP20X_LDO3_V_OUT_MASK,
  566. AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO3_MASK),
  567. AXP_DESC_RANGES(AXP20X, LDO4, "ldo4", "ldo24in",
  568. axp20x_ldo4_ranges, AXP20X_LDO4_V_OUT_NUM_VOLTAGES,
  569. AXP20X_LDO24_V_OUT, AXP20X_LDO4_V_OUT_MASK,
  570. AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_LDO4_MASK),
  571. AXP_DESC_IO(AXP20X, LDO5, "ldo5", "ldo5in", 1800, 3300, 100,
  572. AXP20X_LDO5_V_OUT, AXP20X_LDO5_V_OUT_MASK,
  573. AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
  574. AXP20X_IO_ENABLED, AXP20X_IO_DISABLED),
  575. };
  576. static const struct regulator_desc axp22x_regulators[] = {
  577. AXP_DESC(AXP22X, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
  578. AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
  579. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
  580. AXP_DESC(AXP22X, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
  581. AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
  582. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
  583. AXP_DESC(AXP22X, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
  584. AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
  585. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
  586. AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20,
  587. AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
  588. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
  589. AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
  590. AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
  591. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
  592. /* secondary switchable output of DCDC1 */
  593. AXP_DESC_SW(AXP22X, DC1SW, "dc1sw", NULL,
  594. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
  595. /* LDO regulator internally chained to DCDC5 */
  596. AXP_DESC(AXP22X, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
  597. AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
  598. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
  599. AXP_DESC(AXP22X, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  600. AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  601. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
  602. AXP_DESC(AXP22X, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
  603. AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  604. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
  605. AXP_DESC(AXP22X, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  606. AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  607. AXP22X_PWR_OUT_CTRL3, AXP22X_PWR_OUT_ALDO3_MASK),
  608. AXP_DESC(AXP22X, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
  609. AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  610. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  611. AXP_DESC(AXP22X, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
  612. AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
  613. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
  614. AXP_DESC(AXP22X, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
  615. AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  616. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
  617. AXP_DESC(AXP22X, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
  618. AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  619. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
  620. AXP_DESC(AXP22X, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
  621. AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  622. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
  623. AXP_DESC(AXP22X, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
  624. AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  625. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
  626. AXP_DESC(AXP22X, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
  627. AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  628. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
  629. /* Note the datasheet only guarantees reliable operation up to
  630. * 3.3V, this needs to be enforced via dts provided constraints */
  631. AXP_DESC_IO(AXP22X, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
  632. AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  633. AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
  634. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  635. /* Note the datasheet only guarantees reliable operation up to
  636. * 3.3V, this needs to be enforced via dts provided constraints */
  637. AXP_DESC_IO(AXP22X, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
  638. AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  639. AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
  640. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  641. AXP_DESC_FIXED(AXP22X, RTC_LDO, "rtc_ldo", "ips", 3000),
  642. };
  643. static const struct regulator_desc axp22x_drivevbus_regulator = {
  644. .name = "drivevbus",
  645. .supply_name = "drivevbus",
  646. .of_match = of_match_ptr("drivevbus"),
  647. .regulators_node = of_match_ptr("regulators"),
  648. .type = REGULATOR_VOLTAGE,
  649. .owner = THIS_MODULE,
  650. .enable_reg = AXP20X_VBUS_IPSOUT_MGMT,
  651. .enable_mask = AXP20X_VBUS_IPSOUT_MGMT_MASK,
  652. .ops = &axp20x_ops_sw,
  653. };
  654. static const struct linear_range axp313a_dcdc1_ranges[] = {
  655. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  656. REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
  657. REGULATOR_LINEAR_RANGE(1600000, 88, 106, 100000),
  658. };
  659. static const struct linear_range axp313a_dcdc2_ranges[] = {
  660. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  661. REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
  662. };
  663. /*
  664. * This is deviating from the datasheet. The values here are taken from the
  665. * BSP driver and have been confirmed by measurements.
  666. */
  667. static const struct linear_range axp313a_dcdc3_ranges[] = {
  668. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  669. REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000),
  670. };
  671. static const struct regulator_desc axp313a_regulators[] = {
  672. AXP_DESC_RANGES(AXP313A, DCDC1, "dcdc1", "vin1",
  673. axp313a_dcdc1_ranges, AXP313A_DCDC1_NUM_VOLTAGES,
  674. AXP313A_DCDC1_CONTROL, AXP313A_DCDC_V_OUT_MASK,
  675. AXP313A_OUTPUT_CONTROL, BIT(0)),
  676. AXP_DESC_RANGES(AXP313A, DCDC2, "dcdc2", "vin2",
  677. axp313a_dcdc2_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
  678. AXP313A_DCDC2_CONTROL, AXP313A_DCDC_V_OUT_MASK,
  679. AXP313A_OUTPUT_CONTROL, BIT(1)),
  680. AXP_DESC_RANGES(AXP313A, DCDC3, "dcdc3", "vin3",
  681. axp313a_dcdc3_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
  682. AXP313A_DCDC3_CONTROL, AXP313A_DCDC_V_OUT_MASK,
  683. AXP313A_OUTPUT_CONTROL, BIT(2)),
  684. AXP_DESC(AXP313A, ALDO1, "aldo1", "vin1", 500, 3500, 100,
  685. AXP313A_ALDO1_CONTROL, AXP313A_LDO_V_OUT_MASK,
  686. AXP313A_OUTPUT_CONTROL, BIT(3)),
  687. AXP_DESC(AXP313A, DLDO1, "dldo1", "vin1", 500, 3500, 100,
  688. AXP313A_DLDO1_CONTROL, AXP313A_LDO_V_OUT_MASK,
  689. AXP313A_OUTPUT_CONTROL, BIT(4)),
  690. AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800),
  691. };
  692. static const struct linear_range axp717_dcdc1_ranges[] = {
  693. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  694. REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
  695. };
  696. /*
  697. * The manual says that the last voltage is 3.4V, encoded as 0b1101011 (107),
  698. * but every other method proves that this is wrong, so it's really 106 that
  699. * programs the final 3.4V.
  700. */
  701. static const struct linear_range axp717_dcdc2_ranges[] = {
  702. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  703. REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
  704. REGULATOR_LINEAR_RANGE(1600000, 88, 106, 100000),
  705. };
  706. static const struct linear_range axp717_dcdc3_ranges[] = {
  707. REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
  708. REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000),
  709. };
  710. static const struct regulator_desc axp717_regulators[] = {
  711. AXP_DESC_RANGES_DELAY(AXP717, DCDC1, "dcdc1", "vin1",
  712. axp717_dcdc1_ranges, AXP717_DCDC1_NUM_VOLTAGES,
  713. AXP717_DCDC1_CONTROL, AXP717_DCDC_V_OUT_MASK,
  714. AXP717_DCDC_OUTPUT_CONTROL, BIT(0), 640),
  715. AXP_DESC_RANGES_DELAY(AXP717, DCDC2, "dcdc2", "vin2",
  716. axp717_dcdc2_ranges, AXP717_DCDC2_NUM_VOLTAGES,
  717. AXP717_DCDC2_CONTROL, AXP717_DCDC_V_OUT_MASK,
  718. AXP717_DCDC_OUTPUT_CONTROL, BIT(1), 640),
  719. AXP_DESC_RANGES_DELAY(AXP717, DCDC3, "dcdc3", "vin3",
  720. axp717_dcdc3_ranges, AXP717_DCDC3_NUM_VOLTAGES,
  721. AXP717_DCDC3_CONTROL, AXP717_DCDC_V_OUT_MASK,
  722. AXP717_DCDC_OUTPUT_CONTROL, BIT(2), 640),
  723. AXP_DESC_DELAY(AXP717, DCDC4, "dcdc4", "vin4", 1000, 3700, 100,
  724. AXP717_DCDC4_CONTROL, AXP717_DCDC_V_OUT_MASK,
  725. AXP717_DCDC_OUTPUT_CONTROL, BIT(3), 6400),
  726. AXP_DESC(AXP717, ALDO1, "aldo1", "aldoin", 500, 3500, 100,
  727. AXP717_ALDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
  728. AXP717_LDO0_OUTPUT_CONTROL, BIT(0)),
  729. AXP_DESC(AXP717, ALDO2, "aldo2", "aldoin", 500, 3500, 100,
  730. AXP717_ALDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
  731. AXP717_LDO0_OUTPUT_CONTROL, BIT(1)),
  732. AXP_DESC(AXP717, ALDO3, "aldo3", "aldoin", 500, 3500, 100,
  733. AXP717_ALDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
  734. AXP717_LDO0_OUTPUT_CONTROL, BIT(2)),
  735. AXP_DESC(AXP717, ALDO4, "aldo4", "aldoin", 500, 3500, 100,
  736. AXP717_ALDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
  737. AXP717_LDO0_OUTPUT_CONTROL, BIT(3)),
  738. AXP_DESC(AXP717, BLDO1, "bldo1", "bldoin", 500, 3500, 100,
  739. AXP717_BLDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
  740. AXP717_LDO0_OUTPUT_CONTROL, BIT(4)),
  741. AXP_DESC(AXP717, BLDO2, "bldo2", "bldoin", 500, 3500, 100,
  742. AXP717_BLDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
  743. AXP717_LDO0_OUTPUT_CONTROL, BIT(5)),
  744. AXP_DESC(AXP717, BLDO3, "bldo3", "bldoin", 500, 3500, 100,
  745. AXP717_BLDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
  746. AXP717_LDO0_OUTPUT_CONTROL, BIT(6)),
  747. AXP_DESC(AXP717, BLDO4, "bldo4", "bldoin", 500, 3500, 100,
  748. AXP717_BLDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
  749. AXP717_LDO0_OUTPUT_CONTROL, BIT(7)),
  750. AXP_DESC(AXP717, CLDO1, "cldo1", "cldoin", 500, 3500, 100,
  751. AXP717_CLDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
  752. AXP717_LDO1_OUTPUT_CONTROL, BIT(0)),
  753. AXP_DESC(AXP717, CLDO2, "cldo2", "cldoin", 500, 3500, 100,
  754. AXP717_CLDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
  755. AXP717_LDO1_OUTPUT_CONTROL, BIT(1)),
  756. AXP_DESC(AXP717, CLDO3, "cldo3", "cldoin", 500, 3500, 100,
  757. AXP717_CLDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
  758. AXP717_LDO1_OUTPUT_CONTROL, BIT(2)),
  759. AXP_DESC(AXP717, CLDO4, "cldo4", "cldoin", 500, 3500, 100,
  760. AXP717_CLDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
  761. AXP717_LDO1_OUTPUT_CONTROL, BIT(3)),
  762. AXP_DESC(AXP717, CPUSLDO, "cpusldo", "vin1", 500, 1400, 50,
  763. AXP717_CPUSLDO_CONTROL, AXP717_LDO_V_OUT_MASK,
  764. AXP717_LDO1_OUTPUT_CONTROL, BIT(4)),
  765. AXP_DESC(AXP717, BOOST, "boost", "vin1", 4550, 5510, 64,
  766. AXP717_BOOST_CONTROL, AXP717_BOOST_V_OUT_MASK,
  767. AXP717_MODULE_EN_CONTROL_2, BIT(4)),
  768. };
  769. /* DCDC ranges shared with AXP813 */
  770. static const struct linear_range axp803_dcdc234_ranges[] = {
  771. REGULATOR_LINEAR_RANGE(500000,
  772. AXP803_DCDC234_500mV_START,
  773. AXP803_DCDC234_500mV_END,
  774. 10000),
  775. REGULATOR_LINEAR_RANGE(1220000,
  776. AXP803_DCDC234_1220mV_START,
  777. AXP803_DCDC234_1220mV_END,
  778. 20000),
  779. };
  780. static const struct linear_range axp803_dcdc5_ranges[] = {
  781. REGULATOR_LINEAR_RANGE(800000,
  782. AXP803_DCDC5_800mV_START,
  783. AXP803_DCDC5_800mV_END,
  784. 10000),
  785. REGULATOR_LINEAR_RANGE(1140000,
  786. AXP803_DCDC5_1140mV_START,
  787. AXP803_DCDC5_1140mV_END,
  788. 20000),
  789. };
  790. static const struct linear_range axp803_dcdc6_ranges[] = {
  791. REGULATOR_LINEAR_RANGE(600000,
  792. AXP803_DCDC6_600mV_START,
  793. AXP803_DCDC6_600mV_END,
  794. 10000),
  795. REGULATOR_LINEAR_RANGE(1120000,
  796. AXP803_DCDC6_1120mV_START,
  797. AXP803_DCDC6_1120mV_END,
  798. 20000),
  799. };
  800. /* AXP806's CLDO2 and AXP809's DLDO1 share the same range */
  801. static const struct linear_range axp803_dldo2_ranges[] = {
  802. REGULATOR_LINEAR_RANGE(700000,
  803. AXP803_DLDO2_700mV_START,
  804. AXP803_DLDO2_700mV_END,
  805. 100000),
  806. REGULATOR_LINEAR_RANGE(3400000,
  807. AXP803_DLDO2_3400mV_START,
  808. AXP803_DLDO2_3400mV_END,
  809. 200000),
  810. };
  811. static const struct regulator_desc axp803_regulators[] = {
  812. AXP_DESC(AXP803, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
  813. AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
  814. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
  815. AXP_DESC_RANGES(AXP803, DCDC2, "dcdc2", "vin2",
  816. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  817. AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
  818. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
  819. AXP_DESC_RANGES(AXP803, DCDC3, "dcdc3", "vin3",
  820. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  821. AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
  822. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
  823. AXP_DESC_RANGES(AXP803, DCDC4, "dcdc4", "vin4",
  824. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  825. AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
  826. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
  827. AXP_DESC_RANGES(AXP803, DCDC5, "dcdc5", "vin5",
  828. axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
  829. AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
  830. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
  831. AXP_DESC_RANGES(AXP803, DCDC6, "dcdc6", "vin6",
  832. axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  833. AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
  834. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
  835. /* secondary switchable output of DCDC1 */
  836. AXP_DESC_SW(AXP803, DC1SW, "dc1sw", NULL,
  837. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
  838. AXP_DESC(AXP803, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  839. AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  840. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
  841. AXP_DESC(AXP803, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
  842. AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  843. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
  844. AXP_DESC(AXP803, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  845. AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  846. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
  847. AXP_DESC(AXP803, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
  848. AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  849. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  850. AXP_DESC_RANGES(AXP803, DLDO2, "dldo2", "dldoin",
  851. axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  852. AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
  853. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
  854. AXP_DESC(AXP803, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
  855. AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  856. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
  857. AXP_DESC(AXP803, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
  858. AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  859. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
  860. AXP_DESC(AXP803, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
  861. AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  862. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
  863. AXP_DESC(AXP803, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
  864. AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  865. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
  866. AXP_DESC(AXP803, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
  867. AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  868. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
  869. AXP_DESC(AXP803, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
  870. AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
  871. AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
  872. AXP_DESC(AXP803, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
  873. AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
  874. AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
  875. AXP_DESC_IO(AXP803, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
  876. AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  877. AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
  878. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  879. AXP_DESC_IO(AXP803, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
  880. AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  881. AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
  882. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  883. AXP_DESC_FIXED(AXP803, RTC_LDO, "rtc-ldo", "ips", 3000),
  884. };
  885. static const struct linear_range axp806_dcdca_ranges[] = {
  886. REGULATOR_LINEAR_RANGE(600000,
  887. AXP806_DCDCA_600mV_START,
  888. AXP806_DCDCA_600mV_END,
  889. 10000),
  890. REGULATOR_LINEAR_RANGE(1120000,
  891. AXP806_DCDCA_1120mV_START,
  892. AXP806_DCDCA_1120mV_END,
  893. 20000),
  894. };
  895. static const struct linear_range axp806_dcdcd_ranges[] = {
  896. REGULATOR_LINEAR_RANGE(600000,
  897. AXP806_DCDCD_600mV_START,
  898. AXP806_DCDCD_600mV_END,
  899. 20000),
  900. REGULATOR_LINEAR_RANGE(1600000,
  901. AXP806_DCDCD_1600mV_START,
  902. AXP806_DCDCD_1600mV_END,
  903. 100000),
  904. };
  905. static const struct regulator_desc axp806_regulators[] = {
  906. AXP_DESC_RANGES(AXP806, DCDCA, "dcdca", "vina",
  907. axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
  908. AXP806_DCDCA_V_CTRL, AXP806_DCDCA_V_CTRL_MASK,
  909. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCA_MASK),
  910. AXP_DESC(AXP806, DCDCB, "dcdcb", "vinb", 1000, 2550, 50,
  911. AXP806_DCDCB_V_CTRL, AXP806_DCDCB_V_CTRL_MASK,
  912. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCB_MASK),
  913. AXP_DESC_RANGES(AXP806, DCDCC, "dcdcc", "vinc",
  914. axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES,
  915. AXP806_DCDCC_V_CTRL, AXP806_DCDCC_V_CTRL_MASK,
  916. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCC_MASK),
  917. AXP_DESC_RANGES(AXP806, DCDCD, "dcdcd", "vind",
  918. axp806_dcdcd_ranges, AXP806_DCDCD_NUM_VOLTAGES,
  919. AXP806_DCDCD_V_CTRL, AXP806_DCDCD_V_CTRL_MASK,
  920. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCD_MASK),
  921. AXP_DESC(AXP806, DCDCE, "dcdce", "vine", 1100, 3400, 100,
  922. AXP806_DCDCE_V_CTRL, AXP806_DCDCE_V_CTRL_MASK,
  923. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCE_MASK),
  924. AXP_DESC(AXP806, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  925. AXP806_ALDO1_V_CTRL, AXP806_ALDO1_V_CTRL_MASK,
  926. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO1_MASK),
  927. AXP_DESC(AXP806, ALDO2, "aldo2", "aldoin", 700, 3400, 100,
  928. AXP806_ALDO2_V_CTRL, AXP806_ALDO2_V_CTRL_MASK,
  929. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO2_MASK),
  930. AXP_DESC(AXP806, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  931. AXP806_ALDO3_V_CTRL, AXP806_ALDO3_V_CTRL_MASK,
  932. AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_ALDO3_MASK),
  933. AXP_DESC(AXP806, BLDO1, "bldo1", "bldoin", 700, 1900, 100,
  934. AXP806_BLDO1_V_CTRL, AXP806_BLDO1_V_CTRL_MASK,
  935. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO1_MASK),
  936. AXP_DESC(AXP806, BLDO2, "bldo2", "bldoin", 700, 1900, 100,
  937. AXP806_BLDO2_V_CTRL, AXP806_BLDO2_V_CTRL_MASK,
  938. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO2_MASK),
  939. AXP_DESC(AXP806, BLDO3, "bldo3", "bldoin", 700, 1900, 100,
  940. AXP806_BLDO3_V_CTRL, AXP806_BLDO3_V_CTRL_MASK,
  941. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO3_MASK),
  942. AXP_DESC(AXP806, BLDO4, "bldo4", "bldoin", 700, 1900, 100,
  943. AXP806_BLDO4_V_CTRL, AXP806_BLDO4_V_CTRL_MASK,
  944. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO4_MASK),
  945. AXP_DESC(AXP806, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
  946. AXP806_CLDO1_V_CTRL, AXP806_CLDO1_V_CTRL_MASK,
  947. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO1_MASK),
  948. AXP_DESC_RANGES(AXP806, CLDO2, "cldo2", "cldoin",
  949. axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  950. AXP806_CLDO2_V_CTRL, AXP806_CLDO2_V_CTRL_MASK,
  951. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO2_MASK),
  952. AXP_DESC(AXP806, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
  953. AXP806_CLDO3_V_CTRL, AXP806_CLDO3_V_CTRL_MASK,
  954. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_CLDO3_MASK),
  955. AXP_DESC_SW(AXP806, SW, "sw", "swin",
  956. AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_SW_MASK),
  957. };
  958. static const struct linear_range axp809_dcdc4_ranges[] = {
  959. REGULATOR_LINEAR_RANGE(600000,
  960. AXP809_DCDC4_600mV_START,
  961. AXP809_DCDC4_600mV_END,
  962. 20000),
  963. REGULATOR_LINEAR_RANGE(1800000,
  964. AXP809_DCDC4_1800mV_START,
  965. AXP809_DCDC4_1800mV_END,
  966. 100000),
  967. };
  968. static const struct regulator_desc axp809_regulators[] = {
  969. AXP_DESC(AXP809, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
  970. AXP22X_DCDC1_V_OUT, AXP22X_DCDC1_V_OUT_MASK,
  971. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC1_MASK),
  972. AXP_DESC(AXP809, DCDC2, "dcdc2", "vin2", 600, 1540, 20,
  973. AXP22X_DCDC2_V_OUT, AXP22X_DCDC2_V_OUT_MASK,
  974. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC2_MASK),
  975. AXP_DESC(AXP809, DCDC3, "dcdc3", "vin3", 600, 1860, 20,
  976. AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK,
  977. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK),
  978. AXP_DESC_RANGES(AXP809, DCDC4, "dcdc4", "vin4",
  979. axp809_dcdc4_ranges, AXP809_DCDC4_NUM_VOLTAGES,
  980. AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK,
  981. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK),
  982. AXP_DESC(AXP809, DCDC5, "dcdc5", "vin5", 1000, 2550, 50,
  983. AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK,
  984. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC5_MASK),
  985. /* secondary switchable output of DCDC1 */
  986. AXP_DESC_SW(AXP809, DC1SW, "dc1sw", NULL,
  987. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
  988. /* LDO regulator internally chained to DCDC5 */
  989. AXP_DESC(AXP809, DC5LDO, "dc5ldo", NULL, 700, 1400, 100,
  990. AXP22X_DC5LDO_V_OUT, AXP22X_DC5LDO_V_OUT_MASK,
  991. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DC5LDO_MASK),
  992. AXP_DESC(AXP809, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  993. AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  994. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO1_MASK),
  995. AXP_DESC(AXP809, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
  996. AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  997. AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_ALDO2_MASK),
  998. AXP_DESC(AXP809, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  999. AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  1000. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ALDO3_MASK),
  1001. AXP_DESC_RANGES(AXP809, DLDO1, "dldo1", "dldoin",
  1002. axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  1003. AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  1004. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  1005. AXP_DESC(AXP809, DLDO2, "dldo2", "dldoin", 700, 3300, 100,
  1006. AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
  1007. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
  1008. AXP_DESC(AXP809, ELDO1, "eldo1", "eldoin", 700, 3300, 100,
  1009. AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  1010. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
  1011. AXP_DESC(AXP809, ELDO2, "eldo2", "eldoin", 700, 3300, 100,
  1012. AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  1013. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
  1014. AXP_DESC(AXP809, ELDO3, "eldo3", "eldoin", 700, 3300, 100,
  1015. AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  1016. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
  1017. /*
  1018. * Note the datasheet only guarantees reliable operation up to
  1019. * 3.3V, this needs to be enforced via dts provided constraints
  1020. */
  1021. AXP_DESC_IO(AXP809, LDO_IO0, "ldo_io0", "ips", 700, 3800, 100,
  1022. AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  1023. AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
  1024. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  1025. /*
  1026. * Note the datasheet only guarantees reliable operation up to
  1027. * 3.3V, this needs to be enforced via dts provided constraints
  1028. */
  1029. AXP_DESC_IO(AXP809, LDO_IO1, "ldo_io1", "ips", 700, 3800, 100,
  1030. AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  1031. AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
  1032. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  1033. AXP_DESC_FIXED(AXP809, RTC_LDO, "rtc_ldo", "ips", 1800),
  1034. AXP_DESC_SW(AXP809, SW, "sw", "swin",
  1035. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_SW_MASK),
  1036. };
  1037. static const struct regulator_desc axp813_regulators[] = {
  1038. AXP_DESC(AXP813, DCDC1, "dcdc1", "vin1", 1600, 3400, 100,
  1039. AXP803_DCDC1_V_OUT, AXP803_DCDC1_V_OUT_MASK,
  1040. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC1_MASK),
  1041. AXP_DESC_RANGES(AXP813, DCDC2, "dcdc2", "vin2",
  1042. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  1043. AXP803_DCDC2_V_OUT, AXP803_DCDC2_V_OUT_MASK,
  1044. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC2_MASK),
  1045. AXP_DESC_RANGES(AXP813, DCDC3, "dcdc3", "vin3",
  1046. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  1047. AXP803_DCDC3_V_OUT, AXP803_DCDC3_V_OUT_MASK,
  1048. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC3_MASK),
  1049. AXP_DESC_RANGES(AXP813, DCDC4, "dcdc4", "vin4",
  1050. axp803_dcdc234_ranges, AXP803_DCDC234_NUM_VOLTAGES,
  1051. AXP803_DCDC4_V_OUT, AXP803_DCDC4_V_OUT_MASK,
  1052. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC4_MASK),
  1053. AXP_DESC_RANGES(AXP813, DCDC5, "dcdc5", "vin5",
  1054. axp803_dcdc5_ranges, AXP803_DCDC5_NUM_VOLTAGES,
  1055. AXP803_DCDC5_V_OUT, AXP803_DCDC5_V_OUT_MASK,
  1056. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC5_MASK),
  1057. AXP_DESC_RANGES(AXP813, DCDC6, "dcdc6", "vin6",
  1058. axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  1059. AXP803_DCDC6_V_OUT, AXP803_DCDC6_V_OUT_MASK,
  1060. AXP22X_PWR_OUT_CTRL1, AXP803_PWR_OUT_DCDC6_MASK),
  1061. AXP_DESC_RANGES(AXP813, DCDC7, "dcdc7", "vin7",
  1062. axp803_dcdc6_ranges, AXP803_DCDC6_NUM_VOLTAGES,
  1063. AXP813_DCDC7_V_OUT, AXP813_DCDC7_V_OUT_MASK,
  1064. AXP22X_PWR_OUT_CTRL1, AXP813_PWR_OUT_DCDC7_MASK),
  1065. AXP_DESC(AXP813, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  1066. AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK,
  1067. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK),
  1068. AXP_DESC(AXP813, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
  1069. AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK,
  1070. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK),
  1071. AXP_DESC(AXP813, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  1072. AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK,
  1073. AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO3_MASK),
  1074. AXP_DESC(AXP813, DLDO1, "dldo1", "dldoin", 700, 3300, 100,
  1075. AXP22X_DLDO1_V_OUT, AXP22X_DLDO1_V_OUT_MASK,
  1076. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK),
  1077. AXP_DESC_RANGES(AXP813, DLDO2, "dldo2", "dldoin",
  1078. axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES,
  1079. AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK,
  1080. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK),
  1081. AXP_DESC(AXP813, DLDO3, "dldo3", "dldoin", 700, 3300, 100,
  1082. AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK,
  1083. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO3_MASK),
  1084. AXP_DESC(AXP813, DLDO4, "dldo4", "dldoin", 700, 3300, 100,
  1085. AXP22X_DLDO4_V_OUT, AXP22X_DLDO4_V_OUT_MASK,
  1086. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO4_MASK),
  1087. AXP_DESC(AXP813, ELDO1, "eldo1", "eldoin", 700, 1900, 50,
  1088. AXP22X_ELDO1_V_OUT, AXP22X_ELDO1_V_OUT_MASK,
  1089. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO1_MASK),
  1090. AXP_DESC(AXP813, ELDO2, "eldo2", "eldoin", 700, 1900, 50,
  1091. AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK,
  1092. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK),
  1093. AXP_DESC(AXP813, ELDO3, "eldo3", "eldoin", 700, 1900, 50,
  1094. AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK,
  1095. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK),
  1096. /* to do / check ... */
  1097. AXP_DESC(AXP813, FLDO1, "fldo1", "fldoin", 700, 1450, 50,
  1098. AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK,
  1099. AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO1_MASK),
  1100. AXP_DESC(AXP813, FLDO2, "fldo2", "fldoin", 700, 1450, 50,
  1101. AXP803_FLDO2_V_OUT, AXP803_FLDO2_V_OUT_MASK,
  1102. AXP22X_PWR_OUT_CTRL3, AXP803_PWR_OUT_FLDO2_MASK),
  1103. /*
  1104. * TODO: FLDO3 = {DCDC5, FLDOIN} / 2
  1105. *
  1106. * This means FLDO3 effectively switches supplies at runtime,
  1107. * something the regulator subsystem does not support.
  1108. */
  1109. AXP_DESC_FIXED(AXP813, RTC_LDO, "rtc-ldo", "ips", 1800),
  1110. AXP_DESC_IO(AXP813, LDO_IO0, "ldo-io0", "ips", 700, 3300, 100,
  1111. AXP22X_LDO_IO0_V_OUT, AXP22X_LDO_IO0_V_OUT_MASK,
  1112. AXP20X_GPIO0_CTRL, AXP20X_GPIO0_FUNC_MASK,
  1113. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  1114. AXP_DESC_IO(AXP813, LDO_IO1, "ldo-io1", "ips", 700, 3300, 100,
  1115. AXP22X_LDO_IO1_V_OUT, AXP22X_LDO_IO1_V_OUT_MASK,
  1116. AXP20X_GPIO1_CTRL, AXP20X_GPIO1_FUNC_MASK,
  1117. AXP22X_IO_ENABLED, AXP22X_IO_DISABLED),
  1118. AXP_DESC_SW(AXP813, SW, "sw", "swin",
  1119. AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
  1120. };
  1121. static const struct linear_range axp15060_dcdc234_ranges[] = {
  1122. REGULATOR_LINEAR_RANGE(500000,
  1123. AXP15060_DCDC234_500mV_START,
  1124. AXP15060_DCDC234_500mV_END,
  1125. 10000),
  1126. REGULATOR_LINEAR_RANGE(1220000,
  1127. AXP15060_DCDC234_1220mV_START,
  1128. AXP15060_DCDC234_1220mV_END,
  1129. 20000),
  1130. };
  1131. static const struct linear_range axp15060_dcdc5_ranges[] = {
  1132. REGULATOR_LINEAR_RANGE(800000,
  1133. AXP15060_DCDC5_800mV_START,
  1134. AXP15060_DCDC5_800mV_END,
  1135. 10000),
  1136. REGULATOR_LINEAR_RANGE(1140000,
  1137. AXP15060_DCDC5_1140mV_START,
  1138. AXP15060_DCDC5_1140mV_END,
  1139. 20000),
  1140. };
  1141. static const struct regulator_desc axp15060_regulators[] = {
  1142. AXP_DESC(AXP15060, DCDC1, "dcdc1", "vin1", 1500, 3400, 100,
  1143. AXP15060_DCDC1_V_CTRL, AXP15060_DCDC1_V_CTRL_MASK,
  1144. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC1_MASK),
  1145. AXP_DESC_RANGES(AXP15060, DCDC2, "dcdc2", "vin2",
  1146. axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
  1147. AXP15060_DCDC2_V_CTRL, AXP15060_DCDC2_V_CTRL_MASK,
  1148. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC2_MASK),
  1149. AXP_DESC_RANGES(AXP15060, DCDC3, "dcdc3", "vin3",
  1150. axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
  1151. AXP15060_DCDC3_V_CTRL, AXP15060_DCDC3_V_CTRL_MASK,
  1152. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC3_MASK),
  1153. AXP_DESC_RANGES(AXP15060, DCDC4, "dcdc4", "vin4",
  1154. axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
  1155. AXP15060_DCDC4_V_CTRL, AXP15060_DCDC4_V_CTRL_MASK,
  1156. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC4_MASK),
  1157. AXP_DESC_RANGES(AXP15060, DCDC5, "dcdc5", "vin5",
  1158. axp15060_dcdc5_ranges, AXP15060_DCDC5_NUM_VOLTAGES,
  1159. AXP15060_DCDC5_V_CTRL, AXP15060_DCDC5_V_CTRL_MASK,
  1160. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC5_MASK),
  1161. AXP_DESC(AXP15060, DCDC6, "dcdc6", "vin6", 500, 3400, 100,
  1162. AXP15060_DCDC6_V_CTRL, AXP15060_DCDC6_V_CTRL_MASK,
  1163. AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC6_MASK),
  1164. AXP_DESC(AXP15060, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
  1165. AXP15060_ALDO1_V_CTRL, AXP15060_ALDO1_V_CTRL_MASK,
  1166. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO1_MASK),
  1167. AXP_DESC(AXP15060, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
  1168. AXP15060_ALDO2_V_CTRL, AXP15060_ALDO2_V_CTRL_MASK,
  1169. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO2_MASK),
  1170. AXP_DESC(AXP15060, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
  1171. AXP15060_ALDO3_V_CTRL, AXP15060_ALDO3_V_CTRL_MASK,
  1172. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO3_MASK),
  1173. AXP_DESC(AXP15060, ALDO4, "aldo4", "aldoin", 700, 3300, 100,
  1174. AXP15060_ALDO4_V_CTRL, AXP15060_ALDO4_V_CTRL_MASK,
  1175. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO4_MASK),
  1176. AXP_DESC(AXP15060, ALDO5, "aldo5", "aldoin", 700, 3300, 100,
  1177. AXP15060_ALDO5_V_CTRL, AXP15060_ALDO5_V_CTRL_MASK,
  1178. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO5_MASK),
  1179. AXP_DESC(AXP15060, BLDO1, "bldo1", "bldoin", 700, 3300, 100,
  1180. AXP15060_BLDO1_V_CTRL, AXP15060_BLDO1_V_CTRL_MASK,
  1181. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO1_MASK),
  1182. AXP_DESC(AXP15060, BLDO2, "bldo2", "bldoin", 700, 3300, 100,
  1183. AXP15060_BLDO2_V_CTRL, AXP15060_BLDO2_V_CTRL_MASK,
  1184. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO2_MASK),
  1185. AXP_DESC(AXP15060, BLDO3, "bldo3", "bldoin", 700, 3300, 100,
  1186. AXP15060_BLDO3_V_CTRL, AXP15060_BLDO3_V_CTRL_MASK,
  1187. AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO3_MASK),
  1188. AXP_DESC(AXP15060, BLDO4, "bldo4", "bldoin", 700, 3300, 100,
  1189. AXP15060_BLDO4_V_CTRL, AXP15060_BLDO4_V_CTRL_MASK,
  1190. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO4_MASK),
  1191. AXP_DESC(AXP15060, BLDO5, "bldo5", "bldoin", 700, 3300, 100,
  1192. AXP15060_BLDO5_V_CTRL, AXP15060_BLDO5_V_CTRL_MASK,
  1193. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO5_MASK),
  1194. AXP_DESC(AXP15060, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
  1195. AXP15060_CLDO1_V_CTRL, AXP15060_CLDO1_V_CTRL_MASK,
  1196. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO1_MASK),
  1197. AXP_DESC(AXP15060, CLDO2, "cldo2", "cldoin", 700, 3300, 100,
  1198. AXP15060_CLDO2_V_CTRL, AXP15060_CLDO2_V_CTRL_MASK,
  1199. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO2_MASK),
  1200. AXP_DESC(AXP15060, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
  1201. AXP15060_CLDO3_V_CTRL, AXP15060_CLDO3_V_CTRL_MASK,
  1202. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO3_MASK),
  1203. AXP_DESC(AXP15060, CLDO4, "cldo4", "cldoin", 700, 4200, 100,
  1204. AXP15060_CLDO4_V_CTRL, AXP15060_CLDO4_V_CTRL_MASK,
  1205. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO4_MASK),
  1206. /* Supply comes from DCDC5 */
  1207. AXP_DESC(AXP15060, CPUSLDO, "cpusldo", NULL, 700, 1400, 50,
  1208. AXP15060_CPUSLDO_V_CTRL, AXP15060_CPUSLDO_V_CTRL_MASK,
  1209. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CPUSLDO_MASK),
  1210. /* Supply comes from DCDC1 */
  1211. AXP_DESC_SW(AXP15060, SW, "sw", NULL,
  1212. AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_SW_MASK),
  1213. /* Supply comes from ALDO1 */
  1214. AXP_DESC_FIXED(AXP15060, RTC_LDO, "rtc-ldo", NULL, 1800),
  1215. };
  1216. static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
  1217. {
  1218. struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
  1219. unsigned int reg = AXP20X_DCDC_FREQ;
  1220. u32 min, max, def, step;
  1221. switch (axp20x->variant) {
  1222. case AXP202_ID:
  1223. case AXP209_ID:
  1224. min = 750;
  1225. max = 1875;
  1226. def = 1500;
  1227. step = 75;
  1228. break;
  1229. case AXP803_ID:
  1230. case AXP813_ID:
  1231. /*
  1232. * AXP803/AXP813 DCDC work frequency setting has the same
  1233. * range and step as AXP22X, but at a different register.
  1234. * (See include/linux/mfd/axp20x.h)
  1235. */
  1236. reg = AXP803_DCDC_FREQ_CTRL;
  1237. fallthrough; /* to the check below */
  1238. case AXP806_ID:
  1239. /*
  1240. * AXP806 also have DCDC work frequency setting register at a
  1241. * different position.
  1242. */
  1243. if (axp20x->variant == AXP806_ID)
  1244. reg = AXP806_DCDC_FREQ_CTRL;
  1245. fallthrough;
  1246. case AXP221_ID:
  1247. case AXP223_ID:
  1248. case AXP809_ID:
  1249. min = 1800;
  1250. max = 4050;
  1251. def = 3000;
  1252. step = 150;
  1253. break;
  1254. case AXP313A_ID:
  1255. case AXP717_ID:
  1256. case AXP15060_ID:
  1257. /* The DCDC PWM frequency seems to be fixed to 3 MHz. */
  1258. if (dcdcfreq != 0) {
  1259. dev_err(&pdev->dev,
  1260. "DCDC frequency on this PMIC is fixed to 3 MHz.\n");
  1261. return -EINVAL;
  1262. }
  1263. return 0;
  1264. default:
  1265. dev_err(&pdev->dev,
  1266. "Setting DCDC frequency for unsupported AXP variant\n");
  1267. return -EINVAL;
  1268. }
  1269. if (dcdcfreq == 0)
  1270. dcdcfreq = def;
  1271. if (dcdcfreq < min) {
  1272. dcdcfreq = min;
  1273. dev_warn(&pdev->dev, "DCDC frequency too low. Set to %ukHz\n",
  1274. min);
  1275. }
  1276. if (dcdcfreq > max) {
  1277. dcdcfreq = max;
  1278. dev_warn(&pdev->dev, "DCDC frequency too high. Set to %ukHz\n",
  1279. max);
  1280. }
  1281. dcdcfreq = (dcdcfreq - min) / step;
  1282. return regmap_update_bits(axp20x->regmap, reg,
  1283. AXP20X_FREQ_DCDC_MASK, dcdcfreq);
  1284. }
  1285. static int axp20x_regulator_parse_dt(struct platform_device *pdev)
  1286. {
  1287. struct device_node *np, *regulators;
  1288. int ret = 0;
  1289. u32 dcdcfreq = 0;
  1290. np = of_node_get(pdev->dev.parent->of_node);
  1291. if (!np)
  1292. return 0;
  1293. regulators = of_get_child_by_name(np, "regulators");
  1294. if (!regulators) {
  1295. dev_warn(&pdev->dev, "regulators node not found\n");
  1296. } else {
  1297. of_property_read_u32(regulators, "x-powers,dcdc-freq", &dcdcfreq);
  1298. ret = axp20x_set_dcdc_freq(pdev, dcdcfreq);
  1299. if (ret < 0) {
  1300. dev_err(&pdev->dev, "Error setting dcdc frequency: %d\n", ret);
  1301. }
  1302. of_node_put(regulators);
  1303. }
  1304. of_node_put(np);
  1305. return ret;
  1306. }
  1307. static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 workmode)
  1308. {
  1309. struct axp20x_dev *axp20x = rdev_get_drvdata(rdev);
  1310. unsigned int reg = AXP20X_DCDC_MODE;
  1311. unsigned int mask;
  1312. switch (axp20x->variant) {
  1313. case AXP202_ID:
  1314. case AXP209_ID:
  1315. if ((id != AXP20X_DCDC2) && (id != AXP20X_DCDC3))
  1316. return -EINVAL;
  1317. mask = AXP20X_WORKMODE_DCDC2_MASK;
  1318. if (id == AXP20X_DCDC3)
  1319. mask = AXP20X_WORKMODE_DCDC3_MASK;
  1320. workmode <<= ffs(mask) - 1;
  1321. break;
  1322. case AXP806_ID:
  1323. /*
  1324. * AXP806 DCDC regulator IDs have the same range as AXP22X.
  1325. * (See include/linux/mfd/axp20x.h)
  1326. */
  1327. reg = AXP806_DCDC_MODE_CTRL2;
  1328. fallthrough; /* to the check below */
  1329. case AXP221_ID:
  1330. case AXP223_ID:
  1331. case AXP809_ID:
  1332. if (id < AXP22X_DCDC1 || id > AXP22X_DCDC5)
  1333. return -EINVAL;
  1334. mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP22X_DCDC1);
  1335. workmode <<= id - AXP22X_DCDC1;
  1336. break;
  1337. case AXP803_ID:
  1338. if (id < AXP803_DCDC1 || id > AXP803_DCDC6)
  1339. return -EINVAL;
  1340. mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP803_DCDC1);
  1341. workmode <<= id - AXP803_DCDC1;
  1342. break;
  1343. case AXP813_ID:
  1344. if (id < AXP813_DCDC1 || id > AXP813_DCDC7)
  1345. return -EINVAL;
  1346. mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP813_DCDC1);
  1347. workmode <<= id - AXP813_DCDC1;
  1348. break;
  1349. case AXP15060_ID:
  1350. reg = AXP15060_DCDC_MODE_CTRL2;
  1351. if (id < AXP15060_DCDC1 || id > AXP15060_DCDC6)
  1352. return -EINVAL;
  1353. mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP15060_DCDC1);
  1354. workmode <<= id - AXP15060_DCDC1;
  1355. break;
  1356. default:
  1357. /* should not happen */
  1358. WARN_ON(1);
  1359. return -EINVAL;
  1360. }
  1361. return regmap_update_bits(rdev->regmap, reg, mask, workmode);
  1362. }
  1363. /*
  1364. * This function checks whether a regulator is part of a poly-phase
  1365. * output setup based on the registers settings. Returns true if it is.
  1366. */
  1367. static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
  1368. {
  1369. u32 reg = 0;
  1370. /*
  1371. * Currently in our supported AXP variants, only AXP803, AXP806,
  1372. * AXP813 and AXP15060 have polyphase regulators.
  1373. */
  1374. switch (axp20x->variant) {
  1375. case AXP803_ID:
  1376. case AXP813_ID:
  1377. regmap_read(axp20x->regmap, AXP803_POLYPHASE_CTRL, &reg);
  1378. switch (id) {
  1379. case AXP803_DCDC3:
  1380. return !!(reg & AXP803_DCDC23_POLYPHASE_DUAL);
  1381. case AXP803_DCDC6:
  1382. return !!(reg & AXP803_DCDC56_POLYPHASE_DUAL);
  1383. }
  1384. break;
  1385. case AXP806_ID:
  1386. regmap_read(axp20x->regmap, AXP806_DCDC_MODE_CTRL2, &reg);
  1387. switch (id) {
  1388. case AXP806_DCDCB:
  1389. return (((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  1390. AXP806_DCDCAB_POLYPHASE_DUAL) ||
  1391. ((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  1392. AXP806_DCDCABC_POLYPHASE_TRI));
  1393. case AXP806_DCDCC:
  1394. return ((reg & AXP806_DCDCABC_POLYPHASE_MASK) ==
  1395. AXP806_DCDCABC_POLYPHASE_TRI);
  1396. case AXP806_DCDCE:
  1397. return !!(reg & AXP806_DCDCDE_POLYPHASE_DUAL);
  1398. }
  1399. break;
  1400. case AXP15060_ID:
  1401. regmap_read(axp20x->regmap, AXP15060_DCDC_MODE_CTRL1, &reg);
  1402. switch (id) {
  1403. case AXP15060_DCDC3:
  1404. return !!(reg & AXP15060_DCDC23_POLYPHASE_DUAL_MASK);
  1405. case AXP15060_DCDC6:
  1406. return !!(reg & AXP15060_DCDC46_POLYPHASE_DUAL_MASK);
  1407. }
  1408. break;
  1409. default:
  1410. return false;
  1411. }
  1412. return false;
  1413. }
  1414. static int axp20x_regulator_probe(struct platform_device *pdev)
  1415. {
  1416. struct regulator_dev *rdev;
  1417. struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
  1418. const struct regulator_desc *regulators;
  1419. struct regulator_config config = {
  1420. .dev = pdev->dev.parent,
  1421. .regmap = axp20x->regmap,
  1422. .driver_data = axp20x,
  1423. };
  1424. int ret, i, nregulators;
  1425. u32 workmode;
  1426. const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
  1427. const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
  1428. const char *aldo1_name = axp15060_regulators[AXP15060_ALDO1].name;
  1429. bool drivevbus = false;
  1430. switch (axp20x->variant) {
  1431. case AXP202_ID:
  1432. case AXP209_ID:
  1433. regulators = axp20x_regulators;
  1434. nregulators = AXP20X_REG_ID_MAX;
  1435. break;
  1436. case AXP221_ID:
  1437. case AXP223_ID:
  1438. regulators = axp22x_regulators;
  1439. nregulators = AXP22X_REG_ID_MAX;
  1440. drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  1441. "x-powers,drive-vbus-en");
  1442. break;
  1443. case AXP313A_ID:
  1444. regulators = axp313a_regulators;
  1445. nregulators = AXP313A_REG_ID_MAX;
  1446. break;
  1447. case AXP717_ID:
  1448. regulators = axp717_regulators;
  1449. nregulators = AXP717_REG_ID_MAX;
  1450. break;
  1451. case AXP803_ID:
  1452. regulators = axp803_regulators;
  1453. nregulators = AXP803_REG_ID_MAX;
  1454. drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  1455. "x-powers,drive-vbus-en");
  1456. break;
  1457. case AXP806_ID:
  1458. regulators = axp806_regulators;
  1459. nregulators = AXP806_REG_ID_MAX;
  1460. break;
  1461. case AXP809_ID:
  1462. regulators = axp809_regulators;
  1463. nregulators = AXP809_REG_ID_MAX;
  1464. break;
  1465. case AXP813_ID:
  1466. regulators = axp813_regulators;
  1467. nregulators = AXP813_REG_ID_MAX;
  1468. drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
  1469. "x-powers,drive-vbus-en");
  1470. break;
  1471. case AXP15060_ID:
  1472. regulators = axp15060_regulators;
  1473. nregulators = AXP15060_REG_ID_MAX;
  1474. break;
  1475. default:
  1476. dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n",
  1477. axp20x->variant);
  1478. return -EINVAL;
  1479. }
  1480. /* This only sets the dcdc freq. Ignore any errors */
  1481. axp20x_regulator_parse_dt(pdev);
  1482. for (i = 0; i < nregulators; i++) {
  1483. const struct regulator_desc *desc = &regulators[i];
  1484. struct regulator_desc *new_desc;
  1485. /*
  1486. * If this regulator is a slave in a poly-phase setup,
  1487. * skip it, as its controls are bound to the master
  1488. * regulator and won't work.
  1489. */
  1490. if (axp20x_is_polyphase_slave(axp20x, i))
  1491. continue;
  1492. /* Support for AXP813's FLDO3 is not implemented */
  1493. if (axp20x->variant == AXP813_ID && i == AXP813_FLDO3)
  1494. continue;
  1495. /*
  1496. * Regulators DC1SW, DC5LDO and RTCLDO on AXP15060 are
  1497. * connected internally, so we have to handle their supply
  1498. * names separately.
  1499. *
  1500. * We always register the regulators in proper sequence,
  1501. * so the supply names are correctly read. See the last
  1502. * part of this loop to see where we save the DT defined
  1503. * name.
  1504. */
  1505. if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) ||
  1506. (regulators == axp803_regulators && i == AXP803_DC1SW) ||
  1507. (regulators == axp809_regulators && i == AXP809_DC1SW) ||
  1508. (regulators == axp15060_regulators && i == AXP15060_SW)) {
  1509. new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
  1510. GFP_KERNEL);
  1511. if (!new_desc)
  1512. return -ENOMEM;
  1513. *new_desc = regulators[i];
  1514. new_desc->supply_name = dcdc1_name;
  1515. desc = new_desc;
  1516. }
  1517. if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) ||
  1518. (regulators == axp809_regulators && i == AXP809_DC5LDO) ||
  1519. (regulators == axp15060_regulators && i == AXP15060_CPUSLDO)) {
  1520. new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
  1521. GFP_KERNEL);
  1522. if (!new_desc)
  1523. return -ENOMEM;
  1524. *new_desc = regulators[i];
  1525. new_desc->supply_name = dcdc5_name;
  1526. desc = new_desc;
  1527. }
  1528. if (regulators == axp15060_regulators && i == AXP15060_RTC_LDO) {
  1529. new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
  1530. GFP_KERNEL);
  1531. if (!new_desc)
  1532. return -ENOMEM;
  1533. *new_desc = regulators[i];
  1534. new_desc->supply_name = aldo1_name;
  1535. desc = new_desc;
  1536. }
  1537. rdev = devm_regulator_register(&pdev->dev, desc, &config);
  1538. if (IS_ERR(rdev)) {
  1539. dev_err(&pdev->dev, "Failed to register %s\n",
  1540. regulators[i].name);
  1541. return PTR_ERR(rdev);
  1542. }
  1543. ret = of_property_read_u32(rdev->dev.of_node,
  1544. "x-powers,dcdc-workmode",
  1545. &workmode);
  1546. if (!ret) {
  1547. if (axp20x_set_dcdc_workmode(rdev, i, workmode))
  1548. dev_err(&pdev->dev, "Failed to set workmode on %s\n",
  1549. rdev->desc->name);
  1550. }
  1551. /*
  1552. * Save AXP22X DCDC1 / DCDC5 / AXP15060 ALDO1 regulator names for later.
  1553. */
  1554. if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) ||
  1555. (regulators == axp809_regulators && i == AXP809_DCDC1) ||
  1556. (regulators == axp15060_regulators && i == AXP15060_DCDC1))
  1557. of_property_read_string(rdev->dev.of_node,
  1558. "regulator-name",
  1559. &dcdc1_name);
  1560. if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) ||
  1561. (regulators == axp809_regulators && i == AXP809_DCDC5) ||
  1562. (regulators == axp15060_regulators && i == AXP15060_DCDC5))
  1563. of_property_read_string(rdev->dev.of_node,
  1564. "regulator-name",
  1565. &dcdc5_name);
  1566. if (regulators == axp15060_regulators && i == AXP15060_ALDO1)
  1567. of_property_read_string(rdev->dev.of_node,
  1568. "regulator-name",
  1569. &aldo1_name);
  1570. }
  1571. if (drivevbus) {
  1572. /* Change N_VBUSEN sense pin to DRIVEVBUS output pin */
  1573. regmap_update_bits(axp20x->regmap, AXP20X_OVER_TMP,
  1574. AXP22X_MISC_N_VBUSEN_FUNC, 0);
  1575. rdev = devm_regulator_register(&pdev->dev,
  1576. &axp22x_drivevbus_regulator,
  1577. &config);
  1578. if (IS_ERR(rdev)) {
  1579. dev_err(&pdev->dev, "Failed to register drivevbus\n");
  1580. return PTR_ERR(rdev);
  1581. }
  1582. }
  1583. return 0;
  1584. }
  1585. static struct platform_driver axp20x_regulator_driver = {
  1586. .probe = axp20x_regulator_probe,
  1587. .driver = {
  1588. .name = "axp20x-regulator",
  1589. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  1590. },
  1591. };
  1592. module_platform_driver(axp20x_regulator_driver);
  1593. MODULE_LICENSE("GPL v2");
  1594. MODULE_AUTHOR("Carlo Caione <carlo@caione.org>");
  1595. MODULE_DESCRIPTION("Regulator Driver for AXP20X PMIC");
  1596. MODULE_ALIAS("platform:axp20x-regulator");