pinctrl-jh7110-aon.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Pinctrl / GPIO driver for StarFive JH7110 SoC
  4. *
  5. * Copyright (C) 2022 StarFive Technology Co., Ltd.
  6. * Author: Lee Kuan Lim <kuanlim.lee@starfivetech.com>
  7. * Author: Jianlong Huang <jianlong.huang@starfivetech.com>
  8. */
  9. #include <dm/read.h>
  10. #include <dm/device_compat.h>
  11. #include <linux/io.h>
  12. #include <dt-bindings/pinctrl/pinctrl-starfive-jh7110.h>
  13. #include "pinctrl-starfive.h"
  14. #define JH7110_AON_NGPIO 4
  15. #define JH7110_AON_GC_BASE 64
  16. /* registers */
  17. #define JH7110_AON_DOEN 0x0
  18. #define JH7110_AON_DOUT 0x4
  19. #define JH7110_AON_GPI 0x8
  20. #define JH7110_AON_GPIOIN 0x2c
  21. #define JH7110_AON_GPIOEN 0xc
  22. #define JH7110_AON_GPIOIS 0x10
  23. #define JH7110_AON_GPIOIC 0x14
  24. #define JH7110_AON_GPIOIBE 0x18
  25. #define JH7110_AON_GPIOIEV 0x1c
  26. #define JH7110_AON_GPIOIE 0x20
  27. #define JH7110_AON_GPIORIS 0x28
  28. #define JH7110_AON_GPIOMIS 0x28
  29. #define AON_GPO_PDA_0_5_CFG 0x30
  30. static int jh7110_aon_set_one_pin_mux(struct udevice *dev, unsigned int pin,
  31. unsigned int din, u32 dout, u32 doen, u32 func)
  32. {
  33. struct starfive_pinctrl_priv *priv = dev_get_priv(dev);
  34. if (pin < priv->info->ngpios && func == 0)
  35. starfive_set_gpiomux(dev, pin, din, dout, doen);
  36. return 0;
  37. }
  38. static int jh7110_aon_get_padcfg_base(struct udevice *dev,
  39. unsigned int pin)
  40. {
  41. if (pin < PAD_GMAC0_MDC)
  42. return AON_GPO_PDA_0_5_CFG;
  43. return -1;
  44. }
  45. static void jh7110_aon_init_hw(struct udevice *dev)
  46. {
  47. struct starfive_pinctrl_priv *priv = dev_get_priv(dev);
  48. /* mask all GPIO interrupts */
  49. writel(0, priv->base + JH7110_AON_GPIOIE);
  50. /* clear edge interrupt flags */
  51. writel(0, priv->base + JH7110_AON_GPIOIC);
  52. writel(0x0f, priv->base + JH7110_AON_GPIOIC);
  53. /* enable GPIO interrupts */
  54. writel(1, priv->base + JH7110_AON_GPIOEN);
  55. }
  56. const struct starfive_pinctrl_soc_info jh7110_aon_pinctrl_info = {
  57. /* pin conf */
  58. .set_one_pinmux = jh7110_aon_set_one_pin_mux,
  59. .get_padcfg_base = jh7110_aon_get_padcfg_base,
  60. /* gpio dout/doen/din/gpioinput register */
  61. .dout_reg_base = JH7110_AON_DOUT,
  62. .dout_mask = GENMASK(3, 0),
  63. .doen_reg_base = JH7110_AON_DOEN,
  64. .doen_mask = GENMASK(2, 0),
  65. .gpi_reg_base = JH7110_AON_GPI,
  66. .gpi_mask = GENMASK(3, 0),
  67. .gpioin_reg_base = JH7110_AON_GPIOIN,
  68. /* gpio */
  69. .gpio_bank_name = "RGPIO",
  70. .ngpios = JH7110_AON_NGPIO,
  71. .gpio_init_hw = jh7110_aon_init_hw,
  72. };
  73. static int jh7110_aon_pinctrl_probe(struct udevice *dev)
  74. {
  75. struct starfive_pinctrl_soc_info *info =
  76. (struct starfive_pinctrl_soc_info *)dev_get_driver_data(dev);
  77. return starfive_pinctrl_probe(dev, info);
  78. }
  79. static const struct udevice_id jh7110_aon_pinctrl_ids[] = {
  80. /* JH7110 aon pinctrl */
  81. { .compatible = "starfive,jh7110-aon-pinctrl",
  82. .data = (ulong)&jh7110_aon_pinctrl_info, },
  83. { /* sentinel */ }
  84. };
  85. U_BOOT_DRIVER(jh7110_aon_pinctrl) = {
  86. .name = "jh7110-aon-pinctrl",
  87. .id = UCLASS_PINCTRL,
  88. .of_match = jh7110_aon_pinctrl_ids,
  89. .priv_auto = sizeof(struct starfive_pinctrl_priv),
  90. .ops = &starfive_pinctrl_ops,
  91. .probe = jh7110_aon_pinctrl_probe,
  92. };