pcf50633-gpio.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* NXP PCF50633 GPIO Driver
  3. *
  4. * (C) 2006-2008 by Openmoko, Inc.
  5. * Author: Balaji Rao <[email protected]>
  6. * All rights reserved.
  7. *
  8. * Broken down from monstrous PCF50633 driver mainly by
  9. * Harald Welte, Andy Green and Werner Almesberger
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/mfd/pcf50633/core.h>
  14. #include <linux/mfd/pcf50633/gpio.h>
  15. #include <linux/mfd/pcf50633/pmic.h>
  16. static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = {
  17. [PCF50633_REGULATOR_AUTO] = PCF50633_REG_AUTOOUT,
  18. [PCF50633_REGULATOR_DOWN1] = PCF50633_REG_DOWN1OUT,
  19. [PCF50633_REGULATOR_DOWN2] = PCF50633_REG_DOWN2OUT,
  20. [PCF50633_REGULATOR_MEMLDO] = PCF50633_REG_MEMLDOOUT,
  21. [PCF50633_REGULATOR_LDO1] = PCF50633_REG_LDO1OUT,
  22. [PCF50633_REGULATOR_LDO2] = PCF50633_REG_LDO2OUT,
  23. [PCF50633_REGULATOR_LDO3] = PCF50633_REG_LDO3OUT,
  24. [PCF50633_REGULATOR_LDO4] = PCF50633_REG_LDO4OUT,
  25. [PCF50633_REGULATOR_LDO5] = PCF50633_REG_LDO5OUT,
  26. [PCF50633_REGULATOR_LDO6] = PCF50633_REG_LDO6OUT,
  27. [PCF50633_REGULATOR_HCLDO] = PCF50633_REG_HCLDOOUT,
  28. };
  29. int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val)
  30. {
  31. u8 reg;
  32. reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
  33. return pcf50633_reg_set_bit_mask(pcf, reg, 0x07, val);
  34. }
  35. EXPORT_SYMBOL_GPL(pcf50633_gpio_set);
  36. u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio)
  37. {
  38. u8 reg, val;
  39. reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
  40. val = pcf50633_reg_read(pcf, reg) & 0x07;
  41. return val;
  42. }
  43. EXPORT_SYMBOL_GPL(pcf50633_gpio_get);
  44. int pcf50633_gpio_invert_set(struct pcf50633 *pcf, int gpio, int invert)
  45. {
  46. u8 val, reg;
  47. reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
  48. val = !!invert << 3;
  49. return pcf50633_reg_set_bit_mask(pcf, reg, 1 << 3, val);
  50. }
  51. EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_set);
  52. int pcf50633_gpio_invert_get(struct pcf50633 *pcf, int gpio)
  53. {
  54. u8 reg, val;
  55. reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
  56. val = pcf50633_reg_read(pcf, reg);
  57. return val & (1 << 3);
  58. }
  59. EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_get);
  60. int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
  61. int gpio, int regulator, int on)
  62. {
  63. u8 reg, val, mask;
  64. /* the *ENA register is always one after the *OUT register */
  65. reg = pcf50633_regulator_registers[regulator] + 1;
  66. val = !!on << (gpio - PCF50633_GPIO1);
  67. mask = 1 << (gpio - PCF50633_GPIO1);
  68. return pcf50633_reg_set_bit_mask(pcf, reg, mask, val);
  69. }
  70. EXPORT_SYMBOL_GPL(pcf50633_gpio_power_supply_set);
  71. MODULE_LICENSE("GPL");