iqs62x.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Azoteq IQS620A/621/622/624/625 Multi-Function Sensors
  4. *
  5. * Copyright (C) 2019 Jeff LaBundy <[email protected]>
  6. */
  7. #ifndef __LINUX_MFD_IQS62X_H
  8. #define __LINUX_MFD_IQS62X_H
  9. #define IQS620_PROD_NUM 0x41
  10. #define IQS621_PROD_NUM 0x46
  11. #define IQS622_PROD_NUM 0x42
  12. #define IQS624_PROD_NUM 0x43
  13. #define IQS625_PROD_NUM 0x4E
  14. #define IQS620_HW_NUM_V0 0x82
  15. #define IQS620_HW_NUM_V1 IQS620_HW_NUM_V0
  16. #define IQS620_HW_NUM_V2 IQS620_HW_NUM_V0
  17. #define IQS620_HW_NUM_V3 0x92
  18. #define IQS621_ALS_FLAGS 0x16
  19. #define IQS622_ALS_FLAGS 0x14
  20. #define IQS624_HALL_UI 0x70
  21. #define IQS624_HALL_UI_WHL_EVENT BIT(4)
  22. #define IQS624_HALL_UI_INT_EVENT BIT(3)
  23. #define IQS624_HALL_UI_AUTO_CAL BIT(2)
  24. #define IQS624_INTERVAL_DIV 0x7D
  25. #define IQS620_GLBL_EVENT_MASK 0xD7
  26. #define IQS620_GLBL_EVENT_MASK_PMU BIT(6)
  27. #define IQS62X_NUM_KEYS 16
  28. #define IQS62X_NUM_EVENTS (IQS62X_NUM_KEYS + 6)
  29. #define IQS62X_EVENT_SIZE 10
  30. enum iqs62x_ui_sel {
  31. IQS62X_UI_PROX,
  32. IQS62X_UI_SAR1,
  33. };
  34. enum iqs62x_event_reg {
  35. IQS62X_EVENT_NONE,
  36. IQS62X_EVENT_SYS,
  37. IQS62X_EVENT_PROX,
  38. IQS62X_EVENT_HYST,
  39. IQS62X_EVENT_HALL,
  40. IQS62X_EVENT_ALS,
  41. IQS62X_EVENT_IR,
  42. IQS62X_EVENT_WHEEL,
  43. IQS62X_EVENT_INTER,
  44. IQS62X_EVENT_UI_LO,
  45. IQS62X_EVENT_UI_HI,
  46. };
  47. enum iqs62x_event_flag {
  48. /* keys */
  49. IQS62X_EVENT_PROX_CH0_T,
  50. IQS62X_EVENT_PROX_CH0_P,
  51. IQS62X_EVENT_PROX_CH1_T,
  52. IQS62X_EVENT_PROX_CH1_P,
  53. IQS62X_EVENT_PROX_CH2_T,
  54. IQS62X_EVENT_PROX_CH2_P,
  55. IQS62X_EVENT_HYST_POS_T,
  56. IQS62X_EVENT_HYST_POS_P,
  57. IQS62X_EVENT_HYST_NEG_T,
  58. IQS62X_EVENT_HYST_NEG_P,
  59. IQS62X_EVENT_SAR1_ACT,
  60. IQS62X_EVENT_SAR1_QRD,
  61. IQS62X_EVENT_SAR1_MOVE,
  62. IQS62X_EVENT_SAR1_HALT,
  63. IQS62X_EVENT_WHEEL_UP,
  64. IQS62X_EVENT_WHEEL_DN,
  65. /* switches */
  66. IQS62X_EVENT_HALL_N_T,
  67. IQS62X_EVENT_HALL_N_P,
  68. IQS62X_EVENT_HALL_S_T,
  69. IQS62X_EVENT_HALL_S_P,
  70. /* everything else */
  71. IQS62X_EVENT_SYS_RESET,
  72. IQS62X_EVENT_SYS_ATI,
  73. };
  74. struct iqs62x_event_data {
  75. u16 ui_data;
  76. u8 als_flags;
  77. u8 ir_flags;
  78. u8 interval;
  79. };
  80. struct iqs62x_event_desc {
  81. enum iqs62x_event_reg reg;
  82. u8 mask;
  83. u8 val;
  84. };
  85. struct iqs62x_dev_desc {
  86. const char *dev_name;
  87. const struct mfd_cell *sub_devs;
  88. int num_sub_devs;
  89. u8 prod_num;
  90. u8 sw_num;
  91. const u8 *cal_regs;
  92. int num_cal_regs;
  93. u8 prox_mask;
  94. u8 sar_mask;
  95. u8 hall_mask;
  96. u8 hyst_mask;
  97. u8 temp_mask;
  98. u8 als_mask;
  99. u8 ir_mask;
  100. u8 prox_settings;
  101. u8 als_flags;
  102. u8 hall_flags;
  103. u8 hyst_shift;
  104. u8 interval;
  105. u8 interval_div;
  106. const char *fw_name;
  107. const enum iqs62x_event_reg (*event_regs)[IQS62X_EVENT_SIZE];
  108. };
  109. struct iqs62x_core {
  110. const struct iqs62x_dev_desc *dev_desc;
  111. struct i2c_client *client;
  112. struct regmap *regmap;
  113. struct blocking_notifier_head nh;
  114. struct list_head fw_blk_head;
  115. struct completion ati_done;
  116. struct completion fw_done;
  117. enum iqs62x_ui_sel ui_sel;
  118. unsigned long event_cache;
  119. u8 sw_num;
  120. u8 hw_num;
  121. };
  122. extern const struct iqs62x_event_desc iqs62x_events[IQS62X_NUM_EVENTS];
  123. #endif /* __LINUX_MFD_IQS62X_H */