soc_pinmux.c 980 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2019 Actions Semiconductor Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file pinmux interface for Actions SoC
  8. */
  9. #include <errno.h>
  10. #include <kernel.h>
  11. #include "soc.h"
  12. int acts_pinmux_set(unsigned int pin, unsigned int mode)
  13. {
  14. unsigned int key, ctl_reg, val;
  15. if (pin >= GPIO_MAX_PIN_NUM)
  16. return -EINVAL;
  17. ctl_reg = GPIO_REG_CTL(GPIO_REG_BASE, pin);
  18. key = irq_lock();
  19. val = (sys_read32(ctl_reg) & ~PINMUX_MODE_MASK) | mode;
  20. sys_write32(val, ctl_reg);
  21. irq_unlock(key);
  22. return 0;
  23. }
  24. int acts_pinmux_get(unsigned int pin, unsigned int *mode)
  25. {
  26. unsigned int ctl_reg = GPIO_REG_CTL(GPIO_REG_BASE, pin);
  27. *mode = sys_read32(ctl_reg) & PINMUX_MODE_MASK;
  28. return 0;
  29. }
  30. void acts_pinmux_setup_pins(const struct acts_pin_config *pinconf, int pins)
  31. {
  32. int i;
  33. for (i = 0; i < pins; i++) {
  34. acts_pinmux_set(pinconf[i].pin_num, pinconf[i].mode);
  35. //printk("pin=%d, ctl_reg=0x%x\n", pinconf[i].pin_num,
  36. // pinconf[i].mode);
  37. }
  38. }