blob: 804c5bbff013623044b9670a947279a8441622a5 [file] [log] [blame]
Nicholas Troast34db5032016-03-28 12:26:44 -07001/* Copyright (c) 2016 The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#ifndef __SMB2_CHARGER_H
14#define __SMB2_CHARGER_H
15#include <linux/types.h>
16#include <linux/irqreturn.h>
17#include <linux/regulator/driver.h>
18#include <linux/regulator/consumer.h>
Nicholas Troast47ae4612016-08-03 09:49:36 -070019#include "storm-watch.h"
Nicholas Troast34db5032016-03-28 12:26:44 -070020
21enum print_reason {
22 PR_INTERRUPT = BIT(0),
23 PR_REGISTER = BIT(1),
24 PR_MISC = BIT(2),
25};
26
Harry Yang995b7422016-08-29 16:06:50 -070027#define DEFAULT_VOTER "DEFAULT_VOTER"
28#define USER_VOTER "USER_VOTER"
29#define PD_VOTER "PD_VOTER"
30#define PL_TAPER_WORK_RUNNING_VOTER "PL_TAPER_WORK_RUNNING_VOTER"
31#define PARALLEL_PSY_VOTER "PARALLEL_PSY_VOTER"
Harry Yangaba1f5f2016-09-28 10:47:29 -070032#define PL_INDIRECT_VOTER "PL_INDIRECT_VOTER"
33#define USBIN_I_VOTER "USBIN_I_VOTER"
34#define USBIN_V_VOTER "USBIN_V_VOTER"
Harry Yang995b7422016-08-29 16:06:50 -070035#define CHG_STATE_VOTER "CHG_STATE_VOTER"
36#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
37#define TAPER_END_VOTER "TAPER_END_VOTER"
Harry Yangaba1f5f2016-09-28 10:47:29 -070038#define FCC_MAX_RESULT_VOTER "FCC_MAX_RESULT_VOTER"
39#define THERMAL_DAEMON_VOTER "THERMAL_DAEMON_VOTER"
Abhijeet Dharmapurikar4b13c6e2016-10-05 15:15:10 -070040#define CC_DETACHED_VOTER "CC_DETACHED_VOTER"
41#define HVDCP_TIMEOUT_VOTER "HVDCP_TIMEOUT_VOTER"
42#define PD_DISALLOWED_INDIRECT_VOTER "PD_DISALLOWED_INDIRECT_VOTER"
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -070043#define PD_HARD_RESET_VOTER "PD_HARD_RESET_VOTER"
Nicholas Troast34db5032016-03-28 12:26:44 -070044
Nicholas Troast320839e2016-06-03 10:18:00 -070045enum smb_mode {
46 PARALLEL_MASTER = 0,
47 PARALLEL_SLAVE,
48 NUM_MODES,
49};
50
Harry Yang1369b7a2016-09-27 15:59:50 -070051enum {
52 QC_CHARGER_DETECTION_WA_BIT = BIT(0),
53};
54
Nicholas Troast34db5032016-03-28 12:26:44 -070055struct smb_regulator {
56 struct regulator_dev *rdev;
57 struct regulator_desc rdesc;
58};
59
60struct smb_irq_data {
Nicholas Troast47ae4612016-08-03 09:49:36 -070061 void *parent_data;
62 const char *name;
63 struct storm_watch storm_data;
Nicholas Troast34db5032016-03-28 12:26:44 -070064};
65
66struct smb_chg_param {
67 const char *name;
68 u16 reg;
69 int min_u;
70 int max_u;
71 int step_u;
Harry Yangf8b41252016-08-10 14:21:10 -070072 int (*get_proc)(struct smb_chg_param *param,
73 u8 val_raw);
74 int (*set_proc)(struct smb_chg_param *param,
75 int val_u,
76 u8 *val_raw);
Nicholas Troast34db5032016-03-28 12:26:44 -070077};
78
79struct smb_params {
80 struct smb_chg_param fcc;
81 struct smb_chg_param fv;
82 struct smb_chg_param usb_icl;
Harry Yang1d1034c2016-06-15 12:09:42 -070083 struct smb_chg_param icl_stat;
Harry Yang360bd532016-09-26 11:03:22 -070084 struct smb_chg_param otg_cl;
Nicholas Troast34db5032016-03-28 12:26:44 -070085 struct smb_chg_param dc_icl;
Abhijeet Dharmapurikar5cf5faf2016-06-21 14:20:24 -070086 struct smb_chg_param dc_icl_pt_lv;
87 struct smb_chg_param dc_icl_pt_hv;
88 struct smb_chg_param dc_icl_div2_lv;
89 struct smb_chg_param dc_icl_div2_mid_lv;
90 struct smb_chg_param dc_icl_div2_mid_hv;
91 struct smb_chg_param dc_icl_div2_hv;
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -070092 struct smb_chg_param jeita_cc_comp;
Harry Yangfe913842016-08-10 12:27:28 -070093 struct smb_chg_param step_soc_threshold[4];
94 struct smb_chg_param step_soc;
95 struct smb_chg_param step_cc_delta[5];
Nicholas Troast34db5032016-03-28 12:26:44 -070096};
97
Harry Yang1d1034c2016-06-15 12:09:42 -070098struct parallel_params {
99 struct power_supply *psy;
100 int *master_percent;
101 int taper_percent;
102 int slave_fcc;
103};
104
Harry Yangba874ce2016-08-19 14:17:01 -0700105struct smb_iio {
106 struct iio_channel *temp_chan;
107 struct iio_channel *temp_max_chan;
108 struct iio_channel *usbin_i_chan;
109 struct iio_channel *usbin_v_chan;
Nicholas Troast7dbcad22016-10-05 13:30:18 -0700110 struct iio_channel *batt_i_chan;
Harry Yangba874ce2016-08-19 14:17:01 -0700111};
112
Nicholas Troast34db5032016-03-28 12:26:44 -0700113struct smb_charger {
114 struct device *dev;
115 struct regmap *regmap;
116 struct smb_params param;
Harry Yangba874ce2016-08-19 14:17:01 -0700117 struct smb_iio iio;
Nicholas Troast34db5032016-03-28 12:26:44 -0700118 int *debug_mask;
Nicholas Troast320839e2016-06-03 10:18:00 -0700119 enum smb_mode mode;
Nicholas Troast34db5032016-03-28 12:26:44 -0700120
121 /* locks */
Harry Yangbacd2222016-05-11 16:43:51 -0700122 struct mutex write_lock;
Nicholas Troast34db5032016-03-28 12:26:44 -0700123 struct mutex ps_change_lock;
124
125 /* power supplies */
126 struct power_supply *batt_psy;
127 struct power_supply *usb_psy;
Harry Yangf3023592016-07-20 14:56:41 -0700128 struct power_supply *dc_psy;
Harry Yang5e1a5222016-07-26 15:16:04 -0700129 struct power_supply *bms_psy;
Nicholas Troast34db5032016-03-28 12:26:44 -0700130 struct power_supply_desc usb_psy_desc;
131
Harry Yang5e1a5222016-07-26 15:16:04 -0700132 /* notifiers */
133 struct notifier_block nb;
134
Harry Yang1d1034c2016-06-15 12:09:42 -0700135 /* parallel charging */
136 struct parallel_params pl;
137
Nicholas Troast34db5032016-03-28 12:26:44 -0700138 /* regulators */
139 struct smb_regulator *vbus_vreg;
140 struct smb_regulator *vconn_vreg;
141 struct regulator *dpdm_reg;
142
143 /* votables */
144 struct votable *usb_suspend_votable;
145 struct votable *dc_suspend_votable;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700146 struct votable *fcc_max_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700147 struct votable *fcc_votable;
Abhijeet Dharmapurikarf9805d42016-05-17 18:38:42 -0700148 struct votable *fv_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700149 struct votable *usb_icl_votable;
150 struct votable *dc_icl_votable;
Abhijeet Dharmapurikar4b13c6e2016-10-05 15:15:10 -0700151 struct votable *pd_disallowed_votable_indirect;
Nicholas Troast34db5032016-03-28 12:26:44 -0700152 struct votable *pd_allowed_votable;
Harry Yang1d1034c2016-06-15 12:09:42 -0700153 struct votable *awake_votable;
154 struct votable *pl_disable_votable;
Abhijeet Dharmapurikaree54de02016-07-08 14:51:47 -0700155 struct votable *chg_disable_votable;
Harry Yangaba1f5f2016-09-28 10:47:29 -0700156 struct votable *pl_enable_votable_indirect;
Abhijeet Dharmapurikarf0b0a042016-10-10 16:43:43 -0700157 struct votable *hvdcp_disable_votable;
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700158 struct votable *apsd_disable_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700159
160 /* work */
Harry Yang5e1a5222016-07-26 15:16:04 -0700161 struct work_struct bms_update_work;
Harry Yang58a9e7a2016-06-23 14:54:43 -0700162 struct work_struct pl_detect_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700163 struct delayed_work hvdcp_detect_work;
164 struct delayed_work ps_change_timeout_work;
Harry Yang1d1034c2016-06-15 12:09:42 -0700165 struct delayed_work pl_taper_work;
Harry Yangfe913842016-08-10 12:27:28 -0700166 struct delayed_work step_soc_req_work;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700167 struct delayed_work clear_hdc_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700168
169 /* cached status */
170 int voltage_min_uv;
171 int voltage_max_uv;
172 bool pd_active;
173 bool vbus_present;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700174
175 int system_temp_level;
176 int thermal_levels;
177 int *thermal_mitigation;
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700178
Harry Yang360bd532016-09-26 11:03:22 -0700179 int otg_cl_ua;
180
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700181 int fake_capacity;
Harry Yangfe913842016-08-10 12:27:28 -0700182
183 bool step_chg_enabled;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700184 bool is_hdc;
Subbaraman Narayanamurthy270a2652016-10-04 17:08:42 -0700185 bool chg_done;
Harry Yangf7251982016-09-16 11:14:49 -0700186
187 /* workaround flag */
188 u32 wa_flags;
Nicholas Troast34db5032016-03-28 12:26:44 -0700189};
190
191int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
192int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val);
193int smblib_write(struct smb_charger *chg, u16 addr, u8 val);
194
Nicholas Troast4c310492016-05-12 17:56:35 -0700195int smblib_get_charge_param(struct smb_charger *chg,
196 struct smb_chg_param *param, int *val_u);
197int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend);
198
Nicholas Troast34db5032016-03-28 12:26:44 -0700199int smblib_enable_charging(struct smb_charger *chg, bool enable);
Nicholas Troast4c310492016-05-12 17:56:35 -0700200int smblib_set_charge_param(struct smb_charger *chg,
201 struct smb_chg_param *param, int val_u);
202int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend);
203int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend);
Nicholas Troast34db5032016-03-28 12:26:44 -0700204
Harry Yangfe913842016-08-10 12:27:28 -0700205int smblib_mapping_soc_from_field_value(struct smb_chg_param *param,
206 int val_u, u8 *val_raw);
207int smblib_mapping_cc_delta_to_field_value(struct smb_chg_param *param,
208 u8 val_raw);
209int smblib_mapping_cc_delta_from_field_value(struct smb_chg_param *param,
210 int val_u, u8 *val_raw);
211
Nicholas Troast34db5032016-03-28 12:26:44 -0700212int smblib_vbus_regulator_enable(struct regulator_dev *rdev);
213int smblib_vbus_regulator_disable(struct regulator_dev *rdev);
214int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev);
215
216int smblib_vconn_regulator_enable(struct regulator_dev *rdev);
217int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
218int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);
219
220irqreturn_t smblib_handle_debug(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700221irqreturn_t smblib_handle_chg_state_change(int irq, void *data);
Harry Yangfe913842016-08-10 12:27:28 -0700222irqreturn_t smblib_handle_step_chg_state_change(int irq, void *data);
223irqreturn_t smblib_handle_step_chg_soc_update_fail(int irq, void *data);
224irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data);
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -0700225irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700226irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data);
227irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data);
228irqreturn_t smblib_handle_usb_plugin(int irq, void *data);
229irqreturn_t smblib_handle_usb_source_change(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700230irqreturn_t smblib_handle_icl_change(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700231irqreturn_t smblib_handle_usb_typec_change(int irq, void *data);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700232irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700233
234int smblib_get_prop_input_suspend(struct smb_charger *chg,
235 union power_supply_propval *val);
236int smblib_get_prop_batt_present(struct smb_charger *chg,
237 union power_supply_propval *val);
238int smblib_get_prop_batt_capacity(struct smb_charger *chg,
239 union power_supply_propval *val);
240int smblib_get_prop_batt_status(struct smb_charger *chg,
241 union power_supply_propval *val);
242int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
243 union power_supply_propval *val);
Subbaraman Narayanamurthyb491d022016-10-10 20:22:48 -0700244int smblib_get_prop_batt_charge_done(struct smb_charger *chg,
245 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700246int smblib_get_prop_batt_health(struct smb_charger *chg,
247 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700248int smblib_get_prop_system_temp_level(struct smb_charger *chg,
249 union power_supply_propval *val);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700250int smblib_get_prop_input_current_limited(struct smb_charger *chg,
251 union power_supply_propval *val);
Nicholas Troast66b21d72016-09-20 15:33:20 -0700252int smblib_get_prop_batt_voltage_now(struct smb_charger *chg,
253 union power_supply_propval *val);
254int smblib_get_prop_batt_current_now(struct smb_charger *chg,
255 union power_supply_propval *val);
256int smblib_get_prop_batt_temp(struct smb_charger *chg,
257 union power_supply_propval *val);
Harry Yangbedee332016-08-31 16:14:29 -0700258int smblib_get_prop_step_chg_step(struct smb_charger *chg,
259 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700260
Nicholas Troast34db5032016-03-28 12:26:44 -0700261int smblib_set_prop_input_suspend(struct smb_charger *chg,
262 const union power_supply_propval *val);
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700263int smblib_set_prop_batt_capacity(struct smb_charger *chg,
264 const union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700265int smblib_set_prop_system_temp_level(struct smb_charger *chg,
266 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700267
Harry Yangf3023592016-07-20 14:56:41 -0700268int smblib_get_prop_dc_present(struct smb_charger *chg,
269 union power_supply_propval *val);
270int smblib_get_prop_dc_online(struct smb_charger *chg,
271 union power_supply_propval *val);
272int smblib_get_prop_dc_current_max(struct smb_charger *chg,
273 union power_supply_propval *val);
274int smblib_set_prop_dc_current_max(struct smb_charger *chg,
275 const union power_supply_propval *val);
276
Nicholas Troast34db5032016-03-28 12:26:44 -0700277int smblib_get_prop_usb_present(struct smb_charger *chg,
278 union power_supply_propval *val);
279int smblib_get_prop_usb_online(struct smb_charger *chg,
280 union power_supply_propval *val);
281int smblib_get_prop_usb_suspend(struct smb_charger *chg,
282 union power_supply_propval *val);
283int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
284 union power_supply_propval *val);
285int smblib_get_prop_usb_current_max(struct smb_charger *chg,
286 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700287int smblib_get_prop_usb_current_now(struct smb_charger *chg,
288 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700289int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
290 union power_supply_propval *val);
291int smblib_get_prop_typec_mode(struct smb_charger *chg,
292 union power_supply_propval *val);
293int smblib_get_prop_typec_power_role(struct smb_charger *chg,
294 union power_supply_propval *val);
295int smblib_get_prop_pd_allowed(struct smb_charger *chg,
296 union power_supply_propval *val);
Nicholas Troast133a7f52016-06-29 13:48:20 -0700297int smblib_get_prop_input_current_settled(struct smb_charger *chg,
298 union power_supply_propval *val);
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700299int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
300 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700301int smblib_get_prop_charger_temp(struct smb_charger *chg,
302 union power_supply_propval *val);
303int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
304 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700305int smblib_set_prop_usb_current_max(struct smb_charger *chg,
306 const union power_supply_propval *val);
307int smblib_set_prop_usb_voltage_min(struct smb_charger *chg,
308 const union power_supply_propval *val);
309int smblib_set_prop_usb_voltage_max(struct smb_charger *chg,
310 const union power_supply_propval *val);
311int smblib_set_prop_typec_power_role(struct smb_charger *chg,
312 const union power_supply_propval *val);
313int smblib_set_prop_pd_active(struct smb_charger *chg,
314 const union power_supply_propval *val);
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700315int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
316 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700317
Nicholas Troast7dbcad22016-10-05 13:30:18 -0700318int smblib_get_prop_slave_current_now(struct smb_charger *chg,
319 union power_supply_propval *val);
320
Nicholas Troast34db5032016-03-28 12:26:44 -0700321int smblib_init(struct smb_charger *chg);
Abhijeet Dharmapurikar8e9e7572016-06-06 16:13:14 -0700322int smblib_deinit(struct smb_charger *chg);
Nicholas Troast34db5032016-03-28 12:26:44 -0700323#endif /* __SMB2_CHARGER_H */