bcm2835_gpio.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (C) 2012 Vikram Narayananan
  3. * <vikram186@gmail.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/gpio.h>
  9. #include <asm/io.h>
  10. inline int gpio_is_valid(unsigned gpio)
  11. {
  12. return (gpio < BCM2835_GPIO_COUNT);
  13. }
  14. int gpio_request(unsigned gpio, const char *label)
  15. {
  16. return !gpio_is_valid(gpio);
  17. }
  18. int gpio_free(unsigned gpio)
  19. {
  20. return 0;
  21. }
  22. int gpio_direction_input(unsigned gpio)
  23. {
  24. struct bcm2835_gpio_regs *reg =
  25. (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE;
  26. unsigned val;
  27. val = readl(&reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]);
  28. val &= ~(BCM2835_GPIO_FSEL_MASK << BCM2835_GPIO_FSEL_SHIFT(gpio));
  29. val |= (BCM2835_GPIO_INPUT << BCM2835_GPIO_FSEL_SHIFT(gpio));
  30. writel(val, &reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]);
  31. return 0;
  32. }
  33. int gpio_direction_output(unsigned gpio, int value)
  34. {
  35. struct bcm2835_gpio_regs *reg =
  36. (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE;
  37. unsigned val;
  38. gpio_set_value(gpio, value);
  39. val = readl(&reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]);
  40. val &= ~(BCM2835_GPIO_FSEL_MASK << BCM2835_GPIO_FSEL_SHIFT(gpio));
  41. val |= (BCM2835_GPIO_OUTPUT << BCM2835_GPIO_FSEL_SHIFT(gpio));
  42. writel(val, &reg->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]);
  43. return 0;
  44. }
  45. int gpio_get_value(unsigned gpio)
  46. {
  47. struct bcm2835_gpio_regs *reg =
  48. (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE;
  49. unsigned val;
  50. val = readl(&reg->gplev[BCM2835_GPIO_COMMON_BANK(gpio)]);
  51. return (val >> BCM2835_GPIO_COMMON_SHIFT(gpio)) & 0x1;
  52. }
  53. int gpio_set_value(unsigned gpio, int value)
  54. {
  55. struct bcm2835_gpio_regs *reg =
  56. (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE;
  57. u32 *output_reg = value ? reg->gpset : reg->gpclr;
  58. writel(1 << BCM2835_GPIO_COMMON_SHIFT(gpio),
  59. &output_reg[BCM2835_GPIO_COMMON_BANK(gpio)]);
  60. return 0;
  61. }