pinctrl-nexell.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Pinctrl driver for Nexell SoCs
  4. * (C) Copyright 2016 Nexell
  5. * Bongyu, KOO <freestyle@nexell.co.kr>
  6. */
  7. #include <common.h>
  8. #include <dm.h>
  9. #include <errno.h>
  10. #include <asm/global_data.h>
  11. #include <asm/io.h>
  12. #include "pinctrl-nexell.h"
  13. #include "pinctrl-s5pxx18.h"
  14. DECLARE_GLOBAL_DATA_PTR;
  15. /* given a pin-name, return the address of pin config registers */
  16. unsigned long pin_to_bank_base(struct udevice *dev, const char *pin_name,
  17. u32 *pin)
  18. {
  19. struct nexell_pinctrl_priv *priv = dev_get_priv(dev);
  20. const struct nexell_pin_ctrl *pin_ctrl = priv->pin_ctrl;
  21. const struct nexell_pin_bank_data *bank_data = pin_ctrl->pin_banks;
  22. u32 nr_banks = pin_ctrl->nr_banks, idx = 0;
  23. char bank[10];
  24. /*
  25. * The format of the pin name is <bank name>-<pin_number>.
  26. * Example: gpioa-4 (gpioa is the bank name and 4 is the pin number)
  27. */
  28. while (pin_name[idx] != '-') {
  29. bank[idx] = pin_name[idx];
  30. idx++;
  31. }
  32. bank[idx] = '\0';
  33. *pin = (u32)dectoul(&pin_name[++idx], NULL);
  34. /* lookup the pin bank data using the pin bank name */
  35. for (idx = 0; idx < nr_banks; idx++)
  36. if (!strcmp(bank, bank_data[idx].name))
  37. break;
  38. return priv->base + bank_data[idx].offset;
  39. }
  40. int nexell_pinctrl_probe(struct udevice *dev)
  41. {
  42. struct nexell_pinctrl_priv *priv;
  43. fdt_addr_t base;
  44. priv = dev_get_priv(dev);
  45. if (!priv)
  46. return -EINVAL;
  47. base = devfdt_get_addr(dev);
  48. if (base == FDT_ADDR_T_NONE)
  49. return -EINVAL;
  50. priv->base = base;
  51. priv->pin_ctrl = (struct nexell_pin_ctrl *)dev_get_driver_data(dev);
  52. s5pxx18_pinctrl_init(dev);
  53. return 0;
  54. }