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