blob: 1f2457e04ed609c1f911d8329013afd6edfc965d [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
Abhijeet Dharmapurikarebb5e5c2016-05-17 20:09:16 -070027#define DEFAULT_VOTER "DEFAULT_VOTER"
28#define USER_VOTER "USER_VOTER"
29#define PD_VOTER "PD_VOTER"
Harry Yang1d1034c2016-06-15 12:09:42 -070030#define PL_VOTER "PL_VOTER"
31#define USBIN_ICL_VOTER "USBIN_ICL_VOTER"
32#define CHG_STATE_VOTER "CHG_STATE_VOTER"
33#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
34#define TAPER_END_VOTER "TAPER_END_VOTER"
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -070035#define FCC_MAX_RESULT "FCC_MAX_RESULT"
36#define THERMAL_DAEMON "THERMAL_DAEMON"
Nicholas Troast34db5032016-03-28 12:26:44 -070037
Nicholas Troast320839e2016-06-03 10:18:00 -070038enum smb_mode {
39 PARALLEL_MASTER = 0,
40 PARALLEL_SLAVE,
41 NUM_MODES,
42};
43
Nicholas Troast34db5032016-03-28 12:26:44 -070044struct smb_regulator {
45 struct regulator_dev *rdev;
46 struct regulator_desc rdesc;
47};
48
49struct smb_irq_data {
Nicholas Troast47ae4612016-08-03 09:49:36 -070050 void *parent_data;
51 const char *name;
52 struct storm_watch storm_data;
Nicholas Troast34db5032016-03-28 12:26:44 -070053};
54
55struct smb_chg_param {
56 const char *name;
57 u16 reg;
58 int min_u;
59 int max_u;
60 int step_u;
Harry Yangf8b41252016-08-10 14:21:10 -070061 int (*get_proc)(struct smb_chg_param *param,
62 u8 val_raw);
63 int (*set_proc)(struct smb_chg_param *param,
64 int val_u,
65 u8 *val_raw);
Nicholas Troast34db5032016-03-28 12:26:44 -070066};
67
68struct smb_params {
69 struct smb_chg_param fcc;
70 struct smb_chg_param fv;
71 struct smb_chg_param usb_icl;
Harry Yang1d1034c2016-06-15 12:09:42 -070072 struct smb_chg_param icl_stat;
Nicholas Troast34db5032016-03-28 12:26:44 -070073 struct smb_chg_param dc_icl;
Abhijeet Dharmapurikar5cf5faf2016-06-21 14:20:24 -070074 struct smb_chg_param dc_icl_pt_lv;
75 struct smb_chg_param dc_icl_pt_hv;
76 struct smb_chg_param dc_icl_div2_lv;
77 struct smb_chg_param dc_icl_div2_mid_lv;
78 struct smb_chg_param dc_icl_div2_mid_hv;
79 struct smb_chg_param dc_icl_div2_hv;
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -070080 struct smb_chg_param jeita_cc_comp;
Harry Yangfe913842016-08-10 12:27:28 -070081 struct smb_chg_param step_soc_threshold[4];
82 struct smb_chg_param step_soc;
83 struct smb_chg_param step_cc_delta[5];
Nicholas Troast34db5032016-03-28 12:26:44 -070084};
85
Harry Yang1d1034c2016-06-15 12:09:42 -070086struct parallel_params {
87 struct power_supply *psy;
88 int *master_percent;
89 int taper_percent;
90 int slave_fcc;
91};
92
Harry Yangba874ce2016-08-19 14:17:01 -070093struct smb_iio {
94 struct iio_channel *temp_chan;
95 struct iio_channel *temp_max_chan;
96 struct iio_channel *usbin_i_chan;
97 struct iio_channel *usbin_v_chan;
98};
99
Nicholas Troast34db5032016-03-28 12:26:44 -0700100struct smb_charger {
101 struct device *dev;
102 struct regmap *regmap;
103 struct smb_params param;
Harry Yangba874ce2016-08-19 14:17:01 -0700104 struct smb_iio iio;
Nicholas Troast34db5032016-03-28 12:26:44 -0700105 int *debug_mask;
Nicholas Troast320839e2016-06-03 10:18:00 -0700106 enum smb_mode mode;
Nicholas Troast34db5032016-03-28 12:26:44 -0700107
108 /* locks */
Harry Yangbacd2222016-05-11 16:43:51 -0700109 struct mutex write_lock;
Nicholas Troast34db5032016-03-28 12:26:44 -0700110 struct mutex ps_change_lock;
111
112 /* power supplies */
113 struct power_supply *batt_psy;
114 struct power_supply *usb_psy;
Harry Yangf3023592016-07-20 14:56:41 -0700115 struct power_supply *dc_psy;
Harry Yang5e1a5222016-07-26 15:16:04 -0700116 struct power_supply *bms_psy;
Nicholas Troast34db5032016-03-28 12:26:44 -0700117 struct power_supply_desc usb_psy_desc;
118
Harry Yang5e1a5222016-07-26 15:16:04 -0700119 /* notifiers */
120 struct notifier_block nb;
121
Harry Yang1d1034c2016-06-15 12:09:42 -0700122 /* parallel charging */
123 struct parallel_params pl;
124
Nicholas Troast34db5032016-03-28 12:26:44 -0700125 /* regulators */
126 struct smb_regulator *vbus_vreg;
127 struct smb_regulator *vconn_vreg;
128 struct regulator *dpdm_reg;
129
130 /* votables */
131 struct votable *usb_suspend_votable;
132 struct votable *dc_suspend_votable;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700133 struct votable *fcc_max_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700134 struct votable *fcc_votable;
Abhijeet Dharmapurikarf9805d42016-05-17 18:38:42 -0700135 struct votable *fv_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700136 struct votable *usb_icl_votable;
137 struct votable *dc_icl_votable;
138 struct votable *pd_allowed_votable;
Harry Yang1d1034c2016-06-15 12:09:42 -0700139 struct votable *awake_votable;
140 struct votable *pl_disable_votable;
Abhijeet Dharmapurikaree54de02016-07-08 14:51:47 -0700141 struct votable *chg_disable_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700142
143 /* work */
Harry Yang5e1a5222016-07-26 15:16:04 -0700144 struct work_struct bms_update_work;
Harry Yang58a9e7a2016-06-23 14:54:43 -0700145 struct work_struct pl_detect_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700146 struct delayed_work hvdcp_detect_work;
147 struct delayed_work ps_change_timeout_work;
Harry Yang1d1034c2016-06-15 12:09:42 -0700148 struct delayed_work pl_taper_work;
Harry Yangfe913842016-08-10 12:27:28 -0700149 struct delayed_work step_soc_req_work;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700150 struct delayed_work clear_hdc_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700151
152 /* cached status */
153 int voltage_min_uv;
154 int voltage_max_uv;
155 bool pd_active;
156 bool vbus_present;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700157
158 int system_temp_level;
159 int thermal_levels;
160 int *thermal_mitigation;
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700161
162 int fake_capacity;
Harry Yangfe913842016-08-10 12:27:28 -0700163
164 bool step_chg_enabled;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700165 bool is_hdc;
Subbaraman Narayanamurthy270a2652016-10-04 17:08:42 -0700166 bool chg_done;
Harry Yangf7251982016-09-16 11:14:49 -0700167
168 /* workaround flag */
169 u32 wa_flags;
Nicholas Troast34db5032016-03-28 12:26:44 -0700170};
171
172int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
173int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val);
174int smblib_write(struct smb_charger *chg, u16 addr, u8 val);
175
Nicholas Troast4c310492016-05-12 17:56:35 -0700176int smblib_get_charge_param(struct smb_charger *chg,
177 struct smb_chg_param *param, int *val_u);
178int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend);
179
Nicholas Troast34db5032016-03-28 12:26:44 -0700180int smblib_enable_charging(struct smb_charger *chg, bool enable);
Nicholas Troast4c310492016-05-12 17:56:35 -0700181int smblib_set_charge_param(struct smb_charger *chg,
182 struct smb_chg_param *param, int val_u);
183int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend);
184int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend);
Nicholas Troast34db5032016-03-28 12:26:44 -0700185
Harry Yangfe913842016-08-10 12:27:28 -0700186int smblib_mapping_soc_from_field_value(struct smb_chg_param *param,
187 int val_u, u8 *val_raw);
188int smblib_mapping_cc_delta_to_field_value(struct smb_chg_param *param,
189 u8 val_raw);
190int smblib_mapping_cc_delta_from_field_value(struct smb_chg_param *param,
191 int val_u, u8 *val_raw);
192
Nicholas Troast34db5032016-03-28 12:26:44 -0700193int smblib_vbus_regulator_enable(struct regulator_dev *rdev);
194int smblib_vbus_regulator_disable(struct regulator_dev *rdev);
195int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev);
196
197int smblib_vconn_regulator_enable(struct regulator_dev *rdev);
198int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
199int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);
200
201irqreturn_t smblib_handle_debug(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700202irqreturn_t smblib_handle_chg_state_change(int irq, void *data);
Harry Yangfe913842016-08-10 12:27:28 -0700203irqreturn_t smblib_handle_step_chg_state_change(int irq, void *data);
204irqreturn_t smblib_handle_step_chg_soc_update_fail(int irq, void *data);
205irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data);
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -0700206irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700207irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data);
208irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data);
209irqreturn_t smblib_handle_usb_plugin(int irq, void *data);
210irqreturn_t smblib_handle_usb_source_change(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700211irqreturn_t smblib_handle_icl_change(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700212irqreturn_t smblib_handle_usb_typec_change(int irq, void *data);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700213irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700214
215int smblib_get_prop_input_suspend(struct smb_charger *chg,
216 union power_supply_propval *val);
217int smblib_get_prop_batt_present(struct smb_charger *chg,
218 union power_supply_propval *val);
219int smblib_get_prop_batt_capacity(struct smb_charger *chg,
220 union power_supply_propval *val);
221int smblib_get_prop_batt_status(struct smb_charger *chg,
222 union power_supply_propval *val);
223int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
224 union power_supply_propval *val);
225int smblib_get_prop_batt_health(struct smb_charger *chg,
226 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700227int smblib_get_prop_system_temp_level(struct smb_charger *chg,
228 union power_supply_propval *val);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700229int smblib_get_prop_input_current_limited(struct smb_charger *chg,
230 union power_supply_propval *val);
Nicholas Troast66b21d72016-09-20 15:33:20 -0700231int smblib_get_prop_batt_voltage_now(struct smb_charger *chg,
232 union power_supply_propval *val);
233int smblib_get_prop_batt_current_now(struct smb_charger *chg,
234 union power_supply_propval *val);
235int smblib_get_prop_batt_temp(struct smb_charger *chg,
236 union power_supply_propval *val);
Harry Yangbedee332016-08-31 16:14:29 -0700237int smblib_get_prop_step_chg_step(struct smb_charger *chg,
238 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700239
Nicholas Troast34db5032016-03-28 12:26:44 -0700240int smblib_set_prop_input_suspend(struct smb_charger *chg,
241 const union power_supply_propval *val);
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700242int smblib_set_prop_batt_capacity(struct smb_charger *chg,
243 const union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700244int smblib_set_prop_system_temp_level(struct smb_charger *chg,
245 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700246
Harry Yangf3023592016-07-20 14:56:41 -0700247int smblib_get_prop_dc_present(struct smb_charger *chg,
248 union power_supply_propval *val);
249int smblib_get_prop_dc_online(struct smb_charger *chg,
250 union power_supply_propval *val);
251int smblib_get_prop_dc_current_max(struct smb_charger *chg,
252 union power_supply_propval *val);
253int smblib_set_prop_dc_current_max(struct smb_charger *chg,
254 const union power_supply_propval *val);
255
Nicholas Troast34db5032016-03-28 12:26:44 -0700256int smblib_get_prop_usb_present(struct smb_charger *chg,
257 union power_supply_propval *val);
258int smblib_get_prop_usb_online(struct smb_charger *chg,
259 union power_supply_propval *val);
260int smblib_get_prop_usb_suspend(struct smb_charger *chg,
261 union power_supply_propval *val);
262int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
263 union power_supply_propval *val);
264int smblib_get_prop_usb_current_max(struct smb_charger *chg,
265 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700266int smblib_get_prop_usb_current_now(struct smb_charger *chg,
267 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700268int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
269 union power_supply_propval *val);
270int smblib_get_prop_typec_mode(struct smb_charger *chg,
271 union power_supply_propval *val);
272int smblib_get_prop_typec_power_role(struct smb_charger *chg,
273 union power_supply_propval *val);
274int smblib_get_prop_pd_allowed(struct smb_charger *chg,
275 union power_supply_propval *val);
Nicholas Troast133a7f52016-06-29 13:48:20 -0700276int smblib_get_prop_input_current_settled(struct smb_charger *chg,
277 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700278int smblib_get_prop_charger_temp(struct smb_charger *chg,
279 union power_supply_propval *val);
280int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
281 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700282int smblib_set_prop_usb_current_max(struct smb_charger *chg,
283 const union power_supply_propval *val);
284int smblib_set_prop_usb_voltage_min(struct smb_charger *chg,
285 const union power_supply_propval *val);
286int smblib_set_prop_usb_voltage_max(struct smb_charger *chg,
287 const union power_supply_propval *val);
288int smblib_set_prop_typec_power_role(struct smb_charger *chg,
289 const union power_supply_propval *val);
290int smblib_set_prop_pd_active(struct smb_charger *chg,
291 const union power_supply_propval *val);
292
293int smblib_init(struct smb_charger *chg);
Abhijeet Dharmapurikar8e9e7572016-06-06 16:13:14 -0700294int smblib_deinit(struct smb_charger *chg);
Nicholas Troast34db5032016-03-28 12:26:44 -0700295#endif /* __SMB2_CHARGER_H */
296