blob: aeb1eb2c454f63b1a02b2c3013fa565414924272 [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>
19
20enum print_reason {
21 PR_INTERRUPT = BIT(0),
22 PR_REGISTER = BIT(1),
23 PR_MISC = BIT(2),
24};
25
Abhijeet Dharmapurikarebb5e5c2016-05-17 20:09:16 -070026#define DEFAULT_VOTER "DEFAULT_VOTER"
27#define USER_VOTER "USER_VOTER"
28#define PD_VOTER "PD_VOTER"
Harry Yang1d1034c2016-06-15 12:09:42 -070029#define PL_VOTER "PL_VOTER"
30#define USBIN_ICL_VOTER "USBIN_ICL_VOTER"
31#define CHG_STATE_VOTER "CHG_STATE_VOTER"
32#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
33#define TAPER_END_VOTER "TAPER_END_VOTER"
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -070034#define FCC_MAX_RESULT "FCC_MAX_RESULT"
35#define THERMAL_DAEMON "THERMAL_DAEMON"
Nicholas Troast34db5032016-03-28 12:26:44 -070036
Nicholas Troast320839e2016-06-03 10:18:00 -070037enum smb_mode {
38 PARALLEL_MASTER = 0,
39 PARALLEL_SLAVE,
40 NUM_MODES,
41};
42
Nicholas Troast34db5032016-03-28 12:26:44 -070043struct smb_regulator {
44 struct regulator_dev *rdev;
45 struct regulator_desc rdesc;
46};
47
48struct smb_irq_data {
49 void *parent_data;
50 const char *name;
51};
52
53struct smb_chg_param {
54 const char *name;
55 u16 reg;
56 int min_u;
57 int max_u;
58 int step_u;
Harry Yangf8b41252016-08-10 14:21:10 -070059 int (*get_proc)(struct smb_chg_param *param,
60 u8 val_raw);
61 int (*set_proc)(struct smb_chg_param *param,
62 int val_u,
63 u8 *val_raw);
Nicholas Troast34db5032016-03-28 12:26:44 -070064};
65
66struct smb_params {
67 struct smb_chg_param fcc;
68 struct smb_chg_param fv;
69 struct smb_chg_param usb_icl;
Harry Yang1d1034c2016-06-15 12:09:42 -070070 struct smb_chg_param icl_stat;
Nicholas Troast34db5032016-03-28 12:26:44 -070071 struct smb_chg_param dc_icl;
Abhijeet Dharmapurikar5cf5faf2016-06-21 14:20:24 -070072 struct smb_chg_param dc_icl_pt_lv;
73 struct smb_chg_param dc_icl_pt_hv;
74 struct smb_chg_param dc_icl_div2_lv;
75 struct smb_chg_param dc_icl_div2_mid_lv;
76 struct smb_chg_param dc_icl_div2_mid_hv;
77 struct smb_chg_param dc_icl_div2_hv;
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -070078 struct smb_chg_param jeita_cc_comp;
Harry Yangfe913842016-08-10 12:27:28 -070079 struct smb_chg_param step_soc_threshold[4];
80 struct smb_chg_param step_soc;
81 struct smb_chg_param step_cc_delta[5];
Nicholas Troast34db5032016-03-28 12:26:44 -070082};
83
Harry Yang1d1034c2016-06-15 12:09:42 -070084struct parallel_params {
85 struct power_supply *psy;
86 int *master_percent;
87 int taper_percent;
88 int slave_fcc;
89};
90
Harry Yangba874ce2016-08-19 14:17:01 -070091struct smb_iio {
92 struct iio_channel *temp_chan;
93 struct iio_channel *temp_max_chan;
94 struct iio_channel *usbin_i_chan;
95 struct iio_channel *usbin_v_chan;
96};
97
Nicholas Troast34db5032016-03-28 12:26:44 -070098struct smb_charger {
99 struct device *dev;
100 struct regmap *regmap;
101 struct smb_params param;
Harry Yangba874ce2016-08-19 14:17:01 -0700102 struct smb_iio iio;
Nicholas Troast34db5032016-03-28 12:26:44 -0700103 int *debug_mask;
Nicholas Troast320839e2016-06-03 10:18:00 -0700104 enum smb_mode mode;
Nicholas Troast34db5032016-03-28 12:26:44 -0700105
106 /* locks */
Harry Yangbacd2222016-05-11 16:43:51 -0700107 struct mutex write_lock;
Nicholas Troast34db5032016-03-28 12:26:44 -0700108 struct mutex ps_change_lock;
109
110 /* power supplies */
111 struct power_supply *batt_psy;
112 struct power_supply *usb_psy;
Harry Yangf3023592016-07-20 14:56:41 -0700113 struct power_supply *dc_psy;
Harry Yang5e1a5222016-07-26 15:16:04 -0700114 struct power_supply *bms_psy;
Nicholas Troast34db5032016-03-28 12:26:44 -0700115 struct power_supply_desc usb_psy_desc;
116
Harry Yang5e1a5222016-07-26 15:16:04 -0700117 /* notifiers */
118 struct notifier_block nb;
119
Harry Yang1d1034c2016-06-15 12:09:42 -0700120 /* parallel charging */
121 struct parallel_params pl;
122
Nicholas Troast34db5032016-03-28 12:26:44 -0700123 /* regulators */
124 struct smb_regulator *vbus_vreg;
125 struct smb_regulator *vconn_vreg;
126 struct regulator *dpdm_reg;
127
128 /* votables */
129 struct votable *usb_suspend_votable;
130 struct votable *dc_suspend_votable;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700131 struct votable *fcc_max_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700132 struct votable *fcc_votable;
Abhijeet Dharmapurikarf9805d42016-05-17 18:38:42 -0700133 struct votable *fv_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700134 struct votable *usb_icl_votable;
135 struct votable *dc_icl_votable;
136 struct votable *pd_allowed_votable;
Harry Yang1d1034c2016-06-15 12:09:42 -0700137 struct votable *awake_votable;
138 struct votable *pl_disable_votable;
Abhijeet Dharmapurikaree54de02016-07-08 14:51:47 -0700139 struct votable *chg_disable_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700140
141 /* work */
Harry Yang5e1a5222016-07-26 15:16:04 -0700142 struct work_struct bms_update_work;
Harry Yang58a9e7a2016-06-23 14:54:43 -0700143 struct work_struct pl_detect_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700144 struct delayed_work hvdcp_detect_work;
145 struct delayed_work ps_change_timeout_work;
Harry Yang1d1034c2016-06-15 12:09:42 -0700146 struct delayed_work pl_taper_work;
Harry Yangfe913842016-08-10 12:27:28 -0700147 struct delayed_work step_soc_req_work;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700148 struct delayed_work clear_hdc_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700149
150 /* cached status */
151 int voltage_min_uv;
152 int voltage_max_uv;
153 bool pd_active;
154 bool vbus_present;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700155
156 int system_temp_level;
157 int thermal_levels;
158 int *thermal_mitigation;
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700159
160 int fake_capacity;
Harry Yangfe913842016-08-10 12:27:28 -0700161
162 bool step_chg_enabled;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700163 bool is_hdc;
Nicholas Troast34db5032016-03-28 12:26:44 -0700164};
165
166int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
167int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val);
168int smblib_write(struct smb_charger *chg, u16 addr, u8 val);
169
Nicholas Troast4c310492016-05-12 17:56:35 -0700170int smblib_get_charge_param(struct smb_charger *chg,
171 struct smb_chg_param *param, int *val_u);
172int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend);
173
Nicholas Troast34db5032016-03-28 12:26:44 -0700174int smblib_enable_charging(struct smb_charger *chg, bool enable);
Nicholas Troast4c310492016-05-12 17:56:35 -0700175int smblib_set_charge_param(struct smb_charger *chg,
176 struct smb_chg_param *param, int val_u);
177int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend);
178int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend);
Nicholas Troast34db5032016-03-28 12:26:44 -0700179
Harry Yangfe913842016-08-10 12:27:28 -0700180int smblib_mapping_soc_from_field_value(struct smb_chg_param *param,
181 int val_u, u8 *val_raw);
182int smblib_mapping_cc_delta_to_field_value(struct smb_chg_param *param,
183 u8 val_raw);
184int smblib_mapping_cc_delta_from_field_value(struct smb_chg_param *param,
185 int val_u, u8 *val_raw);
186
Nicholas Troast34db5032016-03-28 12:26:44 -0700187int smblib_vbus_regulator_enable(struct regulator_dev *rdev);
188int smblib_vbus_regulator_disable(struct regulator_dev *rdev);
189int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev);
190
191int smblib_vconn_regulator_enable(struct regulator_dev *rdev);
192int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
193int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);
194
195irqreturn_t smblib_handle_debug(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700196irqreturn_t smblib_handle_chg_state_change(int irq, void *data);
Harry Yangfe913842016-08-10 12:27:28 -0700197irqreturn_t smblib_handle_step_chg_state_change(int irq, void *data);
198irqreturn_t smblib_handle_step_chg_soc_update_fail(int irq, void *data);
199irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data);
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -0700200irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700201irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data);
202irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data);
203irqreturn_t smblib_handle_usb_plugin(int irq, void *data);
204irqreturn_t smblib_handle_usb_source_change(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700205irqreturn_t smblib_handle_icl_change(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700206irqreturn_t smblib_handle_usb_typec_change(int irq, void *data);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700207irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700208
209int smblib_get_prop_input_suspend(struct smb_charger *chg,
210 union power_supply_propval *val);
211int smblib_get_prop_batt_present(struct smb_charger *chg,
212 union power_supply_propval *val);
213int smblib_get_prop_batt_capacity(struct smb_charger *chg,
214 union power_supply_propval *val);
215int smblib_get_prop_batt_status(struct smb_charger *chg,
216 union power_supply_propval *val);
217int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
218 union power_supply_propval *val);
219int smblib_get_prop_batt_health(struct smb_charger *chg,
220 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700221int smblib_get_prop_system_temp_level(struct smb_charger *chg,
222 union power_supply_propval *val);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700223int smblib_get_prop_input_current_limited(struct smb_charger *chg,
224 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700225
Nicholas Troast34db5032016-03-28 12:26:44 -0700226int smblib_set_prop_input_suspend(struct smb_charger *chg,
227 const union power_supply_propval *val);
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700228int smblib_set_prop_batt_capacity(struct smb_charger *chg,
229 const union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700230int smblib_set_prop_system_temp_level(struct smb_charger *chg,
231 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700232
Harry Yangf3023592016-07-20 14:56:41 -0700233int smblib_get_prop_dc_present(struct smb_charger *chg,
234 union power_supply_propval *val);
235int smblib_get_prop_dc_online(struct smb_charger *chg,
236 union power_supply_propval *val);
237int smblib_get_prop_dc_current_max(struct smb_charger *chg,
238 union power_supply_propval *val);
239int smblib_set_prop_dc_current_max(struct smb_charger *chg,
240 const union power_supply_propval *val);
241
Nicholas Troast34db5032016-03-28 12:26:44 -0700242int smblib_get_prop_usb_present(struct smb_charger *chg,
243 union power_supply_propval *val);
244int smblib_get_prop_usb_online(struct smb_charger *chg,
245 union power_supply_propval *val);
246int smblib_get_prop_usb_suspend(struct smb_charger *chg,
247 union power_supply_propval *val);
248int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
249 union power_supply_propval *val);
250int smblib_get_prop_usb_current_max(struct smb_charger *chg,
251 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700252int smblib_get_prop_usb_current_now(struct smb_charger *chg,
253 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700254int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
255 union power_supply_propval *val);
256int smblib_get_prop_typec_mode(struct smb_charger *chg,
257 union power_supply_propval *val);
258int smblib_get_prop_typec_power_role(struct smb_charger *chg,
259 union power_supply_propval *val);
260int smblib_get_prop_pd_allowed(struct smb_charger *chg,
261 union power_supply_propval *val);
Nicholas Troast133a7f52016-06-29 13:48:20 -0700262int smblib_get_prop_input_current_settled(struct smb_charger *chg,
263 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700264int smblib_get_prop_charger_temp(struct smb_charger *chg,
265 union power_supply_propval *val);
266int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
267 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700268int smblib_set_prop_usb_current_max(struct smb_charger *chg,
269 const union power_supply_propval *val);
270int smblib_set_prop_usb_voltage_min(struct smb_charger *chg,
271 const union power_supply_propval *val);
272int smblib_set_prop_usb_voltage_max(struct smb_charger *chg,
273 const union power_supply_propval *val);
274int smblib_set_prop_typec_power_role(struct smb_charger *chg,
275 const union power_supply_propval *val);
276int smblib_set_prop_pd_active(struct smb_charger *chg,
277 const union power_supply_propval *val);
278
279int smblib_init(struct smb_charger *chg);
Abhijeet Dharmapurikar8e9e7572016-06-06 16:13:14 -0700280int smblib_deinit(struct smb_charger *chg);
Nicholas Troast34db5032016-03-28 12:26:44 -0700281#endif /* __SMB2_CHARGER_H */
282