pinctrl-wmt.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Pinctrl driver for the Wondermedia SoC's
  4. *
  5. * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz>
  6. */
  7. #include <linux/gpio/driver.h>
  8. /* VT8500 has no enable register in the extgpio bank. */
  9. #define NO_REG 0xFFFF
  10. #define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg) \
  11. { \
  12. .reg_en = __en, \
  13. .reg_dir = __dir, \
  14. .reg_data_out = __dout, \
  15. .reg_data_in = __din, \
  16. .reg_pull_en = __pen, \
  17. .reg_pull_cfg = __pcfg, \
  18. }
  19. /* Encode/decode the bank/bit pairs into a pin value */
  20. #define WMT_PIN(__bank, __offset) ((__bank << 5) | __offset)
  21. #define WMT_BANK_FROM_PIN(__pin) (__pin >> 5)
  22. #define WMT_BIT_FROM_PIN(__pin) (__pin & 0x1f)
  23. #define WMT_GROUP(__name, __data) \
  24. { \
  25. .name = __name, \
  26. .pins = __data, \
  27. .npins = ARRAY_SIZE(__data), \
  28. }
  29. struct wmt_pinctrl_bank_registers {
  30. u32 reg_en;
  31. u32 reg_dir;
  32. u32 reg_data_out;
  33. u32 reg_data_in;
  34. u32 reg_pull_en;
  35. u32 reg_pull_cfg;
  36. };
  37. struct wmt_pinctrl_group {
  38. const char *name;
  39. const unsigned int *pins;
  40. const unsigned npins;
  41. };
  42. struct wmt_pinctrl_data {
  43. struct device *dev;
  44. struct pinctrl_dev *pctl_dev;
  45. /* must be initialized before calling wmt_pinctrl_probe */
  46. void __iomem *base;
  47. const struct wmt_pinctrl_bank_registers *banks;
  48. const struct pinctrl_pin_desc *pins;
  49. const char * const *groups;
  50. u32 nbanks;
  51. u32 npins;
  52. u32 ngroups;
  53. struct gpio_chip gpio_chip;
  54. struct pinctrl_gpio_range gpio_range;
  55. };
  56. int wmt_pinctrl_probe(struct platform_device *pdev,
  57. struct wmt_pinctrl_data *data);