mvgpio.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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 <malloc.h>
  12. #include <asm/io.h>
  13. #include <linux/errno.h>
  14. #include "mvgpio.h"
  15. #include <asm/gpio.h>
  16. #ifndef MV_MAX_GPIO
  17. #define MV_MAX_GPIO 128
  18. #endif
  19. int gpio_request(unsigned gpio, const char *label)
  20. {
  21. if (gpio >= MV_MAX_GPIO) {
  22. printf("%s: Invalid GPIO requested %d\n", __func__, gpio);
  23. return -1;
  24. }
  25. return 0;
  26. }
  27. int gpio_free(unsigned gpio)
  28. {
  29. return 0;
  30. }
  31. int gpio_direction_input(unsigned gpio)
  32. {
  33. struct gpio_reg *gpio_reg_bank;
  34. if (gpio >= MV_MAX_GPIO) {
  35. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  36. return -1;
  37. }
  38. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  39. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr);
  40. return 0;
  41. }
  42. int gpio_direction_output(unsigned gpio, int value)
  43. {
  44. struct gpio_reg *gpio_reg_bank;
  45. if (gpio >= MV_MAX_GPIO) {
  46. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  47. return -1;
  48. }
  49. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  50. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr);
  51. gpio_set_value(gpio, value);
  52. return 0;
  53. }
  54. int gpio_get_value(unsigned gpio)
  55. {
  56. struct gpio_reg *gpio_reg_bank;
  57. u32 gpio_val;
  58. if (gpio >= MV_MAX_GPIO) {
  59. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  60. return -1;
  61. }
  62. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  63. gpio_val = readl(&gpio_reg_bank->gplr);
  64. return GPIO_VAL(gpio, gpio_val);
  65. }
  66. int gpio_set_value(unsigned gpio, int value)
  67. {
  68. struct gpio_reg *gpio_reg_bank;
  69. if (gpio >= MV_MAX_GPIO) {
  70. printf("%s: Invalid GPIO %d\n", __func__, gpio);
  71. return -1;
  72. }
  73. gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio));
  74. if (value)
  75. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr);
  76. else
  77. writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr);
  78. return 0;
  79. }