mxs_gpio.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. * See file CREDITS for list of people who contributed to this
  8. * project.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 of
  13. * the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23. * MA 02111-1307 USA
  24. */
  25. #include <common.h>
  26. #include <netdev.h>
  27. #include <asm/errno.h>
  28. #include <asm/io.h>
  29. #include <asm/arch/iomux.h>
  30. #include <asm/arch/imx-regs.h>
  31. #if defined(CONFIG_MX23)
  32. #define PINCTRL_BANKS 3
  33. #define PINCTRL_DOUT(n) (0x0500 + ((n) * 0x10))
  34. #define PINCTRL_DIN(n) (0x0600 + ((n) * 0x10))
  35. #define PINCTRL_DOE(n) (0x0700 + ((n) * 0x10))
  36. #define PINCTRL_PIN2IRQ(n) (0x0800 + ((n) * 0x10))
  37. #define PINCTRL_IRQEN(n) (0x0900 + ((n) * 0x10))
  38. #define PINCTRL_IRQSTAT(n) (0x0c00 + ((n) * 0x10))
  39. #elif defined(CONFIG_MX28)
  40. #define PINCTRL_BANKS 5
  41. #define PINCTRL_DOUT(n) (0x0700 + ((n) * 0x10))
  42. #define PINCTRL_DIN(n) (0x0900 + ((n) * 0x10))
  43. #define PINCTRL_DOE(n) (0x0b00 + ((n) * 0x10))
  44. #define PINCTRL_PIN2IRQ(n) (0x1000 + ((n) * 0x10))
  45. #define PINCTRL_IRQEN(n) (0x1100 + ((n) * 0x10))
  46. #define PINCTRL_IRQSTAT(n) (0x1400 + ((n) * 0x10))
  47. #else
  48. #error "Please select CONFIG_MX23 or CONFIG_MX28"
  49. #endif
  50. #define GPIO_INT_FALL_EDGE 0x0
  51. #define GPIO_INT_LOW_LEV 0x1
  52. #define GPIO_INT_RISE_EDGE 0x2
  53. #define GPIO_INT_HIGH_LEV 0x3
  54. #define GPIO_INT_LEV_MASK (1 << 0)
  55. #define GPIO_INT_POL_MASK (1 << 1)
  56. void mxs_gpio_init(void)
  57. {
  58. int i;
  59. for (i = 0; i < PINCTRL_BANKS; i++) {
  60. writel(0, MXS_PINCTRL_BASE + PINCTRL_PIN2IRQ(i));
  61. writel(0, MXS_PINCTRL_BASE + PINCTRL_IRQEN(i));
  62. /* Use SCT address here to clear the IRQSTAT bits */
  63. writel(0xffffffff, MXS_PINCTRL_BASE + PINCTRL_IRQSTAT(i) + 8);
  64. }
  65. }
  66. int gpio_get_value(unsigned gpio)
  67. {
  68. uint32_t bank = PAD_BANK(gpio);
  69. uint32_t offset = PINCTRL_DIN(bank);
  70. struct mx28_register_32 *reg =
  71. (struct mx28_register_32 *)(MXS_PINCTRL_BASE + offset);
  72. return (readl(&reg->reg) >> PAD_PIN(gpio)) & 1;
  73. }
  74. void gpio_set_value(unsigned gpio, int value)
  75. {
  76. uint32_t bank = PAD_BANK(gpio);
  77. uint32_t offset = PINCTRL_DOUT(bank);
  78. struct mx28_register_32 *reg =
  79. (struct mx28_register_32 *)(MXS_PINCTRL_BASE + offset);
  80. if (value)
  81. writel(1 << PAD_PIN(gpio), &reg->reg_set);
  82. else
  83. writel(1 << PAD_PIN(gpio), &reg->reg_clr);
  84. }
  85. int gpio_direction_input(unsigned gpio)
  86. {
  87. uint32_t bank = PAD_BANK(gpio);
  88. uint32_t offset = PINCTRL_DOE(bank);
  89. struct mx28_register_32 *reg =
  90. (struct mx28_register_32 *)(MXS_PINCTRL_BASE + offset);
  91. writel(1 << PAD_PIN(gpio), &reg->reg_clr);
  92. return 0;
  93. }
  94. int gpio_direction_output(unsigned gpio, int value)
  95. {
  96. uint32_t bank = PAD_BANK(gpio);
  97. uint32_t offset = PINCTRL_DOE(bank);
  98. struct mx28_register_32 *reg =
  99. (struct mx28_register_32 *)(MXS_PINCTRL_BASE + offset);
  100. writel(1 << PAD_PIN(gpio), &reg->reg_set);
  101. gpio_set_value(gpio, value);
  102. return 0;
  103. }
  104. int gpio_request(unsigned gpio, const char *label)
  105. {
  106. if (PAD_BANK(gpio) >= PINCTRL_BANKS)
  107. return -1;
  108. return 0;
  109. }
  110. int gpio_free(unsigned gpio)
  111. {
  112. return 0;
  113. }