kcs_bmc_aspeed.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015-2018, Intel Corporation.
  4. */
  5. #define pr_fmt(fmt) "aspeed-kcs-bmc: " fmt
  6. #include <linux/atomic.h>
  7. #include <linux/errno.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/io.h>
  10. #include <linux/irq.h>
  11. #include <linux/mfd/syscon.h>
  12. #include <linux/module.h>
  13. #include <linux/of.h>
  14. #include <linux/of_address.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/poll.h>
  17. #include <linux/regmap.h>
  18. #include <linux/sched.h>
  19. #include <linux/slab.h>
  20. #include <linux/timer.h>
  21. #include "kcs_bmc_device.h"
  22. #define DEVICE_NAME "ast-kcs-bmc"
  23. #define KCS_CHANNEL_MAX 4
  24. /*
  25. * Field class descriptions
  26. *
  27. * LPCyE Enable LPC channel y
  28. * IBFIEy Input Buffer Full IRQ Enable for LPC channel y
  29. * IRQxEy Assert SerIRQ x for LPC channel y (Deprecated, use IDyIRQX, IRQXEy)
  30. * IDyIRQX Use the specified 4-bit SerIRQ for LPC channel y
  31. * SELyIRQX SerIRQ polarity for LPC channel y (low: 0, high: 1)
  32. * IRQXEy Assert the SerIRQ specified in IDyIRQX for LPC channel y
  33. */
  34. #define LPC_TYIRQX_LOW 0b00
  35. #define LPC_TYIRQX_HIGH 0b01
  36. #define LPC_TYIRQX_RSVD 0b10
  37. #define LPC_TYIRQX_RISING 0b11
  38. #define LPC_HICR0 0x000
  39. #define LPC_HICR0_LPC3E BIT(7)
  40. #define LPC_HICR0_LPC2E BIT(6)
  41. #define LPC_HICR0_LPC1E BIT(5)
  42. #define LPC_HICR2 0x008
  43. #define LPC_HICR2_IBFIE3 BIT(3)
  44. #define LPC_HICR2_IBFIE2 BIT(2)
  45. #define LPC_HICR2_IBFIE1 BIT(1)
  46. #define LPC_HICR4 0x010
  47. #define LPC_HICR4_LADR12AS BIT(7)
  48. #define LPC_HICR4_KCSENBL BIT(2)
  49. #define LPC_SIRQCR0 0x070
  50. /* IRQ{12,1}E1 are deprecated as of AST2600 A3 but necessary for prior chips */
  51. #define LPC_SIRQCR0_IRQ12E1 BIT(1)
  52. #define LPC_SIRQCR0_IRQ1E1 BIT(0)
  53. #define LPC_HICR5 0x080
  54. #define LPC_HICR5_ID3IRQX_MASK GENMASK(23, 20)
  55. #define LPC_HICR5_ID3IRQX_SHIFT 20
  56. #define LPC_HICR5_ID2IRQX_MASK GENMASK(19, 16)
  57. #define LPC_HICR5_ID2IRQX_SHIFT 16
  58. #define LPC_HICR5_SEL3IRQX BIT(15)
  59. #define LPC_HICR5_IRQXE3 BIT(14)
  60. #define LPC_HICR5_SEL2IRQX BIT(13)
  61. #define LPC_HICR5_IRQXE2 BIT(12)
  62. #define LPC_LADR3H 0x014
  63. #define LPC_LADR3L 0x018
  64. #define LPC_LADR12H 0x01C
  65. #define LPC_LADR12L 0x020
  66. #define LPC_IDR1 0x024
  67. #define LPC_IDR2 0x028
  68. #define LPC_IDR3 0x02C
  69. #define LPC_ODR1 0x030
  70. #define LPC_ODR2 0x034
  71. #define LPC_ODR3 0x038
  72. #define LPC_STR1 0x03C
  73. #define LPC_STR2 0x040
  74. #define LPC_STR3 0x044
  75. #define LPC_HICRB 0x100
  76. #define LPC_HICRB_EN16LADR2 BIT(5)
  77. #define LPC_HICRB_EN16LADR1 BIT(4)
  78. #define LPC_HICRB_IBFIE4 BIT(1)
  79. #define LPC_HICRB_LPC4E BIT(0)
  80. #define LPC_HICRC 0x104
  81. #define LPC_HICRC_ID4IRQX_MASK GENMASK(7, 4)
  82. #define LPC_HICRC_ID4IRQX_SHIFT 4
  83. #define LPC_HICRC_TY4IRQX_MASK GENMASK(3, 2)
  84. #define LPC_HICRC_TY4IRQX_SHIFT 2
  85. #define LPC_HICRC_OBF4_AUTO_CLR BIT(1)
  86. #define LPC_HICRC_IRQXE4 BIT(0)
  87. #define LPC_LADR4 0x110
  88. #define LPC_IDR4 0x114
  89. #define LPC_ODR4 0x118
  90. #define LPC_STR4 0x11C
  91. #define LPC_LSADR12 0x120
  92. #define LPC_LSADR12_LSADR2_MASK GENMASK(31, 16)
  93. #define LPC_LSADR12_LSADR2_SHIFT 16
  94. #define LPC_LSADR12_LSADR1_MASK GENMASK(15, 0)
  95. #define LPC_LSADR12_LSADR1_SHIFT 0
  96. #define OBE_POLL_PERIOD (HZ / 2)
  97. enum aspeed_kcs_irq_mode {
  98. aspeed_kcs_irq_none,
  99. aspeed_kcs_irq_serirq,
  100. };
  101. struct aspeed_kcs_bmc {
  102. struct kcs_bmc_device kcs_bmc;
  103. struct regmap *map;
  104. struct {
  105. enum aspeed_kcs_irq_mode mode;
  106. int id;
  107. } upstream_irq;
  108. struct {
  109. spinlock_t lock;
  110. bool remove;
  111. struct timer_list timer;
  112. } obe;
  113. };
  114. static inline struct aspeed_kcs_bmc *to_aspeed_kcs_bmc(struct kcs_bmc_device *kcs_bmc)
  115. {
  116. return container_of(kcs_bmc, struct aspeed_kcs_bmc, kcs_bmc);
  117. }
  118. static u8 aspeed_kcs_inb(struct kcs_bmc_device *kcs_bmc, u32 reg)
  119. {
  120. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  121. u32 val = 0;
  122. int rc;
  123. rc = regmap_read(priv->map, reg, &val);
  124. WARN(rc != 0, "regmap_read() failed: %d\n", rc);
  125. return rc == 0 ? (u8) val : 0;
  126. }
  127. static void aspeed_kcs_outb(struct kcs_bmc_device *kcs_bmc, u32 reg, u8 data)
  128. {
  129. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  130. int rc;
  131. rc = regmap_write(priv->map, reg, data);
  132. WARN(rc != 0, "regmap_write() failed: %d\n", rc);
  133. /* Trigger the upstream IRQ on ODR writes, if enabled */
  134. switch (reg) {
  135. case LPC_ODR1:
  136. case LPC_ODR2:
  137. case LPC_ODR3:
  138. case LPC_ODR4:
  139. break;
  140. default:
  141. return;
  142. }
  143. if (priv->upstream_irq.mode != aspeed_kcs_irq_serirq)
  144. return;
  145. switch (kcs_bmc->channel) {
  146. case 1:
  147. switch (priv->upstream_irq.id) {
  148. case 12:
  149. regmap_update_bits(priv->map, LPC_SIRQCR0, LPC_SIRQCR0_IRQ12E1,
  150. LPC_SIRQCR0_IRQ12E1);
  151. break;
  152. case 1:
  153. regmap_update_bits(priv->map, LPC_SIRQCR0, LPC_SIRQCR0_IRQ1E1,
  154. LPC_SIRQCR0_IRQ1E1);
  155. break;
  156. default:
  157. break;
  158. }
  159. break;
  160. case 2:
  161. regmap_update_bits(priv->map, LPC_HICR5, LPC_HICR5_IRQXE2, LPC_HICR5_IRQXE2);
  162. break;
  163. case 3:
  164. regmap_update_bits(priv->map, LPC_HICR5, LPC_HICR5_IRQXE3, LPC_HICR5_IRQXE3);
  165. break;
  166. case 4:
  167. regmap_update_bits(priv->map, LPC_HICRC, LPC_HICRC_IRQXE4, LPC_HICRC_IRQXE4);
  168. break;
  169. default:
  170. break;
  171. }
  172. }
  173. static void aspeed_kcs_updateb(struct kcs_bmc_device *kcs_bmc, u32 reg, u8 mask, u8 val)
  174. {
  175. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  176. int rc;
  177. rc = regmap_update_bits(priv->map, reg, mask, val);
  178. WARN(rc != 0, "regmap_update_bits() failed: %d\n", rc);
  179. }
  180. /*
  181. * We note D for Data, and C for Cmd/Status, default rules are
  182. *
  183. * 1. Only the D address is given:
  184. * A. KCS1/KCS2 (D/C: X/X+4)
  185. * D/C: CA0h/CA4h
  186. * D/C: CA8h/CACh
  187. * B. KCS3 (D/C: XX2/XX3h)
  188. * D/C: CA2h/CA3h
  189. * C. KCS4 (D/C: X/X+1)
  190. * D/C: CA4h/CA5h
  191. *
  192. * 2. Both the D/C addresses are given:
  193. * A. KCS1/KCS2/KCS4 (D/C: X/Y)
  194. * D/C: CA0h/CA1h
  195. * D/C: CA8h/CA9h
  196. * D/C: CA4h/CA5h
  197. * B. KCS3 (D/C: XX2/XX3h)
  198. * D/C: CA2h/CA3h
  199. */
  200. static int aspeed_kcs_set_address(struct kcs_bmc_device *kcs_bmc, u32 addrs[2], int nr_addrs)
  201. {
  202. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  203. if (WARN_ON(nr_addrs < 1 || nr_addrs > 2))
  204. return -EINVAL;
  205. switch (priv->kcs_bmc.channel) {
  206. case 1:
  207. regmap_update_bits(priv->map, LPC_HICR4, LPC_HICR4_LADR12AS, 0);
  208. regmap_write(priv->map, LPC_LADR12H, addrs[0] >> 8);
  209. regmap_write(priv->map, LPC_LADR12L, addrs[0] & 0xFF);
  210. if (nr_addrs == 2) {
  211. regmap_update_bits(priv->map, LPC_LSADR12, LPC_LSADR12_LSADR1_MASK,
  212. addrs[1] << LPC_LSADR12_LSADR1_SHIFT);
  213. regmap_update_bits(priv->map, LPC_HICRB, LPC_HICRB_EN16LADR1,
  214. LPC_HICRB_EN16LADR1);
  215. }
  216. break;
  217. case 2:
  218. regmap_update_bits(priv->map, LPC_HICR4, LPC_HICR4_LADR12AS, LPC_HICR4_LADR12AS);
  219. regmap_write(priv->map, LPC_LADR12H, addrs[0] >> 8);
  220. regmap_write(priv->map, LPC_LADR12L, addrs[0] & 0xFF);
  221. if (nr_addrs == 2) {
  222. regmap_update_bits(priv->map, LPC_LSADR12, LPC_LSADR12_LSADR2_MASK,
  223. addrs[1] << LPC_LSADR12_LSADR2_SHIFT);
  224. regmap_update_bits(priv->map, LPC_HICRB, LPC_HICRB_EN16LADR2,
  225. LPC_HICRB_EN16LADR2);
  226. }
  227. break;
  228. case 3:
  229. if (nr_addrs == 2) {
  230. dev_err(priv->kcs_bmc.dev,
  231. "Channel 3 only supports inferred status IO address\n");
  232. return -EINVAL;
  233. }
  234. regmap_write(priv->map, LPC_LADR3H, addrs[0] >> 8);
  235. regmap_write(priv->map, LPC_LADR3L, addrs[0] & 0xFF);
  236. break;
  237. case 4:
  238. if (nr_addrs == 1)
  239. regmap_write(priv->map, LPC_LADR4, ((addrs[0] + 1) << 16) | addrs[0]);
  240. else
  241. regmap_write(priv->map, LPC_LADR4, (addrs[1] << 16) | addrs[0]);
  242. break;
  243. default:
  244. return -EINVAL;
  245. }
  246. return 0;
  247. }
  248. static inline int aspeed_kcs_map_serirq_type(u32 dt_type)
  249. {
  250. switch (dt_type) {
  251. case IRQ_TYPE_EDGE_RISING:
  252. return LPC_TYIRQX_RISING;
  253. case IRQ_TYPE_LEVEL_HIGH:
  254. return LPC_TYIRQX_HIGH;
  255. case IRQ_TYPE_LEVEL_LOW:
  256. return LPC_TYIRQX_LOW;
  257. default:
  258. return -EINVAL;
  259. }
  260. }
  261. static int aspeed_kcs_config_upstream_irq(struct aspeed_kcs_bmc *priv, u32 id, u32 dt_type)
  262. {
  263. unsigned int mask, val, hw_type;
  264. int ret;
  265. if (id > 15)
  266. return -EINVAL;
  267. ret = aspeed_kcs_map_serirq_type(dt_type);
  268. if (ret < 0)
  269. return ret;
  270. hw_type = ret;
  271. priv->upstream_irq.mode = aspeed_kcs_irq_serirq;
  272. priv->upstream_irq.id = id;
  273. switch (priv->kcs_bmc.channel) {
  274. case 1:
  275. /* Needs IRQxE1 rather than (ID1IRQX, SEL1IRQX, IRQXE1) before AST2600 A3 */
  276. break;
  277. case 2:
  278. if (!(hw_type == LPC_TYIRQX_LOW || hw_type == LPC_TYIRQX_HIGH))
  279. return -EINVAL;
  280. mask = LPC_HICR5_SEL2IRQX | LPC_HICR5_ID2IRQX_MASK;
  281. val = (id << LPC_HICR5_ID2IRQX_SHIFT);
  282. val |= (hw_type == LPC_TYIRQX_HIGH) ? LPC_HICR5_SEL2IRQX : 0;
  283. regmap_update_bits(priv->map, LPC_HICR5, mask, val);
  284. break;
  285. case 3:
  286. if (!(hw_type == LPC_TYIRQX_LOW || hw_type == LPC_TYIRQX_HIGH))
  287. return -EINVAL;
  288. mask = LPC_HICR5_SEL3IRQX | LPC_HICR5_ID3IRQX_MASK;
  289. val = (id << LPC_HICR5_ID3IRQX_SHIFT);
  290. val |= (hw_type == LPC_TYIRQX_HIGH) ? LPC_HICR5_SEL3IRQX : 0;
  291. regmap_update_bits(priv->map, LPC_HICR5, mask, val);
  292. break;
  293. case 4:
  294. mask = LPC_HICRC_ID4IRQX_MASK | LPC_HICRC_TY4IRQX_MASK | LPC_HICRC_OBF4_AUTO_CLR;
  295. val = (id << LPC_HICRC_ID4IRQX_SHIFT) | (hw_type << LPC_HICRC_TY4IRQX_SHIFT);
  296. regmap_update_bits(priv->map, LPC_HICRC, mask, val);
  297. break;
  298. default:
  299. dev_warn(priv->kcs_bmc.dev,
  300. "SerIRQ configuration not supported on KCS channel %d\n",
  301. priv->kcs_bmc.channel);
  302. return -EINVAL;
  303. }
  304. return 0;
  305. }
  306. static void aspeed_kcs_enable_channel(struct kcs_bmc_device *kcs_bmc, bool enable)
  307. {
  308. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  309. switch (kcs_bmc->channel) {
  310. case 1:
  311. regmap_update_bits(priv->map, LPC_HICR0, LPC_HICR0_LPC1E, enable * LPC_HICR0_LPC1E);
  312. return;
  313. case 2:
  314. regmap_update_bits(priv->map, LPC_HICR0, LPC_HICR0_LPC2E, enable * LPC_HICR0_LPC2E);
  315. return;
  316. case 3:
  317. regmap_update_bits(priv->map, LPC_HICR0, LPC_HICR0_LPC3E, enable * LPC_HICR0_LPC3E);
  318. regmap_update_bits(priv->map, LPC_HICR4,
  319. LPC_HICR4_KCSENBL, enable * LPC_HICR4_KCSENBL);
  320. return;
  321. case 4:
  322. regmap_update_bits(priv->map, LPC_HICRB, LPC_HICRB_LPC4E, enable * LPC_HICRB_LPC4E);
  323. return;
  324. default:
  325. pr_warn("%s: Unsupported channel: %d", __func__, kcs_bmc->channel);
  326. return;
  327. }
  328. }
  329. static void aspeed_kcs_check_obe(struct timer_list *timer)
  330. {
  331. struct aspeed_kcs_bmc *priv = container_of(timer, struct aspeed_kcs_bmc, obe.timer);
  332. unsigned long flags;
  333. u8 str;
  334. spin_lock_irqsave(&priv->obe.lock, flags);
  335. if (priv->obe.remove) {
  336. spin_unlock_irqrestore(&priv->obe.lock, flags);
  337. return;
  338. }
  339. str = aspeed_kcs_inb(&priv->kcs_bmc, priv->kcs_bmc.ioreg.str);
  340. if (str & KCS_BMC_STR_OBF) {
  341. mod_timer(timer, jiffies + OBE_POLL_PERIOD);
  342. spin_unlock_irqrestore(&priv->obe.lock, flags);
  343. return;
  344. }
  345. spin_unlock_irqrestore(&priv->obe.lock, flags);
  346. kcs_bmc_handle_event(&priv->kcs_bmc);
  347. }
  348. static void aspeed_kcs_irq_mask_update(struct kcs_bmc_device *kcs_bmc, u8 mask, u8 state)
  349. {
  350. struct aspeed_kcs_bmc *priv = to_aspeed_kcs_bmc(kcs_bmc);
  351. int rc;
  352. u8 str;
  353. /* We don't have an OBE IRQ, emulate it */
  354. if (mask & KCS_BMC_EVENT_TYPE_OBE) {
  355. if (KCS_BMC_EVENT_TYPE_OBE & state) {
  356. /*
  357. * Given we don't have an OBE IRQ, delay by polling briefly to see if we can
  358. * observe such an event before returning to the caller. This is not
  359. * incorrect because OBF may have already become clear before enabling the
  360. * IRQ if we had one, under which circumstance no event will be propagated
  361. * anyway.
  362. *
  363. * The onus is on the client to perform a race-free check that it hasn't
  364. * missed the event.
  365. */
  366. rc = read_poll_timeout_atomic(aspeed_kcs_inb, str,
  367. !(str & KCS_BMC_STR_OBF), 1, 100, false,
  368. &priv->kcs_bmc, priv->kcs_bmc.ioreg.str);
  369. /* Time for the slow path? */
  370. if (rc == -ETIMEDOUT)
  371. mod_timer(&priv->obe.timer, jiffies + OBE_POLL_PERIOD);
  372. } else {
  373. del_timer(&priv->obe.timer);
  374. }
  375. }
  376. if (mask & KCS_BMC_EVENT_TYPE_IBF) {
  377. const bool enable = !!(state & KCS_BMC_EVENT_TYPE_IBF);
  378. switch (kcs_bmc->channel) {
  379. case 1:
  380. regmap_update_bits(priv->map, LPC_HICR2, LPC_HICR2_IBFIE1,
  381. enable * LPC_HICR2_IBFIE1);
  382. return;
  383. case 2:
  384. regmap_update_bits(priv->map, LPC_HICR2, LPC_HICR2_IBFIE2,
  385. enable * LPC_HICR2_IBFIE2);
  386. return;
  387. case 3:
  388. regmap_update_bits(priv->map, LPC_HICR2, LPC_HICR2_IBFIE3,
  389. enable * LPC_HICR2_IBFIE3);
  390. return;
  391. case 4:
  392. regmap_update_bits(priv->map, LPC_HICRB, LPC_HICRB_IBFIE4,
  393. enable * LPC_HICRB_IBFIE4);
  394. return;
  395. default:
  396. pr_warn("%s: Unsupported channel: %d", __func__, kcs_bmc->channel);
  397. return;
  398. }
  399. }
  400. }
  401. static const struct kcs_bmc_device_ops aspeed_kcs_ops = {
  402. .irq_mask_update = aspeed_kcs_irq_mask_update,
  403. .io_inputb = aspeed_kcs_inb,
  404. .io_outputb = aspeed_kcs_outb,
  405. .io_updateb = aspeed_kcs_updateb,
  406. };
  407. static irqreturn_t aspeed_kcs_irq(int irq, void *arg)
  408. {
  409. struct kcs_bmc_device *kcs_bmc = arg;
  410. return kcs_bmc_handle_event(kcs_bmc);
  411. }
  412. static int aspeed_kcs_config_downstream_irq(struct kcs_bmc_device *kcs_bmc,
  413. struct platform_device *pdev)
  414. {
  415. struct device *dev = &pdev->dev;
  416. int irq;
  417. irq = platform_get_irq(pdev, 0);
  418. if (irq < 0)
  419. return irq;
  420. return devm_request_irq(dev, irq, aspeed_kcs_irq, IRQF_SHARED,
  421. dev_name(dev), kcs_bmc);
  422. }
  423. static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = {
  424. { .idr = LPC_IDR1, .odr = LPC_ODR1, .str = LPC_STR1 },
  425. { .idr = LPC_IDR2, .odr = LPC_ODR2, .str = LPC_STR2 },
  426. { .idr = LPC_IDR3, .odr = LPC_ODR3, .str = LPC_STR3 },
  427. { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 },
  428. };
  429. static int aspeed_kcs_of_get_channel(struct platform_device *pdev)
  430. {
  431. struct device_node *np;
  432. struct kcs_ioreg ioreg;
  433. const __be32 *reg;
  434. int i;
  435. np = pdev->dev.of_node;
  436. /* Don't translate addresses, we want offsets for the regmaps */
  437. reg = of_get_address(np, 0, NULL, NULL);
  438. if (!reg)
  439. return -EINVAL;
  440. ioreg.idr = be32_to_cpup(reg);
  441. reg = of_get_address(np, 1, NULL, NULL);
  442. if (!reg)
  443. return -EINVAL;
  444. ioreg.odr = be32_to_cpup(reg);
  445. reg = of_get_address(np, 2, NULL, NULL);
  446. if (!reg)
  447. return -EINVAL;
  448. ioreg.str = be32_to_cpup(reg);
  449. for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
  450. if (!memcmp(&ast_kcs_bmc_ioregs[i], &ioreg, sizeof(ioreg)))
  451. return i + 1;
  452. }
  453. return -EINVAL;
  454. }
  455. static int
  456. aspeed_kcs_of_get_io_address(struct platform_device *pdev, u32 addrs[2])
  457. {
  458. int rc;
  459. rc = of_property_read_variable_u32_array(pdev->dev.of_node,
  460. "aspeed,lpc-io-reg",
  461. addrs, 1, 2);
  462. if (rc < 0) {
  463. dev_err(&pdev->dev, "No valid 'aspeed,lpc-io-reg' configured\n");
  464. return rc;
  465. }
  466. if (addrs[0] > 0xffff) {
  467. dev_err(&pdev->dev, "Invalid data address in 'aspeed,lpc-io-reg'\n");
  468. return -EINVAL;
  469. }
  470. if (rc == 2 && addrs[1] > 0xffff) {
  471. dev_err(&pdev->dev, "Invalid status address in 'aspeed,lpc-io-reg'\n");
  472. return -EINVAL;
  473. }
  474. return rc;
  475. }
  476. static int aspeed_kcs_probe(struct platform_device *pdev)
  477. {
  478. struct kcs_bmc_device *kcs_bmc;
  479. struct aspeed_kcs_bmc *priv;
  480. struct device_node *np;
  481. bool have_upstream_irq;
  482. u32 upstream_irq[2];
  483. int rc, channel;
  484. int nr_addrs;
  485. u32 addrs[2];
  486. np = pdev->dev.of_node->parent;
  487. if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") &&
  488. !of_device_is_compatible(np, "aspeed,ast2500-lpc-v2") &&
  489. !of_device_is_compatible(np, "aspeed,ast2600-lpc-v2")) {
  490. dev_err(&pdev->dev, "unsupported LPC device binding\n");
  491. return -ENODEV;
  492. }
  493. channel = aspeed_kcs_of_get_channel(pdev);
  494. if (channel < 0)
  495. return channel;
  496. nr_addrs = aspeed_kcs_of_get_io_address(pdev, addrs);
  497. if (nr_addrs < 0)
  498. return nr_addrs;
  499. np = pdev->dev.of_node;
  500. rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", upstream_irq, 2);
  501. if (rc && rc != -EINVAL)
  502. return -EINVAL;
  503. have_upstream_irq = !rc;
  504. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  505. if (!priv)
  506. return -ENOMEM;
  507. kcs_bmc = &priv->kcs_bmc;
  508. kcs_bmc->dev = &pdev->dev;
  509. kcs_bmc->channel = channel;
  510. kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
  511. kcs_bmc->ops = &aspeed_kcs_ops;
  512. priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
  513. if (IS_ERR(priv->map)) {
  514. dev_err(&pdev->dev, "Couldn't get regmap\n");
  515. return -ENODEV;
  516. }
  517. spin_lock_init(&priv->obe.lock);
  518. priv->obe.remove = false;
  519. timer_setup(&priv->obe.timer, aspeed_kcs_check_obe, 0);
  520. rc = aspeed_kcs_set_address(kcs_bmc, addrs, nr_addrs);
  521. if (rc)
  522. return rc;
  523. /* Host to BMC IRQ */
  524. rc = aspeed_kcs_config_downstream_irq(kcs_bmc, pdev);
  525. if (rc)
  526. return rc;
  527. /* BMC to Host IRQ */
  528. if (have_upstream_irq) {
  529. rc = aspeed_kcs_config_upstream_irq(priv, upstream_irq[0], upstream_irq[1]);
  530. if (rc < 0)
  531. return rc;
  532. } else {
  533. priv->upstream_irq.mode = aspeed_kcs_irq_none;
  534. }
  535. platform_set_drvdata(pdev, priv);
  536. aspeed_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 0);
  537. aspeed_kcs_enable_channel(kcs_bmc, true);
  538. rc = kcs_bmc_add_device(&priv->kcs_bmc);
  539. if (rc) {
  540. dev_warn(&pdev->dev, "Failed to register channel %d: %d\n", kcs_bmc->channel, rc);
  541. return rc;
  542. }
  543. dev_info(&pdev->dev, "Initialised channel %d at 0x%x\n",
  544. kcs_bmc->channel, addrs[0]);
  545. return 0;
  546. }
  547. static void aspeed_kcs_remove(struct platform_device *pdev)
  548. {
  549. struct aspeed_kcs_bmc *priv = platform_get_drvdata(pdev);
  550. struct kcs_bmc_device *kcs_bmc = &priv->kcs_bmc;
  551. kcs_bmc_remove_device(kcs_bmc);
  552. aspeed_kcs_enable_channel(kcs_bmc, false);
  553. aspeed_kcs_irq_mask_update(kcs_bmc, (KCS_BMC_EVENT_TYPE_IBF | KCS_BMC_EVENT_TYPE_OBE), 0);
  554. /* Make sure it's proper dead */
  555. spin_lock_irq(&priv->obe.lock);
  556. priv->obe.remove = true;
  557. spin_unlock_irq(&priv->obe.lock);
  558. del_timer_sync(&priv->obe.timer);
  559. }
  560. static const struct of_device_id ast_kcs_bmc_match[] = {
  561. { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
  562. { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
  563. { .compatible = "aspeed,ast2600-kcs-bmc" },
  564. { }
  565. };
  566. MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match);
  567. static struct platform_driver ast_kcs_bmc_driver = {
  568. .driver = {
  569. .name = DEVICE_NAME,
  570. .of_match_table = ast_kcs_bmc_match,
  571. },
  572. .probe = aspeed_kcs_probe,
  573. .remove_new = aspeed_kcs_remove,
  574. };
  575. module_platform_driver(ast_kcs_bmc_driver);
  576. MODULE_LICENSE("GPL v2");
  577. MODULE_AUTHOR("Haiyue Wang <haiyue.wang@linux.intel.com>");
  578. MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>");
  579. MODULE_DESCRIPTION("Aspeed device interface to the KCS BMC device");