pinmux.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2007-2011
  4. * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
  5. * Tom Cubie <tangliang@allwinnertech.com>
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/gpio.h>
  10. void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val)
  11. {
  12. u32 index = GPIO_CFG_INDEX(bank_offset);
  13. u32 offset = GPIO_CFG_OFFSET(bank_offset);
  14. clrsetbits_le32(&pio->cfg[0] + index, 0xf << offset, val << offset);
  15. }
  16. void sunxi_gpio_set_cfgpin(u32 pin, u32 val)
  17. {
  18. u32 bank = GPIO_BANK(pin);
  19. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  20. sunxi_gpio_set_cfgbank(pio, pin, val);
  21. }
  22. int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset)
  23. {
  24. u32 index = GPIO_CFG_INDEX(bank_offset);
  25. u32 offset = GPIO_CFG_OFFSET(bank_offset);
  26. u32 cfg;
  27. cfg = readl(&pio->cfg[0] + index);
  28. cfg >>= offset;
  29. return cfg & 0xf;
  30. }
  31. int sunxi_gpio_get_cfgpin(u32 pin)
  32. {
  33. u32 bank = GPIO_BANK(pin);
  34. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  35. return sunxi_gpio_get_cfgbank(pio, pin);
  36. }
  37. int sunxi_gpio_set_drv(u32 pin, u32 val)
  38. {
  39. u32 bank = GPIO_BANK(pin);
  40. u32 index = GPIO_DRV_INDEX(pin);
  41. u32 offset = GPIO_DRV_OFFSET(pin);
  42. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  43. clrsetbits_le32(&pio->drv[0] + index, 0x3 << offset, val << offset);
  44. return 0;
  45. }
  46. int sunxi_gpio_set_pull(u32 pin, u32 val)
  47. {
  48. u32 bank = GPIO_BANK(pin);
  49. u32 index = GPIO_PULL_INDEX(pin);
  50. u32 offset = GPIO_PULL_OFFSET(pin);
  51. struct sunxi_gpio *pio = BANK_TO_GPIO(bank);
  52. clrsetbits_le32(&pio->pull[0] + index, 0x3 << offset, val << offset);
  53. return 0;
  54. }