mxs_gpio.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * Freescale i.MX28 GPIO control code
  3. *
  4. * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
  5. * on behalf of DENX Software Engineering GmbH
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <common.h>
  10. #include <netdev.h>
  11. #include <asm/errno.h>
  12. #include <asm/io.h>
  13. #include <asm/arch/iomux.h>
  14. #include <asm/arch/imx-regs.h>
  15. #if defined(CONFIG_MX23)
  16. #define PINCTRL_BANKS 3
  17. #define PINCTRL_DOUT(n) (0x0500 + ((n) * 0x10))
  18. #define PINCTRL_DIN(n) (0x0600 + ((n) * 0x10))
  19. #define PINCTRL_DOE(n) (0x0700 + ((n) * 0x10))
  20. #define PINCTRL_PIN2IRQ(n) (0x0800 + ((n) * 0x10))
  21. #define PINCTRL_IRQEN(n) (0x0900 + ((n) * 0x10))
  22. #define PINCTRL_IRQSTAT(n) (0x0c00 + ((n) * 0x10))
  23. #elif defined(CONFIG_MX28)
  24. #define PINCTRL_BANKS 5
  25. #define PINCTRL_DOUT(n) (0x0700 + ((n) * 0x10))
  26. #define PINCTRL_DIN(n) (0x0900 + ((n) * 0x10))
  27. #define PINCTRL_DOE(n) (0x0b00 + ((n) * 0x10))
  28. #define PINCTRL_PIN2IRQ(n) (0x1000 + ((n) * 0x10))
  29. #define PINCTRL_IRQEN(n) (0x1100 + ((n) * 0x10))
  30. #define PINCTRL_IRQSTAT(n) (0x1400 + ((n) * 0x10))
  31. #else
  32. #error "Please select CONFIG_MX23 or CONFIG_MX28"
  33. #endif
  34. #define GPIO_INT_FALL_EDGE 0x0
  35. #define GPIO_INT_LOW_LEV 0x1
  36. #define GPIO_INT_RISE_EDGE 0x2
  37. #define GPIO_INT_HIGH_LEV 0x3
  38. #define GPIO_INT_LEV_MASK (1 << 0)
  39. #define GPIO_INT_POL_MASK (1 << 1)
  40. void mxs_gpio_init(void)
  41. {
  42. int i;
  43. for (i = 0; i < PINCTRL_BANKS; i++) {
  44. writel(0, MXS_PINCTRL_BASE + PINCTRL_PIN2IRQ(i));
  45. writel(0, MXS_PINCTRL_BASE + PINCTRL_IRQEN(i));
  46. /* Use SCT address here to clear the IRQSTAT bits */
  47. writel(0xffffffff, MXS_PINCTRL_BASE + PINCTRL_IRQSTAT(i) + 8);
  48. }
  49. }
  50. int gpio_get_value(unsigned gpio)
  51. {
  52. uint32_t bank = PAD_BANK(gpio);
  53. uint32_t offset = PINCTRL_DIN(bank);
  54. struct mxs_register_32 *reg =
  55. (struct mxs_register_32 *)(MXS_PINCTRL_BASE + offset);
  56. return (readl(&reg->reg) >> PAD_PIN(gpio)) & 1;
  57. }
  58. void gpio_set_value(unsigned gpio, int value)
  59. {
  60. uint32_t bank = PAD_BANK(gpio);
  61. uint32_t offset = PINCTRL_DOUT(bank);
  62. struct mxs_register_32 *reg =
  63. (struct mxs_register_32 *)(MXS_PINCTRL_BASE + offset);
  64. if (value)
  65. writel(1 << PAD_PIN(gpio), &reg->reg_set);
  66. else
  67. writel(1 << PAD_PIN(gpio), &reg->reg_clr);
  68. }
  69. int gpio_direction_input(unsigned gpio)
  70. {
  71. uint32_t bank = PAD_BANK(gpio);
  72. uint32_t offset = PINCTRL_DOE(bank);
  73. struct mxs_register_32 *reg =
  74. (struct mxs_register_32 *)(MXS_PINCTRL_BASE + offset);
  75. writel(1 << PAD_PIN(gpio), &reg->reg_clr);
  76. return 0;
  77. }
  78. int gpio_direction_output(unsigned gpio, int value)
  79. {
  80. uint32_t bank = PAD_BANK(gpio);
  81. uint32_t offset = PINCTRL_DOE(bank);
  82. struct mxs_register_32 *reg =
  83. (struct mxs_register_32 *)(MXS_PINCTRL_BASE + offset);
  84. gpio_set_value(gpio, value);
  85. writel(1 << PAD_PIN(gpio), &reg->reg_set);
  86. return 0;
  87. }
  88. int gpio_request(unsigned gpio, const char *label)
  89. {
  90. if (PAD_BANK(gpio) >= PINCTRL_BANKS)
  91. return -1;
  92. return 0;
  93. }
  94. int gpio_free(unsigned gpio)
  95. {
  96. return 0;
  97. }