blob: 0c891760d1916a484fc5c743b2832d3dfd7d7496 [file] [log] [blame]
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +00001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Platform data for the NXP WC68 battery charger driver.
4 */
5
6#ifndef _WC68_CHARGER_H_
7#define _WC68_CHARGER_H_
8
9#include <linux/mutex.h>
10#include <linux/module.h>
11#include <linux/debugfs.h>
12#include <linux/thermal.h>
13#include <linux/pm_runtime.h>
14#include <linux/kernel.h>
15
16/* Google integration */
17#include "gbms_power_supply.h"
18#include "google_bms.h"
19#include "google_dc_pps.h"
20
21struct wc68_platform_data {
22 s32 irq_gpio; /* GPIO pin that's connected to INT# */
23 u32 iin_cfg; /* Input Current Limit - uA unit */
24 u32 iin_cfg_max; /* from config/dt */
25 u32 v_float; /* V_Float Voltage - uV unit */
26 u32 v_float_dt; /* from config/dt */
Wasb Liu012fc822022-11-10 12:56:06 +000027 u32 iin_topoff; /* Input Topoff current -uV unit */
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +000028 s32 iin_max_offset;
29 s32 iin_cc_comp_offset;
Wasb Liu012fc822022-11-10 12:56:06 +000030 u32 ta_max_vol;
31 u32 ta_max_vol_cp;
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +000032
33 /* irdrop */
34 s32 irdrop_limits[3];
35 s32 irdrop_limit_cnt;
Wasb Liu52d2ce82022-10-21 01:18:10 +000036 u8 wc68_irdrop;
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +000037
38#if IS_ENABLED(CONFIG_THERMAL)
39 const char *usb_tz_name;
40#endif
41};
42
43/* - PPS Integration Shared definitions ---------------------------------- */
44
45/* AC[0] */
46#define WC68_CHGS_VER 1
47#define WC68_CHGS_VER_MASK 0xff
48/* AC[1] APDO */
49/* RS[0] */
50#define WC68_CHGS_FLAG_SHIFT 0
51#define WC68_CHGS_FLAG_MASK 0xff
52#define WC68_CHGS_F_STBY BIT(0)
53#define WC68_CHGS_F_SHDN BIT(1)
54#define WC68_CHGS_F_DONE BIT(2)
55#define WC68_CHGS_PRE_SHIFT 8
56#define WC68_CHGS_PRE_MASK (0xff << WC68_CHGS_PRE_SHIFT)
57#define WC68_CHGS_RCPC_SHIFT 16
58#define WC68_CHGS_RCPC_MASK (0xff << WC68_CHGS_RCPC_SHIFT)
59#define WC68_CHGS_NC_SHIFT 24
60#define WC68_CHGS_NC_MASK (0xff << WC68_CHGS_NC_SHIFT)
61/* RS[1] */
62#define WC68_CHGS_OVCC_SHIFT 0
63#define WC68_CHGS_OVCC_MASK (0xffff << WC68_CHGS_OVCC_SHIFT)
64#define WC68_CHGS_ADJ_SHIFT 16
65#define WC68_CHGS_ADJ_MASK (0xffff << WC68_CHGS_ADJ_MASK)
66/* RS[2] */
67#define WC68_CHGS_CC_SHIFT 0
68#define WC68_CHGS_CC_MASK (0xffff << WC68_CHGS_CC_SHIFT)
69#define WC68_CHGS_CV_SHIFT 16
70#define WC68_CHGS_CV_MASK (0xffff << WC68_CHGS_CV_SHIFT)
71/* RS[3] */
72#define WC68_CHGS_CA_SHIFT 0
73#define WC68_CHGS_CA_MASK (0xff << WC68_CHGS_CA_SHIFT)
74
75
76struct wc68_chg_stats {
77 u32 adapter_capabilities[2];
78 u32 receiver_state[5];
79
80 u8 valid;
81 u32 ovc_count;
82 u32 ovc_max_ibatt;
83 u32 ovc_max_delta;
84
85 u32 rcp_count;
86 u32 nc_count;
87 u32 pre_count;
88 u32 ca_count;
89 u32 cc_count;
90 u32 cv_count;
91 u32 adj_count;
92 u32 stby_count;
93};
94
95#define wc68_chg_stats_valid(chg_data) ((chg_data)->valid)
96
97static inline void wc68_chg_stats_update_flags(struct wc68_chg_stats *chg_data, u8 flags)
98{
99 chg_data->receiver_state[0] |= flags << WC68_CHGS_FLAG_SHIFT;
100}
101
102static inline void wc68_chg_stats_set_flags(struct wc68_chg_stats *chg_data, u8 flags)
103{
104 chg_data->receiver_state[0] &= ~WC68_CHGS_FLAG_MASK;
105 wc68_chg_stats_update_flags(chg_data, flags);
106}
107
108static inline void wc68_chg_stats_inc_ovcf(struct wc68_chg_stats *chg_data,
109 s32 ibatt, s32 cc_max)
110{
111 const s32 delta = ibatt - cc_max;
112
113 chg_data->ovc_count++;
114 if (delta > chg_data->ovc_max_delta) {
115 chg_data->ovc_max_ibatt = ibatt;
116 chg_data->ovc_max_delta = delta;
117 }
118}
119
120/**
121 * struct wc68_charger - wc68 charger instance
122 * @monitor_wake_lock: lock to enter the suspend mode
123 * @lock: protects concurrent access to online variables
124 * @dev: pointer to device
125 * @regmap: pointer to driver regmap
126 * @mains: power_supply instance for AC/DC power
127 * @dc_wq: work queue for the algorithm and monitor timer
128 * @timer_work: timer work for charging
129 * @timer_id: timer id for timer_work
130 * @timer_period: timer period for timer_work
131 * @last_update_time: last update time after sleep
132 * @pps_index: psy index
133 * @tcpm_psy_name: name of TCPM power supply
134 * @tcpm_phandle: lookup for tcpm power supply
135 * @pps_work: pps work for PPS periodic time
136 * @pps_data: internal data for dc_pps
137 * @log: logbuffer
138 * @pd: phandle for qualcomm PMI usbpd-phy
139 * @wlc_psy_name: power supply for wlc DC
140 * @wlc_psy: wlc DC ps
141 * @mains_online: is AC/DC input connected
142 * @charging_state: direct charging state
143 * @ret_state: return direct charging state after DC_STATE_ADJUST_TAVOL is done
144 * @iin_cc: input current for the direct charging in cc mode, uA
145 * @ta_cur: AC/DC(TA) current, uA
146 * @ta_vol: AC/DC(TA) voltage, uV
147 * @ta_objpos: AC/DC(TA) PDO object position
148 * @ta_max_cur: TA maximum current of APDO, uA
149 * @ta_max_vol: TA maximum voltage for the direct charging, uV
150 * @ta_max_pwr: TA maximum power, uW
151 * @prev_iin: Previous IIN ADC of WC68, uA
152 * @prev_inc: Previous TA voltage or current increment factor
153 * @fv_uv: requested float voltage
154 * @cc_max: requested charge current max
155 * @new_iin: New request input current limit, uA
156 * @new_vfloat: Request for new vfloat
157 * @adc_comp_gain: adc gain for compensation
158 * @retry_cnt: retry counter for re-starting charging if charging stop happens
159 * @ta_type: TA type for the direct charging, USBPD TA or Wireless Charger.
160 * @chg_mode: supported DC charging mode 2:1 or 4:1 mode
161 * @pdata: pointer to platform data
162 * @usb_tzd: device for thermal zone
163 * @debug_root: debug entry
164 * @debug_address: debug register address
165 * @debug_adc_channel: ADC channel to read
166 * @init_done: true when initialization is complete
167 * @dc_start_time: start time (sec since boot) of the DC session
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +0000168 */
169struct wc68_charger {
170 struct wakeup_source *monitor_wake_lock;
171 struct mutex lock;
172 struct device *dev;
173 struct regmap *regmap;
174 struct power_supply *mains;
175
176 struct workqueue_struct *dc_wq;
177 struct delayed_work timer_work;
178 u32 timer_id;
179 unsigned long timer_period;
180 unsigned long last_update_time;
181
182 bool mains_online;
183 u32 charging_state;
184 u32 ret_state;
185
186 u32 iin_cc;
187
188 u32 ta_cur;
189 u32 ta_vol;
190 u32 ta_objpos;
191
192 /* same as pps_data */
193 u32 ta_max_cur;
194 u32 ta_max_vol;
195 unsigned long ta_max_pwr;
196
197 u32 prev_iin;
198 u32 prev_inc;
199
200 u32 new_iin;
201 s32 new_vfloat;
202
203 s32 adc_comp_gain;
204
205 s32 retry_cnt;
206
207 struct wc68_platform_data *pdata;
208
209 /* Google Integration Start */
210 s32 pps_index; /* 0=disabled, 1=tcpm, 2=wireless */
211 bool init_done;
212 bool hw_init_done;
213
214 /* PPS_wireless */
215 const char *wlc_psy_name;
216 struct power_supply *wlc_psy;
217 /* PPS_wired with TCPM */
218 u32 tcpm_phandle;
219 const char *tcpm_psy_name;
220 struct power_supply *pd;
221 struct delayed_work pps_work;
222 struct pd_pps_data pps_data;
223 struct logbuffer *log;
224
225#if IS_ENABLED(CONFIG_THERMAL)
226 struct thermal_zone_device *usb_tzd;
227#endif
228
229 /* WIRELESS or WIRED */
230 s32 ta_type;
231 /*
232 * 0 - No direct charging
233 * 1 - 2:1 charging mode
234 * 2 - 4:1 charging mode
235 */
236 s32 chg_mode;
237
238 /* requested charging current and voltage */
239 s32 fv_uv;
240 s32 cc_max;
241 ktime_t dc_start_time;
Prasanna Prapanchama60d7ce2022-10-14 20:04:26 +0000242
243 /* monitoring */
244 struct power_supply *batt_psy;
245
246 /* debug */
247 struct dentry *debug_root;
248 u32 debug_address;
249 s32 debug_adc_channel;
250
251
252 bool wlc_ramp_out_iin;
253 u32 wlc_ramp_out_delay;
254 u32 wlc_ramp_out_vout_target;
255
256 struct wc68_chg_stats chg_data;
257 struct gvotable_election *dc_avail;
258
259 u32 debug_count;
260 struct i2c_client *client;
261 struct attribute_group attrs; /* SysFS attributes */
262 struct delayed_work init_hw_work;
263 /* Google Integration END */
264};
265
266/* Direct Charging State */
267enum {
268 DC_STATE_NO_CHARGING, /* No charging */
269 DC_STATE_CHECK_VBAT, /* Check min battery level */
270 DC_STATE_PRESET_DC, /* Preset TA voltage/current for DC */
271 DC_STATE_CHECK_ACTIVE, /* Check active status before Adjust CC mode */
272 DC_STATE_ADJUST_CC, /* Adjust CC mode */
273 DC_STATE_CC_MODE, /* Check CC mode status */
274 DC_STATE_START_CV, /* Start CV mode */
275 DC_STATE_CV_MODE, /* Check CV mode status */
276 DC_STATE_CHARGING_DONE, /* Charging Done */
277 DC_STATE_ADJUST_TAVOL, /* Adjust TA voltage, new TA current < 1000mA */
278 DC_STATE_ADJUST_TACUR, /* Adjust TA current, new TA current < 1000mA */
279 DC_STATE_MAX,
280};
281
282/* PD Message Type */
283enum {
284 PD_MSG_REQUEST_APDO,
285 MSG_REQUEST_FIXED_PDO,
286 WCRX_REQUEST_VOLTAGE,
287};
288
289/* TA Type for the direct charging */
290enum {
291 TA_TYPE_UNKNOWN,
292 TA_TYPE_USBPD,
293 TA_TYPE_WIRELESS,
294};
295
296/* Direct Charging Mode for the direct charging */
297enum {
298 CHG_NO_DC_MODE,
299 CHG_2TO1_DC_MODE,
300 CHG_4TO1_DC_MODE,
301};
302
303/* PPS timers */
304#define WC68_PDMSG_WAIT_T 250 /* 250ms */
305#define WC68_PDMSG_RETRY_T 1000 /* 1000ms */
306#define WC68_PDMSG_WLC_WAIT_T 5000 /* 5000ms */
307#define WC68_PPS_PERIODIC_T 10000 /* 10000ms */
308
309/* - Core driver ---------------------------- */
310
311s32 wc68_read_adc(struct wc68_charger *wc68, u8 adc_ch);
312s32 wc68_input_current_limit(struct wc68_charger *wc68);
313
314/* - PPS Integration (move to a separate file) ---------------------------- */
315
316/* */
317enum {
318 PPS_INDEX_DISABLED = 0,
319 PPS_INDEX_TCPM = 1,
320 PPS_INDEX_WLC,
321 PPS_INDEX_MAX,
322};
323
324s32 wc68_probe_pps(struct wc68_charger *wc68_chg);
325
326s32 wc68_request_pdo(struct wc68_charger *wc68);
327s32 wc68_usbpd_setup(struct wc68_charger *wc68);
328s32 wc68_send_pd_message(struct wc68_charger *wc68, u32 msg_type);
329s32 wc68_get_apdo_max_power(struct wc68_charger *wc68,
330 u32 ta_max_vol, u32 ta_max_cur);
331s32 wc68_send_rx_voltage(struct wc68_charger *wc68, u32 msg_type);
332s32 wc68_get_rx_max_power(struct wc68_charger *wc68);
333s32 wc68_set_ta_type(struct wc68_charger *wc68, s32 pps_index);
334
335/* GBMS integration */
336struct power_supply *wc68_get_rx_psy(struct wc68_charger *wc68);
337s32 wc68_get_chg_chgr_state(struct wc68_charger *wc68,
338 union gbms_charger_state *chg_state);
339s32 wc68_is_present(struct wc68_charger *wc68);
340s32 wc68_get_status(struct wc68_charger *wc68);
341s32 wc68_get_charge_type(struct wc68_charger *wc68);
342
343extern s32 debug_printk_prlog;
344extern s32 debug_no_logbuffer;
345
346#define logbuffer_prlog(p, level, fmt, ...) \
347 gbms_logbuffer_prlog(p->log, level, debug_no_logbuffer, debug_printk_prlog, fmt, ##__VA_ARGS__)
348
349/* charge stats */
350void wc68_chg_stats_init(struct wc68_chg_stats *chg_data);
351s32 wc68_chg_stats_update(struct wc68_chg_stats *chg_data,
352 const struct wc68_charger *wc68);
353s32 wc68_chg_stats_done(struct wc68_chg_stats *chg_data,
354 const struct wc68_charger *wc68);
355void wc68_chg_stats_dump(const struct wc68_charger *wc68);
356s32 wc68_check_standby(struct wc68_charger *wc68);
357s32 wc68_hw_ping(struct wc68_charger *wc68);
358
359#endif