hi6421v600-irq.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Device driver for irqs in HISI PMIC IC
  4. *
  5. * Copyright (c) 2013 Linaro Ltd.
  6. * Copyright (c) 2011 Hisilicon.
  7. * Copyright (c) 2020-2021 Huawei Technologies Co., Ltd.
  8. */
  9. #include <linux/bitops.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/irq.h>
  12. #include <linux/module.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/slab.h>
  15. #include <linux/irqdomain.h>
  16. #include <linux/regmap.h>
  17. struct hi6421v600_irq {
  18. struct device *dev;
  19. struct irq_domain *domain;
  20. int irq;
  21. unsigned int *irqs;
  22. struct regmap *regmap;
  23. /* Protect IRQ mask changes */
  24. spinlock_t lock;
  25. };
  26. enum hi6421v600_irq_list {
  27. OTMP = 0,
  28. VBUS_CONNECT,
  29. VBUS_DISCONNECT,
  30. ALARMON_R,
  31. HOLD_6S,
  32. HOLD_1S,
  33. POWERKEY_UP,
  34. POWERKEY_DOWN,
  35. OCP_SCP_R,
  36. COUL_R,
  37. SIM0_HPD_R,
  38. SIM0_HPD_F,
  39. SIM1_HPD_R,
  40. SIM1_HPD_F,
  41. PMIC_IRQ_LIST_MAX
  42. };
  43. #define HISI_IRQ_BANK_SIZE 2
  44. /*
  45. * IRQ number for the power key button and mask for both UP and DOWN IRQs
  46. */
  47. #define HISI_POWERKEY_IRQ_NUM 0
  48. #define HISI_IRQ_POWERKEY_UP_DOWN (BIT(POWERKEY_DOWN) | BIT(POWERKEY_UP))
  49. /*
  50. * Registers for IRQ address and IRQ mask bits
  51. *
  52. * Please notice that we need to regmap a larger region, as other
  53. * registers are used by the irqs.
  54. * See drivers/irq/hi6421-irq.c.
  55. */
  56. #define SOC_PMIC_IRQ_MASK_0_ADDR 0x0202
  57. #define SOC_PMIC_IRQ0_ADDR 0x0212
  58. /*
  59. * The IRQs are mapped as:
  60. *
  61. * ====================== ============= ============ =====
  62. * IRQ MASK REGISTER IRQ REGISTER BIT
  63. * ====================== ============= ============ =====
  64. * OTMP 0x0202 0x212 bit 0
  65. * VBUS_CONNECT 0x0202 0x212 bit 1
  66. * VBUS_DISCONNECT 0x0202 0x212 bit 2
  67. * ALARMON_R 0x0202 0x212 bit 3
  68. * HOLD_6S 0x0202 0x212 bit 4
  69. * HOLD_1S 0x0202 0x212 bit 5
  70. * POWERKEY_UP 0x0202 0x212 bit 6
  71. * POWERKEY_DOWN 0x0202 0x212 bit 7
  72. *
  73. * OCP_SCP_R 0x0203 0x213 bit 0
  74. * COUL_R 0x0203 0x213 bit 1
  75. * SIM0_HPD_R 0x0203 0x213 bit 2
  76. * SIM0_HPD_F 0x0203 0x213 bit 3
  77. * SIM1_HPD_R 0x0203 0x213 bit 4
  78. * SIM1_HPD_F 0x0203 0x213 bit 5
  79. * ====================== ============= ============ =====
  80. *
  81. * Each mask register contains 8 bits. The ancillary macros below
  82. * convert a number from 0 to 14 into a register address and a bit mask
  83. */
  84. #define HISI_IRQ_MASK_REG(irq_data) (SOC_PMIC_IRQ_MASK_0_ADDR + \
  85. (irqd_to_hwirq(irq_data) / BITS_PER_BYTE))
  86. #define HISI_IRQ_MASK_BIT(irq_data) BIT(irqd_to_hwirq(irq_data) & (BITS_PER_BYTE - 1))
  87. #define HISI_8BITS_MASK 0xff
  88. static irqreturn_t hi6421v600_irq_handler(int irq, void *__priv)
  89. {
  90. struct hi6421v600_irq *priv = __priv;
  91. unsigned long pending;
  92. unsigned int in;
  93. int i, offset;
  94. for (i = 0; i < HISI_IRQ_BANK_SIZE; i++) {
  95. regmap_read(priv->regmap, SOC_PMIC_IRQ0_ADDR + i, &in);
  96. /* Mark pending IRQs as handled */
  97. regmap_write(priv->regmap, SOC_PMIC_IRQ0_ADDR + i, in);
  98. pending = in & HISI_8BITS_MASK;
  99. if (i == HISI_POWERKEY_IRQ_NUM &&
  100. (pending & HISI_IRQ_POWERKEY_UP_DOWN) == HISI_IRQ_POWERKEY_UP_DOWN) {
  101. /*
  102. * If both powerkey down and up IRQs are received,
  103. * handle them at the right order
  104. */
  105. generic_handle_irq_safe(priv->irqs[POWERKEY_DOWN]);
  106. generic_handle_irq_safe(priv->irqs[POWERKEY_UP]);
  107. pending &= ~HISI_IRQ_POWERKEY_UP_DOWN;
  108. }
  109. if (!pending)
  110. continue;
  111. for_each_set_bit(offset, &pending, BITS_PER_BYTE) {
  112. generic_handle_irq_safe(priv->irqs[offset + i * BITS_PER_BYTE]);
  113. }
  114. }
  115. return IRQ_HANDLED;
  116. }
  117. static void hi6421v600_irq_mask(struct irq_data *d)
  118. {
  119. struct hi6421v600_irq *priv = irq_data_get_irq_chip_data(d);
  120. unsigned long flags;
  121. unsigned int data;
  122. u32 offset;
  123. offset = HISI_IRQ_MASK_REG(d);
  124. spin_lock_irqsave(&priv->lock, flags);
  125. regmap_read(priv->regmap, offset, &data);
  126. data |= HISI_IRQ_MASK_BIT(d);
  127. regmap_write(priv->regmap, offset, data);
  128. spin_unlock_irqrestore(&priv->lock, flags);
  129. }
  130. static void hi6421v600_irq_unmask(struct irq_data *d)
  131. {
  132. struct hi6421v600_irq *priv = irq_data_get_irq_chip_data(d);
  133. u32 data, offset;
  134. unsigned long flags;
  135. offset = HISI_IRQ_MASK_REG(d);
  136. spin_lock_irqsave(&priv->lock, flags);
  137. regmap_read(priv->regmap, offset, &data);
  138. data &= ~HISI_IRQ_MASK_BIT(d);
  139. regmap_write(priv->regmap, offset, data);
  140. spin_unlock_irqrestore(&priv->lock, flags);
  141. }
  142. static struct irq_chip hi6421v600_pmu_irqchip = {
  143. .name = "hi6421v600-irq",
  144. .irq_mask = hi6421v600_irq_mask,
  145. .irq_unmask = hi6421v600_irq_unmask,
  146. .irq_disable = hi6421v600_irq_mask,
  147. .irq_enable = hi6421v600_irq_unmask,
  148. };
  149. static int hi6421v600_irq_map(struct irq_domain *d, unsigned int virq,
  150. irq_hw_number_t hw)
  151. {
  152. struct hi6421v600_irq *priv = d->host_data;
  153. irq_set_chip_and_handler_name(virq, &hi6421v600_pmu_irqchip,
  154. handle_simple_irq, "hi6421v600");
  155. irq_set_chip_data(virq, priv);
  156. irq_set_irq_type(virq, IRQ_TYPE_NONE);
  157. return 0;
  158. }
  159. static const struct irq_domain_ops hi6421v600_domain_ops = {
  160. .map = hi6421v600_irq_map,
  161. .xlate = irq_domain_xlate_twocell,
  162. };
  163. static void hi6421v600_irq_init(struct hi6421v600_irq *priv)
  164. {
  165. int i;
  166. unsigned int pending;
  167. /* Mask all IRQs */
  168. for (i = 0; i < HISI_IRQ_BANK_SIZE; i++)
  169. regmap_write(priv->regmap, SOC_PMIC_IRQ_MASK_0_ADDR + i,
  170. HISI_8BITS_MASK);
  171. /* Mark all IRQs as handled */
  172. for (i = 0; i < HISI_IRQ_BANK_SIZE; i++) {
  173. regmap_read(priv->regmap, SOC_PMIC_IRQ0_ADDR + i, &pending);
  174. regmap_write(priv->regmap, SOC_PMIC_IRQ0_ADDR + i,
  175. HISI_8BITS_MASK);
  176. }
  177. }
  178. static int hi6421v600_irq_probe(struct platform_device *pdev)
  179. {
  180. struct device *pmic_dev = pdev->dev.parent;
  181. struct platform_device *pmic_pdev;
  182. struct device *dev = &pdev->dev;
  183. struct hi6421v600_irq *priv;
  184. struct regmap *regmap;
  185. unsigned int virq;
  186. int i, ret;
  187. /*
  188. * This driver is meant to be called by hi6421-spmi-core,
  189. * which should first set drvdata. If this doesn't happen, hit
  190. * a warn on and return.
  191. */
  192. regmap = dev_get_drvdata(pmic_dev);
  193. if (WARN_ON(!regmap))
  194. return -ENODEV;
  195. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  196. if (!priv)
  197. return -ENOMEM;
  198. priv->dev = dev;
  199. priv->regmap = regmap;
  200. spin_lock_init(&priv->lock);
  201. pmic_pdev = container_of(pmic_dev, struct platform_device, dev);
  202. priv->irq = platform_get_irq(pmic_pdev, 0);
  203. if (priv->irq < 0)
  204. return priv->irq;
  205. platform_set_drvdata(pdev, priv);
  206. hi6421v600_irq_init(priv);
  207. priv->irqs = devm_kzalloc(dev, PMIC_IRQ_LIST_MAX * sizeof(int), GFP_KERNEL);
  208. if (!priv->irqs)
  209. return -ENOMEM;
  210. priv->domain = irq_domain_create_simple(dev_fwnode(pmic_dev), PMIC_IRQ_LIST_MAX, 0,
  211. &hi6421v600_domain_ops, priv);
  212. if (!priv->domain) {
  213. dev_err(dev, "Failed to create IRQ domain\n");
  214. return -ENODEV;
  215. }
  216. for (i = 0; i < PMIC_IRQ_LIST_MAX; i++) {
  217. virq = irq_create_mapping(priv->domain, i);
  218. if (!virq) {
  219. dev_err(dev, "Failed to map H/W IRQ\n");
  220. return -ENODEV;
  221. }
  222. priv->irqs[i] = virq;
  223. }
  224. ret = devm_request_threaded_irq(dev,
  225. priv->irq, hi6421v600_irq_handler,
  226. NULL,
  227. IRQF_TRIGGER_LOW | IRQF_SHARED | IRQF_NO_SUSPEND,
  228. "pmic", priv);
  229. if (ret < 0) {
  230. dev_err(dev, "Failed to start IRQ handling thread: error %d\n",
  231. ret);
  232. return ret;
  233. }
  234. return 0;
  235. }
  236. static const struct platform_device_id hi6421v600_irq_table[] = {
  237. { .name = "hi6421v600-irq" },
  238. {},
  239. };
  240. MODULE_DEVICE_TABLE(platform, hi6421v600_irq_table);
  241. static struct platform_driver hi6421v600_irq_driver = {
  242. .id_table = hi6421v600_irq_table,
  243. .driver = {
  244. .name = "hi6421v600-irq",
  245. },
  246. .probe = hi6421v600_irq_probe,
  247. };
  248. module_platform_driver(hi6421v600_irq_driver);
  249. MODULE_DESCRIPTION("HiSilicon Hi6421v600 IRQ driver");
  250. MODULE_LICENSE("GPL v2");