rk_gpio.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * (C) Copyright 2015 Google, Inc
  3. *
  4. * (C) Copyright 2008-2014 Rockchip Electronics
  5. * Peter, Software Engineering, <superpeter.cai@gmail.com>.
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <dm.h>
  11. #include <asm/errno.h>
  12. #include <asm/gpio.h>
  13. #include <asm/io.h>
  14. #include <dt-bindings/gpio/gpio.h>
  15. enum {
  16. ROCKCHIP_GPIOS_PER_BANK = 32,
  17. };
  18. #define OFFSET_TO_BIT(bit) (1UL << (bit))
  19. struct rockchip_gpio_priv {
  20. struct rockchip_gpio_regs *regs;
  21. char name[2];
  22. };
  23. static int rockchip_gpio_direction_input(struct udevice *dev, unsigned offset)
  24. {
  25. struct rockchip_gpio_priv *priv = dev_get_priv(dev);
  26. struct rockchip_gpio_regs *regs = priv->regs;
  27. clrbits_le32(&regs->swport_ddr, OFFSET_TO_BIT(offset));
  28. return 0;
  29. }
  30. static int rockchip_gpio_direction_output(struct udevice *dev, unsigned offset,
  31. int value)
  32. {
  33. struct rockchip_gpio_priv *priv = dev_get_priv(dev);
  34. struct rockchip_gpio_regs *regs = priv->regs;
  35. int mask = OFFSET_TO_BIT(offset);
  36. clrsetbits_le32(&regs->swport_dr, mask, value ? mask : 0);
  37. setbits_le32(&regs->swport_ddr, mask);
  38. return 0;
  39. }
  40. static int rockchip_gpio_get_value(struct udevice *dev, unsigned offset)
  41. {
  42. struct rockchip_gpio_priv *priv = dev_get_priv(dev);
  43. struct rockchip_gpio_regs *regs = priv->regs;
  44. return readl(&regs->ext_port) & OFFSET_TO_BIT(offset);
  45. }
  46. static int rockchip_gpio_set_value(struct udevice *dev, unsigned offset,
  47. int value)
  48. {
  49. struct rockchip_gpio_priv *priv = dev_get_priv(dev);
  50. struct rockchip_gpio_regs *regs = priv->regs;
  51. int mask = OFFSET_TO_BIT(offset);
  52. clrsetbits_le32(&regs->swport_dr, mask, value ? mask : 0);
  53. return 0;
  54. }
  55. static int rockchip_gpio_get_function(struct udevice *dev, unsigned offset)
  56. {
  57. return -ENOSYS;
  58. }
  59. static int rockchip_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
  60. struct fdtdec_phandle_args *args)
  61. {
  62. desc->offset = args->args[0];
  63. desc->flags = args->args[1] & GPIO_ACTIVE_LOW ? GPIOD_ACTIVE_LOW : 0;
  64. return 0;
  65. }
  66. static int rockchip_gpio_probe(struct udevice *dev)
  67. {
  68. struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
  69. struct rockchip_gpio_priv *priv = dev_get_priv(dev);
  70. char *end;
  71. int bank;
  72. priv->regs = (struct rockchip_gpio_regs *)dev_get_addr(dev);
  73. uc_priv->gpio_count = ROCKCHIP_GPIOS_PER_BANK;
  74. end = strrchr(dev->name, '@');
  75. bank = trailing_strtoln(dev->name, end);
  76. priv->name[0] = 'A' + bank;
  77. uc_priv->bank_name = priv->name;
  78. return 0;
  79. }
  80. static const struct dm_gpio_ops gpio_rockchip_ops = {
  81. .direction_input = rockchip_gpio_direction_input,
  82. .direction_output = rockchip_gpio_direction_output,
  83. .get_value = rockchip_gpio_get_value,
  84. .set_value = rockchip_gpio_set_value,
  85. .get_function = rockchip_gpio_get_function,
  86. .xlate = rockchip_gpio_xlate,
  87. };
  88. static const struct udevice_id rockchip_gpio_ids[] = {
  89. { .compatible = "rockchip,gpio-bank" },
  90. { }
  91. };
  92. U_BOOT_DRIVER(gpio_rockchip) = {
  93. .name = "gpio_rockchip",
  94. .id = UCLASS_GPIO,
  95. .of_match = rockchip_gpio_ids,
  96. .ops = &gpio_rockchip_ops,
  97. .priv_auto_alloc_size = sizeof(struct rockchip_gpio_priv),
  98. .probe = rockchip_gpio_probe,
  99. };