xilinx-ams.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Xilinx AMS driver
  4. *
  5. * Copyright (C) 2021 Xilinx, Inc.
  6. *
  7. * Manish Narani <mnarani@xilinx.com>
  8. * Rajnikant Bhojani <rajnikant.bhojani@xilinx.com>
  9. */
  10. #include <linux/bits.h>
  11. #include <linux/bitfield.h>
  12. #include <linux/clk.h>
  13. #include <linux/delay.h>
  14. #include <linux/devm-helpers.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/io.h>
  17. #include <linux/iopoll.h>
  18. #include <linux/kernel.h>
  19. #include <linux/module.h>
  20. #include <linux/mod_devicetable.h>
  21. #include <linux/overflow.h>
  22. #include <linux/platform_device.h>
  23. #include <linux/property.h>
  24. #include <linux/slab.h>
  25. #include <linux/iio/events.h>
  26. #include <linux/iio/iio.h>
  27. /* AMS registers definitions */
  28. #define AMS_ISR_0 0x010
  29. #define AMS_ISR_1 0x014
  30. #define AMS_IER_0 0x020
  31. #define AMS_IER_1 0x024
  32. #define AMS_IDR_0 0x028
  33. #define AMS_IDR_1 0x02C
  34. #define AMS_PS_CSTS 0x040
  35. #define AMS_PL_CSTS 0x044
  36. #define AMS_VCC_PSPLL0 0x060
  37. #define AMS_VCC_PSPLL3 0x06C
  38. #define AMS_VCCINT 0x078
  39. #define AMS_VCCBRAM 0x07C
  40. #define AMS_VCCAUX 0x080
  41. #define AMS_PSDDRPLL 0x084
  42. #define AMS_PSINTFPDDR 0x09C
  43. #define AMS_VCC_PSPLL0_CH 48
  44. #define AMS_VCC_PSPLL3_CH 51
  45. #define AMS_VCCINT_CH 54
  46. #define AMS_VCCBRAM_CH 55
  47. #define AMS_VCCAUX_CH 56
  48. #define AMS_PSDDRPLL_CH 57
  49. #define AMS_PSINTFPDDR_CH 63
  50. #define AMS_REG_CONFIG0 0x100
  51. #define AMS_REG_CONFIG1 0x104
  52. #define AMS_REG_CONFIG3 0x10C
  53. #define AMS_REG_CONFIG4 0x110
  54. #define AMS_REG_SEQ_CH0 0x120
  55. #define AMS_REG_SEQ_CH1 0x124
  56. #define AMS_REG_SEQ_CH2 0x118
  57. #define AMS_VUSER0_MASK BIT(0)
  58. #define AMS_VUSER1_MASK BIT(1)
  59. #define AMS_VUSER2_MASK BIT(2)
  60. #define AMS_VUSER3_MASK BIT(3)
  61. #define AMS_TEMP 0x000
  62. #define AMS_SUPPLY1 0x004
  63. #define AMS_SUPPLY2 0x008
  64. #define AMS_VP_VN 0x00C
  65. #define AMS_VREFP 0x010
  66. #define AMS_VREFN 0x014
  67. #define AMS_SUPPLY3 0x018
  68. #define AMS_SUPPLY4 0x034
  69. #define AMS_SUPPLY5 0x038
  70. #define AMS_SUPPLY6 0x03C
  71. #define AMS_SUPPLY7 0x200
  72. #define AMS_SUPPLY8 0x204
  73. #define AMS_SUPPLY9 0x208
  74. #define AMS_SUPPLY10 0x20C
  75. #define AMS_VCCAMS 0x210
  76. #define AMS_TEMP_REMOTE 0x214
  77. #define AMS_REG_VAUX(x) (0x40 + 4 * (x))
  78. #define AMS_PS_RESET_VALUE 0xFFFF
  79. #define AMS_PL_RESET_VALUE 0xFFFF
  80. #define AMS_CONF0_CHANNEL_NUM_MASK GENMASK(6, 0)
  81. #define AMS_CONF1_SEQ_MASK GENMASK(15, 12)
  82. #define AMS_CONF1_SEQ_DEFAULT FIELD_PREP(AMS_CONF1_SEQ_MASK, 0)
  83. #define AMS_CONF1_SEQ_CONTINUOUS FIELD_PREP(AMS_CONF1_SEQ_MASK, 2)
  84. #define AMS_CONF1_SEQ_SINGLE_CHANNEL FIELD_PREP(AMS_CONF1_SEQ_MASK, 3)
  85. #define AMS_REG_SEQ0_MASK GENMASK(15, 0)
  86. #define AMS_REG_SEQ2_MASK GENMASK(21, 16)
  87. #define AMS_REG_SEQ1_MASK GENMASK_ULL(37, 22)
  88. #define AMS_PS_SEQ_MASK GENMASK(21, 0)
  89. #define AMS_PL_SEQ_MASK GENMASK_ULL(59, 22)
  90. #define AMS_ALARM_TEMP 0x140
  91. #define AMS_ALARM_SUPPLY1 0x144
  92. #define AMS_ALARM_SUPPLY2 0x148
  93. #define AMS_ALARM_SUPPLY3 0x160
  94. #define AMS_ALARM_SUPPLY4 0x164
  95. #define AMS_ALARM_SUPPLY5 0x168
  96. #define AMS_ALARM_SUPPLY6 0x16C
  97. #define AMS_ALARM_SUPPLY7 0x180
  98. #define AMS_ALARM_SUPPLY8 0x184
  99. #define AMS_ALARM_SUPPLY9 0x188
  100. #define AMS_ALARM_SUPPLY10 0x18C
  101. #define AMS_ALARM_VCCAMS 0x190
  102. #define AMS_ALARM_TEMP_REMOTE 0x194
  103. #define AMS_ALARM_THRESHOLD_OFF_10 0x10
  104. #define AMS_ALARM_THRESHOLD_OFF_20 0x20
  105. #define AMS_ALARM_THR_DIRECT_MASK BIT(1)
  106. #define AMS_ALARM_THR_MIN 0x0000
  107. #define AMS_ALARM_THR_MAX (BIT(16) - 1)
  108. #define AMS_ALARM_MASK GENMASK_ULL(63, 0)
  109. #define AMS_NO_OF_ALARMS 32
  110. #define AMS_PL_ALARM_START 16
  111. #define AMS_PL_ALARM_MASK GENMASK(31, 16)
  112. #define AMS_ISR0_ALARM_MASK GENMASK(31, 0)
  113. #define AMS_ISR1_ALARM_MASK (GENMASK(31, 29) | GENMASK(4, 0))
  114. #define AMS_ISR1_EOC_MASK BIT(3)
  115. #define AMS_ISR1_INTR_MASK GENMASK_ULL(63, 32)
  116. #define AMS_ISR0_ALARM_2_TO_0_MASK GENMASK(2, 0)
  117. #define AMS_ISR0_ALARM_6_TO_3_MASK GENMASK(6, 3)
  118. #define AMS_ISR0_ALARM_12_TO_7_MASK GENMASK(13, 8)
  119. #define AMS_CONF1_ALARM_2_TO_0_MASK GENMASK(3, 1)
  120. #define AMS_CONF1_ALARM_6_TO_3_MASK GENMASK(11, 8)
  121. #define AMS_CONF1_ALARM_12_TO_7_MASK GENMASK(5, 0)
  122. #define AMS_REGCFG1_ALARM_MASK \
  123. (AMS_CONF1_ALARM_2_TO_0_MASK | AMS_CONF1_ALARM_6_TO_3_MASK | BIT(0))
  124. #define AMS_REGCFG3_ALARM_MASK AMS_CONF1_ALARM_12_TO_7_MASK
  125. #define AMS_PS_CSTS_PS_READY (BIT(27) | BIT(16))
  126. #define AMS_PL_CSTS_ACCESS_MASK BIT(1)
  127. #define AMS_PL_MAX_FIXED_CHANNEL 10
  128. #define AMS_PL_MAX_EXT_CHANNEL 20
  129. #define AMS_INIT_POLL_TIME_US 200
  130. #define AMS_INIT_TIMEOUT_US 10000
  131. #define AMS_UNMASK_TIMEOUT_MS 500
  132. /*
  133. * Following scale and offset value is derived from
  134. * UG580 (v1.7) December 20, 2016
  135. */
  136. #define AMS_SUPPLY_SCALE_1VOLT_mV 1000
  137. #define AMS_SUPPLY_SCALE_3VOLT_mV 3000
  138. #define AMS_SUPPLY_SCALE_6VOLT_mV 6000
  139. #define AMS_SUPPLY_SCALE_DIV_BIT 16
  140. #define AMS_TEMP_SCALE 509314
  141. #define AMS_TEMP_SCALE_DIV_BIT 16
  142. #define AMS_TEMP_OFFSET -((280230LL << 16) / 509314)
  143. enum ams_alarm_bit {
  144. AMS_ALARM_BIT_TEMP = 0,
  145. AMS_ALARM_BIT_SUPPLY1 = 1,
  146. AMS_ALARM_BIT_SUPPLY2 = 2,
  147. AMS_ALARM_BIT_SUPPLY3 = 3,
  148. AMS_ALARM_BIT_SUPPLY4 = 4,
  149. AMS_ALARM_BIT_SUPPLY5 = 5,
  150. AMS_ALARM_BIT_SUPPLY6 = 6,
  151. AMS_ALARM_BIT_RESERVED = 7,
  152. AMS_ALARM_BIT_SUPPLY7 = 8,
  153. AMS_ALARM_BIT_SUPPLY8 = 9,
  154. AMS_ALARM_BIT_SUPPLY9 = 10,
  155. AMS_ALARM_BIT_SUPPLY10 = 11,
  156. AMS_ALARM_BIT_VCCAMS = 12,
  157. AMS_ALARM_BIT_TEMP_REMOTE = 13,
  158. };
  159. enum ams_seq {
  160. AMS_SEQ_VCC_PSPLL = 0,
  161. AMS_SEQ_VCC_PSBATT = 1,
  162. AMS_SEQ_VCCINT = 2,
  163. AMS_SEQ_VCCBRAM = 3,
  164. AMS_SEQ_VCCAUX = 4,
  165. AMS_SEQ_PSDDRPLL = 5,
  166. AMS_SEQ_INTDDR = 6,
  167. };
  168. enum ams_ps_pl_seq {
  169. AMS_SEQ_CALIB = 0,
  170. AMS_SEQ_RSVD_1 = 1,
  171. AMS_SEQ_RSVD_2 = 2,
  172. AMS_SEQ_TEST = 3,
  173. AMS_SEQ_RSVD_4 = 4,
  174. AMS_SEQ_SUPPLY4 = 5,
  175. AMS_SEQ_SUPPLY5 = 6,
  176. AMS_SEQ_SUPPLY6 = 7,
  177. AMS_SEQ_TEMP = 8,
  178. AMS_SEQ_SUPPLY2 = 9,
  179. AMS_SEQ_SUPPLY1 = 10,
  180. AMS_SEQ_VP_VN = 11,
  181. AMS_SEQ_VREFP = 12,
  182. AMS_SEQ_VREFN = 13,
  183. AMS_SEQ_SUPPLY3 = 14,
  184. AMS_SEQ_CURRENT_MON = 15,
  185. AMS_SEQ_SUPPLY7 = 16,
  186. AMS_SEQ_SUPPLY8 = 17,
  187. AMS_SEQ_SUPPLY9 = 18,
  188. AMS_SEQ_SUPPLY10 = 19,
  189. AMS_SEQ_VCCAMS = 20,
  190. AMS_SEQ_TEMP_REMOTE = 21,
  191. AMS_SEQ_MAX = 22
  192. };
  193. #define AMS_PS_SEQ_MAX AMS_SEQ_MAX
  194. #define AMS_SEQ(x) (AMS_SEQ_MAX + (x))
  195. #define PS_SEQ(x) (x)
  196. #define PL_SEQ(x) (AMS_PS_SEQ_MAX + (x))
  197. #define AMS_CTRL_SEQ_BASE (AMS_PS_SEQ_MAX * 3)
  198. #define AMS_CHAN_TEMP(_scan_index, _addr, _name) { \
  199. .type = IIO_TEMP, \
  200. .indexed = 1, \
  201. .address = (_addr), \
  202. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  203. BIT(IIO_CHAN_INFO_SCALE) | \
  204. BIT(IIO_CHAN_INFO_OFFSET), \
  205. .event_spec = ams_temp_events, \
  206. .scan_index = _scan_index, \
  207. .num_event_specs = ARRAY_SIZE(ams_temp_events), \
  208. .datasheet_name = _name, \
  209. }
  210. #define AMS_CHAN_VOLTAGE(_scan_index, _addr, _alarm, _name) { \
  211. .type = IIO_VOLTAGE, \
  212. .indexed = 1, \
  213. .address = (_addr), \
  214. .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
  215. BIT(IIO_CHAN_INFO_SCALE), \
  216. .event_spec = (_alarm) ? ams_voltage_events : NULL, \
  217. .scan_index = _scan_index, \
  218. .num_event_specs = (_alarm) ? ARRAY_SIZE(ams_voltage_events) : 0, \
  219. .datasheet_name = _name, \
  220. }
  221. #define AMS_PS_CHAN_TEMP(_scan_index, _addr, _name) \
  222. AMS_CHAN_TEMP(PS_SEQ(_scan_index), _addr, _name)
  223. #define AMS_PS_CHAN_VOLTAGE(_scan_index, _addr, _name) \
  224. AMS_CHAN_VOLTAGE(PS_SEQ(_scan_index), _addr, true, _name)
  225. #define AMS_PL_CHAN_TEMP(_scan_index, _addr, _name) \
  226. AMS_CHAN_TEMP(PL_SEQ(_scan_index), _addr, _name)
  227. #define AMS_PL_CHAN_VOLTAGE(_scan_index, _addr, _alarm, _name) \
  228. AMS_CHAN_VOLTAGE(PL_SEQ(_scan_index), _addr, _alarm, _name)
  229. #define AMS_PL_AUX_CHAN_VOLTAGE(_auxno) \
  230. AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(_auxno)), AMS_REG_VAUX(_auxno), false, \
  231. "VAUX" #_auxno)
  232. #define AMS_CTRL_CHAN_VOLTAGE(_scan_index, _addr, _name) \
  233. AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(AMS_SEQ(_scan_index))), _addr, false, \
  234. _name)
  235. /**
  236. * struct ams - This structure contains necessary state for xilinx-ams to operate
  237. * @base: physical base address of device
  238. * @ps_base: physical base address of PS device
  239. * @pl_base: physical base address of PL device
  240. * @clk: clocks associated with the device
  241. * @dev: pointer to device struct
  242. * @lock: to handle multiple user interaction
  243. * @intr_lock: to protect interrupt mask values
  244. * @alarm_mask: alarm configuration
  245. * @current_masked_alarm: currently masked due to alarm
  246. * @intr_mask: interrupt configuration
  247. * @ams_unmask_work: re-enables event once the event condition disappears
  248. *
  249. */
  250. struct ams {
  251. void __iomem *base;
  252. void __iomem *ps_base;
  253. void __iomem *pl_base;
  254. struct clk *clk;
  255. struct device *dev;
  256. struct mutex lock;
  257. spinlock_t intr_lock;
  258. unsigned int alarm_mask;
  259. unsigned int current_masked_alarm;
  260. u64 intr_mask;
  261. struct delayed_work ams_unmask_work;
  262. };
  263. static inline void ams_ps_update_reg(struct ams *ams, unsigned int offset,
  264. u32 mask, u32 data)
  265. {
  266. u32 val, regval;
  267. val = readl(ams->ps_base + offset);
  268. regval = (val & ~mask) | (data & mask);
  269. writel(regval, ams->ps_base + offset);
  270. }
  271. static inline void ams_pl_update_reg(struct ams *ams, unsigned int offset,
  272. u32 mask, u32 data)
  273. {
  274. u32 val, regval;
  275. val = readl(ams->pl_base + offset);
  276. regval = (val & ~mask) | (data & mask);
  277. writel(regval, ams->pl_base + offset);
  278. }
  279. static void ams_update_intrmask(struct ams *ams, u64 mask, u64 val)
  280. {
  281. u32 regval;
  282. ams->intr_mask = (ams->intr_mask & ~mask) | (val & mask);
  283. regval = ~(ams->intr_mask | ams->current_masked_alarm);
  284. writel(regval, ams->base + AMS_IER_0);
  285. regval = ~(FIELD_GET(AMS_ISR1_INTR_MASK, ams->intr_mask));
  286. writel(regval, ams->base + AMS_IER_1);
  287. regval = ams->intr_mask | ams->current_masked_alarm;
  288. writel(regval, ams->base + AMS_IDR_0);
  289. regval = FIELD_GET(AMS_ISR1_INTR_MASK, ams->intr_mask);
  290. writel(regval, ams->base + AMS_IDR_1);
  291. }
  292. static void ams_disable_all_alarms(struct ams *ams)
  293. {
  294. /* disable PS module alarm */
  295. if (ams->ps_base) {
  296. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_REGCFG1_ALARM_MASK,
  297. AMS_REGCFG1_ALARM_MASK);
  298. ams_ps_update_reg(ams, AMS_REG_CONFIG3, AMS_REGCFG3_ALARM_MASK,
  299. AMS_REGCFG3_ALARM_MASK);
  300. }
  301. /* disable PL module alarm */
  302. if (ams->pl_base) {
  303. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_REGCFG1_ALARM_MASK,
  304. AMS_REGCFG1_ALARM_MASK);
  305. ams_pl_update_reg(ams, AMS_REG_CONFIG3, AMS_REGCFG3_ALARM_MASK,
  306. AMS_REGCFG3_ALARM_MASK);
  307. }
  308. }
  309. static void ams_update_ps_alarm(struct ams *ams, unsigned long alarm_mask)
  310. {
  311. u32 cfg;
  312. u32 val;
  313. val = FIELD_GET(AMS_ISR0_ALARM_2_TO_0_MASK, alarm_mask);
  314. cfg = ~(FIELD_PREP(AMS_CONF1_ALARM_2_TO_0_MASK, val));
  315. val = FIELD_GET(AMS_ISR0_ALARM_6_TO_3_MASK, alarm_mask);
  316. cfg &= ~(FIELD_PREP(AMS_CONF1_ALARM_6_TO_3_MASK, val));
  317. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_REGCFG1_ALARM_MASK, cfg);
  318. val = FIELD_GET(AMS_ISR0_ALARM_12_TO_7_MASK, alarm_mask);
  319. cfg = ~(FIELD_PREP(AMS_CONF1_ALARM_12_TO_7_MASK, val));
  320. ams_ps_update_reg(ams, AMS_REG_CONFIG3, AMS_REGCFG3_ALARM_MASK, cfg);
  321. }
  322. static void ams_update_pl_alarm(struct ams *ams, unsigned long alarm_mask)
  323. {
  324. unsigned long pl_alarm_mask;
  325. u32 cfg;
  326. u32 val;
  327. pl_alarm_mask = FIELD_GET(AMS_PL_ALARM_MASK, alarm_mask);
  328. val = FIELD_GET(AMS_ISR0_ALARM_2_TO_0_MASK, pl_alarm_mask);
  329. cfg = ~(FIELD_PREP(AMS_CONF1_ALARM_2_TO_0_MASK, val));
  330. val = FIELD_GET(AMS_ISR0_ALARM_6_TO_3_MASK, pl_alarm_mask);
  331. cfg &= ~(FIELD_PREP(AMS_CONF1_ALARM_6_TO_3_MASK, val));
  332. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_REGCFG1_ALARM_MASK, cfg);
  333. val = FIELD_GET(AMS_ISR0_ALARM_12_TO_7_MASK, pl_alarm_mask);
  334. cfg = ~(FIELD_PREP(AMS_CONF1_ALARM_12_TO_7_MASK, val));
  335. ams_pl_update_reg(ams, AMS_REG_CONFIG3, AMS_REGCFG3_ALARM_MASK, cfg);
  336. }
  337. static void ams_update_alarm(struct ams *ams, unsigned long alarm_mask)
  338. {
  339. unsigned long flags;
  340. if (ams->ps_base)
  341. ams_update_ps_alarm(ams, alarm_mask);
  342. if (ams->pl_base)
  343. ams_update_pl_alarm(ams, alarm_mask);
  344. spin_lock_irqsave(&ams->intr_lock, flags);
  345. ams_update_intrmask(ams, AMS_ISR0_ALARM_MASK, ~alarm_mask);
  346. spin_unlock_irqrestore(&ams->intr_lock, flags);
  347. }
  348. static void ams_enable_channel_sequence(struct iio_dev *indio_dev)
  349. {
  350. struct ams *ams = iio_priv(indio_dev);
  351. unsigned long long scan_mask;
  352. int i;
  353. u32 regval;
  354. /*
  355. * Enable channel sequence. First 22 bits of scan_mask represent
  356. * PS channels, and next remaining bits represent PL channels.
  357. */
  358. /* Run calibration of PS & PL as part of the sequence */
  359. scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
  360. for (i = 0; i < indio_dev->num_channels; i++) {
  361. const struct iio_chan_spec *chan = &indio_dev->channels[i];
  362. if (chan->scan_index < AMS_CTRL_SEQ_BASE)
  363. scan_mask |= BIT_ULL(chan->scan_index);
  364. }
  365. if (ams->ps_base) {
  366. /* put sysmon in a soft reset to change the sequence */
  367. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  368. AMS_CONF1_SEQ_DEFAULT);
  369. /* configure basic channels */
  370. regval = FIELD_GET(AMS_REG_SEQ0_MASK, scan_mask);
  371. writel(regval, ams->ps_base + AMS_REG_SEQ_CH0);
  372. regval = FIELD_GET(AMS_REG_SEQ2_MASK, scan_mask);
  373. writel(regval, ams->ps_base + AMS_REG_SEQ_CH2);
  374. /* set continuous sequence mode */
  375. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  376. AMS_CONF1_SEQ_CONTINUOUS);
  377. }
  378. if (ams->pl_base) {
  379. /* put sysmon in a soft reset to change the sequence */
  380. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  381. AMS_CONF1_SEQ_DEFAULT);
  382. /* configure basic channels */
  383. scan_mask = FIELD_GET(AMS_PL_SEQ_MASK, scan_mask);
  384. regval = FIELD_GET(AMS_REG_SEQ0_MASK, scan_mask);
  385. writel(regval, ams->pl_base + AMS_REG_SEQ_CH0);
  386. regval = FIELD_GET(AMS_REG_SEQ1_MASK, scan_mask);
  387. writel(regval, ams->pl_base + AMS_REG_SEQ_CH1);
  388. regval = FIELD_GET(AMS_REG_SEQ2_MASK, scan_mask);
  389. writel(regval, ams->pl_base + AMS_REG_SEQ_CH2);
  390. /* set continuous sequence mode */
  391. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  392. AMS_CONF1_SEQ_CONTINUOUS);
  393. }
  394. }
  395. static int ams_init_device(struct ams *ams)
  396. {
  397. u32 expect = AMS_PS_CSTS_PS_READY;
  398. u32 reg, value;
  399. int ret;
  400. /* reset AMS */
  401. if (ams->ps_base) {
  402. writel(AMS_PS_RESET_VALUE, ams->ps_base + AMS_VP_VN);
  403. ret = readl_poll_timeout(ams->base + AMS_PS_CSTS, reg, (reg & expect),
  404. AMS_INIT_POLL_TIME_US, AMS_INIT_TIMEOUT_US);
  405. if (ret)
  406. return ret;
  407. /* put sysmon in a default state */
  408. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  409. AMS_CONF1_SEQ_DEFAULT);
  410. }
  411. if (ams->pl_base) {
  412. value = readl(ams->base + AMS_PL_CSTS);
  413. if (value == 0)
  414. return 0;
  415. writel(AMS_PL_RESET_VALUE, ams->pl_base + AMS_VP_VN);
  416. /* put sysmon in a default state */
  417. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  418. AMS_CONF1_SEQ_DEFAULT);
  419. }
  420. ams_disable_all_alarms(ams);
  421. /* Disable interrupt */
  422. ams_update_intrmask(ams, AMS_ALARM_MASK, AMS_ALARM_MASK);
  423. /* Clear any pending interrupt */
  424. writel(AMS_ISR0_ALARM_MASK, ams->base + AMS_ISR_0);
  425. writel(AMS_ISR1_ALARM_MASK, ams->base + AMS_ISR_1);
  426. return 0;
  427. }
  428. static int ams_read_label(struct iio_dev *indio_dev,
  429. struct iio_chan_spec const *chan, char *label)
  430. {
  431. return sysfs_emit(label, "%s\n", chan->datasheet_name);
  432. }
  433. static int ams_enable_single_channel(struct ams *ams, unsigned int offset)
  434. {
  435. u8 channel_num;
  436. switch (offset) {
  437. case AMS_VCC_PSPLL0:
  438. channel_num = AMS_VCC_PSPLL0_CH;
  439. break;
  440. case AMS_VCC_PSPLL3:
  441. channel_num = AMS_VCC_PSPLL3_CH;
  442. break;
  443. case AMS_VCCINT:
  444. channel_num = AMS_VCCINT_CH;
  445. break;
  446. case AMS_VCCBRAM:
  447. channel_num = AMS_VCCBRAM_CH;
  448. break;
  449. case AMS_VCCAUX:
  450. channel_num = AMS_VCCAUX_CH;
  451. break;
  452. case AMS_PSDDRPLL:
  453. channel_num = AMS_PSDDRPLL_CH;
  454. break;
  455. case AMS_PSINTFPDDR:
  456. channel_num = AMS_PSINTFPDDR_CH;
  457. break;
  458. default:
  459. return -EINVAL;
  460. }
  461. /* put sysmon in a soft reset to change the sequence */
  462. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  463. AMS_CONF1_SEQ_DEFAULT);
  464. /* write the channel number */
  465. ams_ps_update_reg(ams, AMS_REG_CONFIG0, AMS_CONF0_CHANNEL_NUM_MASK,
  466. channel_num);
  467. /* set single channel, sequencer off mode */
  468. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  469. AMS_CONF1_SEQ_SINGLE_CHANNEL);
  470. return 0;
  471. }
  472. static int ams_read_vcc_reg(struct ams *ams, unsigned int offset, u32 *data)
  473. {
  474. u32 expect = AMS_ISR1_EOC_MASK;
  475. u32 reg;
  476. int ret;
  477. ret = ams_enable_single_channel(ams, offset);
  478. if (ret)
  479. return ret;
  480. /* clear end-of-conversion flag, wait for next conversion to complete */
  481. writel(expect, ams->base + AMS_ISR_1);
  482. ret = readl_poll_timeout(ams->base + AMS_ISR_1, reg, (reg & expect),
  483. AMS_INIT_POLL_TIME_US, AMS_INIT_TIMEOUT_US);
  484. if (ret)
  485. return ret;
  486. *data = readl(ams->base + offset);
  487. return 0;
  488. }
  489. static int ams_get_ps_scale(int address)
  490. {
  491. int val;
  492. switch (address) {
  493. case AMS_SUPPLY1:
  494. case AMS_SUPPLY2:
  495. case AMS_SUPPLY3:
  496. case AMS_SUPPLY4:
  497. case AMS_SUPPLY9:
  498. case AMS_SUPPLY10:
  499. case AMS_VCCAMS:
  500. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  501. break;
  502. case AMS_SUPPLY5:
  503. case AMS_SUPPLY6:
  504. case AMS_SUPPLY7:
  505. case AMS_SUPPLY8:
  506. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  507. break;
  508. default:
  509. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  510. break;
  511. }
  512. return val;
  513. }
  514. static int ams_get_pl_scale(struct ams *ams, int address)
  515. {
  516. int val, regval;
  517. switch (address) {
  518. case AMS_SUPPLY1:
  519. case AMS_SUPPLY2:
  520. case AMS_SUPPLY3:
  521. case AMS_SUPPLY4:
  522. case AMS_SUPPLY5:
  523. case AMS_SUPPLY6:
  524. case AMS_VCCAMS:
  525. case AMS_VREFP:
  526. case AMS_VREFN:
  527. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  528. break;
  529. case AMS_SUPPLY7:
  530. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  531. if (FIELD_GET(AMS_VUSER0_MASK, regval))
  532. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  533. else
  534. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  535. break;
  536. case AMS_SUPPLY8:
  537. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  538. if (FIELD_GET(AMS_VUSER1_MASK, regval))
  539. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  540. else
  541. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  542. break;
  543. case AMS_SUPPLY9:
  544. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  545. if (FIELD_GET(AMS_VUSER2_MASK, regval))
  546. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  547. else
  548. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  549. break;
  550. case AMS_SUPPLY10:
  551. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  552. if (FIELD_GET(AMS_VUSER3_MASK, regval))
  553. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  554. else
  555. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  556. break;
  557. case AMS_VP_VN:
  558. case AMS_REG_VAUX(0) ... AMS_REG_VAUX(15):
  559. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  560. break;
  561. default:
  562. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  563. break;
  564. }
  565. return val;
  566. }
  567. static int ams_get_ctrl_scale(int address)
  568. {
  569. int val;
  570. switch (address) {
  571. case AMS_VCC_PSPLL0:
  572. case AMS_VCC_PSPLL3:
  573. case AMS_VCCINT:
  574. case AMS_VCCBRAM:
  575. case AMS_VCCAUX:
  576. case AMS_PSDDRPLL:
  577. case AMS_PSINTFPDDR:
  578. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  579. break;
  580. default:
  581. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  582. break;
  583. }
  584. return val;
  585. }
  586. static int ams_read_raw(struct iio_dev *indio_dev,
  587. struct iio_chan_spec const *chan,
  588. int *val, int *val2, long mask)
  589. {
  590. struct ams *ams = iio_priv(indio_dev);
  591. int ret;
  592. switch (mask) {
  593. case IIO_CHAN_INFO_RAW:
  594. mutex_lock(&ams->lock);
  595. if (chan->scan_index >= AMS_CTRL_SEQ_BASE) {
  596. ret = ams_read_vcc_reg(ams, chan->address, val);
  597. if (ret)
  598. goto unlock_mutex;
  599. ams_enable_channel_sequence(indio_dev);
  600. } else if (chan->scan_index >= AMS_PS_SEQ_MAX)
  601. *val = readl(ams->pl_base + chan->address);
  602. else
  603. *val = readl(ams->ps_base + chan->address);
  604. ret = IIO_VAL_INT;
  605. unlock_mutex:
  606. mutex_unlock(&ams->lock);
  607. return ret;
  608. case IIO_CHAN_INFO_SCALE:
  609. switch (chan->type) {
  610. case IIO_VOLTAGE:
  611. if (chan->scan_index < AMS_PS_SEQ_MAX)
  612. *val = ams_get_ps_scale(chan->address);
  613. else if (chan->scan_index >= AMS_PS_SEQ_MAX &&
  614. chan->scan_index < AMS_CTRL_SEQ_BASE)
  615. *val = ams_get_pl_scale(ams, chan->address);
  616. else
  617. *val = ams_get_ctrl_scale(chan->address);
  618. *val2 = AMS_SUPPLY_SCALE_DIV_BIT;
  619. return IIO_VAL_FRACTIONAL_LOG2;
  620. case IIO_TEMP:
  621. *val = AMS_TEMP_SCALE;
  622. *val2 = AMS_TEMP_SCALE_DIV_BIT;
  623. return IIO_VAL_FRACTIONAL_LOG2;
  624. default:
  625. return -EINVAL;
  626. }
  627. case IIO_CHAN_INFO_OFFSET:
  628. /* Only the temperature channel has an offset */
  629. *val = AMS_TEMP_OFFSET;
  630. return IIO_VAL_INT;
  631. default:
  632. return -EINVAL;
  633. }
  634. }
  635. static int ams_get_alarm_offset(int scan_index, enum iio_event_direction dir)
  636. {
  637. int offset;
  638. if (scan_index >= AMS_PS_SEQ_MAX)
  639. scan_index -= AMS_PS_SEQ_MAX;
  640. if (dir == IIO_EV_DIR_FALLING) {
  641. if (scan_index < AMS_SEQ_SUPPLY7)
  642. offset = AMS_ALARM_THRESHOLD_OFF_10;
  643. else
  644. offset = AMS_ALARM_THRESHOLD_OFF_20;
  645. } else {
  646. offset = 0;
  647. }
  648. switch (scan_index) {
  649. case AMS_SEQ_TEMP:
  650. return AMS_ALARM_TEMP + offset;
  651. case AMS_SEQ_SUPPLY1:
  652. return AMS_ALARM_SUPPLY1 + offset;
  653. case AMS_SEQ_SUPPLY2:
  654. return AMS_ALARM_SUPPLY2 + offset;
  655. case AMS_SEQ_SUPPLY3:
  656. return AMS_ALARM_SUPPLY3 + offset;
  657. case AMS_SEQ_SUPPLY4:
  658. return AMS_ALARM_SUPPLY4 + offset;
  659. case AMS_SEQ_SUPPLY5:
  660. return AMS_ALARM_SUPPLY5 + offset;
  661. case AMS_SEQ_SUPPLY6:
  662. return AMS_ALARM_SUPPLY6 + offset;
  663. case AMS_SEQ_SUPPLY7:
  664. return AMS_ALARM_SUPPLY7 + offset;
  665. case AMS_SEQ_SUPPLY8:
  666. return AMS_ALARM_SUPPLY8 + offset;
  667. case AMS_SEQ_SUPPLY9:
  668. return AMS_ALARM_SUPPLY9 + offset;
  669. case AMS_SEQ_SUPPLY10:
  670. return AMS_ALARM_SUPPLY10 + offset;
  671. case AMS_SEQ_VCCAMS:
  672. return AMS_ALARM_VCCAMS + offset;
  673. case AMS_SEQ_TEMP_REMOTE:
  674. return AMS_ALARM_TEMP_REMOTE + offset;
  675. default:
  676. return 0;
  677. }
  678. }
  679. static const struct iio_chan_spec *ams_event_to_channel(struct iio_dev *dev,
  680. u32 event)
  681. {
  682. int scan_index = 0, i;
  683. if (event >= AMS_PL_ALARM_START) {
  684. event -= AMS_PL_ALARM_START;
  685. scan_index = AMS_PS_SEQ_MAX;
  686. }
  687. switch (event) {
  688. case AMS_ALARM_BIT_TEMP:
  689. scan_index += AMS_SEQ_TEMP;
  690. break;
  691. case AMS_ALARM_BIT_SUPPLY1:
  692. scan_index += AMS_SEQ_SUPPLY1;
  693. break;
  694. case AMS_ALARM_BIT_SUPPLY2:
  695. scan_index += AMS_SEQ_SUPPLY2;
  696. break;
  697. case AMS_ALARM_BIT_SUPPLY3:
  698. scan_index += AMS_SEQ_SUPPLY3;
  699. break;
  700. case AMS_ALARM_BIT_SUPPLY4:
  701. scan_index += AMS_SEQ_SUPPLY4;
  702. break;
  703. case AMS_ALARM_BIT_SUPPLY5:
  704. scan_index += AMS_SEQ_SUPPLY5;
  705. break;
  706. case AMS_ALARM_BIT_SUPPLY6:
  707. scan_index += AMS_SEQ_SUPPLY6;
  708. break;
  709. case AMS_ALARM_BIT_SUPPLY7:
  710. scan_index += AMS_SEQ_SUPPLY7;
  711. break;
  712. case AMS_ALARM_BIT_SUPPLY8:
  713. scan_index += AMS_SEQ_SUPPLY8;
  714. break;
  715. case AMS_ALARM_BIT_SUPPLY9:
  716. scan_index += AMS_SEQ_SUPPLY9;
  717. break;
  718. case AMS_ALARM_BIT_SUPPLY10:
  719. scan_index += AMS_SEQ_SUPPLY10;
  720. break;
  721. case AMS_ALARM_BIT_VCCAMS:
  722. scan_index += AMS_SEQ_VCCAMS;
  723. break;
  724. case AMS_ALARM_BIT_TEMP_REMOTE:
  725. scan_index += AMS_SEQ_TEMP_REMOTE;
  726. break;
  727. default:
  728. break;
  729. }
  730. for (i = 0; i < dev->num_channels; i++)
  731. if (dev->channels[i].scan_index == scan_index)
  732. break;
  733. return &dev->channels[i];
  734. }
  735. static int ams_get_alarm_mask(int scan_index)
  736. {
  737. int bit = 0;
  738. if (scan_index >= AMS_PS_SEQ_MAX) {
  739. bit = AMS_PL_ALARM_START;
  740. scan_index -= AMS_PS_SEQ_MAX;
  741. }
  742. switch (scan_index) {
  743. case AMS_SEQ_TEMP:
  744. return BIT(AMS_ALARM_BIT_TEMP + bit);
  745. case AMS_SEQ_SUPPLY1:
  746. return BIT(AMS_ALARM_BIT_SUPPLY1 + bit);
  747. case AMS_SEQ_SUPPLY2:
  748. return BIT(AMS_ALARM_BIT_SUPPLY2 + bit);
  749. case AMS_SEQ_SUPPLY3:
  750. return BIT(AMS_ALARM_BIT_SUPPLY3 + bit);
  751. case AMS_SEQ_SUPPLY4:
  752. return BIT(AMS_ALARM_BIT_SUPPLY4 + bit);
  753. case AMS_SEQ_SUPPLY5:
  754. return BIT(AMS_ALARM_BIT_SUPPLY5 + bit);
  755. case AMS_SEQ_SUPPLY6:
  756. return BIT(AMS_ALARM_BIT_SUPPLY6 + bit);
  757. case AMS_SEQ_SUPPLY7:
  758. return BIT(AMS_ALARM_BIT_SUPPLY7 + bit);
  759. case AMS_SEQ_SUPPLY8:
  760. return BIT(AMS_ALARM_BIT_SUPPLY8 + bit);
  761. case AMS_SEQ_SUPPLY9:
  762. return BIT(AMS_ALARM_BIT_SUPPLY9 + bit);
  763. case AMS_SEQ_SUPPLY10:
  764. return BIT(AMS_ALARM_BIT_SUPPLY10 + bit);
  765. case AMS_SEQ_VCCAMS:
  766. return BIT(AMS_ALARM_BIT_VCCAMS + bit);
  767. case AMS_SEQ_TEMP_REMOTE:
  768. return BIT(AMS_ALARM_BIT_TEMP_REMOTE + bit);
  769. default:
  770. return 0;
  771. }
  772. }
  773. static int ams_read_event_config(struct iio_dev *indio_dev,
  774. const struct iio_chan_spec *chan,
  775. enum iio_event_type type,
  776. enum iio_event_direction dir)
  777. {
  778. struct ams *ams = iio_priv(indio_dev);
  779. return !!(ams->alarm_mask & ams_get_alarm_mask(chan->scan_index));
  780. }
  781. static int ams_write_event_config(struct iio_dev *indio_dev,
  782. const struct iio_chan_spec *chan,
  783. enum iio_event_type type,
  784. enum iio_event_direction dir,
  785. int state)
  786. {
  787. struct ams *ams = iio_priv(indio_dev);
  788. unsigned int alarm;
  789. alarm = ams_get_alarm_mask(chan->scan_index);
  790. mutex_lock(&ams->lock);
  791. if (state)
  792. ams->alarm_mask |= alarm;
  793. else
  794. ams->alarm_mask &= ~alarm;
  795. ams_update_alarm(ams, ams->alarm_mask);
  796. mutex_unlock(&ams->lock);
  797. return 0;
  798. }
  799. static int ams_read_event_value(struct iio_dev *indio_dev,
  800. const struct iio_chan_spec *chan,
  801. enum iio_event_type type,
  802. enum iio_event_direction dir,
  803. enum iio_event_info info, int *val, int *val2)
  804. {
  805. struct ams *ams = iio_priv(indio_dev);
  806. unsigned int offset = ams_get_alarm_offset(chan->scan_index, dir);
  807. mutex_lock(&ams->lock);
  808. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  809. *val = readl(ams->pl_base + offset);
  810. else
  811. *val = readl(ams->ps_base + offset);
  812. mutex_unlock(&ams->lock);
  813. return IIO_VAL_INT;
  814. }
  815. static int ams_write_event_value(struct iio_dev *indio_dev,
  816. const struct iio_chan_spec *chan,
  817. enum iio_event_type type,
  818. enum iio_event_direction dir,
  819. enum iio_event_info info, int val, int val2)
  820. {
  821. struct ams *ams = iio_priv(indio_dev);
  822. unsigned int offset;
  823. mutex_lock(&ams->lock);
  824. /* Set temperature channel threshold to direct threshold */
  825. if (chan->type == IIO_TEMP) {
  826. offset = ams_get_alarm_offset(chan->scan_index, IIO_EV_DIR_FALLING);
  827. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  828. ams_pl_update_reg(ams, offset,
  829. AMS_ALARM_THR_DIRECT_MASK,
  830. AMS_ALARM_THR_DIRECT_MASK);
  831. else
  832. ams_ps_update_reg(ams, offset,
  833. AMS_ALARM_THR_DIRECT_MASK,
  834. AMS_ALARM_THR_DIRECT_MASK);
  835. }
  836. offset = ams_get_alarm_offset(chan->scan_index, dir);
  837. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  838. writel(val, ams->pl_base + offset);
  839. else
  840. writel(val, ams->ps_base + offset);
  841. mutex_unlock(&ams->lock);
  842. return 0;
  843. }
  844. static void ams_handle_event(struct iio_dev *indio_dev, u32 event)
  845. {
  846. const struct iio_chan_spec *chan;
  847. chan = ams_event_to_channel(indio_dev, event);
  848. if (chan->type == IIO_TEMP) {
  849. /*
  850. * The temperature channel only supports over-temperature
  851. * events.
  852. */
  853. iio_push_event(indio_dev,
  854. IIO_UNMOD_EVENT_CODE(chan->type, chan->channel,
  855. IIO_EV_TYPE_THRESH,
  856. IIO_EV_DIR_RISING),
  857. iio_get_time_ns(indio_dev));
  858. } else {
  859. /*
  860. * For other channels we don't know whether it is a upper or
  861. * lower threshold event. Userspace will have to check the
  862. * channel value if it wants to know.
  863. */
  864. iio_push_event(indio_dev,
  865. IIO_UNMOD_EVENT_CODE(chan->type, chan->channel,
  866. IIO_EV_TYPE_THRESH,
  867. IIO_EV_DIR_EITHER),
  868. iio_get_time_ns(indio_dev));
  869. }
  870. }
  871. static void ams_handle_events(struct iio_dev *indio_dev, unsigned long events)
  872. {
  873. unsigned int bit;
  874. for_each_set_bit(bit, &events, AMS_NO_OF_ALARMS)
  875. ams_handle_event(indio_dev, bit);
  876. }
  877. /**
  878. * ams_unmask_worker - ams alarm interrupt unmask worker
  879. * @work: work to be done
  880. *
  881. * The ZynqMP threshold interrupts are level sensitive. Since we can't make the
  882. * threshold condition go way from within the interrupt handler, this means as
  883. * soon as a threshold condition is present we would enter the interrupt handler
  884. * again and again. To work around this we mask all active threshold interrupts
  885. * in the interrupt handler and start a timer. In this timer we poll the
  886. * interrupt status and only if the interrupt is inactive we unmask it again.
  887. */
  888. static void ams_unmask_worker(struct work_struct *work)
  889. {
  890. struct ams *ams = container_of(work, struct ams, ams_unmask_work.work);
  891. unsigned int status, unmask;
  892. spin_lock_irq(&ams->intr_lock);
  893. status = readl(ams->base + AMS_ISR_0);
  894. /* Clear those bits which are not active anymore */
  895. unmask = (ams->current_masked_alarm ^ status) & ams->current_masked_alarm;
  896. /* Clear status of disabled alarm */
  897. unmask |= ams->intr_mask;
  898. ams->current_masked_alarm &= status;
  899. /* Also clear those which are masked out anyway */
  900. ams->current_masked_alarm &= ~ams->intr_mask;
  901. /* Clear the interrupts before we unmask them */
  902. writel(unmask, ams->base + AMS_ISR_0);
  903. ams_update_intrmask(ams, ~AMS_ALARM_MASK, ~AMS_ALARM_MASK);
  904. spin_unlock_irq(&ams->intr_lock);
  905. /* If still pending some alarm re-trigger the timer */
  906. if (ams->current_masked_alarm)
  907. schedule_delayed_work(&ams->ams_unmask_work,
  908. msecs_to_jiffies(AMS_UNMASK_TIMEOUT_MS));
  909. }
  910. static irqreturn_t ams_irq(int irq, void *data)
  911. {
  912. struct iio_dev *indio_dev = data;
  913. struct ams *ams = iio_priv(indio_dev);
  914. u32 isr0;
  915. spin_lock(&ams->intr_lock);
  916. isr0 = readl(ams->base + AMS_ISR_0);
  917. /* Only process alarms that are not masked */
  918. isr0 &= ~((ams->intr_mask & AMS_ISR0_ALARM_MASK) | ams->current_masked_alarm);
  919. if (!isr0) {
  920. spin_unlock(&ams->intr_lock);
  921. return IRQ_NONE;
  922. }
  923. /* Clear interrupt */
  924. writel(isr0, ams->base + AMS_ISR_0);
  925. /* Mask the alarm interrupts until cleared */
  926. ams->current_masked_alarm |= isr0;
  927. ams_update_intrmask(ams, ~AMS_ALARM_MASK, ~AMS_ALARM_MASK);
  928. ams_handle_events(indio_dev, isr0);
  929. schedule_delayed_work(&ams->ams_unmask_work,
  930. msecs_to_jiffies(AMS_UNMASK_TIMEOUT_MS));
  931. spin_unlock(&ams->intr_lock);
  932. return IRQ_HANDLED;
  933. }
  934. static const struct iio_event_spec ams_temp_events[] = {
  935. {
  936. .type = IIO_EV_TYPE_THRESH,
  937. .dir = IIO_EV_DIR_RISING,
  938. .mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
  939. },
  940. };
  941. static const struct iio_event_spec ams_voltage_events[] = {
  942. {
  943. .type = IIO_EV_TYPE_THRESH,
  944. .dir = IIO_EV_DIR_RISING,
  945. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  946. },
  947. {
  948. .type = IIO_EV_TYPE_THRESH,
  949. .dir = IIO_EV_DIR_FALLING,
  950. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  951. },
  952. {
  953. .type = IIO_EV_TYPE_THRESH,
  954. .dir = IIO_EV_DIR_EITHER,
  955. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  956. },
  957. };
  958. static const struct iio_chan_spec ams_ps_channels[] = {
  959. AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_LPD"),
  960. AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP_REMOTE, AMS_TEMP_REMOTE, "Temp_FPD"),
  961. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, "VCC_PSINTLP"),
  962. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, "VCC_PSINTFP"),
  963. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, "VCC_PSAUX"),
  964. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, "VCC_PSDDR"),
  965. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, "VCC_PSIO3"),
  966. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, "VCC_PSIO0"),
  967. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, "VCC_PSIO1"),
  968. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, "VCC_PSIO2"),
  969. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, "PS_MGTRAVCC"),
  970. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, "PS_MGTRAVTT"),
  971. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, "VCC_PSADC"),
  972. };
  973. static const struct iio_chan_spec ams_pl_channels[] = {
  974. AMS_PL_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_PL"),
  975. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, true, "VCCINT"),
  976. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, true, "VCCAUX"),
  977. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFP, AMS_VREFP, false, "VREFP"),
  978. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFN, AMS_VREFN, false, "VREFN"),
  979. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, true, "VCCBRAM"),
  980. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, true, "VCC_PSINTLP"),
  981. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, true, "VCC_PSINTFP"),
  982. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, true, "VCC_PSAUX"),
  983. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, true, "VCCAMS"),
  984. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VP_VN, AMS_VP_VN, false, "VP_VN"),
  985. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, true, "VUser0"),
  986. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, true, "VUser1"),
  987. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, true, "VUser2"),
  988. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, true, "VUser3"),
  989. AMS_PL_AUX_CHAN_VOLTAGE(0),
  990. AMS_PL_AUX_CHAN_VOLTAGE(1),
  991. AMS_PL_AUX_CHAN_VOLTAGE(2),
  992. AMS_PL_AUX_CHAN_VOLTAGE(3),
  993. AMS_PL_AUX_CHAN_VOLTAGE(4),
  994. AMS_PL_AUX_CHAN_VOLTAGE(5),
  995. AMS_PL_AUX_CHAN_VOLTAGE(6),
  996. AMS_PL_AUX_CHAN_VOLTAGE(7),
  997. AMS_PL_AUX_CHAN_VOLTAGE(8),
  998. AMS_PL_AUX_CHAN_VOLTAGE(9),
  999. AMS_PL_AUX_CHAN_VOLTAGE(10),
  1000. AMS_PL_AUX_CHAN_VOLTAGE(11),
  1001. AMS_PL_AUX_CHAN_VOLTAGE(12),
  1002. AMS_PL_AUX_CHAN_VOLTAGE(13),
  1003. AMS_PL_AUX_CHAN_VOLTAGE(14),
  1004. AMS_PL_AUX_CHAN_VOLTAGE(15),
  1005. };
  1006. static const struct iio_chan_spec ams_ctrl_channels[] = {
  1007. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSPLL, AMS_VCC_PSPLL0, "VCC_PSPLL"),
  1008. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSBATT, AMS_VCC_PSPLL3, "VCC_PSBATT"),
  1009. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCINT, AMS_VCCINT, "VCCINT"),
  1010. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCBRAM, AMS_VCCBRAM, "VCCBRAM"),
  1011. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCAUX, AMS_VCCAUX, "VCCAUX"),
  1012. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_PSDDRPLL, AMS_PSDDRPLL, "VCC_PSDDR_PLL"),
  1013. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_INTDDR, AMS_PSINTFPDDR, "VCC_PSINTFP_DDR"),
  1014. };
  1015. static int ams_get_ext_chan(struct fwnode_handle *chan_node,
  1016. struct iio_chan_spec *channels, int num_channels)
  1017. {
  1018. struct iio_chan_spec *chan;
  1019. struct fwnode_handle *child;
  1020. unsigned int reg, ext_chan;
  1021. int ret;
  1022. fwnode_for_each_child_node(chan_node, child) {
  1023. ret = fwnode_property_read_u32(child, "reg", &reg);
  1024. if (ret || reg > AMS_PL_MAX_EXT_CHANNEL + 30)
  1025. continue;
  1026. chan = &channels[num_channels];
  1027. ext_chan = reg + AMS_PL_MAX_FIXED_CHANNEL - 30;
  1028. memcpy(chan, &ams_pl_channels[ext_chan], sizeof(*channels));
  1029. if (fwnode_property_read_bool(child, "xlnx,bipolar"))
  1030. chan->scan_type.sign = 's';
  1031. num_channels++;
  1032. }
  1033. return num_channels;
  1034. }
  1035. static void ams_iounmap_ps(void *data)
  1036. {
  1037. struct ams *ams = data;
  1038. iounmap(ams->ps_base);
  1039. }
  1040. static void ams_iounmap_pl(void *data)
  1041. {
  1042. struct ams *ams = data;
  1043. iounmap(ams->pl_base);
  1044. }
  1045. static int ams_init_module(struct iio_dev *indio_dev,
  1046. struct fwnode_handle *fwnode,
  1047. struct iio_chan_spec *channels)
  1048. {
  1049. struct device *dev = indio_dev->dev.parent;
  1050. struct ams *ams = iio_priv(indio_dev);
  1051. int num_channels = 0;
  1052. int ret;
  1053. if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams-ps")) {
  1054. ams->ps_base = fwnode_iomap(fwnode, 0);
  1055. if (!ams->ps_base)
  1056. return -ENXIO;
  1057. ret = devm_add_action_or_reset(dev, ams_iounmap_ps, ams);
  1058. if (ret < 0)
  1059. return ret;
  1060. /* add PS channels to iio device channels */
  1061. memcpy(channels, ams_ps_channels, sizeof(ams_ps_channels));
  1062. num_channels = ARRAY_SIZE(ams_ps_channels);
  1063. } else if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams-pl")) {
  1064. ams->pl_base = fwnode_iomap(fwnode, 0);
  1065. if (!ams->pl_base)
  1066. return -ENXIO;
  1067. ret = devm_add_action_or_reset(dev, ams_iounmap_pl, ams);
  1068. if (ret < 0)
  1069. return ret;
  1070. /* Copy only first 10 fix channels */
  1071. memcpy(channels, ams_pl_channels, AMS_PL_MAX_FIXED_CHANNEL * sizeof(*channels));
  1072. num_channels += AMS_PL_MAX_FIXED_CHANNEL;
  1073. num_channels = ams_get_ext_chan(fwnode, channels,
  1074. num_channels);
  1075. } else if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams")) {
  1076. /* add AMS channels to iio device channels */
  1077. memcpy(channels, ams_ctrl_channels, sizeof(ams_ctrl_channels));
  1078. num_channels += ARRAY_SIZE(ams_ctrl_channels);
  1079. } else {
  1080. return -EINVAL;
  1081. }
  1082. return num_channels;
  1083. }
  1084. static int ams_parse_firmware(struct iio_dev *indio_dev)
  1085. {
  1086. struct ams *ams = iio_priv(indio_dev);
  1087. struct iio_chan_spec *ams_channels, *dev_channels;
  1088. struct device *dev = indio_dev->dev.parent;
  1089. struct fwnode_handle *fwnode = dev_fwnode(dev);
  1090. size_t ams_size;
  1091. int ret, ch_cnt = 0, i, rising_off, falling_off;
  1092. unsigned int num_channels = 0;
  1093. ams_size = ARRAY_SIZE(ams_ps_channels) + ARRAY_SIZE(ams_pl_channels) +
  1094. ARRAY_SIZE(ams_ctrl_channels);
  1095. /* Initialize buffer for channel specification */
  1096. ams_channels = devm_kcalloc(dev, ams_size, sizeof(*ams_channels), GFP_KERNEL);
  1097. if (!ams_channels)
  1098. return -ENOMEM;
  1099. if (fwnode_device_is_available(fwnode)) {
  1100. ret = ams_init_module(indio_dev, fwnode, ams_channels);
  1101. if (ret < 0)
  1102. return ret;
  1103. num_channels += ret;
  1104. }
  1105. device_for_each_child_node_scoped(dev, child) {
  1106. ret = ams_init_module(indio_dev, child, ams_channels + num_channels);
  1107. if (ret < 0)
  1108. return ret;
  1109. num_channels += ret;
  1110. }
  1111. for (i = 0; i < num_channels; i++) {
  1112. ams_channels[i].channel = ch_cnt++;
  1113. if (ams_channels[i].scan_index < AMS_CTRL_SEQ_BASE) {
  1114. /* set threshold to max and min for each channel */
  1115. falling_off =
  1116. ams_get_alarm_offset(ams_channels[i].scan_index,
  1117. IIO_EV_DIR_FALLING);
  1118. rising_off =
  1119. ams_get_alarm_offset(ams_channels[i].scan_index,
  1120. IIO_EV_DIR_RISING);
  1121. if (ams_channels[i].scan_index >= AMS_PS_SEQ_MAX) {
  1122. writel(AMS_ALARM_THR_MIN,
  1123. ams->pl_base + falling_off);
  1124. writel(AMS_ALARM_THR_MAX,
  1125. ams->pl_base + rising_off);
  1126. } else {
  1127. writel(AMS_ALARM_THR_MIN,
  1128. ams->ps_base + falling_off);
  1129. writel(AMS_ALARM_THR_MAX,
  1130. ams->ps_base + rising_off);
  1131. }
  1132. }
  1133. }
  1134. dev_channels = devm_krealloc_array(dev, ams_channels, num_channels,
  1135. sizeof(*dev_channels), GFP_KERNEL);
  1136. if (!dev_channels)
  1137. return -ENOMEM;
  1138. indio_dev->channels = dev_channels;
  1139. indio_dev->num_channels = num_channels;
  1140. return 0;
  1141. }
  1142. static const struct iio_info iio_ams_info = {
  1143. .read_label = ams_read_label,
  1144. .read_raw = &ams_read_raw,
  1145. .read_event_config = &ams_read_event_config,
  1146. .write_event_config = &ams_write_event_config,
  1147. .read_event_value = &ams_read_event_value,
  1148. .write_event_value = &ams_write_event_value,
  1149. };
  1150. static const struct of_device_id ams_of_match_table[] = {
  1151. { .compatible = "xlnx,zynqmp-ams" },
  1152. { }
  1153. };
  1154. MODULE_DEVICE_TABLE(of, ams_of_match_table);
  1155. static int ams_probe(struct platform_device *pdev)
  1156. {
  1157. struct iio_dev *indio_dev;
  1158. struct ams *ams;
  1159. int ret;
  1160. int irq;
  1161. indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*ams));
  1162. if (!indio_dev)
  1163. return -ENOMEM;
  1164. ams = iio_priv(indio_dev);
  1165. mutex_init(&ams->lock);
  1166. spin_lock_init(&ams->intr_lock);
  1167. indio_dev->name = "xilinx-ams";
  1168. indio_dev->info = &iio_ams_info;
  1169. indio_dev->modes = INDIO_DIRECT_MODE;
  1170. ams->base = devm_platform_ioremap_resource(pdev, 0);
  1171. if (IS_ERR(ams->base))
  1172. return PTR_ERR(ams->base);
  1173. ams->clk = devm_clk_get_enabled(&pdev->dev, NULL);
  1174. if (IS_ERR(ams->clk))
  1175. return PTR_ERR(ams->clk);
  1176. ret = devm_delayed_work_autocancel(&pdev->dev, &ams->ams_unmask_work,
  1177. ams_unmask_worker);
  1178. if (ret < 0)
  1179. return ret;
  1180. ret = ams_parse_firmware(indio_dev);
  1181. if (ret)
  1182. return dev_err_probe(&pdev->dev, ret, "failure in parsing DT\n");
  1183. ret = ams_init_device(ams);
  1184. if (ret)
  1185. return dev_err_probe(&pdev->dev, ret, "failed to initialize AMS\n");
  1186. ams_enable_channel_sequence(indio_dev);
  1187. irq = platform_get_irq(pdev, 0);
  1188. if (irq < 0)
  1189. return irq;
  1190. ret = devm_request_irq(&pdev->dev, irq, &ams_irq, 0, "ams-irq",
  1191. indio_dev);
  1192. if (ret < 0)
  1193. return dev_err_probe(&pdev->dev, ret, "failed to register interrupt\n");
  1194. platform_set_drvdata(pdev, indio_dev);
  1195. return devm_iio_device_register(&pdev->dev, indio_dev);
  1196. }
  1197. static int ams_suspend(struct device *dev)
  1198. {
  1199. struct ams *ams = iio_priv(dev_get_drvdata(dev));
  1200. clk_disable_unprepare(ams->clk);
  1201. return 0;
  1202. }
  1203. static int ams_resume(struct device *dev)
  1204. {
  1205. struct ams *ams = iio_priv(dev_get_drvdata(dev));
  1206. return clk_prepare_enable(ams->clk);
  1207. }
  1208. static DEFINE_SIMPLE_DEV_PM_OPS(ams_pm_ops, ams_suspend, ams_resume);
  1209. static struct platform_driver ams_driver = {
  1210. .probe = ams_probe,
  1211. .driver = {
  1212. .name = "xilinx-ams",
  1213. .pm = pm_sleep_ptr(&ams_pm_ops),
  1214. .of_match_table = ams_of_match_table,
  1215. },
  1216. };
  1217. module_platform_driver(ams_driver);
  1218. MODULE_DESCRIPTION("Xilinx AMS driver");
  1219. MODULE_LICENSE("GPL v2");
  1220. MODULE_AUTHOR("Xilinx, Inc.");