gpio-sifive.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2019 SiFive
  4. */
  5. #include <linux/bitops.h>
  6. #include <linux/device.h>
  7. #include <linux/errno.h>
  8. #include <linux/of_irq.h>
  9. #include <linux/gpio/driver.h>
  10. #include <linux/init.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/slab.h>
  13. #include <linux/spinlock.h>
  14. #include <linux/regmap.h>
  15. #define SIFIVE_GPIO_INPUT_VAL 0x00
  16. #define SIFIVE_GPIO_INPUT_EN 0x04
  17. #define SIFIVE_GPIO_OUTPUT_EN 0x08
  18. #define SIFIVE_GPIO_OUTPUT_VAL 0x0C
  19. #define SIFIVE_GPIO_RISE_IE 0x18
  20. #define SIFIVE_GPIO_RISE_IP 0x1C
  21. #define SIFIVE_GPIO_FALL_IE 0x20
  22. #define SIFIVE_GPIO_FALL_IP 0x24
  23. #define SIFIVE_GPIO_HIGH_IE 0x28
  24. #define SIFIVE_GPIO_HIGH_IP 0x2C
  25. #define SIFIVE_GPIO_LOW_IE 0x30
  26. #define SIFIVE_GPIO_LOW_IP 0x34
  27. #define SIFIVE_GPIO_OUTPUT_XOR 0x40
  28. #define SIFIVE_GPIO_MAX 32
  29. struct sifive_gpio {
  30. void __iomem *base;
  31. struct gpio_chip gc;
  32. struct regmap *regs;
  33. unsigned long irq_state;
  34. unsigned int trigger[SIFIVE_GPIO_MAX];
  35. unsigned int irq_number[SIFIVE_GPIO_MAX];
  36. };
  37. static void sifive_gpio_set_ie(struct sifive_gpio *chip, unsigned int offset)
  38. {
  39. unsigned long flags;
  40. unsigned int trigger;
  41. raw_spin_lock_irqsave(&chip->gc.bgpio_lock, flags);
  42. trigger = (chip->irq_state & BIT(offset)) ? chip->trigger[offset] : 0;
  43. regmap_update_bits(chip->regs, SIFIVE_GPIO_RISE_IE, BIT(offset),
  44. (trigger & IRQ_TYPE_EDGE_RISING) ? BIT(offset) : 0);
  45. regmap_update_bits(chip->regs, SIFIVE_GPIO_FALL_IE, BIT(offset),
  46. (trigger & IRQ_TYPE_EDGE_FALLING) ? BIT(offset) : 0);
  47. regmap_update_bits(chip->regs, SIFIVE_GPIO_HIGH_IE, BIT(offset),
  48. (trigger & IRQ_TYPE_LEVEL_HIGH) ? BIT(offset) : 0);
  49. regmap_update_bits(chip->regs, SIFIVE_GPIO_LOW_IE, BIT(offset),
  50. (trigger & IRQ_TYPE_LEVEL_LOW) ? BIT(offset) : 0);
  51. raw_spin_unlock_irqrestore(&chip->gc.bgpio_lock, flags);
  52. }
  53. static int sifive_gpio_irq_set_type(struct irq_data *d, unsigned int trigger)
  54. {
  55. struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
  56. struct sifive_gpio *chip = gpiochip_get_data(gc);
  57. int offset = irqd_to_hwirq(d);
  58. if (offset < 0 || offset >= gc->ngpio)
  59. return -EINVAL;
  60. chip->trigger[offset] = trigger;
  61. sifive_gpio_set_ie(chip, offset);
  62. return 0;
  63. }
  64. static void sifive_gpio_irq_enable(struct irq_data *d)
  65. {
  66. struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
  67. struct sifive_gpio *chip = gpiochip_get_data(gc);
  68. irq_hw_number_t hwirq = irqd_to_hwirq(d);
  69. int offset = hwirq % SIFIVE_GPIO_MAX;
  70. u32 bit = BIT(offset);
  71. unsigned long flags;
  72. gpiochip_enable_irq(gc, hwirq);
  73. irq_chip_enable_parent(d);
  74. /* Switch to input */
  75. gc->direction_input(gc, offset);
  76. raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
  77. /* Clear any sticky pending interrupts */
  78. regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit);
  79. regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit);
  80. regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit);
  81. regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit);
  82. raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
  83. /* Enable interrupts */
  84. assign_bit(offset, &chip->irq_state, 1);
  85. sifive_gpio_set_ie(chip, offset);
  86. }
  87. static void sifive_gpio_irq_disable(struct irq_data *d)
  88. {
  89. struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
  90. struct sifive_gpio *chip = gpiochip_get_data(gc);
  91. irq_hw_number_t hwirq = irqd_to_hwirq(d);
  92. int offset = hwirq % SIFIVE_GPIO_MAX;
  93. assign_bit(offset, &chip->irq_state, 0);
  94. sifive_gpio_set_ie(chip, offset);
  95. irq_chip_disable_parent(d);
  96. gpiochip_disable_irq(gc, hwirq);
  97. }
  98. static void sifive_gpio_irq_eoi(struct irq_data *d)
  99. {
  100. struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
  101. struct sifive_gpio *chip = gpiochip_get_data(gc);
  102. int offset = irqd_to_hwirq(d) % SIFIVE_GPIO_MAX;
  103. u32 bit = BIT(offset);
  104. unsigned long flags;
  105. raw_spin_lock_irqsave(&gc->bgpio_lock, flags);
  106. /* Clear all pending interrupts */
  107. regmap_write(chip->regs, SIFIVE_GPIO_RISE_IP, bit);
  108. regmap_write(chip->regs, SIFIVE_GPIO_FALL_IP, bit);
  109. regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IP, bit);
  110. regmap_write(chip->regs, SIFIVE_GPIO_LOW_IP, bit);
  111. raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags);
  112. irq_chip_eoi_parent(d);
  113. }
  114. static int sifive_gpio_irq_set_affinity(struct irq_data *data,
  115. const struct cpumask *dest,
  116. bool force)
  117. {
  118. if (data->parent_data)
  119. return irq_chip_set_affinity_parent(data, dest, force);
  120. return -EINVAL;
  121. }
  122. static const struct irq_chip sifive_gpio_irqchip = {
  123. .name = "sifive-gpio",
  124. .irq_set_type = sifive_gpio_irq_set_type,
  125. .irq_mask = irq_chip_mask_parent,
  126. .irq_unmask = irq_chip_unmask_parent,
  127. .irq_enable = sifive_gpio_irq_enable,
  128. .irq_disable = sifive_gpio_irq_disable,
  129. .irq_eoi = sifive_gpio_irq_eoi,
  130. .irq_set_affinity = sifive_gpio_irq_set_affinity,
  131. .flags = IRQCHIP_IMMUTABLE,
  132. GPIOCHIP_IRQ_RESOURCE_HELPERS,
  133. };
  134. static int sifive_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
  135. unsigned int child,
  136. unsigned int child_type,
  137. unsigned int *parent,
  138. unsigned int *parent_type)
  139. {
  140. struct sifive_gpio *chip = gpiochip_get_data(gc);
  141. struct irq_data *d = irq_get_irq_data(chip->irq_number[child]);
  142. *parent_type = IRQ_TYPE_NONE;
  143. *parent = irqd_to_hwirq(d);
  144. return 0;
  145. }
  146. static const struct regmap_config sifive_gpio_regmap_config = {
  147. .reg_bits = 32,
  148. .reg_stride = 4,
  149. .val_bits = 32,
  150. .fast_io = true,
  151. .disable_locking = true,
  152. };
  153. static int sifive_gpio_probe(struct platform_device *pdev)
  154. {
  155. struct device *dev = &pdev->dev;
  156. struct device_node *node = pdev->dev.of_node;
  157. struct device_node *irq_parent;
  158. struct irq_domain *parent;
  159. struct gpio_irq_chip *girq;
  160. struct sifive_gpio *chip;
  161. int ret, ngpio, i;
  162. chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
  163. if (!chip)
  164. return -ENOMEM;
  165. chip->base = devm_platform_ioremap_resource(pdev, 0);
  166. if (IS_ERR(chip->base)) {
  167. dev_err(dev, "failed to allocate device memory\n");
  168. return PTR_ERR(chip->base);
  169. }
  170. chip->regs = devm_regmap_init_mmio(dev, chip->base,
  171. &sifive_gpio_regmap_config);
  172. if (IS_ERR(chip->regs))
  173. return PTR_ERR(chip->regs);
  174. ngpio = of_irq_count(node);
  175. if (ngpio > SIFIVE_GPIO_MAX) {
  176. dev_err(dev, "Too many GPIO interrupts (max=%d)\n",
  177. SIFIVE_GPIO_MAX);
  178. return -ENXIO;
  179. }
  180. irq_parent = of_irq_find_parent(node);
  181. if (!irq_parent) {
  182. dev_err(dev, "no IRQ parent node\n");
  183. return -ENODEV;
  184. }
  185. parent = irq_find_host(irq_parent);
  186. of_node_put(irq_parent);
  187. if (!parent) {
  188. dev_err(dev, "no IRQ parent domain\n");
  189. return -ENODEV;
  190. }
  191. for (i = 0; i < ngpio; i++) {
  192. ret = platform_get_irq(pdev, i);
  193. if (ret < 0)
  194. return ret;
  195. chip->irq_number[i] = ret;
  196. }
  197. ret = bgpio_init(&chip->gc, dev, 4,
  198. chip->base + SIFIVE_GPIO_INPUT_VAL,
  199. chip->base + SIFIVE_GPIO_OUTPUT_VAL,
  200. NULL,
  201. chip->base + SIFIVE_GPIO_OUTPUT_EN,
  202. chip->base + SIFIVE_GPIO_INPUT_EN,
  203. BGPIOF_READ_OUTPUT_REG_SET);
  204. if (ret) {
  205. dev_err(dev, "unable to init generic GPIO\n");
  206. return ret;
  207. }
  208. /* Disable all GPIO interrupts before enabling parent interrupts */
  209. regmap_write(chip->regs, SIFIVE_GPIO_RISE_IE, 0);
  210. regmap_write(chip->regs, SIFIVE_GPIO_FALL_IE, 0);
  211. regmap_write(chip->regs, SIFIVE_GPIO_HIGH_IE, 0);
  212. regmap_write(chip->regs, SIFIVE_GPIO_LOW_IE, 0);
  213. chip->irq_state = 0;
  214. chip->gc.base = -1;
  215. chip->gc.ngpio = ngpio;
  216. chip->gc.label = dev_name(dev);
  217. chip->gc.parent = dev;
  218. chip->gc.owner = THIS_MODULE;
  219. girq = &chip->gc.irq;
  220. gpio_irq_chip_set_chip(girq, &sifive_gpio_irqchip);
  221. girq->fwnode = of_node_to_fwnode(node);
  222. girq->parent_domain = parent;
  223. girq->child_to_parent_hwirq = sifive_gpio_child_to_parent_hwirq;
  224. girq->handler = handle_bad_irq;
  225. girq->default_type = IRQ_TYPE_NONE;
  226. platform_set_drvdata(pdev, chip);
  227. return gpiochip_add_data(&chip->gc, chip);
  228. }
  229. static const struct of_device_id sifive_gpio_match[] = {
  230. { .compatible = "sifive,gpio0" },
  231. { .compatible = "sifive,fu540-c000-gpio" },
  232. { },
  233. };
  234. static struct platform_driver sifive_gpio_driver = {
  235. .probe = sifive_gpio_probe,
  236. .driver = {
  237. .name = "sifive_gpio",
  238. .of_match_table = of_match_ptr(sifive_gpio_match),
  239. },
  240. };
  241. builtin_platform_driver(sifive_gpio_driver)