twl4030.c 1.7 KB

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