twl4030.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * TWL4030 input
  3. *
  4. * Copyright (C) 2015 Paul Kocialkowski <contact@paulk.fr>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <twl4030.h>
  9. int twl4030_input_power_button(void)
  10. {
  11. u8 data;
  12. twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  13. TWL4030_PM_MASTER_STS_HW_CONDITIONS, &data);
  14. if (data & TWL4030_PM_MASTER_STS_HW_CONDITIONS_PWON)
  15. return 1;
  16. return 0;
  17. }
  18. int twl4030_input_charger(void)
  19. {
  20. u8 data;
  21. twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  22. TWL4030_PM_MASTER_STS_HW_CONDITIONS, &data);
  23. if (data & TWL4030_PM_MASTER_STS_HW_CONDITIONS_CHG)
  24. return 1;
  25. return 0;
  26. }
  27. int twl4030_input_usb(void)
  28. {
  29. u8 data;
  30. twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER,
  31. TWL4030_PM_MASTER_STS_HW_CONDITIONS, &data);
  32. if (data & TWL4030_PM_MASTER_STS_HW_CONDITIONS_USB ||
  33. data & TWL4030_PM_MASTER_STS_HW_CONDITIONS_VBUS)
  34. return 1;
  35. return 0;
  36. }
  37. int twl4030_keypad_scan(unsigned char *matrix)
  38. {
  39. u8 data;
  40. u8 c, r;
  41. twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD,
  42. TWL4030_KEYPAD_KEYP_CTRL_REG, &data);
  43. data |= TWL4030_KEYPAD_CTRL_SOFT_NRST | TWL4030_KEYPAD_CTRL_KBD_ON;
  44. data &= ~TWL4030_KEYPAD_CTRL_SOFTMODEN;
  45. twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
  46. TWL4030_KEYPAD_KEYP_CTRL_REG, data);
  47. for (c = 0; c < 8; c++) {
  48. data = 0xff & ~(1 << c);
  49. twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
  50. TWL4030_KEYPAD_KBC_REG, data);
  51. data = 0xff;
  52. twl4030_i2c_read_u8(TWL4030_CHIP_KEYPAD,
  53. TWL4030_KEYPAD_KBR_REG, &data);
  54. for (r = 0; r < 8; r++)
  55. matrix[c * 8 + r] = !(data & (1 << r));
  56. }
  57. data = 0xff & ~(TWL4030_KEYPAD_CTRL_SOFT_NRST);
  58. twl4030_i2c_write_u8(TWL4030_CHIP_KEYPAD,
  59. TWL4030_KEYPAD_KEYP_CTRL_REG, data);
  60. return 0;
  61. }
  62. int twl4030_keypad_key(unsigned char *matrix, u8 c, u8 r)
  63. {
  64. return matrix[c * 8 + r];
  65. }