spmi-pmic-arb.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2015, 2017, 2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/bitfield.h>
  6. #include <linux/bitmap.h>
  7. #include <linux/delay.h>
  8. #include <linux/err.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/io.h>
  11. #include <linux/irqchip/chained_irq.h>
  12. #include <linux/irqdomain.h>
  13. #include <linux/irq.h>
  14. #include <linux/kernel.h>
  15. #include <linux/module.h>
  16. #include <linux/of.h>
  17. #include <linux/of_address.h>
  18. #include <linux/of_irq.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/slab.h>
  21. #include <linux/spmi.h>
  22. /* PMIC Arbiter configuration registers */
  23. #define PMIC_ARB_VERSION 0x0000
  24. #define PMIC_ARB_VERSION_V2_MIN 0x20010000
  25. #define PMIC_ARB_VERSION_V3_MIN 0x30000000
  26. #define PMIC_ARB_VERSION_V5_MIN 0x50000000
  27. #define PMIC_ARB_VERSION_V7_MIN 0x70000000
  28. #define PMIC_ARB_VERSION_V8_MIN 0x80000000
  29. #define PMIC_ARB_INT_EN 0x0004
  30. #define PMIC_ARB_FEATURES 0x0004
  31. #define PMIC_ARB_FEATURES_PERIPH_MASK GENMASK(10, 0)
  32. #define PMIC_ARB_FEATURES_V8_PERIPH_MASK GENMASK(12, 0)
  33. /* PMIC Arbiter channel registers offsets */
  34. #define PMIC_ARB_CMD 0x00
  35. #define PMIC_ARB_CONFIG 0x04
  36. #define PMIC_ARB_STATUS 0x08
  37. #define PMIC_ARB_WDATA0 0x10
  38. #define PMIC_ARB_WDATA1 0x14
  39. #define PMIC_ARB_RDATA0 0x18
  40. #define PMIC_ARB_RDATA1 0x1C
  41. /* Mapping Table */
  42. #define SPMI_MAPPING_TABLE_REG(N) (0x0B00 + (4 * (N)))
  43. #define SPMI_MAPPING_BIT_INDEX(X) (((X) >> 18) & 0xF)
  44. #define SPMI_MAPPING_BIT_IS_0_FLAG(X) (((X) >> 17) & 0x1)
  45. #define SPMI_MAPPING_BIT_IS_0_RESULT(X) (((X) >> 9) & 0xFF)
  46. #define SPMI_MAPPING_BIT_IS_1_FLAG(X) (((X) >> 8) & 0x1)
  47. #define SPMI_MAPPING_BIT_IS_1_RESULT(X) (((X) >> 0) & 0xFF)
  48. #define SPMI_MAPPING_TABLE_TREE_DEPTH 16 /* Maximum of 16-bits */
  49. #define PMIC_ARB_MAX_PPID BIT(13)
  50. #define PMIC_ARB_APID_VALID BIT(15)
  51. #define PMIC_ARB_CHAN_IS_IRQ_OWNER_MASK BIT(24)
  52. #define PMIC_ARB_V8_CHAN_IS_IRQ_OWNER_MASK BIT(31)
  53. #define INVALID_EE 0xFF
  54. /* Ownership Table */
  55. #define SPMI_OWNERSHIP_PERIPH2OWNER(X) ((X) & 0x7)
  56. /* Channel Status fields */
  57. enum pmic_arb_chnl_status {
  58. PMIC_ARB_STATUS_DONE = BIT(0),
  59. PMIC_ARB_STATUS_FAILURE = BIT(1),
  60. PMIC_ARB_STATUS_DENIED = BIT(2),
  61. PMIC_ARB_STATUS_DROPPED = BIT(3),
  62. };
  63. /* Command register fields */
  64. #define PMIC_ARB_CMD_MAX_BYTE_COUNT 8
  65. /* Command Opcodes */
  66. enum pmic_arb_cmd_op_code {
  67. PMIC_ARB_OP_EXT_WRITEL = 0,
  68. PMIC_ARB_OP_EXT_READL = 1,
  69. PMIC_ARB_OP_EXT_WRITE = 2,
  70. PMIC_ARB_OP_RESET = 3,
  71. PMIC_ARB_OP_SLEEP = 4,
  72. PMIC_ARB_OP_SHUTDOWN = 5,
  73. PMIC_ARB_OP_WAKEUP = 6,
  74. PMIC_ARB_OP_AUTHENTICATE = 7,
  75. PMIC_ARB_OP_MSTR_READ = 8,
  76. PMIC_ARB_OP_MSTR_WRITE = 9,
  77. PMIC_ARB_OP_EXT_READ = 13,
  78. PMIC_ARB_OP_WRITE = 14,
  79. PMIC_ARB_OP_READ = 15,
  80. PMIC_ARB_OP_ZERO_WRITE = 16,
  81. };
  82. /*
  83. * PMIC arbiter version 5 uses different register offsets for read/write vs
  84. * observer channels.
  85. */
  86. enum pmic_arb_channel {
  87. PMIC_ARB_CHANNEL_RW,
  88. PMIC_ARB_CHANNEL_OBS,
  89. };
  90. #define PMIC_ARB_MAX_BUSES 4
  91. /* Maximum number of support PMIC peripherals */
  92. #define PMIC_ARB_MAX_PERIPHS 512
  93. #define PMIC_ARB_MAX_PERIPHS_V7 1024
  94. #define PMIC_ARB_MAX_PERIPHS_V8 8192
  95. #define PMIC_ARB_TIMEOUT_US 1000
  96. #define PMIC_ARB_MAX_TRANS_BYTES (8)
  97. #define PMIC_ARB_APID_MASK 0xFF
  98. #define PMIC_ARB_PPID_MASK GENMASK(11, 0)
  99. #define PMIC_ARB_V8_PPID_MASK GENMASK(12, 0)
  100. /* interrupt enable bit */
  101. #define SPMI_PIC_ACC_ENABLE_BIT BIT(0)
  102. #define HWIRQ_SID_MASK GENMASK(28, 24)
  103. #define HWIRQ_PID_MASK GENMASK(23, 16)
  104. #define HWIRQ_IRQID_MASK GENMASK(15, 13)
  105. #define HWIRQ_APID_MASK GENMASK(12, 0)
  106. #define spec_to_hwirq(slave_id, periph_id, irq_id, apid) \
  107. (FIELD_PREP(HWIRQ_SID_MASK, (slave_id)) | \
  108. FIELD_PREP(HWIRQ_PID_MASK, (periph_id)) | \
  109. FIELD_PREP(HWIRQ_IRQID_MASK, (irq_id)) | \
  110. FIELD_PREP(HWIRQ_APID_MASK, (apid)))
  111. #define hwirq_to_sid(hwirq) FIELD_GET(HWIRQ_SID_MASK, (hwirq))
  112. #define hwirq_to_per(hwirq) FIELD_GET(HWIRQ_PID_MASK, (hwirq))
  113. #define hwirq_to_irq(hwirq) FIELD_GET(HWIRQ_IRQID_MASK, (hwirq))
  114. #define hwirq_to_apid(hwirq) FIELD_GET(HWIRQ_APID_MASK, (hwirq))
  115. struct pmic_arb_ver_ops;
  116. struct apid_data {
  117. u16 ppid;
  118. u8 write_ee;
  119. u8 irq_ee;
  120. };
  121. struct spmi_pmic_arb;
  122. /**
  123. * struct spmi_pmic_arb_bus - SPMI PMIC Arbiter Bus object
  124. *
  125. * @pmic_arb: the SPMI PMIC Arbiter the bus belongs to.
  126. * @domain: irq domain object for PMIC IRQ domain
  127. * @intr: address of the SPMI interrupt control registers.
  128. * @cnfg: address of the PMIC Arbiter configuration registers.
  129. * @apid_owner: on v8: address of APID owner mapping table registers
  130. * @spmic: spmi controller registered for this bus
  131. * @lock: lock to synchronize accesses.
  132. * @base_apid: on v7 and v8: minimum APID associated with the
  133. * particular SPMI bus instance
  134. * @apid_count: on v5, v7 and v8: number of APIDs associated with the
  135. * particular SPMI bus instance
  136. * @mapping_table: in-memory copy of PPID -> APID mapping table.
  137. * @mapping_table_valid:bitmap containing valid-only periphs
  138. * @ppid_to_apid: in-memory copy of PPID -> APID mapping table.
  139. * @last_apid: Highest value APID in use
  140. * @apid_data: Table of data for all APIDs
  141. * @min_apid: minimum APID (used for bounding IRQ search)
  142. * @max_apid: maximum APID
  143. * @irq: PMIC ARB interrupt.
  144. * @id: unique ID of the bus
  145. */
  146. struct spmi_pmic_arb_bus {
  147. struct spmi_pmic_arb *pmic_arb;
  148. struct irq_domain *domain;
  149. void __iomem *intr;
  150. void __iomem *cnfg;
  151. void __iomem *apid_owner;
  152. struct spmi_controller *spmic;
  153. raw_spinlock_t lock;
  154. u16 base_apid;
  155. int apid_count;
  156. u32 *mapping_table;
  157. DECLARE_BITMAP(mapping_table_valid, PMIC_ARB_MAX_PERIPHS);
  158. u16 *ppid_to_apid;
  159. u16 last_apid;
  160. struct apid_data *apid_data;
  161. u16 min_apid;
  162. u16 max_apid;
  163. int irq;
  164. u8 id;
  165. };
  166. /**
  167. * struct spmi_pmic_arb - SPMI PMIC Arbiter object
  168. *
  169. * @rd_base: on v1 "core", on v2 "observer" register base off DT.
  170. * @wr_base: on v1 "core", on v2 "chnls" register base off DT.
  171. * @core: core register base for v2 and above only (see above)
  172. * @core_size: core register base size
  173. * @apid_map: on v8, APID mapping table register base
  174. * @channel: execution environment channel to use for accesses.
  175. * @ee: the current Execution Environment
  176. * @ver_ops: version dependent operations.
  177. * @max_periphs: Number of elements in apid_data[]
  178. * @buses: per arbiter buses instances
  179. * @buses_available: number of buses registered
  180. */
  181. struct spmi_pmic_arb {
  182. void __iomem *rd_base;
  183. void __iomem *wr_base;
  184. void __iomem *core;
  185. resource_size_t core_size;
  186. void __iomem *apid_map;
  187. u8 channel;
  188. u8 ee;
  189. const struct pmic_arb_ver_ops *ver_ops;
  190. int max_periphs;
  191. struct spmi_pmic_arb_bus *buses[PMIC_ARB_MAX_BUSES];
  192. int buses_available;
  193. };
  194. /**
  195. * struct pmic_arb_ver_ops - version dependent functionality.
  196. *
  197. * @ver_str: version string.
  198. * @get_core_resources: initializes the core, observer and channels
  199. * @get_bus_resources: requests per-SPMI bus register resources
  200. * @init_apid: finds the apid base and count
  201. * @ppid_to_apid: finds the apid for a given ppid.
  202. * @non_data_cmd: on v1 issues an spmi non-data command.
  203. * on v2 no HW support, returns -EOPNOTSUPP.
  204. * @offset: on v1 offset of per-ee channel.
  205. * on v2 offset of per-ee and per-ppid channel.
  206. * @fmt_cmd: formats a GENI/SPMI command.
  207. * @owner_acc_status: on v1 address of PMIC_ARB_SPMI_PIC_OWNERm_ACC_STATUSn
  208. * on v2 address of SPMI_PIC_OWNERm_ACC_STATUSn.
  209. * @acc_enable: on v1 address of PMIC_ARB_SPMI_PIC_ACC_ENABLEn
  210. * on v2 address of SPMI_PIC_ACC_ENABLEn.
  211. * @irq_status: on v1 address of PMIC_ARB_SPMI_PIC_IRQ_STATUSn
  212. * on v2 address of SPMI_PIC_IRQ_STATUSn.
  213. * @irq_clear: on v1 address of PMIC_ARB_SPMI_PIC_IRQ_CLEARn
  214. * on v2 address of SPMI_PIC_IRQ_CLEARn.
  215. * @apid_map_offset: offset of PMIC_ARB_REG_CHNLn
  216. * @apid_owner: on v2 and later address of SPMI_PERIPHn_2OWNER_TABLE_REG
  217. */
  218. struct pmic_arb_ver_ops {
  219. const char *ver_str;
  220. int (*get_core_resources)(struct platform_device *pdev, void __iomem *core);
  221. int (*get_bus_resources)(struct platform_device *pdev,
  222. struct device_node *node,
  223. struct spmi_pmic_arb_bus *bus);
  224. int (*init_apid)(struct spmi_pmic_arb_bus *bus, int index);
  225. int (*ppid_to_apid)(struct spmi_pmic_arb_bus *bus, u16 ppid);
  226. /* spmi commands (read_cmd, write_cmd, cmd) functionality */
  227. int (*offset)(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  228. enum pmic_arb_channel ch_type);
  229. u32 (*fmt_cmd)(u8 opc, u8 sid, u16 addr, u8 bc);
  230. int (*non_data_cmd)(struct spmi_controller *ctrl, u8 opc, u8 sid);
  231. /* Interrupts controller functionality (offset of PIC registers) */
  232. void __iomem *(*owner_acc_status)(struct spmi_pmic_arb_bus *bus, u8 m,
  233. u16 n);
  234. void __iomem *(*acc_enable)(struct spmi_pmic_arb_bus *bus, u16 n);
  235. void __iomem *(*irq_status)(struct spmi_pmic_arb_bus *bus, u16 n);
  236. void __iomem *(*irq_clear)(struct spmi_pmic_arb_bus *bus, u16 n);
  237. u32 (*apid_map_offset)(u16 n);
  238. void __iomem *(*apid_owner)(struct spmi_pmic_arb_bus *bus, u16 n);
  239. };
  240. static inline void pmic_arb_base_write(struct spmi_pmic_arb *pmic_arb,
  241. u32 offset, u32 val)
  242. {
  243. writel_relaxed(val, pmic_arb->wr_base + offset);
  244. }
  245. static inline void pmic_arb_set_rd_cmd(struct spmi_pmic_arb *pmic_arb,
  246. u32 offset, u32 val)
  247. {
  248. writel_relaxed(val, pmic_arb->rd_base + offset);
  249. }
  250. /**
  251. * pmic_arb_read_data: reads pmic-arb's register and copy 1..4 bytes to buf
  252. * @pmic_arb: the SPMI PMIC arbiter
  253. * @bc: byte count -1. range: 0..3
  254. * @reg: register's address
  255. * @buf: output parameter, length must be bc + 1
  256. */
  257. static void
  258. pmic_arb_read_data(struct spmi_pmic_arb *pmic_arb, u8 *buf, u32 reg, u8 bc)
  259. {
  260. u32 data = __raw_readl(pmic_arb->rd_base + reg);
  261. memcpy(buf, &data, (bc & 3) + 1);
  262. }
  263. /**
  264. * pmic_arb_write_data: write 1..4 bytes from buf to pmic-arb's register
  265. * @pmic_arb: the SPMI PMIC arbiter
  266. * @bc: byte-count -1. range: 0..3.
  267. * @reg: register's address.
  268. * @buf: buffer to write. length must be bc + 1.
  269. */
  270. static void pmic_arb_write_data(struct spmi_pmic_arb *pmic_arb, const u8 *buf,
  271. u32 reg, u8 bc)
  272. {
  273. u32 data = 0;
  274. memcpy(&data, buf, (bc & 3) + 1);
  275. __raw_writel(data, pmic_arb->wr_base + reg);
  276. }
  277. static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,
  278. void __iomem *base, u8 sid, u16 addr,
  279. enum pmic_arb_channel ch_type)
  280. {
  281. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  282. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  283. u32 status = 0;
  284. u32 timeout = PMIC_ARB_TIMEOUT_US;
  285. u32 offset;
  286. int rc;
  287. rc = pmic_arb->ver_ops->offset(bus, sid, addr, ch_type);
  288. if (rc < 0)
  289. return rc;
  290. offset = rc;
  291. offset += PMIC_ARB_STATUS;
  292. while (timeout--) {
  293. status = readl_relaxed(base + offset);
  294. if (status & PMIC_ARB_STATUS_DONE) {
  295. if (status & PMIC_ARB_STATUS_DENIED) {
  296. dev_err(&ctrl->dev, "%s: %#x %#x: transaction denied (%#x)\n",
  297. __func__, sid, addr, status);
  298. return -EPERM;
  299. }
  300. if (status & PMIC_ARB_STATUS_FAILURE) {
  301. dev_err(&ctrl->dev, "%s: %#x %#x: transaction failed (%#x) reg: 0x%x\n",
  302. __func__, sid, addr, status, offset);
  303. WARN_ON(1);
  304. return -EIO;
  305. }
  306. if (status & PMIC_ARB_STATUS_DROPPED) {
  307. dev_err(&ctrl->dev, "%s: %#x %#x: transaction dropped (%#x)\n",
  308. __func__, sid, addr, status);
  309. return -EIO;
  310. }
  311. return 0;
  312. }
  313. udelay(1);
  314. }
  315. dev_err(&ctrl->dev, "%s: %#x %#x %#x: timeout, status %#x\n",
  316. __func__, bus->id, sid, addr, status);
  317. return -ETIMEDOUT;
  318. }
  319. static int
  320. pmic_arb_non_data_cmd_v1(struct spmi_controller *ctrl, u8 opc, u8 sid)
  321. {
  322. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  323. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  324. unsigned long flags;
  325. u32 cmd;
  326. int rc;
  327. u32 offset;
  328. rc = pmic_arb->ver_ops->offset(bus, sid, 0, PMIC_ARB_CHANNEL_RW);
  329. if (rc < 0)
  330. return rc;
  331. offset = rc;
  332. cmd = ((opc | 0x40) << 27) | ((sid & 0xf) << 20);
  333. raw_spin_lock_irqsave(&bus->lock, flags);
  334. pmic_arb_base_write(pmic_arb, offset + PMIC_ARB_CMD, cmd);
  335. rc = pmic_arb_wait_for_done(ctrl, pmic_arb->wr_base, sid, 0,
  336. PMIC_ARB_CHANNEL_RW);
  337. raw_spin_unlock_irqrestore(&bus->lock, flags);
  338. return rc;
  339. }
  340. static int
  341. pmic_arb_non_data_cmd_v2(struct spmi_controller *ctrl, u8 opc, u8 sid)
  342. {
  343. return -EOPNOTSUPP;
  344. }
  345. /* Non-data command */
  346. static int pmic_arb_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)
  347. {
  348. struct spmi_pmic_arb *pmic_arb = spmi_controller_get_drvdata(ctrl);
  349. dev_dbg(&ctrl->dev, "cmd op:0x%x sid:%d\n", opc, sid);
  350. /* Check for valid non-data command */
  351. if (opc < SPMI_CMD_RESET || opc > SPMI_CMD_WAKEUP)
  352. return -EINVAL;
  353. return pmic_arb->ver_ops->non_data_cmd(ctrl, opc, sid);
  354. }
  355. static int pmic_arb_fmt_read_cmd(struct spmi_pmic_arb_bus *bus, u8 opc, u8 sid,
  356. u16 addr, size_t len, u32 *cmd, u32 *offset)
  357. {
  358. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  359. u8 bc = len - 1;
  360. int rc;
  361. rc = pmic_arb->ver_ops->offset(bus, sid, addr,
  362. PMIC_ARB_CHANNEL_OBS);
  363. if (rc < 0)
  364. return rc;
  365. *offset = rc;
  366. if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
  367. dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested\n",
  368. PMIC_ARB_MAX_TRANS_BYTES, len);
  369. return -EINVAL;
  370. }
  371. /* Check the opcode */
  372. if (opc >= 0x60 && opc <= 0x7F)
  373. opc = PMIC_ARB_OP_READ;
  374. else if (opc >= 0x20 && opc <= 0x2F)
  375. opc = PMIC_ARB_OP_EXT_READ;
  376. else if (opc >= 0x38 && opc <= 0x3F)
  377. opc = PMIC_ARB_OP_EXT_READL;
  378. else
  379. return -EINVAL;
  380. *cmd = pmic_arb->ver_ops->fmt_cmd(opc, sid, addr, bc);
  381. return 0;
  382. }
  383. static int pmic_arb_read_cmd_unlocked(struct spmi_controller *ctrl, u32 cmd,
  384. u32 offset, u8 sid, u16 addr, u8 *buf,
  385. size_t len)
  386. {
  387. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  388. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  389. u8 bc = len - 1;
  390. int rc;
  391. pmic_arb_set_rd_cmd(pmic_arb, offset + PMIC_ARB_CMD, cmd);
  392. rc = pmic_arb_wait_for_done(ctrl, pmic_arb->rd_base, sid, addr,
  393. PMIC_ARB_CHANNEL_OBS);
  394. if (rc)
  395. return rc;
  396. pmic_arb_read_data(pmic_arb, buf, offset + PMIC_ARB_RDATA0,
  397. min_t(u8, bc, 3));
  398. if (bc > 3)
  399. pmic_arb_read_data(pmic_arb, buf + 4, offset + PMIC_ARB_RDATA1,
  400. bc - 4);
  401. return 0;
  402. }
  403. static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  404. u16 addr, u8 *buf, size_t len)
  405. {
  406. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  407. unsigned long flags;
  408. u32 cmd, offset;
  409. int rc;
  410. rc = pmic_arb_fmt_read_cmd(bus, opc, sid, addr, len, &cmd,
  411. &offset);
  412. if (rc)
  413. return rc;
  414. raw_spin_lock_irqsave(&bus->lock, flags);
  415. rc = pmic_arb_read_cmd_unlocked(ctrl, cmd, offset, sid, addr, buf, len);
  416. raw_spin_unlock_irqrestore(&bus->lock, flags);
  417. return rc;
  418. }
  419. static int pmic_arb_fmt_write_cmd(struct spmi_pmic_arb_bus *bus, u8 opc,
  420. u8 sid, u16 addr, size_t len, u32 *cmd,
  421. u32 *offset)
  422. {
  423. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  424. u8 bc = len - 1;
  425. int rc;
  426. rc = pmic_arb->ver_ops->offset(bus, sid, addr,
  427. PMIC_ARB_CHANNEL_RW);
  428. if (rc < 0)
  429. return rc;
  430. *offset = rc;
  431. if (bc >= PMIC_ARB_MAX_TRANS_BYTES) {
  432. dev_err(&bus->spmic->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested\n",
  433. PMIC_ARB_MAX_TRANS_BYTES, len);
  434. return -EINVAL;
  435. }
  436. /* Check the opcode */
  437. if (opc >= 0x40 && opc <= 0x5F)
  438. opc = PMIC_ARB_OP_WRITE;
  439. else if (opc <= 0x0F)
  440. opc = PMIC_ARB_OP_EXT_WRITE;
  441. else if (opc >= 0x30 && opc <= 0x37)
  442. opc = PMIC_ARB_OP_EXT_WRITEL;
  443. else if (opc >= 0x80)
  444. opc = PMIC_ARB_OP_ZERO_WRITE;
  445. else
  446. return -EINVAL;
  447. *cmd = pmic_arb->ver_ops->fmt_cmd(opc, sid, addr, bc);
  448. return 0;
  449. }
  450. static int pmic_arb_write_cmd_unlocked(struct spmi_controller *ctrl, u32 cmd,
  451. u32 offset, u8 sid, u16 addr,
  452. const u8 *buf, size_t len)
  453. {
  454. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  455. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  456. u8 bc = len - 1;
  457. /* Write data to FIFOs */
  458. pmic_arb_write_data(pmic_arb, buf, offset + PMIC_ARB_WDATA0,
  459. min_t(u8, bc, 3));
  460. if (bc > 3)
  461. pmic_arb_write_data(pmic_arb, buf + 4, offset + PMIC_ARB_WDATA1,
  462. bc - 4);
  463. /* Start the transaction */
  464. pmic_arb_base_write(pmic_arb, offset + PMIC_ARB_CMD, cmd);
  465. return pmic_arb_wait_for_done(ctrl, pmic_arb->wr_base, sid, addr,
  466. PMIC_ARB_CHANNEL_RW);
  467. }
  468. static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  469. u16 addr, const u8 *buf, size_t len)
  470. {
  471. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  472. unsigned long flags;
  473. u32 cmd, offset;
  474. int rc;
  475. rc = pmic_arb_fmt_write_cmd(bus, opc, sid, addr, len, &cmd,
  476. &offset);
  477. if (rc)
  478. return rc;
  479. raw_spin_lock_irqsave(&bus->lock, flags);
  480. rc = pmic_arb_write_cmd_unlocked(ctrl, cmd, offset, sid, addr, buf,
  481. len);
  482. raw_spin_unlock_irqrestore(&bus->lock, flags);
  483. return rc;
  484. }
  485. static int pmic_arb_masked_write(struct spmi_controller *ctrl, u8 sid, u16 addr,
  486. const u8 *buf, const u8 *mask, size_t len)
  487. {
  488. struct spmi_pmic_arb_bus *bus = spmi_controller_get_drvdata(ctrl);
  489. u32 read_cmd, read_offset, write_cmd, write_offset;
  490. u8 temp[PMIC_ARB_MAX_TRANS_BYTES];
  491. unsigned long flags;
  492. int rc, i;
  493. rc = pmic_arb_fmt_read_cmd(bus, SPMI_CMD_EXT_READL, sid, addr, len,
  494. &read_cmd, &read_offset);
  495. if (rc)
  496. return rc;
  497. rc = pmic_arb_fmt_write_cmd(bus, SPMI_CMD_EXT_WRITEL, sid, addr,
  498. len, &write_cmd, &write_offset);
  499. if (rc)
  500. return rc;
  501. raw_spin_lock_irqsave(&bus->lock, flags);
  502. rc = pmic_arb_read_cmd_unlocked(ctrl, read_cmd, read_offset, sid, addr,
  503. temp, len);
  504. if (rc)
  505. goto done;
  506. for (i = 0; i < len; i++)
  507. temp[i] = (temp[i] & ~mask[i]) | (buf[i] & mask[i]);
  508. rc = pmic_arb_write_cmd_unlocked(ctrl, write_cmd, write_offset, sid,
  509. addr, temp, len);
  510. done:
  511. raw_spin_unlock_irqrestore(&bus->lock, flags);
  512. return rc;
  513. }
  514. enum qpnpint_regs {
  515. QPNPINT_REG_RT_STS = 0x10,
  516. QPNPINT_REG_SET_TYPE = 0x11,
  517. QPNPINT_REG_POLARITY_HIGH = 0x12,
  518. QPNPINT_REG_POLARITY_LOW = 0x13,
  519. QPNPINT_REG_LATCHED_CLR = 0x14,
  520. QPNPINT_REG_EN_SET = 0x15,
  521. QPNPINT_REG_EN_CLR = 0x16,
  522. QPNPINT_REG_LATCHED_STS = 0x18,
  523. };
  524. struct spmi_pmic_arb_qpnpint_type {
  525. u8 type; /* 1 -> edge */
  526. u8 polarity_high;
  527. u8 polarity_low;
  528. } __packed;
  529. /* Simplified accessor functions for irqchip callbacks */
  530. static void qpnpint_spmi_write(struct irq_data *d, u8 reg, void *buf,
  531. size_t len)
  532. {
  533. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  534. u8 sid = hwirq_to_sid(d->hwirq);
  535. u8 per = hwirq_to_per(d->hwirq);
  536. if (pmic_arb_write_cmd(bus->spmic, SPMI_CMD_EXT_WRITEL, sid,
  537. (per << 8) + reg, buf, len))
  538. dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x\n",
  539. d->irq);
  540. }
  541. static void qpnpint_spmi_read(struct irq_data *d, u8 reg, void *buf, size_t len)
  542. {
  543. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  544. u8 sid = hwirq_to_sid(d->hwirq);
  545. u8 per = hwirq_to_per(d->hwirq);
  546. if (pmic_arb_read_cmd(bus->spmic, SPMI_CMD_EXT_READL, sid,
  547. (per << 8) + reg, buf, len))
  548. dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x\n",
  549. d->irq);
  550. }
  551. static int qpnpint_spmi_masked_write(struct irq_data *d, u8 reg,
  552. const void *buf, const void *mask,
  553. size_t len)
  554. {
  555. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  556. u8 sid = hwirq_to_sid(d->hwirq);
  557. u8 per = hwirq_to_per(d->hwirq);
  558. int rc;
  559. rc = pmic_arb_masked_write(bus->spmic, sid, (per << 8) + reg, buf,
  560. mask, len);
  561. if (rc)
  562. dev_err_ratelimited(&bus->spmic->dev, "failed irqchip transaction on %x rc=%d\n",
  563. d->irq, rc);
  564. return rc;
  565. }
  566. static void cleanup_irq(struct spmi_pmic_arb_bus *bus, u16 apid, int id)
  567. {
  568. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  569. u16 ppid = bus->apid_data[apid].ppid;
  570. u8 sid = ppid >> 8;
  571. u8 per = ppid & 0xFF;
  572. u8 irq_mask = BIT(id);
  573. dev_err_ratelimited(&bus->spmic->dev, "%s apid=%d sid=0x%x per=0x%x irq=%d\n",
  574. __func__, apid, sid, per, id);
  575. writel_relaxed(irq_mask, pmic_arb->ver_ops->irq_clear(bus, apid));
  576. }
  577. static int periph_interrupt(struct spmi_pmic_arb_bus *bus, u16 apid)
  578. {
  579. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  580. unsigned int irq;
  581. u32 status, id;
  582. int handled = 0;
  583. u8 sid = (bus->apid_data[apid].ppid >> 8) & 0x1F;
  584. u8 per = bus->apid_data[apid].ppid & 0xFF;
  585. status = readl_relaxed(pmic_arb->ver_ops->irq_status(bus, apid));
  586. while (status) {
  587. id = ffs(status) - 1;
  588. status &= ~BIT(id);
  589. irq = irq_find_mapping(bus->domain,
  590. spec_to_hwirq(sid, per, id, apid));
  591. if (irq == 0) {
  592. cleanup_irq(bus, apid, id);
  593. continue;
  594. }
  595. generic_handle_irq(irq);
  596. handled++;
  597. }
  598. return handled;
  599. }
  600. static void pmic_arb_chained_irq(struct irq_desc *desc)
  601. {
  602. struct spmi_pmic_arb_bus *bus = irq_desc_get_handler_data(desc);
  603. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  604. const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops;
  605. struct irq_chip *chip = irq_desc_get_chip(desc);
  606. int first = bus->min_apid;
  607. int last = bus->max_apid;
  608. /*
  609. * acc_offset will be non-zero for the secondary SPMI bus instance on
  610. * v7 and v8 controllers.
  611. */
  612. int acc_offset = bus->base_apid >> 5;
  613. u8 ee = pmic_arb->ee;
  614. u32 status, enable, handled = 0;
  615. int i, id, apid;
  616. /* status based dispatch */
  617. bool acc_valid = false;
  618. u32 irq_status = 0;
  619. chained_irq_enter(chip, desc);
  620. for (i = first >> 5; i <= last >> 5; ++i) {
  621. status = readl_relaxed(ver_ops->owner_acc_status(bus, ee, i - acc_offset));
  622. if (status)
  623. acc_valid = true;
  624. while (status) {
  625. id = ffs(status) - 1;
  626. status &= ~BIT(id);
  627. apid = id + i * 32;
  628. if (apid < first || apid > last) {
  629. WARN_ONCE(true, "spurious spmi irq received for apid=%d\n",
  630. apid);
  631. continue;
  632. }
  633. enable = readl_relaxed(
  634. ver_ops->acc_enable(bus, apid));
  635. if (enable & SPMI_PIC_ACC_ENABLE_BIT)
  636. if (periph_interrupt(bus, apid) != 0)
  637. handled++;
  638. }
  639. }
  640. /* ACC_STATUS is empty but IRQ fired check IRQ_STATUS */
  641. if (!acc_valid) {
  642. for (i = first; i <= last; i++) {
  643. /* skip if APPS is not irq owner */
  644. if (bus->apid_data[i].irq_ee != pmic_arb->ee)
  645. continue;
  646. irq_status = readl_relaxed(
  647. ver_ops->irq_status(bus, i));
  648. if (irq_status) {
  649. enable = readl_relaxed(
  650. ver_ops->acc_enable(bus, i));
  651. if (enable & SPMI_PIC_ACC_ENABLE_BIT) {
  652. dev_dbg(&bus->spmic->dev,
  653. "Dispatching IRQ for apid=%d status=%x\n",
  654. i, irq_status);
  655. if (periph_interrupt(bus, i) != 0)
  656. handled++;
  657. }
  658. }
  659. }
  660. }
  661. if (handled == 0)
  662. handle_bad_irq(desc);
  663. chained_irq_exit(chip, desc);
  664. }
  665. static void qpnpint_irq_ack(struct irq_data *d)
  666. {
  667. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  668. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  669. u8 irq = hwirq_to_irq(d->hwirq);
  670. u16 apid = hwirq_to_apid(d->hwirq);
  671. u8 data;
  672. writel_relaxed(BIT(irq), pmic_arb->ver_ops->irq_clear(bus, apid));
  673. data = BIT(irq);
  674. qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &data, 1);
  675. }
  676. static void qpnpint_irq_mask(struct irq_data *d)
  677. {
  678. u8 irq = hwirq_to_irq(d->hwirq);
  679. u8 data = BIT(irq);
  680. qpnpint_spmi_write(d, QPNPINT_REG_EN_CLR, &data, 1);
  681. }
  682. static void qpnpint_irq_unmask(struct irq_data *d)
  683. {
  684. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  685. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  686. const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops;
  687. u8 irq = hwirq_to_irq(d->hwirq);
  688. u16 apid = hwirq_to_apid(d->hwirq);
  689. u8 buf[2];
  690. writel_relaxed(SPMI_PIC_ACC_ENABLE_BIT,
  691. ver_ops->acc_enable(bus, apid));
  692. qpnpint_spmi_read(d, QPNPINT_REG_EN_SET, &buf[0], 1);
  693. if (!(buf[0] & BIT(irq))) {
  694. /*
  695. * Since the interrupt is currently disabled, write to both the
  696. * LATCHED_CLR and EN_SET registers so that a spurious interrupt
  697. * cannot be triggered when the interrupt is enabled
  698. */
  699. buf[0] = BIT(irq);
  700. buf[1] = BIT(irq);
  701. qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &buf, 2);
  702. }
  703. }
  704. static int qpnpint_irq_set_type(struct irq_data *d, unsigned int flow_type)
  705. {
  706. struct spmi_pmic_arb_qpnpint_type type = {0};
  707. struct spmi_pmic_arb_qpnpint_type mask;
  708. irq_flow_handler_t flow_handler;
  709. u8 irq_bit = BIT(hwirq_to_irq(d->hwirq));
  710. int rc;
  711. if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
  712. type.type = irq_bit;
  713. if (flow_type & IRQF_TRIGGER_RISING)
  714. type.polarity_high = irq_bit;
  715. if (flow_type & IRQF_TRIGGER_FALLING)
  716. type.polarity_low = irq_bit;
  717. flow_handler = handle_edge_irq;
  718. } else {
  719. if ((flow_type & (IRQF_TRIGGER_HIGH)) &&
  720. (flow_type & (IRQF_TRIGGER_LOW)))
  721. return -EINVAL;
  722. if (flow_type & IRQF_TRIGGER_HIGH)
  723. type.polarity_high = irq_bit;
  724. else
  725. type.polarity_low = irq_bit;
  726. flow_handler = handle_level_irq;
  727. }
  728. mask.type = irq_bit;
  729. mask.polarity_high = irq_bit;
  730. mask.polarity_low = irq_bit;
  731. rc = qpnpint_spmi_masked_write(d, QPNPINT_REG_SET_TYPE, &type, &mask,
  732. sizeof(type));
  733. irq_set_handler_locked(d, flow_handler);
  734. return rc;
  735. }
  736. static int qpnpint_irq_set_wake(struct irq_data *d, unsigned int on)
  737. {
  738. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  739. return irq_set_irq_wake(bus->irq, on);
  740. }
  741. static int qpnpint_get_irqchip_state(struct irq_data *d,
  742. enum irqchip_irq_state which,
  743. bool *state)
  744. {
  745. u8 irq = hwirq_to_irq(d->hwirq);
  746. u8 status = 0;
  747. if (which != IRQCHIP_STATE_LINE_LEVEL)
  748. return -EINVAL;
  749. qpnpint_spmi_read(d, QPNPINT_REG_RT_STS, &status, 1);
  750. *state = !!(status & BIT(irq));
  751. return 0;
  752. }
  753. static int qpnpint_irq_domain_activate(struct irq_domain *domain,
  754. struct irq_data *d, bool reserve)
  755. {
  756. struct spmi_pmic_arb_bus *bus = irq_data_get_irq_chip_data(d);
  757. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  758. u16 periph = hwirq_to_per(d->hwirq);
  759. u16 apid = hwirq_to_apid(d->hwirq);
  760. u16 sid = hwirq_to_sid(d->hwirq);
  761. u16 irq = hwirq_to_irq(d->hwirq);
  762. u8 buf;
  763. if (bus->apid_data[apid].irq_ee != pmic_arb->ee) {
  764. dev_err(&bus->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n",
  765. sid, periph, irq, pmic_arb->ee,
  766. bus->apid_data[apid].irq_ee);
  767. return -ENODEV;
  768. }
  769. buf = BIT(irq);
  770. qpnpint_spmi_write(d, QPNPINT_REG_EN_CLR, &buf, 1);
  771. qpnpint_spmi_write(d, QPNPINT_REG_LATCHED_CLR, &buf, 1);
  772. return 0;
  773. }
  774. static struct irq_chip pmic_arb_irqchip = {
  775. .name = "pmic_arb",
  776. .irq_ack = qpnpint_irq_ack,
  777. .irq_mask = qpnpint_irq_mask,
  778. .irq_unmask = qpnpint_irq_unmask,
  779. .irq_set_type = qpnpint_irq_set_type,
  780. .irq_set_wake = qpnpint_irq_set_wake,
  781. .irq_get_irqchip_state = qpnpint_get_irqchip_state,
  782. .flags = IRQCHIP_MASK_ON_SUSPEND,
  783. };
  784. static int qpnpint_irq_domain_translate(struct irq_domain *d,
  785. struct irq_fwspec *fwspec,
  786. unsigned long *out_hwirq,
  787. unsigned int *out_type)
  788. {
  789. struct spmi_pmic_arb_bus *bus = d->host_data;
  790. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  791. u32 *intspec = fwspec->param;
  792. u16 apid, ppid;
  793. int rc;
  794. dev_dbg(&bus->spmic->dev, "intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n",
  795. intspec[0], intspec[1], intspec[2]);
  796. if (irq_domain_get_of_node(d) != bus->spmic->dev.of_node)
  797. return -EINVAL;
  798. if (fwspec->param_count != 4)
  799. return -EINVAL;
  800. if (intspec[0] > FIELD_MAX(HWIRQ_SID_MASK) || intspec[1] > FIELD_MAX(HWIRQ_PID_MASK) ||
  801. intspec[2] > FIELD_MAX(HWIRQ_IRQID_MASK))
  802. return -EINVAL;
  803. ppid = intspec[0] << 8 | intspec[1];
  804. rc = pmic_arb->ver_ops->ppid_to_apid(bus, ppid);
  805. if (rc < 0) {
  806. dev_err(&bus->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u rc = %d\n",
  807. intspec[0], intspec[1], intspec[2], rc);
  808. return rc;
  809. }
  810. apid = rc;
  811. /* Keep track of {max,min}_apid for bounding search during interrupt */
  812. if (apid > bus->max_apid)
  813. bus->max_apid = apid;
  814. if (apid < bus->min_apid)
  815. bus->min_apid = apid;
  816. *out_hwirq = spec_to_hwirq(intspec[0], intspec[1], intspec[2], apid);
  817. *out_type = intspec[3] & IRQ_TYPE_SENSE_MASK;
  818. dev_dbg(&bus->spmic->dev, "out_hwirq = %lu\n", *out_hwirq);
  819. return 0;
  820. }
  821. static struct lock_class_key qpnpint_irq_lock_class, qpnpint_irq_request_class;
  822. static void qpnpint_irq_domain_map(struct spmi_pmic_arb_bus *bus,
  823. struct irq_domain *domain, unsigned int virq,
  824. irq_hw_number_t hwirq, unsigned int type)
  825. {
  826. irq_flow_handler_t handler;
  827. dev_dbg(&bus->spmic->dev, "virq = %u, hwirq = %lu, type = %u\n",
  828. virq, hwirq, type);
  829. if (type & IRQ_TYPE_EDGE_BOTH)
  830. handler = handle_edge_irq;
  831. else
  832. handler = handle_level_irq;
  833. irq_set_lockdep_class(virq, &qpnpint_irq_lock_class,
  834. &qpnpint_irq_request_class);
  835. irq_domain_set_info(domain, virq, hwirq, &pmic_arb_irqchip, bus,
  836. handler, NULL, NULL);
  837. }
  838. static int qpnpint_irq_domain_alloc(struct irq_domain *domain,
  839. unsigned int virq, unsigned int nr_irqs,
  840. void *data)
  841. {
  842. struct spmi_pmic_arb_bus *bus = domain->host_data;
  843. struct irq_fwspec *fwspec = data;
  844. irq_hw_number_t hwirq;
  845. unsigned int type;
  846. int ret, i;
  847. ret = qpnpint_irq_domain_translate(domain, fwspec, &hwirq, &type);
  848. if (ret)
  849. return ret;
  850. for (i = 0; i < nr_irqs; i++)
  851. qpnpint_irq_domain_map(bus, domain, virq + i, hwirq + i,
  852. type);
  853. return 0;
  854. }
  855. static int pmic_arb_init_apid_min_max(struct spmi_pmic_arb_bus *bus)
  856. {
  857. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  858. /*
  859. * Initialize max_apid/min_apid to the opposite bounds, during
  860. * the irq domain translation, we are sure to update these
  861. */
  862. bus->max_apid = 0;
  863. bus->min_apid = pmic_arb->max_periphs - 1;
  864. return 0;
  865. }
  866. static int pmic_arb_get_core_resources_v1(struct platform_device *pdev,
  867. void __iomem *core)
  868. {
  869. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  870. pmic_arb->wr_base = core;
  871. pmic_arb->rd_base = core;
  872. pmic_arb->max_periphs = PMIC_ARB_MAX_PERIPHS;
  873. return 0;
  874. }
  875. static int pmic_arb_init_apid_v1(struct spmi_pmic_arb_bus *bus, int index)
  876. {
  877. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  878. u32 *mapping_table;
  879. if (index) {
  880. dev_err(&bus->spmic->dev, "Unsupported buses count %d detected\n",
  881. index);
  882. return -EINVAL;
  883. }
  884. mapping_table = devm_kcalloc(&bus->spmic->dev, pmic_arb->max_periphs,
  885. sizeof(*mapping_table), GFP_KERNEL);
  886. if (!mapping_table)
  887. return -ENOMEM;
  888. bus->mapping_table = mapping_table;
  889. return pmic_arb_init_apid_min_max(bus);
  890. }
  891. static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb_bus *bus, u16 ppid)
  892. {
  893. u32 *mapping_table = bus->mapping_table;
  894. int index = 0, i;
  895. u16 apid_valid;
  896. u16 apid;
  897. u32 data;
  898. apid_valid = bus->ppid_to_apid[ppid];
  899. if (apid_valid & PMIC_ARB_APID_VALID) {
  900. apid = apid_valid & ~PMIC_ARB_APID_VALID;
  901. return apid;
  902. }
  903. for (i = 0; i < SPMI_MAPPING_TABLE_TREE_DEPTH; ++i) {
  904. if (!test_and_set_bit(index, bus->mapping_table_valid))
  905. mapping_table[index] = readl_relaxed(bus->cnfg +
  906. SPMI_MAPPING_TABLE_REG(index));
  907. data = mapping_table[index];
  908. if (ppid & BIT(SPMI_MAPPING_BIT_INDEX(data))) {
  909. if (SPMI_MAPPING_BIT_IS_1_FLAG(data)) {
  910. index = SPMI_MAPPING_BIT_IS_1_RESULT(data);
  911. } else {
  912. apid = SPMI_MAPPING_BIT_IS_1_RESULT(data);
  913. bus->ppid_to_apid[ppid]
  914. = apid | PMIC_ARB_APID_VALID;
  915. bus->apid_data[apid].ppid = ppid;
  916. return apid;
  917. }
  918. } else {
  919. if (SPMI_MAPPING_BIT_IS_0_FLAG(data)) {
  920. index = SPMI_MAPPING_BIT_IS_0_RESULT(data);
  921. } else {
  922. apid = SPMI_MAPPING_BIT_IS_0_RESULT(data);
  923. bus->ppid_to_apid[ppid]
  924. = apid | PMIC_ARB_APID_VALID;
  925. bus->apid_data[apid].ppid = ppid;
  926. return apid;
  927. }
  928. }
  929. }
  930. return -ENODEV;
  931. }
  932. /* v1 offset per ee */
  933. static int pmic_arb_offset_v1(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  934. enum pmic_arb_channel ch_type)
  935. {
  936. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  937. return 0x800 + 0x80 * pmic_arb->channel;
  938. }
  939. static u16 pmic_arb_find_apid(struct spmi_pmic_arb_bus *bus, u16 ppid)
  940. {
  941. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  942. struct apid_data *apidd = &bus->apid_data[bus->last_apid];
  943. u32 regval, offset;
  944. u16 id, apid;
  945. for (apid = bus->last_apid; ; apid++, apidd++) {
  946. offset = pmic_arb->ver_ops->apid_map_offset(apid);
  947. if (offset >= pmic_arb->core_size)
  948. break;
  949. regval = readl_relaxed(pmic_arb->ver_ops->apid_owner(bus,
  950. apid));
  951. apidd->irq_ee = SPMI_OWNERSHIP_PERIPH2OWNER(regval);
  952. apidd->write_ee = apidd->irq_ee;
  953. regval = readl_relaxed(pmic_arb->core + offset);
  954. if (!regval)
  955. continue;
  956. id = (regval >> 8) & PMIC_ARB_PPID_MASK;
  957. bus->ppid_to_apid[id] = apid | PMIC_ARB_APID_VALID;
  958. apidd->ppid = id;
  959. if (id == ppid) {
  960. apid |= PMIC_ARB_APID_VALID;
  961. break;
  962. }
  963. }
  964. bus->last_apid = apid & ~PMIC_ARB_APID_VALID;
  965. return apid;
  966. }
  967. static int pmic_arb_get_obsrvr_chnls_v2(struct platform_device *pdev)
  968. {
  969. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  970. pmic_arb->rd_base = devm_platform_ioremap_resource_byname(pdev, "obsrvr");
  971. if (IS_ERR(pmic_arb->rd_base))
  972. return PTR_ERR(pmic_arb->rd_base);
  973. pmic_arb->wr_base = devm_platform_ioremap_resource_byname(pdev, "chnls");
  974. if (IS_ERR(pmic_arb->wr_base))
  975. return PTR_ERR(pmic_arb->wr_base);
  976. return 0;
  977. }
  978. static int pmic_arb_get_core_resources_v2(struct platform_device *pdev,
  979. void __iomem *core)
  980. {
  981. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  982. pmic_arb->core = core;
  983. pmic_arb->max_periphs = PMIC_ARB_MAX_PERIPHS;
  984. return pmic_arb_get_obsrvr_chnls_v2(pdev);
  985. }
  986. static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb_bus *bus, u16 ppid)
  987. {
  988. u16 apid_valid;
  989. apid_valid = bus->ppid_to_apid[ppid];
  990. if (!(apid_valid & PMIC_ARB_APID_VALID))
  991. apid_valid = pmic_arb_find_apid(bus, ppid);
  992. if (!(apid_valid & PMIC_ARB_APID_VALID))
  993. return -ENODEV;
  994. return apid_valid & ~PMIC_ARB_APID_VALID;
  995. }
  996. static int _pmic_arb_read_apid_map(struct spmi_pmic_arb_bus *bus,
  997. void __iomem *ppid_base, unsigned long ppid_mask,
  998. u8 ppid_shift, unsigned long irq_owner_mask)
  999. {
  1000. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1001. struct apid_data *apidd;
  1002. struct apid_data *prev_apidd;
  1003. u16 i, apid, ppid, apid_max;
  1004. bool valid, is_irq_ee;
  1005. u32 regval, offset;
  1006. /*
  1007. * In order to allow multiple EEs to write to a single PPID in arbiter
  1008. * version 5,7 and 8, there can be more than one APID mapped to each PPID.
  1009. * The owner field for each of these mappings specifies the EE which is
  1010. * allowed to write to the APID. The owner of the last (highest) APID
  1011. * which has the IRQ owner bit set for a given PPID will receive
  1012. * interrupts from the PPID.
  1013. *
  1014. * In arbiter version 7, the APID numbering space is divided between
  1015. * the primary bus (0) and secondary bus (1) such that:
  1016. * APID = 0 to N-1 are assigned to the primary bus
  1017. * APID = N to N+M-1 are assigned to the secondary bus
  1018. * where N = number of APIDs supported by the primary bus and
  1019. * M = number of APIDs supported by the secondary bus
  1020. *
  1021. * In arbiter version 8, the APID numbering space is divided between
  1022. * the SPMI buses according to this mapping:
  1023. * APID = 0 to N-1 --> bus 0
  1024. * APID = N to N+M-1 --> bus 1
  1025. * APID = N+M to N+M+P-1 --> bus 2
  1026. * APID = N+M+P to N+M+P+Q-1 --> bus 3
  1027. * where N = number of APIDs supported by bus 0
  1028. * M = number of APIDs supported by bus 1
  1029. * P = number of APIDs supported by bus 2
  1030. * Q = number of APIDs supported by bus 3
  1031. */
  1032. apidd = &bus->apid_data[bus->base_apid];
  1033. apid_max = bus->base_apid + bus->apid_count;
  1034. for (i = bus->base_apid; i < apid_max; i++, apidd++) {
  1035. offset = pmic_arb->ver_ops->apid_map_offset(i);
  1036. if (offset >= pmic_arb->core_size)
  1037. break;
  1038. regval = readl_relaxed(ppid_base + offset);
  1039. if (!regval)
  1040. continue;
  1041. ppid = (regval >> ppid_shift) & ppid_mask;
  1042. is_irq_ee = regval & irq_owner_mask;
  1043. regval = readl_relaxed(pmic_arb->ver_ops->apid_owner(bus, i));
  1044. apidd->write_ee = SPMI_OWNERSHIP_PERIPH2OWNER(regval);
  1045. apidd->irq_ee = is_irq_ee ? apidd->write_ee : INVALID_EE;
  1046. valid = bus->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID;
  1047. apid = bus->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID;
  1048. prev_apidd = &bus->apid_data[apid];
  1049. if (!valid || apidd->write_ee == pmic_arb->ee) {
  1050. /* First PPID mapping or one for this EE */
  1051. bus->ppid_to_apid[ppid] = i | PMIC_ARB_APID_VALID;
  1052. } else if (valid && is_irq_ee &&
  1053. prev_apidd->write_ee == pmic_arb->ee) {
  1054. /*
  1055. * Duplicate PPID mapping after the one for this EE;
  1056. * override the irq owner
  1057. */
  1058. prev_apidd->irq_ee = apidd->irq_ee;
  1059. }
  1060. apidd->ppid = ppid;
  1061. bus->last_apid = i;
  1062. }
  1063. /* Dump the mapping table for debug purposes. */
  1064. dev_dbg(&bus->spmic->dev, "PPID APID Write-EE IRQ-EE\n");
  1065. for (ppid = 0; ppid < PMIC_ARB_MAX_PPID; ppid++) {
  1066. apid = bus->ppid_to_apid[ppid];
  1067. if (apid & PMIC_ARB_APID_VALID) {
  1068. apid &= ~PMIC_ARB_APID_VALID;
  1069. apidd = &bus->apid_data[apid];
  1070. dev_dbg(&bus->spmic->dev, "%#03X %3u %2u %2u\n",
  1071. ppid, apid, apidd->write_ee, apidd->irq_ee);
  1072. }
  1073. }
  1074. return 0;
  1075. }
  1076. static int pmic_arb_read_apid_map_v5(struct spmi_pmic_arb_bus *bus)
  1077. {
  1078. return _pmic_arb_read_apid_map(bus, bus->pmic_arb->core, PMIC_ARB_PPID_MASK,
  1079. 8, PMIC_ARB_CHAN_IS_IRQ_OWNER_MASK);
  1080. }
  1081. static int pmic_arb_ppid_to_apid_v5(struct spmi_pmic_arb_bus *bus, u16 ppid)
  1082. {
  1083. if (!(bus->ppid_to_apid[ppid] & PMIC_ARB_APID_VALID))
  1084. return -ENODEV;
  1085. return bus->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID;
  1086. }
  1087. /* v2 offset per ppid and per ee */
  1088. static int pmic_arb_offset_v2(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  1089. enum pmic_arb_channel ch_type)
  1090. {
  1091. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1092. u16 apid;
  1093. u16 ppid;
  1094. int rc;
  1095. ppid = sid << 8 | ((addr >> 8) & 0xFF);
  1096. rc = pmic_arb_ppid_to_apid_v2(bus, ppid);
  1097. if (rc < 0)
  1098. return rc;
  1099. apid = rc;
  1100. return 0x1000 * pmic_arb->ee + 0x8000 * apid;
  1101. }
  1102. static int pmic_arb_init_apid_v5(struct spmi_pmic_arb_bus *bus, int index)
  1103. {
  1104. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1105. int ret;
  1106. if (index) {
  1107. dev_err(&bus->spmic->dev, "Unsupported buses count %d detected\n",
  1108. index);
  1109. return -EINVAL;
  1110. }
  1111. bus->base_apid = 0;
  1112. bus->apid_count = readl_relaxed(pmic_arb->core + PMIC_ARB_FEATURES) &
  1113. PMIC_ARB_FEATURES_PERIPH_MASK;
  1114. if (bus->base_apid + bus->apid_count > pmic_arb->max_periphs) {
  1115. dev_err(&bus->spmic->dev, "Unsupported APID count %d detected\n",
  1116. bus->base_apid + bus->apid_count);
  1117. return -EINVAL;
  1118. }
  1119. ret = pmic_arb_init_apid_min_max(bus);
  1120. if (ret)
  1121. return ret;
  1122. ret = pmic_arb_read_apid_map_v5(bus);
  1123. if (ret) {
  1124. dev_err(&bus->spmic->dev, "could not read APID->PPID mapping table, rc= %d\n",
  1125. ret);
  1126. return ret;
  1127. }
  1128. return 0;
  1129. }
  1130. /*
  1131. * v5 offset per ee and per apid for observer channels and per apid for
  1132. * read/write channels.
  1133. */
  1134. static int pmic_arb_offset_v5(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  1135. enum pmic_arb_channel ch_type)
  1136. {
  1137. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1138. u16 apid;
  1139. int rc;
  1140. u32 offset = 0;
  1141. u16 ppid = (sid << 8) | (addr >> 8);
  1142. rc = pmic_arb_ppid_to_apid_v5(bus, ppid);
  1143. if (rc < 0)
  1144. return rc;
  1145. apid = rc;
  1146. switch (ch_type) {
  1147. case PMIC_ARB_CHANNEL_OBS:
  1148. offset = 0x10000 * pmic_arb->ee + 0x80 * apid;
  1149. break;
  1150. case PMIC_ARB_CHANNEL_RW:
  1151. if (bus->apid_data[apid].write_ee != pmic_arb->ee) {
  1152. dev_err(&bus->spmic->dev, "disallowed SPMI write to sid=%u, addr=0x%04X\n",
  1153. sid, addr);
  1154. return -EPERM;
  1155. }
  1156. offset = 0x10000 * apid;
  1157. break;
  1158. }
  1159. return offset;
  1160. }
  1161. static int pmic_arb_get_core_resources_v7(struct platform_device *pdev,
  1162. void __iomem *core)
  1163. {
  1164. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  1165. pmic_arb->core = core;
  1166. pmic_arb->max_periphs = PMIC_ARB_MAX_PERIPHS_V7;
  1167. return pmic_arb_get_obsrvr_chnls_v2(pdev);
  1168. }
  1169. static int _pmic_arb_init_apid_v7(struct spmi_pmic_arb_bus *bus, int index,
  1170. int max_buses, unsigned long periph_mask)
  1171. {
  1172. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1173. int i;
  1174. if (index < 0 || index >= max_buses) {
  1175. dev_err(&bus->spmic->dev, "Unsupported bus index %d detected\n",
  1176. index);
  1177. return -EINVAL;
  1178. }
  1179. bus->base_apid = 0;
  1180. bus->apid_count = 0;
  1181. for (i = 0; i <= index; i++) {
  1182. bus->base_apid += bus->apid_count;
  1183. bus->apid_count = readl_relaxed(pmic_arb->core +
  1184. PMIC_ARB_FEATURES + i * 4) &
  1185. periph_mask;
  1186. }
  1187. if (bus->apid_count == 0) {
  1188. dev_err(&bus->spmic->dev, "Bus %d not implemented\n", index);
  1189. return -EINVAL;
  1190. } else if (bus->base_apid + bus->apid_count > pmic_arb->max_periphs) {
  1191. dev_err(&bus->spmic->dev, "Unsupported max APID %d detected\n",
  1192. bus->base_apid + bus->apid_count);
  1193. return -EINVAL;
  1194. }
  1195. return pmic_arb_init_apid_min_max(bus);
  1196. }
  1197. /*
  1198. * Arbiter v7 supports 2 buses. Each bus will get a different apid count, read
  1199. * from different registers.
  1200. */
  1201. static int pmic_arb_init_apid_v7(struct spmi_pmic_arb_bus *bus, int index)
  1202. {
  1203. int ret = _pmic_arb_init_apid_v7(bus, index, 2, PMIC_ARB_FEATURES_PERIPH_MASK);
  1204. if (ret)
  1205. return ret;
  1206. ret = pmic_arb_read_apid_map_v5(bus);
  1207. if (ret) {
  1208. dev_err(&bus->spmic->dev, "could not read APID->PPID mapping table, rc= %d\n",
  1209. ret);
  1210. return ret;
  1211. }
  1212. return 0;
  1213. }
  1214. /*
  1215. * v7 offset per ee and per apid for observer channels and per apid for
  1216. * read/write channels.
  1217. */
  1218. static int pmic_arb_offset_v7(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  1219. enum pmic_arb_channel ch_type)
  1220. {
  1221. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1222. u16 apid;
  1223. int rc;
  1224. u32 offset = 0;
  1225. u16 ppid = (sid << 8) | (addr >> 8);
  1226. rc = pmic_arb->ver_ops->ppid_to_apid(bus, ppid);
  1227. if (rc < 0)
  1228. return rc;
  1229. apid = rc;
  1230. switch (ch_type) {
  1231. case PMIC_ARB_CHANNEL_OBS:
  1232. offset = 0x8000 * pmic_arb->ee + 0x20 * apid;
  1233. break;
  1234. case PMIC_ARB_CHANNEL_RW:
  1235. if (bus->apid_data[apid].write_ee != pmic_arb->ee) {
  1236. dev_err(&bus->spmic->dev, "disallowed SPMI write to sid=%u, addr=0x%04X\n",
  1237. sid, addr);
  1238. return -EPERM;
  1239. }
  1240. offset = 0x1000 * apid;
  1241. break;
  1242. }
  1243. return offset;
  1244. }
  1245. static int pmic_arb_get_core_resources_v8(struct platform_device *pdev,
  1246. void __iomem *core)
  1247. {
  1248. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  1249. pmic_arb->apid_map = devm_platform_ioremap_resource_byname(pdev, "chnl_map");
  1250. if (IS_ERR(pmic_arb->apid_map))
  1251. return PTR_ERR(pmic_arb->apid_map);
  1252. pmic_arb->core = core;
  1253. pmic_arb->max_periphs = PMIC_ARB_MAX_PERIPHS_V8;
  1254. return pmic_arb_get_obsrvr_chnls_v2(pdev);
  1255. }
  1256. static int pmic_arb_get_bus_resources_v8(struct platform_device *pdev,
  1257. struct device_node *node,
  1258. struct spmi_pmic_arb_bus *bus)
  1259. {
  1260. int index;
  1261. index = of_property_match_string(node, "reg-names", "chnl_owner");
  1262. if (index < 0) {
  1263. dev_err(&pdev->dev, "chnl_owner reg region missing\n");
  1264. return -EINVAL;
  1265. }
  1266. bus->apid_owner = devm_of_iomap(&pdev->dev, node, index, NULL);
  1267. return PTR_ERR_OR_ZERO(bus->apid_owner);
  1268. }
  1269. static int pmic_arb_read_apid_map_v8(struct spmi_pmic_arb_bus *bus)
  1270. {
  1271. return _pmic_arb_read_apid_map(bus, bus->pmic_arb->apid_map,
  1272. PMIC_ARB_V8_PPID_MASK, 0,
  1273. PMIC_ARB_V8_CHAN_IS_IRQ_OWNER_MASK);
  1274. }
  1275. /*
  1276. * Arbiter v8 supports up to 4 buses. Each bus will get a different apid count, read
  1277. * from different registers.
  1278. */
  1279. static int pmic_arb_init_apid_v8(struct spmi_pmic_arb_bus *bus, int index)
  1280. {
  1281. int ret = _pmic_arb_init_apid_v7(bus, index, 4,
  1282. PMIC_ARB_FEATURES_V8_PERIPH_MASK);
  1283. if (ret)
  1284. return ret;
  1285. ret = pmic_arb_read_apid_map_v8(bus);
  1286. if (ret) {
  1287. dev_err(&bus->spmic->dev, "could not read APID->PPID mapping table, rc= %d\n",
  1288. ret);
  1289. return ret;
  1290. }
  1291. return 0;
  1292. }
  1293. /*
  1294. * v8 offset per ee and per apid for observer channels and per apid for
  1295. * read/write channels.
  1296. */
  1297. static int pmic_arb_offset_v8(struct spmi_pmic_arb_bus *bus, u8 sid, u16 addr,
  1298. enum pmic_arb_channel ch_type)
  1299. {
  1300. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1301. u16 apid;
  1302. int rc;
  1303. u32 offset = 0;
  1304. u16 ppid = (sid << 8) | (addr >> 8);
  1305. rc = pmic_arb->ver_ops->ppid_to_apid(bus, ppid);
  1306. if (rc < 0)
  1307. return rc;
  1308. apid = rc;
  1309. switch (ch_type) {
  1310. case PMIC_ARB_CHANNEL_OBS:
  1311. offset = 0x40000 * pmic_arb->ee + 0x20 * apid;
  1312. break;
  1313. case PMIC_ARB_CHANNEL_RW:
  1314. if (bus->apid_data[apid].write_ee != pmic_arb->ee) {
  1315. dev_err(&bus->spmic->dev, "disallowed SPMI write to sid=%u, addr=0x%04X\n",
  1316. sid, addr);
  1317. return -EPERM;
  1318. }
  1319. offset = 0x200 * apid;
  1320. break;
  1321. }
  1322. return offset;
  1323. }
  1324. static u32 pmic_arb_fmt_cmd_v1(u8 opc, u8 sid, u16 addr, u8 bc)
  1325. {
  1326. return (opc << 27) | ((sid & 0xf) << 20) | (addr << 4) | (bc & 0x7);
  1327. }
  1328. static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc)
  1329. {
  1330. return (opc << 27) | ((addr & 0xff) << 4) | (bc & 0x7);
  1331. }
  1332. static void __iomem *
  1333. pmic_arb_owner_acc_status_v1(struct spmi_pmic_arb_bus *bus, u8 m, u16 n)
  1334. {
  1335. return bus->intr + 0x20 * m + 0x4 * n;
  1336. }
  1337. static void __iomem *
  1338. pmic_arb_owner_acc_status_v2(struct spmi_pmic_arb_bus *bus, u8 m, u16 n)
  1339. {
  1340. return bus->intr + 0x100000 + 0x1000 * m + 0x4 * n;
  1341. }
  1342. static void __iomem *
  1343. pmic_arb_owner_acc_status_v3(struct spmi_pmic_arb_bus *bus, u8 m, u16 n)
  1344. {
  1345. return bus->intr + 0x200000 + 0x1000 * m + 0x4 * n;
  1346. }
  1347. static void __iomem *
  1348. pmic_arb_owner_acc_status_v5(struct spmi_pmic_arb_bus *bus, u8 m, u16 n)
  1349. {
  1350. return bus->intr + 0x10000 * m + 0x4 * n;
  1351. }
  1352. static void __iomem *
  1353. pmic_arb_owner_acc_status_v7(struct spmi_pmic_arb_bus *bus, u8 m, u16 n)
  1354. {
  1355. return bus->intr + 0x1000 * m + 0x4 * n;
  1356. }
  1357. static void __iomem *
  1358. pmic_arb_acc_enable_v1(struct spmi_pmic_arb_bus *bus, u16 n)
  1359. {
  1360. return bus->intr + 0x200 + 0x4 * n;
  1361. }
  1362. static void __iomem *
  1363. pmic_arb_acc_enable_v2(struct spmi_pmic_arb_bus *bus, u16 n)
  1364. {
  1365. return bus->intr + 0x1000 * n;
  1366. }
  1367. static void __iomem *
  1368. pmic_arb_acc_enable_v5(struct spmi_pmic_arb_bus *bus, u16 n)
  1369. {
  1370. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1371. return pmic_arb->wr_base + 0x100 + 0x10000 * n;
  1372. }
  1373. static void __iomem *
  1374. pmic_arb_acc_enable_v7(struct spmi_pmic_arb_bus *bus, u16 n)
  1375. {
  1376. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1377. return pmic_arb->wr_base + 0x100 + 0x1000 * n;
  1378. }
  1379. static void __iomem *
  1380. pmic_arb_acc_enable_v8(struct spmi_pmic_arb_bus *bus, u16 n)
  1381. {
  1382. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1383. return pmic_arb->wr_base + 0x100 + 0x200 * n;
  1384. }
  1385. static void __iomem *
  1386. pmic_arb_irq_status_v1(struct spmi_pmic_arb_bus *bus, u16 n)
  1387. {
  1388. return bus->intr + 0x600 + 0x4 * n;
  1389. }
  1390. static void __iomem *
  1391. pmic_arb_irq_status_v2(struct spmi_pmic_arb_bus *bus, u16 n)
  1392. {
  1393. return bus->intr + 0x4 + 0x1000 * n;
  1394. }
  1395. static void __iomem *
  1396. pmic_arb_irq_status_v5(struct spmi_pmic_arb_bus *bus, u16 n)
  1397. {
  1398. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1399. return pmic_arb->wr_base + 0x104 + 0x10000 * n;
  1400. }
  1401. static void __iomem *
  1402. pmic_arb_irq_status_v7(struct spmi_pmic_arb_bus *bus, u16 n)
  1403. {
  1404. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1405. return pmic_arb->wr_base + 0x104 + 0x1000 * n;
  1406. }
  1407. static void __iomem *
  1408. pmic_arb_irq_status_v8(struct spmi_pmic_arb_bus *bus, u16 n)
  1409. {
  1410. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1411. return pmic_arb->wr_base + 0x104 + 0x200 * n;
  1412. }
  1413. static void __iomem *
  1414. pmic_arb_irq_clear_v1(struct spmi_pmic_arb_bus *bus, u16 n)
  1415. {
  1416. return bus->intr + 0xA00 + 0x4 * n;
  1417. }
  1418. static void __iomem *
  1419. pmic_arb_irq_clear_v2(struct spmi_pmic_arb_bus *bus, u16 n)
  1420. {
  1421. return bus->intr + 0x8 + 0x1000 * n;
  1422. }
  1423. static void __iomem *
  1424. pmic_arb_irq_clear_v5(struct spmi_pmic_arb_bus *bus, u16 n)
  1425. {
  1426. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1427. return pmic_arb->wr_base + 0x108 + 0x10000 * n;
  1428. }
  1429. static void __iomem *
  1430. pmic_arb_irq_clear_v7(struct spmi_pmic_arb_bus *bus, u16 n)
  1431. {
  1432. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1433. return pmic_arb->wr_base + 0x108 + 0x1000 * n;
  1434. }
  1435. static void __iomem *
  1436. pmic_arb_irq_clear_v8(struct spmi_pmic_arb_bus *bus, u16 n)
  1437. {
  1438. struct spmi_pmic_arb *pmic_arb = bus->pmic_arb;
  1439. return pmic_arb->wr_base + 0x108 + 0x200 * n;
  1440. }
  1441. static u32 pmic_arb_apid_map_offset_v2(u16 n)
  1442. {
  1443. return 0x800 + 0x4 * n;
  1444. }
  1445. static u32 pmic_arb_apid_map_offset_v5(u16 n)
  1446. {
  1447. return 0x900 + 0x4 * n;
  1448. }
  1449. static u32 pmic_arb_apid_map_offset_v7(u16 n)
  1450. {
  1451. return 0x2000 + 0x4 * n;
  1452. }
  1453. static u32 pmic_arb_apid_map_offset_v8(u16 n)
  1454. {
  1455. /* For v8, offset is from "chnl_map" base register, not "core". */
  1456. return 0x4 * n;
  1457. }
  1458. static void __iomem *
  1459. pmic_arb_apid_owner_v2(struct spmi_pmic_arb_bus *bus, u16 n)
  1460. {
  1461. return bus->cnfg + 0x700 + 0x4 * n;
  1462. }
  1463. /*
  1464. * For arbiter version 7 and 8, APID ownership table registers have independent
  1465. * numbering space for each SPMI bus instance, so each is indexed starting from
  1466. * 0.
  1467. */
  1468. static void __iomem *
  1469. pmic_arb_apid_owner_v7(struct spmi_pmic_arb_bus *bus, u16 n)
  1470. {
  1471. return bus->cnfg + 0x4 * (n - bus->base_apid);
  1472. }
  1473. static void __iomem *
  1474. pmic_arb_apid_owner_v8(struct spmi_pmic_arb_bus *bus, u16 n)
  1475. {
  1476. return bus->apid_owner + 0x4 * (n - bus->base_apid);
  1477. }
  1478. static const struct pmic_arb_ver_ops pmic_arb_v1 = {
  1479. .ver_str = "v1",
  1480. .get_core_resources = pmic_arb_get_core_resources_v1,
  1481. .init_apid = pmic_arb_init_apid_v1,
  1482. .ppid_to_apid = pmic_arb_ppid_to_apid_v1,
  1483. .non_data_cmd = pmic_arb_non_data_cmd_v1,
  1484. .offset = pmic_arb_offset_v1,
  1485. .fmt_cmd = pmic_arb_fmt_cmd_v1,
  1486. .owner_acc_status = pmic_arb_owner_acc_status_v1,
  1487. .acc_enable = pmic_arb_acc_enable_v1,
  1488. .irq_status = pmic_arb_irq_status_v1,
  1489. .irq_clear = pmic_arb_irq_clear_v1,
  1490. .apid_map_offset = pmic_arb_apid_map_offset_v2,
  1491. .apid_owner = pmic_arb_apid_owner_v2,
  1492. };
  1493. static const struct pmic_arb_ver_ops pmic_arb_v2 = {
  1494. .ver_str = "v2",
  1495. .get_core_resources = pmic_arb_get_core_resources_v2,
  1496. .init_apid = pmic_arb_init_apid_v1,
  1497. .ppid_to_apid = pmic_arb_ppid_to_apid_v2,
  1498. .non_data_cmd = pmic_arb_non_data_cmd_v2,
  1499. .offset = pmic_arb_offset_v2,
  1500. .fmt_cmd = pmic_arb_fmt_cmd_v2,
  1501. .owner_acc_status = pmic_arb_owner_acc_status_v2,
  1502. .acc_enable = pmic_arb_acc_enable_v2,
  1503. .irq_status = pmic_arb_irq_status_v2,
  1504. .irq_clear = pmic_arb_irq_clear_v2,
  1505. .apid_map_offset = pmic_arb_apid_map_offset_v2,
  1506. .apid_owner = pmic_arb_apid_owner_v2,
  1507. };
  1508. static const struct pmic_arb_ver_ops pmic_arb_v3 = {
  1509. .ver_str = "v3",
  1510. .get_core_resources = pmic_arb_get_core_resources_v2,
  1511. .init_apid = pmic_arb_init_apid_v1,
  1512. .ppid_to_apid = pmic_arb_ppid_to_apid_v2,
  1513. .non_data_cmd = pmic_arb_non_data_cmd_v2,
  1514. .offset = pmic_arb_offset_v2,
  1515. .fmt_cmd = pmic_arb_fmt_cmd_v2,
  1516. .owner_acc_status = pmic_arb_owner_acc_status_v3,
  1517. .acc_enable = pmic_arb_acc_enable_v2,
  1518. .irq_status = pmic_arb_irq_status_v2,
  1519. .irq_clear = pmic_arb_irq_clear_v2,
  1520. .apid_map_offset = pmic_arb_apid_map_offset_v2,
  1521. .apid_owner = pmic_arb_apid_owner_v2,
  1522. };
  1523. static const struct pmic_arb_ver_ops pmic_arb_v5 = {
  1524. .ver_str = "v5",
  1525. .get_core_resources = pmic_arb_get_core_resources_v2,
  1526. .init_apid = pmic_arb_init_apid_v5,
  1527. .ppid_to_apid = pmic_arb_ppid_to_apid_v5,
  1528. .non_data_cmd = pmic_arb_non_data_cmd_v2,
  1529. .offset = pmic_arb_offset_v5,
  1530. .fmt_cmd = pmic_arb_fmt_cmd_v2,
  1531. .owner_acc_status = pmic_arb_owner_acc_status_v5,
  1532. .acc_enable = pmic_arb_acc_enable_v5,
  1533. .irq_status = pmic_arb_irq_status_v5,
  1534. .irq_clear = pmic_arb_irq_clear_v5,
  1535. .apid_map_offset = pmic_arb_apid_map_offset_v5,
  1536. .apid_owner = pmic_arb_apid_owner_v2,
  1537. };
  1538. static const struct pmic_arb_ver_ops pmic_arb_v7 = {
  1539. .ver_str = "v7",
  1540. .get_core_resources = pmic_arb_get_core_resources_v7,
  1541. .init_apid = pmic_arb_init_apid_v7,
  1542. .ppid_to_apid = pmic_arb_ppid_to_apid_v5,
  1543. .non_data_cmd = pmic_arb_non_data_cmd_v2,
  1544. .offset = pmic_arb_offset_v7,
  1545. .fmt_cmd = pmic_arb_fmt_cmd_v2,
  1546. .owner_acc_status = pmic_arb_owner_acc_status_v7,
  1547. .acc_enable = pmic_arb_acc_enable_v7,
  1548. .irq_status = pmic_arb_irq_status_v7,
  1549. .irq_clear = pmic_arb_irq_clear_v7,
  1550. .apid_map_offset = pmic_arb_apid_map_offset_v7,
  1551. .apid_owner = pmic_arb_apid_owner_v7,
  1552. };
  1553. static const struct pmic_arb_ver_ops pmic_arb_v8 = {
  1554. .ver_str = "v8",
  1555. .get_core_resources = pmic_arb_get_core_resources_v8,
  1556. .get_bus_resources = pmic_arb_get_bus_resources_v8,
  1557. .init_apid = pmic_arb_init_apid_v8,
  1558. .ppid_to_apid = pmic_arb_ppid_to_apid_v5,
  1559. .non_data_cmd = pmic_arb_non_data_cmd_v2,
  1560. .offset = pmic_arb_offset_v8,
  1561. .fmt_cmd = pmic_arb_fmt_cmd_v2,
  1562. .owner_acc_status = pmic_arb_owner_acc_status_v7,
  1563. .acc_enable = pmic_arb_acc_enable_v8,
  1564. .irq_status = pmic_arb_irq_status_v8,
  1565. .irq_clear = pmic_arb_irq_clear_v8,
  1566. .apid_map_offset = pmic_arb_apid_map_offset_v8,
  1567. .apid_owner = pmic_arb_apid_owner_v8,
  1568. };
  1569. static const struct irq_domain_ops pmic_arb_irq_domain_ops = {
  1570. .activate = qpnpint_irq_domain_activate,
  1571. .alloc = qpnpint_irq_domain_alloc,
  1572. .free = irq_domain_free_irqs_common,
  1573. .translate = qpnpint_irq_domain_translate,
  1574. };
  1575. static int spmi_pmic_arb_bus_init(struct platform_device *pdev,
  1576. struct device_node *node,
  1577. struct spmi_pmic_arb *pmic_arb)
  1578. {
  1579. int bus_index = pmic_arb->buses_available;
  1580. struct spmi_pmic_arb_bus *bus;
  1581. struct device *dev = &pdev->dev;
  1582. struct spmi_controller *ctrl;
  1583. void __iomem *intr;
  1584. void __iomem *cnfg;
  1585. int index, ret;
  1586. int irq;
  1587. ctrl = devm_spmi_controller_alloc(dev, sizeof(*bus));
  1588. if (IS_ERR(ctrl))
  1589. return PTR_ERR(ctrl);
  1590. ctrl->cmd = pmic_arb_cmd;
  1591. ctrl->read_cmd = pmic_arb_read_cmd;
  1592. ctrl->write_cmd = pmic_arb_write_cmd;
  1593. bus = spmi_controller_get_drvdata(ctrl);
  1594. pmic_arb->buses[bus_index] = bus;
  1595. raw_spin_lock_init(&bus->lock);
  1596. bus->ppid_to_apid = devm_kcalloc(dev, PMIC_ARB_MAX_PPID,
  1597. sizeof(*bus->ppid_to_apid),
  1598. GFP_KERNEL);
  1599. if (!bus->ppid_to_apid)
  1600. return -ENOMEM;
  1601. bus->apid_data = devm_kcalloc(dev, pmic_arb->max_periphs,
  1602. sizeof(*bus->apid_data),
  1603. GFP_KERNEL);
  1604. if (!bus->apid_data)
  1605. return -ENOMEM;
  1606. index = of_property_match_string(node, "reg-names", "cnfg");
  1607. if (index < 0) {
  1608. dev_err(dev, "cnfg reg region missing\n");
  1609. return -EINVAL;
  1610. }
  1611. cnfg = devm_of_iomap(dev, node, index, NULL);
  1612. if (IS_ERR(cnfg))
  1613. return PTR_ERR(cnfg);
  1614. index = of_property_match_string(node, "reg-names", "intr");
  1615. if (index < 0) {
  1616. dev_err(dev, "intr reg region missing\n");
  1617. return -EINVAL;
  1618. }
  1619. intr = devm_of_iomap(dev, node, index, NULL);
  1620. if (IS_ERR(intr))
  1621. return PTR_ERR(intr);
  1622. irq = of_irq_get_byname(node, "periph_irq");
  1623. if (irq <= 0)
  1624. return irq ?: -ENXIO;
  1625. bus->pmic_arb = pmic_arb;
  1626. bus->intr = intr;
  1627. bus->cnfg = cnfg;
  1628. bus->irq = irq;
  1629. bus->spmic = ctrl;
  1630. bus->id = bus_index;
  1631. if (pmic_arb->ver_ops->get_bus_resources) {
  1632. ret = pmic_arb->ver_ops->get_bus_resources(pdev, node, bus);
  1633. if (ret)
  1634. return ret;
  1635. }
  1636. ret = pmic_arb->ver_ops->init_apid(bus, bus_index);
  1637. if (ret)
  1638. return ret;
  1639. dev_dbg(&pdev->dev, "adding irq domain for bus %d\n", bus_index);
  1640. bus->domain = irq_domain_create_tree(of_fwnode_handle(node), &pmic_arb_irq_domain_ops, bus);
  1641. if (!bus->domain) {
  1642. dev_err(&pdev->dev, "unable to create irq_domain\n");
  1643. return -ENOMEM;
  1644. }
  1645. irq_set_chained_handler_and_data(bus->irq,
  1646. pmic_arb_chained_irq, bus);
  1647. ctrl->dev.of_node = node;
  1648. dev_set_name(&ctrl->dev, "spmi-%d", bus_index);
  1649. ret = devm_spmi_controller_add(dev, ctrl);
  1650. if (ret)
  1651. return ret;
  1652. pmic_arb->buses_available++;
  1653. return 0;
  1654. }
  1655. static int spmi_pmic_arb_register_buses(struct spmi_pmic_arb *pmic_arb,
  1656. struct platform_device *pdev)
  1657. {
  1658. struct device *dev = &pdev->dev;
  1659. struct device_node *node = dev->of_node;
  1660. int ret;
  1661. /* legacy mode doesn't provide child node for the bus */
  1662. if (of_device_is_compatible(node, "qcom,spmi-pmic-arb"))
  1663. return spmi_pmic_arb_bus_init(pdev, node, pmic_arb);
  1664. for_each_available_child_of_node_scoped(node, child) {
  1665. if (of_node_name_eq(child, "spmi")) {
  1666. ret = spmi_pmic_arb_bus_init(pdev, child, pmic_arb);
  1667. if (ret)
  1668. return ret;
  1669. }
  1670. }
  1671. return ret;
  1672. }
  1673. static void spmi_pmic_arb_deregister_buses(struct spmi_pmic_arb *pmic_arb)
  1674. {
  1675. int i;
  1676. for (i = 0; i < pmic_arb->buses_available; i++) {
  1677. struct spmi_pmic_arb_bus *bus = pmic_arb->buses[i];
  1678. irq_set_chained_handler_and_data(bus->irq,
  1679. NULL, NULL);
  1680. irq_domain_remove(bus->domain);
  1681. }
  1682. }
  1683. static int spmi_pmic_arb_probe(struct platform_device *pdev)
  1684. {
  1685. struct spmi_pmic_arb *pmic_arb;
  1686. struct device *dev = &pdev->dev;
  1687. struct resource *res;
  1688. void __iomem *core;
  1689. u32 channel, ee, hw_ver;
  1690. int err;
  1691. pmic_arb = devm_kzalloc(dev, sizeof(*pmic_arb), GFP_KERNEL);
  1692. if (!pmic_arb)
  1693. return -ENOMEM;
  1694. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core");
  1695. core = devm_ioremap(dev, res->start, resource_size(res));
  1696. if (!core)
  1697. return -ENOMEM;
  1698. pmic_arb->core_size = resource_size(res);
  1699. platform_set_drvdata(pdev, pmic_arb);
  1700. hw_ver = readl_relaxed(core + PMIC_ARB_VERSION);
  1701. if (hw_ver < PMIC_ARB_VERSION_V2_MIN)
  1702. pmic_arb->ver_ops = &pmic_arb_v1;
  1703. else if (hw_ver < PMIC_ARB_VERSION_V3_MIN)
  1704. pmic_arb->ver_ops = &pmic_arb_v2;
  1705. else if (hw_ver < PMIC_ARB_VERSION_V5_MIN)
  1706. pmic_arb->ver_ops = &pmic_arb_v3;
  1707. else if (hw_ver < PMIC_ARB_VERSION_V7_MIN)
  1708. pmic_arb->ver_ops = &pmic_arb_v5;
  1709. else if (hw_ver < PMIC_ARB_VERSION_V8_MIN)
  1710. pmic_arb->ver_ops = &pmic_arb_v7;
  1711. else
  1712. pmic_arb->ver_ops = &pmic_arb_v8;
  1713. err = pmic_arb->ver_ops->get_core_resources(pdev, core);
  1714. if (err)
  1715. return err;
  1716. dev_info(dev, "PMIC arbiter version %s (0x%x)\n",
  1717. pmic_arb->ver_ops->ver_str, hw_ver);
  1718. err = of_property_read_u32(pdev->dev.of_node, "qcom,channel", &channel);
  1719. if (err) {
  1720. dev_err(&pdev->dev, "channel unspecified.\n");
  1721. return err;
  1722. }
  1723. if (channel > 5) {
  1724. dev_err(&pdev->dev, "invalid channel (%u) specified.\n",
  1725. channel);
  1726. return -EINVAL;
  1727. }
  1728. pmic_arb->channel = channel;
  1729. err = of_property_read_u32(pdev->dev.of_node, "qcom,ee", &ee);
  1730. if (err) {
  1731. dev_err(&pdev->dev, "EE unspecified.\n");
  1732. return err;
  1733. }
  1734. if (ee > 5) {
  1735. dev_err(&pdev->dev, "invalid EE (%u) specified\n", ee);
  1736. return -EINVAL;
  1737. }
  1738. pmic_arb->ee = ee;
  1739. return spmi_pmic_arb_register_buses(pmic_arb, pdev);
  1740. }
  1741. static void spmi_pmic_arb_remove(struct platform_device *pdev)
  1742. {
  1743. struct spmi_pmic_arb *pmic_arb = platform_get_drvdata(pdev);
  1744. spmi_pmic_arb_deregister_buses(pmic_arb);
  1745. }
  1746. static const struct of_device_id spmi_pmic_arb_match_table[] = {
  1747. { .compatible = "qcom,spmi-pmic-arb", },
  1748. { .compatible = "qcom,x1e80100-spmi-pmic-arb", },
  1749. { .compatible = "qcom,glymur-spmi-pmic-arb", },
  1750. {},
  1751. };
  1752. MODULE_DEVICE_TABLE(of, spmi_pmic_arb_match_table);
  1753. static struct platform_driver spmi_pmic_arb_driver = {
  1754. .probe = spmi_pmic_arb_probe,
  1755. .remove = spmi_pmic_arb_remove,
  1756. .driver = {
  1757. .name = "spmi_pmic_arb",
  1758. .of_match_table = spmi_pmic_arb_match_table,
  1759. },
  1760. };
  1761. module_platform_driver(spmi_pmic_arb_driver);
  1762. MODULE_DESCRIPTION("Qualcomm MSM SPMI Controller (PMIC Arbiter) driver");
  1763. MODULE_LICENSE("GPL v2");
  1764. MODULE_ALIAS("platform:spmi_pmic_arb");