pinmux.c 1.6 KB

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