gpio-aspeed.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. /*
  2. * Copyright 2015 IBM Corp.
  3. *
  4. * Joel Stanley <joel@jms.id.au>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/init.h>
  14. #include <linux/io.h>
  15. #include <linux/spinlock.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/gpio/driver.h>
  18. #include <linux/pinctrl/consumer.h>
  19. struct aspeed_bank_props {
  20. unsigned int bank;
  21. u32 input;
  22. u32 output;
  23. };
  24. struct aspeed_gpio_config {
  25. unsigned int nr_gpios;
  26. const struct aspeed_bank_props *props;
  27. };
  28. struct aspeed_gpio {
  29. struct gpio_chip chip;
  30. spinlock_t lock;
  31. void __iomem *base;
  32. int irq;
  33. const struct aspeed_gpio_config *config;
  34. };
  35. struct aspeed_gpio_bank {
  36. uint16_t val_regs;
  37. uint16_t irq_regs;
  38. const char names[4][3];
  39. };
  40. static const struct aspeed_gpio_bank aspeed_gpio_banks[] = {
  41. {
  42. .val_regs = 0x0000,
  43. .irq_regs = 0x0008,
  44. .names = { "A", "B", "C", "D" },
  45. },
  46. {
  47. .val_regs = 0x0020,
  48. .irq_regs = 0x0028,
  49. .names = { "E", "F", "G", "H" },
  50. },
  51. {
  52. .val_regs = 0x0070,
  53. .irq_regs = 0x0098,
  54. .names = { "I", "J", "K", "L" },
  55. },
  56. {
  57. .val_regs = 0x0078,
  58. .irq_regs = 0x00e8,
  59. .names = { "M", "N", "O", "P" },
  60. },
  61. {
  62. .val_regs = 0x0080,
  63. .irq_regs = 0x0118,
  64. .names = { "Q", "R", "S", "T" },
  65. },
  66. {
  67. .val_regs = 0x0088,
  68. .irq_regs = 0x0148,
  69. .names = { "U", "V", "W", "X" },
  70. },
  71. {
  72. .val_regs = 0x01E0,
  73. .irq_regs = 0x0178,
  74. .names = { "Y", "Z", "AA", "AB" },
  75. },
  76. {
  77. .val_regs = 0x01E8,
  78. .irq_regs = 0x01A8,
  79. .names = { "AC", "", "", "" },
  80. },
  81. };
  82. #define GPIO_BANK(x) ((x) >> 5)
  83. #define GPIO_OFFSET(x) ((x) & 0x1f)
  84. #define GPIO_BIT(x) BIT(GPIO_OFFSET(x))
  85. #define GPIO_DATA 0x00
  86. #define GPIO_DIR 0x04
  87. #define GPIO_IRQ_ENABLE 0x00
  88. #define GPIO_IRQ_TYPE0 0x04
  89. #define GPIO_IRQ_TYPE1 0x08
  90. #define GPIO_IRQ_TYPE2 0x0c
  91. #define GPIO_IRQ_STATUS 0x10
  92. static const struct aspeed_gpio_bank *to_bank(unsigned int offset)
  93. {
  94. unsigned int bank = GPIO_BANK(offset);
  95. WARN_ON(bank > ARRAY_SIZE(aspeed_gpio_banks));
  96. return &aspeed_gpio_banks[bank];
  97. }
  98. static inline bool is_bank_props_sentinel(const struct aspeed_bank_props *props)
  99. {
  100. return !(props->input || props->output);
  101. }
  102. static inline const struct aspeed_bank_props *find_bank_props(
  103. struct aspeed_gpio *gpio, unsigned int offset)
  104. {
  105. const struct aspeed_bank_props *props = gpio->config->props;
  106. while (!is_bank_props_sentinel(props)) {
  107. if (props->bank == GPIO_BANK(offset))
  108. return props;
  109. props++;
  110. }
  111. return NULL;
  112. }
  113. static inline bool have_gpio(struct aspeed_gpio *gpio, unsigned int offset)
  114. {
  115. const struct aspeed_bank_props *props = find_bank_props(gpio, offset);
  116. const struct aspeed_gpio_bank *bank = to_bank(offset);
  117. unsigned int group = GPIO_OFFSET(offset) / 8;
  118. return bank->names[group][0] != '\0' &&
  119. (!props || ((props->input | props->output) & GPIO_BIT(offset)));
  120. }
  121. static inline bool have_input(struct aspeed_gpio *gpio, unsigned int offset)
  122. {
  123. const struct aspeed_bank_props *props = find_bank_props(gpio, offset);
  124. return !props || (props->input & GPIO_BIT(offset));
  125. }
  126. #define have_irq(g, o) have_input((g), (o))
  127. static inline bool have_output(struct aspeed_gpio *gpio, unsigned int offset)
  128. {
  129. const struct aspeed_bank_props *props = find_bank_props(gpio, offset);
  130. return !props || (props->output & GPIO_BIT(offset));
  131. }
  132. static void __iomem *bank_val_reg(struct aspeed_gpio *gpio,
  133. const struct aspeed_gpio_bank *bank,
  134. unsigned int reg)
  135. {
  136. return gpio->base + bank->val_regs + reg;
  137. }
  138. static void __iomem *bank_irq_reg(struct aspeed_gpio *gpio,
  139. const struct aspeed_gpio_bank *bank,
  140. unsigned int reg)
  141. {
  142. return gpio->base + bank->irq_regs + reg;
  143. }
  144. static int aspeed_gpio_get(struct gpio_chip *gc, unsigned int offset)
  145. {
  146. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  147. const struct aspeed_gpio_bank *bank = to_bank(offset);
  148. return !!(ioread32(bank_val_reg(gpio, bank, GPIO_DATA))
  149. & GPIO_BIT(offset));
  150. }
  151. static void __aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
  152. int val)
  153. {
  154. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  155. const struct aspeed_gpio_bank *bank = to_bank(offset);
  156. void __iomem *addr;
  157. u32 reg;
  158. addr = bank_val_reg(gpio, bank, GPIO_DATA);
  159. reg = ioread32(addr);
  160. if (val)
  161. reg |= GPIO_BIT(offset);
  162. else
  163. reg &= ~GPIO_BIT(offset);
  164. iowrite32(reg, addr);
  165. }
  166. static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
  167. int val)
  168. {
  169. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  170. unsigned long flags;
  171. spin_lock_irqsave(&gpio->lock, flags);
  172. __aspeed_gpio_set(gc, offset, val);
  173. spin_unlock_irqrestore(&gpio->lock, flags);
  174. }
  175. static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
  176. {
  177. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  178. const struct aspeed_gpio_bank *bank = to_bank(offset);
  179. unsigned long flags;
  180. u32 reg;
  181. if (!have_input(gpio, offset))
  182. return -ENOTSUPP;
  183. spin_lock_irqsave(&gpio->lock, flags);
  184. reg = ioread32(bank_val_reg(gpio, bank, GPIO_DIR));
  185. iowrite32(reg & ~GPIO_BIT(offset), bank_val_reg(gpio, bank, GPIO_DIR));
  186. spin_unlock_irqrestore(&gpio->lock, flags);
  187. return 0;
  188. }
  189. static int aspeed_gpio_dir_out(struct gpio_chip *gc,
  190. unsigned int offset, int val)
  191. {
  192. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  193. const struct aspeed_gpio_bank *bank = to_bank(offset);
  194. unsigned long flags;
  195. u32 reg;
  196. if (!have_output(gpio, offset))
  197. return -ENOTSUPP;
  198. spin_lock_irqsave(&gpio->lock, flags);
  199. reg = ioread32(bank_val_reg(gpio, bank, GPIO_DIR));
  200. iowrite32(reg | GPIO_BIT(offset), bank_val_reg(gpio, bank, GPIO_DIR));
  201. __aspeed_gpio_set(gc, offset, val);
  202. spin_unlock_irqrestore(&gpio->lock, flags);
  203. return 0;
  204. }
  205. static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
  206. {
  207. struct aspeed_gpio *gpio = gpiochip_get_data(gc);
  208. const struct aspeed_gpio_bank *bank = to_bank(offset);
  209. unsigned long flags;
  210. u32 val;
  211. if (!have_input(gpio, offset))
  212. return 0;
  213. if (!have_output(gpio, offset))
  214. return 1;
  215. spin_lock_irqsave(&gpio->lock, flags);
  216. val = ioread32(bank_val_reg(gpio, bank, GPIO_DIR)) & GPIO_BIT(offset);
  217. spin_unlock_irqrestore(&gpio->lock, flags);
  218. return !val;
  219. }
  220. static inline int irqd_to_aspeed_gpio_data(struct irq_data *d,
  221. struct aspeed_gpio **gpio,
  222. const struct aspeed_gpio_bank **bank,
  223. u32 *bit)
  224. {
  225. int offset;
  226. struct aspeed_gpio *internal;
  227. offset = irqd_to_hwirq(d);
  228. internal = irq_data_get_irq_chip_data(d);
  229. /* This might be a bit of a questionable place to check */
  230. if (!have_irq(internal, offset))
  231. return -ENOTSUPP;
  232. *gpio = internal;
  233. *bank = to_bank(offset);
  234. *bit = GPIO_BIT(offset);
  235. return 0;
  236. }
  237. static void aspeed_gpio_irq_ack(struct irq_data *d)
  238. {
  239. const struct aspeed_gpio_bank *bank;
  240. struct aspeed_gpio *gpio;
  241. unsigned long flags;
  242. void __iomem *status_addr;
  243. u32 bit;
  244. int rc;
  245. rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit);
  246. if (rc)
  247. return;
  248. status_addr = bank_irq_reg(gpio, bank, GPIO_IRQ_STATUS);
  249. spin_lock_irqsave(&gpio->lock, flags);
  250. iowrite32(bit, status_addr);
  251. spin_unlock_irqrestore(&gpio->lock, flags);
  252. }
  253. static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
  254. {
  255. const struct aspeed_gpio_bank *bank;
  256. struct aspeed_gpio *gpio;
  257. unsigned long flags;
  258. u32 reg, bit;
  259. void __iomem *addr;
  260. int rc;
  261. rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit);
  262. if (rc)
  263. return;
  264. addr = bank_irq_reg(gpio, bank, GPIO_IRQ_ENABLE);
  265. spin_lock_irqsave(&gpio->lock, flags);
  266. reg = ioread32(addr);
  267. if (set)
  268. reg |= bit;
  269. else
  270. reg &= bit;
  271. iowrite32(reg, addr);
  272. spin_unlock_irqrestore(&gpio->lock, flags);
  273. }
  274. static void aspeed_gpio_irq_mask(struct irq_data *d)
  275. {
  276. aspeed_gpio_irq_set_mask(d, false);
  277. }
  278. static void aspeed_gpio_irq_unmask(struct irq_data *d)
  279. {
  280. aspeed_gpio_irq_set_mask(d, true);
  281. }
  282. static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
  283. {
  284. u32 type0 = 0;
  285. u32 type1 = 0;
  286. u32 type2 = 0;
  287. u32 bit, reg;
  288. const struct aspeed_gpio_bank *bank;
  289. irq_flow_handler_t handler;
  290. struct aspeed_gpio *gpio;
  291. unsigned long flags;
  292. void __iomem *addr;
  293. int rc;
  294. rc = irqd_to_aspeed_gpio_data(d, &gpio, &bank, &bit);
  295. if (rc)
  296. return -EINVAL;
  297. switch (type & IRQ_TYPE_SENSE_MASK) {
  298. case IRQ_TYPE_EDGE_BOTH:
  299. type2 |= bit;
  300. case IRQ_TYPE_EDGE_RISING:
  301. type0 |= bit;
  302. case IRQ_TYPE_EDGE_FALLING:
  303. handler = handle_edge_irq;
  304. break;
  305. case IRQ_TYPE_LEVEL_HIGH:
  306. type0 |= bit;
  307. case IRQ_TYPE_LEVEL_LOW:
  308. type1 |= bit;
  309. handler = handle_level_irq;
  310. break;
  311. default:
  312. return -EINVAL;
  313. }
  314. spin_lock_irqsave(&gpio->lock, flags);
  315. addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE0);
  316. reg = ioread32(addr);
  317. reg = (reg & ~bit) | type0;
  318. iowrite32(reg, addr);
  319. addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE1);
  320. reg = ioread32(addr);
  321. reg = (reg & ~bit) | type1;
  322. iowrite32(reg, addr);
  323. addr = bank_irq_reg(gpio, bank, GPIO_IRQ_TYPE2);
  324. reg = ioread32(addr);
  325. reg = (reg & ~bit) | type2;
  326. iowrite32(reg, addr);
  327. spin_unlock_irqrestore(&gpio->lock, flags);
  328. irq_set_handler_locked(d, handler);
  329. return 0;
  330. }
  331. static void aspeed_gpio_irq_handler(struct irq_desc *desc)
  332. {
  333. struct gpio_chip *gc = irq_desc_get_handler_data(desc);
  334. struct irq_chip *ic = irq_desc_get_chip(desc);
  335. struct aspeed_gpio *data = gpiochip_get_data(gc);
  336. unsigned int i, p, girq;
  337. unsigned long reg;
  338. chained_irq_enter(ic, desc);
  339. for (i = 0; i < ARRAY_SIZE(aspeed_gpio_banks); i++) {
  340. const struct aspeed_gpio_bank *bank = &aspeed_gpio_banks[i];
  341. reg = ioread32(bank_irq_reg(data, bank, GPIO_IRQ_STATUS));
  342. for_each_set_bit(p, &reg, 32) {
  343. girq = irq_find_mapping(gc->irqdomain, i * 32 + p);
  344. generic_handle_irq(girq);
  345. }
  346. }
  347. chained_irq_exit(ic, desc);
  348. }
  349. static struct irq_chip aspeed_gpio_irqchip = {
  350. .name = "aspeed-gpio",
  351. .irq_ack = aspeed_gpio_irq_ack,
  352. .irq_mask = aspeed_gpio_irq_mask,
  353. .irq_unmask = aspeed_gpio_irq_unmask,
  354. .irq_set_type = aspeed_gpio_set_type,
  355. };
  356. static void set_irq_valid_mask(struct aspeed_gpio *gpio)
  357. {
  358. const struct aspeed_bank_props *props = gpio->config->props;
  359. while (!is_bank_props_sentinel(props)) {
  360. unsigned int offset;
  361. const unsigned long int input = props->input;
  362. /* Pretty crummy approach, but similar to GPIO core */
  363. for_each_clear_bit(offset, &input, 32) {
  364. unsigned int i = props->bank * 32 + offset;
  365. if (i >= gpio->config->nr_gpios)
  366. break;
  367. clear_bit(i, gpio->chip.irq_valid_mask);
  368. }
  369. props++;
  370. }
  371. }
  372. static int aspeed_gpio_setup_irqs(struct aspeed_gpio *gpio,
  373. struct platform_device *pdev)
  374. {
  375. int rc;
  376. rc = platform_get_irq(pdev, 0);
  377. if (rc < 0)
  378. return rc;
  379. gpio->irq = rc;
  380. set_irq_valid_mask(gpio);
  381. rc = gpiochip_irqchip_add(&gpio->chip, &aspeed_gpio_irqchip,
  382. 0, handle_bad_irq, IRQ_TYPE_NONE);
  383. if (rc) {
  384. dev_info(&pdev->dev, "Could not add irqchip\n");
  385. return rc;
  386. }
  387. gpiochip_set_chained_irqchip(&gpio->chip, &aspeed_gpio_irqchip,
  388. gpio->irq, aspeed_gpio_irq_handler);
  389. return 0;
  390. }
  391. static int aspeed_gpio_request(struct gpio_chip *chip, unsigned int offset)
  392. {
  393. if (!have_gpio(gpiochip_get_data(chip), offset))
  394. return -ENODEV;
  395. return pinctrl_request_gpio(chip->base + offset);
  396. }
  397. static void aspeed_gpio_free(struct gpio_chip *chip, unsigned int offset)
  398. {
  399. pinctrl_free_gpio(chip->base + offset);
  400. }
  401. /*
  402. * Any banks not specified in a struct aspeed_bank_props array are assumed to
  403. * have the properties:
  404. *
  405. * { .input = 0xffffffff, .output = 0xffffffff }
  406. */
  407. static const struct aspeed_bank_props ast2400_bank_props[] = {
  408. /* input output */
  409. { 5, 0xffffffff, 0x0000ffff }, /* U/V/W/X */
  410. { 6, 0x0000000f, 0x0fffff0f }, /* Y/Z/AA/AB, two 4-GPIO holes */
  411. { },
  412. };
  413. static const struct aspeed_gpio_config ast2400_config =
  414. /* 220 for simplicity, really 216 with two 4-GPIO holes, four at end */
  415. { .nr_gpios = 220, .props = ast2400_bank_props, };
  416. static const struct aspeed_bank_props ast2500_bank_props[] = {
  417. /* input output */
  418. { 5, 0xffffffff, 0x0000ffff }, /* U/V/W/X */
  419. { 6, 0x0fffffff, 0x0fffffff }, /* Y/Z/AA/AB, 4-GPIO hole */
  420. { 7, 0x000000ff, 0x000000ff }, /* AC */
  421. { },
  422. };
  423. static const struct aspeed_gpio_config ast2500_config =
  424. /* 232 for simplicity, actual number is 228 (4-GPIO hole in GPIOAB) */
  425. { .nr_gpios = 232, .props = ast2500_bank_props, };
  426. static const struct of_device_id aspeed_gpio_of_table[] = {
  427. { .compatible = "aspeed,ast2400-gpio", .data = &ast2400_config, },
  428. { .compatible = "aspeed,ast2500-gpio", .data = &ast2500_config, },
  429. {}
  430. };
  431. MODULE_DEVICE_TABLE(of, aspeed_gpio_of_table);
  432. static int __init aspeed_gpio_probe(struct platform_device *pdev)
  433. {
  434. const struct of_device_id *gpio_id;
  435. struct aspeed_gpio *gpio;
  436. struct resource *res;
  437. int rc;
  438. gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
  439. if (!gpio)
  440. return -ENOMEM;
  441. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  442. gpio->base = devm_ioremap_resource(&pdev->dev, res);
  443. if (IS_ERR(gpio->base))
  444. return PTR_ERR(gpio->base);
  445. spin_lock_init(&gpio->lock);
  446. gpio_id = of_match_node(aspeed_gpio_of_table, pdev->dev.of_node);
  447. if (!gpio_id)
  448. return -EINVAL;
  449. gpio->config = gpio_id->data;
  450. gpio->chip.ngpio = gpio->config->nr_gpios;
  451. gpio->chip.parent = &pdev->dev;
  452. gpio->chip.direction_input = aspeed_gpio_dir_in;
  453. gpio->chip.direction_output = aspeed_gpio_dir_out;
  454. gpio->chip.get_direction = aspeed_gpio_get_direction;
  455. gpio->chip.request = aspeed_gpio_request;
  456. gpio->chip.free = aspeed_gpio_free;
  457. gpio->chip.get = aspeed_gpio_get;
  458. gpio->chip.set = aspeed_gpio_set;
  459. gpio->chip.label = dev_name(&pdev->dev);
  460. gpio->chip.base = -1;
  461. gpio->chip.irq_need_valid_mask = true;
  462. rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio);
  463. if (rc < 0)
  464. return rc;
  465. return aspeed_gpio_setup_irqs(gpio, pdev);
  466. }
  467. static struct platform_driver aspeed_gpio_driver = {
  468. .driver = {
  469. .name = KBUILD_MODNAME,
  470. .of_match_table = aspeed_gpio_of_table,
  471. },
  472. };
  473. module_platform_driver_probe(aspeed_gpio_driver, aspeed_gpio_probe);
  474. MODULE_DESCRIPTION("Aspeed GPIO Driver");
  475. MODULE_LICENSE("GPL");