xilinx-ams.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  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(0)
  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_unmask(struct ams *ams)
  338. {
  339. unsigned int status, unmask;
  340. status = readl(ams->base + AMS_ISR_0);
  341. /* Clear those bits which are not active anymore */
  342. unmask = (ams->current_masked_alarm ^ status) & ams->current_masked_alarm;
  343. /* Clear status of disabled alarm */
  344. unmask |= ams->intr_mask;
  345. ams->current_masked_alarm &= status;
  346. /* Also clear those which are masked out anyway */
  347. ams->current_masked_alarm &= ~ams->intr_mask;
  348. /* Clear the interrupts before we unmask them */
  349. writel(unmask, ams->base + AMS_ISR_0);
  350. ams_update_intrmask(ams, ~AMS_ALARM_MASK, ~AMS_ALARM_MASK);
  351. }
  352. static void ams_update_alarm(struct ams *ams, unsigned long alarm_mask)
  353. {
  354. unsigned long flags;
  355. if (ams->ps_base)
  356. ams_update_ps_alarm(ams, alarm_mask);
  357. if (ams->pl_base)
  358. ams_update_pl_alarm(ams, alarm_mask);
  359. spin_lock_irqsave(&ams->intr_lock, flags);
  360. ams_update_intrmask(ams, AMS_ISR0_ALARM_MASK, ~alarm_mask);
  361. ams_unmask(ams);
  362. spin_unlock_irqrestore(&ams->intr_lock, flags);
  363. }
  364. static void ams_enable_channel_sequence(struct iio_dev *indio_dev)
  365. {
  366. struct ams *ams = iio_priv(indio_dev);
  367. unsigned long long scan_mask;
  368. int i;
  369. u32 regval;
  370. /*
  371. * Enable channel sequence. First 22 bits of scan_mask represent
  372. * PS channels, and next remaining bits represent PL channels.
  373. */
  374. /* Run calibration of PS & PL as part of the sequence */
  375. scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
  376. for (i = 0; i < indio_dev->num_channels; i++) {
  377. const struct iio_chan_spec *chan = &indio_dev->channels[i];
  378. if (chan->scan_index < AMS_CTRL_SEQ_BASE)
  379. scan_mask |= BIT_ULL(chan->scan_index);
  380. }
  381. if (ams->ps_base) {
  382. /* put sysmon in a soft reset to change the sequence */
  383. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  384. AMS_CONF1_SEQ_DEFAULT);
  385. /* configure basic channels */
  386. regval = FIELD_GET(AMS_REG_SEQ0_MASK, scan_mask);
  387. writel(regval, ams->ps_base + AMS_REG_SEQ_CH0);
  388. regval = FIELD_GET(AMS_REG_SEQ2_MASK, scan_mask);
  389. writel(regval, ams->ps_base + AMS_REG_SEQ_CH2);
  390. /* set continuous sequence mode */
  391. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  392. AMS_CONF1_SEQ_CONTINUOUS);
  393. }
  394. if (ams->pl_base) {
  395. /* put sysmon in a soft reset to change the sequence */
  396. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  397. AMS_CONF1_SEQ_DEFAULT);
  398. /* configure basic channels */
  399. scan_mask = FIELD_GET(AMS_PL_SEQ_MASK, scan_mask);
  400. regval = FIELD_GET(AMS_REG_SEQ0_MASK, scan_mask);
  401. writel(regval, ams->pl_base + AMS_REG_SEQ_CH0);
  402. regval = FIELD_GET(AMS_REG_SEQ1_MASK, scan_mask);
  403. writel(regval, ams->pl_base + AMS_REG_SEQ_CH1);
  404. regval = FIELD_GET(AMS_REG_SEQ2_MASK, scan_mask);
  405. writel(regval, ams->pl_base + AMS_REG_SEQ_CH2);
  406. /* set continuous sequence mode */
  407. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  408. AMS_CONF1_SEQ_CONTINUOUS);
  409. }
  410. }
  411. static int ams_init_device(struct ams *ams)
  412. {
  413. u32 expect = AMS_PS_CSTS_PS_READY;
  414. u32 reg, value;
  415. int ret;
  416. /* reset AMS */
  417. if (ams->ps_base) {
  418. writel(AMS_PS_RESET_VALUE, ams->ps_base + AMS_VP_VN);
  419. ret = readl_poll_timeout(ams->base + AMS_PS_CSTS, reg, (reg & expect),
  420. AMS_INIT_POLL_TIME_US, AMS_INIT_TIMEOUT_US);
  421. if (ret)
  422. return ret;
  423. /* put sysmon in a default state */
  424. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  425. AMS_CONF1_SEQ_DEFAULT);
  426. }
  427. if (ams->pl_base) {
  428. value = readl(ams->base + AMS_PL_CSTS);
  429. if (value == 0)
  430. return 0;
  431. writel(AMS_PL_RESET_VALUE, ams->pl_base + AMS_VP_VN);
  432. /* put sysmon in a default state */
  433. ams_pl_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  434. AMS_CONF1_SEQ_DEFAULT);
  435. }
  436. ams_disable_all_alarms(ams);
  437. /* Disable interrupt */
  438. ams_update_intrmask(ams, AMS_ALARM_MASK, AMS_ALARM_MASK);
  439. /* Clear any pending interrupt */
  440. writel(AMS_ISR0_ALARM_MASK, ams->base + AMS_ISR_0);
  441. writel(AMS_ISR1_ALARM_MASK, ams->base + AMS_ISR_1);
  442. return 0;
  443. }
  444. static int ams_read_label(struct iio_dev *indio_dev,
  445. struct iio_chan_spec const *chan, char *label)
  446. {
  447. return sysfs_emit(label, "%s\n", chan->datasheet_name);
  448. }
  449. static int ams_enable_single_channel(struct ams *ams, unsigned int offset)
  450. {
  451. u8 channel_num;
  452. switch (offset) {
  453. case AMS_VCC_PSPLL0:
  454. channel_num = AMS_VCC_PSPLL0_CH;
  455. break;
  456. case AMS_VCC_PSPLL3:
  457. channel_num = AMS_VCC_PSPLL3_CH;
  458. break;
  459. case AMS_VCCINT:
  460. channel_num = AMS_VCCINT_CH;
  461. break;
  462. case AMS_VCCBRAM:
  463. channel_num = AMS_VCCBRAM_CH;
  464. break;
  465. case AMS_VCCAUX:
  466. channel_num = AMS_VCCAUX_CH;
  467. break;
  468. case AMS_PSDDRPLL:
  469. channel_num = AMS_PSDDRPLL_CH;
  470. break;
  471. case AMS_PSINTFPDDR:
  472. channel_num = AMS_PSINTFPDDR_CH;
  473. break;
  474. default:
  475. return -EINVAL;
  476. }
  477. /* put sysmon in a soft reset to change the sequence */
  478. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  479. AMS_CONF1_SEQ_DEFAULT);
  480. /* write the channel number */
  481. ams_ps_update_reg(ams, AMS_REG_CONFIG0, AMS_CONF0_CHANNEL_NUM_MASK,
  482. channel_num);
  483. /* set single channel, sequencer off mode */
  484. ams_ps_update_reg(ams, AMS_REG_CONFIG1, AMS_CONF1_SEQ_MASK,
  485. AMS_CONF1_SEQ_SINGLE_CHANNEL);
  486. return 0;
  487. }
  488. static int ams_read_vcc_reg(struct ams *ams, unsigned int offset, u32 *data)
  489. {
  490. u32 expect = AMS_ISR1_EOC_MASK;
  491. u32 reg;
  492. int ret;
  493. ret = ams_enable_single_channel(ams, offset);
  494. if (ret)
  495. return ret;
  496. /* clear end-of-conversion flag, wait for next conversion to complete */
  497. writel(expect, ams->base + AMS_ISR_1);
  498. ret = readl_poll_timeout(ams->base + AMS_ISR_1, reg, (reg & expect),
  499. AMS_INIT_POLL_TIME_US, AMS_INIT_TIMEOUT_US);
  500. if (ret)
  501. return ret;
  502. *data = readl(ams->base + offset);
  503. return 0;
  504. }
  505. static int ams_get_ps_scale(int address)
  506. {
  507. int val;
  508. switch (address) {
  509. case AMS_SUPPLY1:
  510. case AMS_SUPPLY2:
  511. case AMS_SUPPLY3:
  512. case AMS_SUPPLY4:
  513. case AMS_SUPPLY9:
  514. case AMS_SUPPLY10:
  515. case AMS_VCCAMS:
  516. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  517. break;
  518. case AMS_SUPPLY5:
  519. case AMS_SUPPLY6:
  520. case AMS_SUPPLY7:
  521. case AMS_SUPPLY8:
  522. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  523. break;
  524. default:
  525. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  526. break;
  527. }
  528. return val;
  529. }
  530. static int ams_get_pl_scale(struct ams *ams, int address)
  531. {
  532. int val, regval;
  533. switch (address) {
  534. case AMS_SUPPLY1:
  535. case AMS_SUPPLY2:
  536. case AMS_SUPPLY3:
  537. case AMS_SUPPLY4:
  538. case AMS_SUPPLY5:
  539. case AMS_SUPPLY6:
  540. case AMS_VCCAMS:
  541. case AMS_VREFP:
  542. case AMS_VREFN:
  543. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  544. break;
  545. case AMS_SUPPLY7:
  546. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  547. if (FIELD_GET(AMS_VUSER0_MASK, regval))
  548. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  549. else
  550. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  551. break;
  552. case AMS_SUPPLY8:
  553. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  554. if (FIELD_GET(AMS_VUSER1_MASK, regval))
  555. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  556. else
  557. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  558. break;
  559. case AMS_SUPPLY9:
  560. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  561. if (FIELD_GET(AMS_VUSER2_MASK, regval))
  562. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  563. else
  564. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  565. break;
  566. case AMS_SUPPLY10:
  567. regval = readl(ams->pl_base + AMS_REG_CONFIG4);
  568. if (FIELD_GET(AMS_VUSER3_MASK, regval))
  569. val = AMS_SUPPLY_SCALE_6VOLT_mV;
  570. else
  571. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  572. break;
  573. case AMS_VP_VN:
  574. case AMS_REG_VAUX(0) ... AMS_REG_VAUX(15):
  575. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  576. break;
  577. default:
  578. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  579. break;
  580. }
  581. return val;
  582. }
  583. static int ams_get_ctrl_scale(int address)
  584. {
  585. int val;
  586. switch (address) {
  587. case AMS_VCC_PSPLL0:
  588. case AMS_VCC_PSPLL3:
  589. case AMS_VCCINT:
  590. case AMS_VCCBRAM:
  591. case AMS_VCCAUX:
  592. case AMS_PSDDRPLL:
  593. case AMS_PSINTFPDDR:
  594. val = AMS_SUPPLY_SCALE_3VOLT_mV;
  595. break;
  596. default:
  597. val = AMS_SUPPLY_SCALE_1VOLT_mV;
  598. break;
  599. }
  600. return val;
  601. }
  602. static int ams_read_raw(struct iio_dev *indio_dev,
  603. struct iio_chan_spec const *chan,
  604. int *val, int *val2, long mask)
  605. {
  606. struct ams *ams = iio_priv(indio_dev);
  607. int ret;
  608. switch (mask) {
  609. case IIO_CHAN_INFO_RAW:
  610. mutex_lock(&ams->lock);
  611. if (chan->scan_index >= AMS_CTRL_SEQ_BASE) {
  612. ret = ams_read_vcc_reg(ams, chan->address, val);
  613. if (ret)
  614. goto unlock_mutex;
  615. ams_enable_channel_sequence(indio_dev);
  616. } else if (chan->scan_index >= AMS_PS_SEQ_MAX)
  617. *val = readl(ams->pl_base + chan->address);
  618. else
  619. *val = readl(ams->ps_base + chan->address);
  620. ret = IIO_VAL_INT;
  621. unlock_mutex:
  622. mutex_unlock(&ams->lock);
  623. return ret;
  624. case IIO_CHAN_INFO_SCALE:
  625. switch (chan->type) {
  626. case IIO_VOLTAGE:
  627. if (chan->scan_index < AMS_PS_SEQ_MAX)
  628. *val = ams_get_ps_scale(chan->address);
  629. else if (chan->scan_index >= AMS_PS_SEQ_MAX &&
  630. chan->scan_index < AMS_CTRL_SEQ_BASE)
  631. *val = ams_get_pl_scale(ams, chan->address);
  632. else
  633. *val = ams_get_ctrl_scale(chan->address);
  634. *val2 = AMS_SUPPLY_SCALE_DIV_BIT;
  635. return IIO_VAL_FRACTIONAL_LOG2;
  636. case IIO_TEMP:
  637. *val = AMS_TEMP_SCALE;
  638. *val2 = AMS_TEMP_SCALE_DIV_BIT;
  639. return IIO_VAL_FRACTIONAL_LOG2;
  640. default:
  641. return -EINVAL;
  642. }
  643. case IIO_CHAN_INFO_OFFSET:
  644. /* Only the temperature channel has an offset */
  645. *val = AMS_TEMP_OFFSET;
  646. return IIO_VAL_INT;
  647. default:
  648. return -EINVAL;
  649. }
  650. }
  651. static int ams_get_alarm_offset(int scan_index, enum iio_event_direction dir)
  652. {
  653. int offset;
  654. if (scan_index >= AMS_PS_SEQ_MAX)
  655. scan_index -= AMS_PS_SEQ_MAX;
  656. if (dir == IIO_EV_DIR_FALLING) {
  657. if (scan_index < AMS_SEQ_SUPPLY7)
  658. offset = AMS_ALARM_THRESHOLD_OFF_10;
  659. else
  660. offset = AMS_ALARM_THRESHOLD_OFF_20;
  661. } else {
  662. offset = 0;
  663. }
  664. switch (scan_index) {
  665. case AMS_SEQ_TEMP:
  666. return AMS_ALARM_TEMP + offset;
  667. case AMS_SEQ_SUPPLY1:
  668. return AMS_ALARM_SUPPLY1 + offset;
  669. case AMS_SEQ_SUPPLY2:
  670. return AMS_ALARM_SUPPLY2 + offset;
  671. case AMS_SEQ_SUPPLY3:
  672. return AMS_ALARM_SUPPLY3 + offset;
  673. case AMS_SEQ_SUPPLY4:
  674. return AMS_ALARM_SUPPLY4 + offset;
  675. case AMS_SEQ_SUPPLY5:
  676. return AMS_ALARM_SUPPLY5 + offset;
  677. case AMS_SEQ_SUPPLY6:
  678. return AMS_ALARM_SUPPLY6 + offset;
  679. case AMS_SEQ_SUPPLY7:
  680. return AMS_ALARM_SUPPLY7 + offset;
  681. case AMS_SEQ_SUPPLY8:
  682. return AMS_ALARM_SUPPLY8 + offset;
  683. case AMS_SEQ_SUPPLY9:
  684. return AMS_ALARM_SUPPLY9 + offset;
  685. case AMS_SEQ_SUPPLY10:
  686. return AMS_ALARM_SUPPLY10 + offset;
  687. case AMS_SEQ_VCCAMS:
  688. return AMS_ALARM_VCCAMS + offset;
  689. case AMS_SEQ_TEMP_REMOTE:
  690. return AMS_ALARM_TEMP_REMOTE + offset;
  691. default:
  692. return 0;
  693. }
  694. }
  695. static const struct iio_chan_spec *ams_event_to_channel(struct iio_dev *dev,
  696. u32 event)
  697. {
  698. int scan_index = 0, i;
  699. if (event >= AMS_PL_ALARM_START) {
  700. event -= AMS_PL_ALARM_START;
  701. scan_index = AMS_PS_SEQ_MAX;
  702. }
  703. switch (event) {
  704. case AMS_ALARM_BIT_TEMP:
  705. scan_index += AMS_SEQ_TEMP;
  706. break;
  707. case AMS_ALARM_BIT_SUPPLY1:
  708. scan_index += AMS_SEQ_SUPPLY1;
  709. break;
  710. case AMS_ALARM_BIT_SUPPLY2:
  711. scan_index += AMS_SEQ_SUPPLY2;
  712. break;
  713. case AMS_ALARM_BIT_SUPPLY3:
  714. scan_index += AMS_SEQ_SUPPLY3;
  715. break;
  716. case AMS_ALARM_BIT_SUPPLY4:
  717. scan_index += AMS_SEQ_SUPPLY4;
  718. break;
  719. case AMS_ALARM_BIT_SUPPLY5:
  720. scan_index += AMS_SEQ_SUPPLY5;
  721. break;
  722. case AMS_ALARM_BIT_SUPPLY6:
  723. scan_index += AMS_SEQ_SUPPLY6;
  724. break;
  725. case AMS_ALARM_BIT_SUPPLY7:
  726. scan_index += AMS_SEQ_SUPPLY7;
  727. break;
  728. case AMS_ALARM_BIT_SUPPLY8:
  729. scan_index += AMS_SEQ_SUPPLY8;
  730. break;
  731. case AMS_ALARM_BIT_SUPPLY9:
  732. scan_index += AMS_SEQ_SUPPLY9;
  733. break;
  734. case AMS_ALARM_BIT_SUPPLY10:
  735. scan_index += AMS_SEQ_SUPPLY10;
  736. break;
  737. case AMS_ALARM_BIT_VCCAMS:
  738. scan_index += AMS_SEQ_VCCAMS;
  739. break;
  740. case AMS_ALARM_BIT_TEMP_REMOTE:
  741. scan_index += AMS_SEQ_TEMP_REMOTE;
  742. break;
  743. default:
  744. break;
  745. }
  746. for (i = 0; i < dev->num_channels; i++)
  747. if (dev->channels[i].scan_index == scan_index)
  748. break;
  749. return &dev->channels[i];
  750. }
  751. static int ams_get_alarm_mask(int scan_index)
  752. {
  753. int bit = 0;
  754. if (scan_index >= AMS_PS_SEQ_MAX) {
  755. bit = AMS_PL_ALARM_START;
  756. scan_index -= AMS_PS_SEQ_MAX;
  757. }
  758. switch (scan_index) {
  759. case AMS_SEQ_TEMP:
  760. return BIT(AMS_ALARM_BIT_TEMP + bit);
  761. case AMS_SEQ_SUPPLY1:
  762. return BIT(AMS_ALARM_BIT_SUPPLY1 + bit);
  763. case AMS_SEQ_SUPPLY2:
  764. return BIT(AMS_ALARM_BIT_SUPPLY2 + bit);
  765. case AMS_SEQ_SUPPLY3:
  766. return BIT(AMS_ALARM_BIT_SUPPLY3 + bit);
  767. case AMS_SEQ_SUPPLY4:
  768. return BIT(AMS_ALARM_BIT_SUPPLY4 + bit);
  769. case AMS_SEQ_SUPPLY5:
  770. return BIT(AMS_ALARM_BIT_SUPPLY5 + bit);
  771. case AMS_SEQ_SUPPLY6:
  772. return BIT(AMS_ALARM_BIT_SUPPLY6 + bit);
  773. case AMS_SEQ_SUPPLY7:
  774. return BIT(AMS_ALARM_BIT_SUPPLY7 + bit);
  775. case AMS_SEQ_SUPPLY8:
  776. return BIT(AMS_ALARM_BIT_SUPPLY8 + bit);
  777. case AMS_SEQ_SUPPLY9:
  778. return BIT(AMS_ALARM_BIT_SUPPLY9 + bit);
  779. case AMS_SEQ_SUPPLY10:
  780. return BIT(AMS_ALARM_BIT_SUPPLY10 + bit);
  781. case AMS_SEQ_VCCAMS:
  782. return BIT(AMS_ALARM_BIT_VCCAMS + bit);
  783. case AMS_SEQ_TEMP_REMOTE:
  784. return BIT(AMS_ALARM_BIT_TEMP_REMOTE + bit);
  785. default:
  786. return 0;
  787. }
  788. }
  789. static int ams_read_event_config(struct iio_dev *indio_dev,
  790. const struct iio_chan_spec *chan,
  791. enum iio_event_type type,
  792. enum iio_event_direction dir)
  793. {
  794. struct ams *ams = iio_priv(indio_dev);
  795. return !!(ams->alarm_mask & ams_get_alarm_mask(chan->scan_index));
  796. }
  797. static int ams_write_event_config(struct iio_dev *indio_dev,
  798. const struct iio_chan_spec *chan,
  799. enum iio_event_type type,
  800. enum iio_event_direction dir,
  801. bool state)
  802. {
  803. struct ams *ams = iio_priv(indio_dev);
  804. unsigned int alarm;
  805. alarm = ams_get_alarm_mask(chan->scan_index);
  806. mutex_lock(&ams->lock);
  807. if (state)
  808. ams->alarm_mask |= alarm;
  809. else
  810. ams->alarm_mask &= ~alarm;
  811. ams_update_alarm(ams, ams->alarm_mask);
  812. mutex_unlock(&ams->lock);
  813. return 0;
  814. }
  815. static int ams_read_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 = ams_get_alarm_offset(chan->scan_index, dir);
  823. mutex_lock(&ams->lock);
  824. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  825. *val = readl(ams->pl_base + offset);
  826. else
  827. *val = readl(ams->ps_base + offset);
  828. mutex_unlock(&ams->lock);
  829. return IIO_VAL_INT;
  830. }
  831. static int ams_write_event_value(struct iio_dev *indio_dev,
  832. const struct iio_chan_spec *chan,
  833. enum iio_event_type type,
  834. enum iio_event_direction dir,
  835. enum iio_event_info info, int val, int val2)
  836. {
  837. struct ams *ams = iio_priv(indio_dev);
  838. unsigned int offset;
  839. mutex_lock(&ams->lock);
  840. /* Set temperature channel threshold to direct threshold */
  841. if (chan->type == IIO_TEMP) {
  842. offset = ams_get_alarm_offset(chan->scan_index, IIO_EV_DIR_FALLING);
  843. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  844. ams_pl_update_reg(ams, offset,
  845. AMS_ALARM_THR_DIRECT_MASK,
  846. AMS_ALARM_THR_DIRECT_MASK);
  847. else
  848. ams_ps_update_reg(ams, offset,
  849. AMS_ALARM_THR_DIRECT_MASK,
  850. AMS_ALARM_THR_DIRECT_MASK);
  851. }
  852. offset = ams_get_alarm_offset(chan->scan_index, dir);
  853. if (chan->scan_index >= AMS_PS_SEQ_MAX)
  854. writel(val, ams->pl_base + offset);
  855. else
  856. writel(val, ams->ps_base + offset);
  857. mutex_unlock(&ams->lock);
  858. return 0;
  859. }
  860. static void ams_handle_event(struct iio_dev *indio_dev, u32 event)
  861. {
  862. const struct iio_chan_spec *chan;
  863. chan = ams_event_to_channel(indio_dev, event);
  864. if (chan->type == IIO_TEMP) {
  865. /*
  866. * The temperature channel only supports over-temperature
  867. * events.
  868. */
  869. iio_push_event(indio_dev,
  870. IIO_UNMOD_EVENT_CODE(chan->type, chan->channel,
  871. IIO_EV_TYPE_THRESH,
  872. IIO_EV_DIR_RISING),
  873. iio_get_time_ns(indio_dev));
  874. } else {
  875. /*
  876. * For other channels we don't know whether it is a upper or
  877. * lower threshold event. Userspace will have to check the
  878. * channel value if it wants to know.
  879. */
  880. iio_push_event(indio_dev,
  881. IIO_UNMOD_EVENT_CODE(chan->type, chan->channel,
  882. IIO_EV_TYPE_THRESH,
  883. IIO_EV_DIR_EITHER),
  884. iio_get_time_ns(indio_dev));
  885. }
  886. }
  887. static void ams_handle_events(struct iio_dev *indio_dev, unsigned long events)
  888. {
  889. unsigned int bit;
  890. for_each_set_bit(bit, &events, AMS_NO_OF_ALARMS)
  891. ams_handle_event(indio_dev, bit);
  892. }
  893. /**
  894. * ams_unmask_worker - ams alarm interrupt unmask worker
  895. * @work: work to be done
  896. *
  897. * The ZynqMP threshold interrupts are level sensitive. Since we can't make the
  898. * threshold condition go way from within the interrupt handler, this means as
  899. * soon as a threshold condition is present we would enter the interrupt handler
  900. * again and again. To work around this we mask all active threshold interrupts
  901. * in the interrupt handler and start a timer. In this timer we poll the
  902. * interrupt status and only if the interrupt is inactive we unmask it again.
  903. */
  904. static void ams_unmask_worker(struct work_struct *work)
  905. {
  906. struct ams *ams = container_of(work, struct ams, ams_unmask_work.work);
  907. spin_lock_irq(&ams->intr_lock);
  908. ams_unmask(ams);
  909. spin_unlock_irq(&ams->intr_lock);
  910. /* If still pending some alarm re-trigger the timer */
  911. if (ams->current_masked_alarm)
  912. schedule_delayed_work(&ams->ams_unmask_work,
  913. msecs_to_jiffies(AMS_UNMASK_TIMEOUT_MS));
  914. }
  915. static irqreturn_t ams_irq(int irq, void *data)
  916. {
  917. struct iio_dev *indio_dev = data;
  918. struct ams *ams = iio_priv(indio_dev);
  919. u32 isr0;
  920. spin_lock(&ams->intr_lock);
  921. isr0 = readl(ams->base + AMS_ISR_0);
  922. /* Only process alarms that are not masked */
  923. isr0 &= ~((ams->intr_mask & AMS_ISR0_ALARM_MASK) | ams->current_masked_alarm);
  924. if (!isr0) {
  925. spin_unlock(&ams->intr_lock);
  926. return IRQ_NONE;
  927. }
  928. /* Clear interrupt */
  929. writel(isr0, ams->base + AMS_ISR_0);
  930. /* Mask the alarm interrupts until cleared */
  931. ams->current_masked_alarm |= isr0;
  932. ams_update_intrmask(ams, ~AMS_ALARM_MASK, ~AMS_ALARM_MASK);
  933. ams_handle_events(indio_dev, isr0);
  934. schedule_delayed_work(&ams->ams_unmask_work,
  935. msecs_to_jiffies(AMS_UNMASK_TIMEOUT_MS));
  936. spin_unlock(&ams->intr_lock);
  937. return IRQ_HANDLED;
  938. }
  939. static const struct iio_event_spec ams_temp_events[] = {
  940. {
  941. .type = IIO_EV_TYPE_THRESH,
  942. .dir = IIO_EV_DIR_RISING,
  943. .mask_separate = BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_VALUE),
  944. },
  945. };
  946. static const struct iio_event_spec ams_voltage_events[] = {
  947. {
  948. .type = IIO_EV_TYPE_THRESH,
  949. .dir = IIO_EV_DIR_RISING,
  950. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  951. },
  952. {
  953. .type = IIO_EV_TYPE_THRESH,
  954. .dir = IIO_EV_DIR_FALLING,
  955. .mask_separate = BIT(IIO_EV_INFO_VALUE),
  956. },
  957. {
  958. .type = IIO_EV_TYPE_THRESH,
  959. .dir = IIO_EV_DIR_EITHER,
  960. .mask_separate = BIT(IIO_EV_INFO_ENABLE),
  961. },
  962. };
  963. static const struct iio_chan_spec ams_ps_channels[] = {
  964. AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_LPD"),
  965. AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP_REMOTE, AMS_TEMP_REMOTE, "Temp_FPD"),
  966. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, "VCC_PSINTLP"),
  967. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, "VCC_PSINTFP"),
  968. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, "VCC_PSAUX"),
  969. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, "VCC_PSDDR"),
  970. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, "VCC_PSIO3"),
  971. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, "VCC_PSIO0"),
  972. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, "VCC_PSIO1"),
  973. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, "VCC_PSIO2"),
  974. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, "PS_MGTRAVCC"),
  975. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, "PS_MGTRAVTT"),
  976. AMS_PS_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, "VCC_PSADC"),
  977. };
  978. static const struct iio_chan_spec ams_pl_channels[] = {
  979. AMS_PL_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_PL"),
  980. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, true, "VCCINT"),
  981. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, true, "VCCAUX"),
  982. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFP, AMS_VREFP, false, "VREFP"),
  983. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFN, AMS_VREFN, false, "VREFN"),
  984. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, true, "VCCBRAM"),
  985. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, true, "VCC_PSINTLP"),
  986. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, true, "VCC_PSINTFP"),
  987. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, true, "VCC_PSAUX"),
  988. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, true, "VCCAMS"),
  989. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VP_VN, AMS_VP_VN, false, "VP_VN"),
  990. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, true, "VUser0"),
  991. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, true, "VUser1"),
  992. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, true, "VUser2"),
  993. AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, true, "VUser3"),
  994. AMS_PL_AUX_CHAN_VOLTAGE(0),
  995. AMS_PL_AUX_CHAN_VOLTAGE(1),
  996. AMS_PL_AUX_CHAN_VOLTAGE(2),
  997. AMS_PL_AUX_CHAN_VOLTAGE(3),
  998. AMS_PL_AUX_CHAN_VOLTAGE(4),
  999. AMS_PL_AUX_CHAN_VOLTAGE(5),
  1000. AMS_PL_AUX_CHAN_VOLTAGE(6),
  1001. AMS_PL_AUX_CHAN_VOLTAGE(7),
  1002. AMS_PL_AUX_CHAN_VOLTAGE(8),
  1003. AMS_PL_AUX_CHAN_VOLTAGE(9),
  1004. AMS_PL_AUX_CHAN_VOLTAGE(10),
  1005. AMS_PL_AUX_CHAN_VOLTAGE(11),
  1006. AMS_PL_AUX_CHAN_VOLTAGE(12),
  1007. AMS_PL_AUX_CHAN_VOLTAGE(13),
  1008. AMS_PL_AUX_CHAN_VOLTAGE(14),
  1009. AMS_PL_AUX_CHAN_VOLTAGE(15),
  1010. };
  1011. static const struct iio_chan_spec ams_ctrl_channels[] = {
  1012. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSPLL, AMS_VCC_PSPLL0, "VCC_PSPLL"),
  1013. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSBATT, AMS_VCC_PSPLL3, "VCC_PSBATT"),
  1014. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCINT, AMS_VCCINT, "VCCINT"),
  1015. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCBRAM, AMS_VCCBRAM, "VCCBRAM"),
  1016. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCAUX, AMS_VCCAUX, "VCCAUX"),
  1017. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_PSDDRPLL, AMS_PSDDRPLL, "VCC_PSDDR_PLL"),
  1018. AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_INTDDR, AMS_PSINTFPDDR, "VCC_PSINTFP_DDR"),
  1019. };
  1020. static int ams_get_ext_chan(struct fwnode_handle *chan_node,
  1021. struct iio_chan_spec *channels, int num_channels)
  1022. {
  1023. struct iio_chan_spec *chan;
  1024. struct fwnode_handle *child;
  1025. unsigned int reg, ext_chan;
  1026. int ret;
  1027. fwnode_for_each_child_node(chan_node, child) {
  1028. ret = fwnode_property_read_u32(child, "reg", &reg);
  1029. if (ret || reg > AMS_PL_MAX_EXT_CHANNEL + 30)
  1030. continue;
  1031. chan = &channels[num_channels];
  1032. ext_chan = reg + AMS_PL_MAX_FIXED_CHANNEL - 30;
  1033. memcpy(chan, &ams_pl_channels[ext_chan], sizeof(*channels));
  1034. if (fwnode_property_read_bool(child, "xlnx,bipolar"))
  1035. chan->scan_type.sign = 's';
  1036. num_channels++;
  1037. }
  1038. return num_channels;
  1039. }
  1040. static void ams_iounmap_ps(void *data)
  1041. {
  1042. struct ams *ams = data;
  1043. iounmap(ams->ps_base);
  1044. }
  1045. static void ams_iounmap_pl(void *data)
  1046. {
  1047. struct ams *ams = data;
  1048. iounmap(ams->pl_base);
  1049. }
  1050. static int ams_init_module(struct iio_dev *indio_dev,
  1051. struct fwnode_handle *fwnode,
  1052. struct iio_chan_spec *channels)
  1053. {
  1054. struct device *dev = indio_dev->dev.parent;
  1055. struct ams *ams = iio_priv(indio_dev);
  1056. int num_channels = 0;
  1057. int ret;
  1058. if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams-ps")) {
  1059. ams->ps_base = fwnode_iomap(fwnode, 0);
  1060. if (!ams->ps_base)
  1061. return -ENXIO;
  1062. ret = devm_add_action_or_reset(dev, ams_iounmap_ps, ams);
  1063. if (ret < 0)
  1064. return ret;
  1065. /* add PS channels to iio device channels */
  1066. memcpy(channels, ams_ps_channels, sizeof(ams_ps_channels));
  1067. num_channels = ARRAY_SIZE(ams_ps_channels);
  1068. } else if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams-pl")) {
  1069. ams->pl_base = fwnode_iomap(fwnode, 0);
  1070. if (!ams->pl_base)
  1071. return -ENXIO;
  1072. ret = devm_add_action_or_reset(dev, ams_iounmap_pl, ams);
  1073. if (ret < 0)
  1074. return ret;
  1075. /* Copy only first 10 fix channels */
  1076. memcpy(channels, ams_pl_channels, AMS_PL_MAX_FIXED_CHANNEL * sizeof(*channels));
  1077. num_channels += AMS_PL_MAX_FIXED_CHANNEL;
  1078. num_channels = ams_get_ext_chan(fwnode, channels,
  1079. num_channels);
  1080. } else if (fwnode_device_is_compatible(fwnode, "xlnx,zynqmp-ams")) {
  1081. /* add AMS channels to iio device channels */
  1082. memcpy(channels, ams_ctrl_channels, sizeof(ams_ctrl_channels));
  1083. num_channels += ARRAY_SIZE(ams_ctrl_channels);
  1084. } else {
  1085. return -EINVAL;
  1086. }
  1087. return num_channels;
  1088. }
  1089. static int ams_parse_firmware(struct iio_dev *indio_dev)
  1090. {
  1091. struct ams *ams = iio_priv(indio_dev);
  1092. struct iio_chan_spec *ams_channels, *dev_channels;
  1093. struct device *dev = indio_dev->dev.parent;
  1094. struct fwnode_handle *fwnode = dev_fwnode(dev);
  1095. size_t ams_size;
  1096. int ret, ch_cnt = 0, i, rising_off, falling_off;
  1097. unsigned int num_channels = 0;
  1098. ams_size = ARRAY_SIZE(ams_ps_channels) + ARRAY_SIZE(ams_pl_channels) +
  1099. ARRAY_SIZE(ams_ctrl_channels);
  1100. /* Initialize buffer for channel specification */
  1101. ams_channels = devm_kcalloc(dev, ams_size, sizeof(*ams_channels), GFP_KERNEL);
  1102. if (!ams_channels)
  1103. return -ENOMEM;
  1104. if (fwnode_device_is_available(fwnode)) {
  1105. ret = ams_init_module(indio_dev, fwnode, ams_channels);
  1106. if (ret < 0)
  1107. return ret;
  1108. num_channels += ret;
  1109. }
  1110. device_for_each_child_node_scoped(dev, child) {
  1111. ret = ams_init_module(indio_dev, child, ams_channels + num_channels);
  1112. if (ret < 0)
  1113. return ret;
  1114. num_channels += ret;
  1115. }
  1116. for (i = 0; i < num_channels; i++) {
  1117. ams_channels[i].channel = ch_cnt++;
  1118. if (ams_channels[i].scan_index < AMS_CTRL_SEQ_BASE) {
  1119. /* set threshold to max and min for each channel */
  1120. falling_off =
  1121. ams_get_alarm_offset(ams_channels[i].scan_index,
  1122. IIO_EV_DIR_FALLING);
  1123. rising_off =
  1124. ams_get_alarm_offset(ams_channels[i].scan_index,
  1125. IIO_EV_DIR_RISING);
  1126. if (ams_channels[i].scan_index >= AMS_PS_SEQ_MAX) {
  1127. writel(AMS_ALARM_THR_MIN,
  1128. ams->pl_base + falling_off);
  1129. writel(AMS_ALARM_THR_MAX,
  1130. ams->pl_base + rising_off);
  1131. } else {
  1132. writel(AMS_ALARM_THR_MIN,
  1133. ams->ps_base + falling_off);
  1134. writel(AMS_ALARM_THR_MAX,
  1135. ams->ps_base + rising_off);
  1136. }
  1137. }
  1138. }
  1139. dev_channels = devm_krealloc_array(dev, ams_channels, num_channels,
  1140. sizeof(*dev_channels), GFP_KERNEL);
  1141. if (!dev_channels)
  1142. return -ENOMEM;
  1143. indio_dev->channels = dev_channels;
  1144. indio_dev->num_channels = num_channels;
  1145. return 0;
  1146. }
  1147. static const struct iio_info iio_ams_info = {
  1148. .read_label = ams_read_label,
  1149. .read_raw = &ams_read_raw,
  1150. .read_event_config = &ams_read_event_config,
  1151. .write_event_config = &ams_write_event_config,
  1152. .read_event_value = &ams_read_event_value,
  1153. .write_event_value = &ams_write_event_value,
  1154. };
  1155. static const struct of_device_id ams_of_match_table[] = {
  1156. { .compatible = "xlnx,zynqmp-ams" },
  1157. { }
  1158. };
  1159. MODULE_DEVICE_TABLE(of, ams_of_match_table);
  1160. static int ams_probe(struct platform_device *pdev)
  1161. {
  1162. struct iio_dev *indio_dev;
  1163. struct ams *ams;
  1164. int ret;
  1165. int irq;
  1166. indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*ams));
  1167. if (!indio_dev)
  1168. return -ENOMEM;
  1169. ams = iio_priv(indio_dev);
  1170. mutex_init(&ams->lock);
  1171. spin_lock_init(&ams->intr_lock);
  1172. indio_dev->name = "xilinx-ams";
  1173. indio_dev->info = &iio_ams_info;
  1174. indio_dev->modes = INDIO_DIRECT_MODE;
  1175. ams->base = devm_platform_ioremap_resource(pdev, 0);
  1176. if (IS_ERR(ams->base))
  1177. return PTR_ERR(ams->base);
  1178. ams->clk = devm_clk_get_enabled(&pdev->dev, NULL);
  1179. if (IS_ERR(ams->clk))
  1180. return PTR_ERR(ams->clk);
  1181. ret = devm_delayed_work_autocancel(&pdev->dev, &ams->ams_unmask_work,
  1182. ams_unmask_worker);
  1183. if (ret < 0)
  1184. return ret;
  1185. ret = ams_parse_firmware(indio_dev);
  1186. if (ret)
  1187. return dev_err_probe(&pdev->dev, ret, "failure in parsing DT\n");
  1188. ret = ams_init_device(ams);
  1189. if (ret)
  1190. return dev_err_probe(&pdev->dev, ret, "failed to initialize AMS\n");
  1191. ams_enable_channel_sequence(indio_dev);
  1192. irq = platform_get_irq(pdev, 0);
  1193. if (irq < 0)
  1194. return irq;
  1195. ret = devm_request_irq(&pdev->dev, irq, &ams_irq, 0, "ams-irq",
  1196. indio_dev);
  1197. if (ret < 0)
  1198. return dev_err_probe(&pdev->dev, ret, "failed to register interrupt\n");
  1199. platform_set_drvdata(pdev, indio_dev);
  1200. return devm_iio_device_register(&pdev->dev, indio_dev);
  1201. }
  1202. static int ams_suspend(struct device *dev)
  1203. {
  1204. struct ams *ams = iio_priv(dev_get_drvdata(dev));
  1205. clk_disable_unprepare(ams->clk);
  1206. return 0;
  1207. }
  1208. static int ams_resume(struct device *dev)
  1209. {
  1210. struct ams *ams = iio_priv(dev_get_drvdata(dev));
  1211. return clk_prepare_enable(ams->clk);
  1212. }
  1213. static DEFINE_SIMPLE_DEV_PM_OPS(ams_pm_ops, ams_suspend, ams_resume);
  1214. static struct platform_driver ams_driver = {
  1215. .probe = ams_probe,
  1216. .driver = {
  1217. .name = "xilinx-ams",
  1218. .pm = pm_sleep_ptr(&ams_pm_ops),
  1219. .of_match_table = ams_of_match_table,
  1220. },
  1221. };
  1222. module_platform_driver(ams_driver);
  1223. MODULE_DESCRIPTION("Xilinx AMS driver");
  1224. MODULE_LICENSE("GPL v2");
  1225. MODULE_AUTHOR("Xilinx, Inc.");