mvgpio.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2011
  4. * eInfochips Ltd. <www.einfochips.com>
  5. * Written-by: Ajay Bhargav <contact@8051projects.net>
  6. *
  7. * (C) Copyright 2010
  8. * Marvell Semiconductor <www.marvell.com>
  9. */
  10. #include <common.h>
  11. #include <asm/io.h>
  12. #include <linux/errno.h>
  13. #include "mvgpio.h"
  14. #include <asm/gpio.h>
  15. #ifndef MV_MAX_GPIO
  16. #define MV_MAX_GPIO 128
  17. #endif
  18. int gpio_request(unsigned gpio, const char *label)
  19. {
  20. if (gpio >= MV_MAX_GPIO) {
  21. printf("%s: Invalid GPIO requested %d\n", __func__, gpio);
  22. return -1;
  23. }
  24. return 0;
  25. }
  26. int gpio_free(unsigned gpio)
  27. {
  28. return 0;
  29. }
  30. int gpio_direction_input(unsigned gpio)
  31. {
  32. struct gpio_reg *gpio_reg_bank;
  33. if (gpio >= MV_MAX_GPIO) {
  34. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  35. return -1;
  36. }
  37. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  38. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr);
  39. return 0;
  40. }
  41. int gpio_direction_output(unsigned gpio, int value)
  42. {
  43. struct gpio_reg *gpio_reg_bank;
  44. if (gpio >= MV_MAX_GPIO) {
  45. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  46. return -1;
  47. }
  48. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  49. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr);
  50. gpio_set_value(gpio, value);
  51. return 0;
  52. }
  53. int gpio_get_value(unsigned gpio)
  54. {
  55. struct gpio_reg *gpio_reg_bank;
  56. u32 gpio_val;
  57. if (gpio >= MV_MAX_GPIO) {
  58. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  59. return -1;
  60. }
  61. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  62. gpio_val = readl(&gpio_reg_bank->gplr);
  63. return GPIO_VAL(gpio, gpio_val);
  64. }
  65. int gpio_set_value(unsigned gpio, int value)
  66. {
  67. struct gpio_reg *gpio_reg_bank;
  68. if (gpio >= MV_MAX_GPIO) {
  69. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  70. return -1;
  71. }
  72. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  73. if (value)
  74. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr);
  75. else
  76. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr);
  77. return 0;
  78. }