blob: 704a8db74e1af8a123a492f434f1e853c55d9b92 [file] [log] [blame]
Harry Yang3b113a52016-12-08 12:37:40 -08001/* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
Nicholas Troast34db5032016-03-28 12:26:44 -07002 *
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>
Subbaraman Narayanamurthybbd7f452017-02-06 16:22:48 -080016#include <linux/interrupt.h>
Nicholas Troast34db5032016-03-28 12:26:44 -070017#include <linux/irqreturn.h>
18#include <linux/regulator/driver.h>
19#include <linux/regulator/consumer.h>
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +053020#include <linux/extcon.h>
Nicholas Troast47ae4612016-08-03 09:49:36 -070021#include "storm-watch.h"
Nicholas Troast34db5032016-03-28 12:26:44 -070022
23enum print_reason {
24 PR_INTERRUPT = BIT(0),
25 PR_REGISTER = BIT(1),
26 PR_MISC = BIT(2),
Nicholas Troast87d69ba2016-10-10 19:29:47 -070027 PR_PARALLEL = BIT(3),
Nicholas Troastb11015f2017-01-17 17:56:45 -080028 PR_OTG = BIT(4),
Nicholas Troast34db5032016-03-28 12:26:44 -070029};
30
Harry Yang995b7422016-08-29 16:06:50 -070031#define DEFAULT_VOTER "DEFAULT_VOTER"
32#define USER_VOTER "USER_VOTER"
33#define PD_VOTER "PD_VOTER"
Harry Yang631b99e2016-11-17 11:24:25 -080034#define DCP_VOTER "DCP_VOTER"
Harry Yang4bf7d962017-03-13 16:51:43 -070035#define QC_VOTER "QC_VOTER"
Abhijeet Dharmapurikar7442e422017-02-08 13:35:14 -080036#define PL_USBIN_USBIN_VOTER "PL_USBIN_USBIN_VOTER"
Abhijeet Dharmapurikard92eca62016-10-07 19:04:33 -070037#define USB_PSY_VOTER "USB_PSY_VOTER"
Harry Yang995b7422016-08-29 16:06:50 -070038#define PL_TAPER_WORK_RUNNING_VOTER "PL_TAPER_WORK_RUNNING_VOTER"
Harry Yang67f19522017-03-23 22:40:31 -070039#define PL_QNOVO_VOTER "PL_QNOVO_VOTER"
Harry Yangaba1f5f2016-09-28 10:47:29 -070040#define USBIN_V_VOTER "USBIN_V_VOTER"
Harry Yang995b7422016-08-29 16:06:50 -070041#define CHG_STATE_VOTER "CHG_STATE_VOTER"
42#define TYPEC_SRC_VOTER "TYPEC_SRC_VOTER"
43#define TAPER_END_VOTER "TAPER_END_VOTER"
Harry Yangaba1f5f2016-09-28 10:47:29 -070044#define THERMAL_DAEMON_VOTER "THERMAL_DAEMON_VOTER"
Abhijeet Dharmapurikar4b13c6e2016-10-05 15:15:10 -070045#define CC_DETACHED_VOTER "CC_DETACHED_VOTER"
46#define HVDCP_TIMEOUT_VOTER "HVDCP_TIMEOUT_VOTER"
47#define PD_DISALLOWED_INDIRECT_VOTER "PD_DISALLOWED_INDIRECT_VOTER"
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -070048#define PD_HARD_RESET_VOTER "PD_HARD_RESET_VOTER"
Abhijeet Dharmapurikara8075d72016-10-06 12:59:04 -070049#define VBUS_CC_SHORT_VOTER "VBUS_CC_SHORT_VOTER"
Abhijeet Dharmapurikar716cd962016-10-14 12:50:37 -070050#define PD_INACTIVE_VOTER "PD_INACTIVE_VOTER"
Nicholas Troastabedaf72016-09-16 11:07:45 -070051#define BOOST_BACK_VOTER "BOOST_BACK_VOTER"
Harry Yanga2fb0e32017-03-22 22:45:25 -070052#define USBIN_USBIN_BOOST_VOTER "USBIN_USBIN_BOOST_VOTER"
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +053053#define HVDCP_INDIRECT_VOTER "HVDCP_INDIRECT_VOTER"
54#define MICRO_USB_VOTER "MICRO_USB_VOTER"
Ashay Jaiswal2fb369d2017-01-12 21:38:29 +053055#define DEBUG_BOARD_VOTER "DEBUG_BOARD_VOTER"
Abhijeet Dharmapurikar95670872017-02-09 22:55:51 +053056#define PD_SUSPEND_SUPPORTED_VOTER "PD_SUSPEND_SUPPORTED_VOTER"
Ashay Jaiswalc0361672017-03-21 12:24:16 +053057#define PL_DELAY_VOTER "PL_DELAY_VOTER"
Nicholas Troaste1b0c042017-02-09 10:05:03 -080058#define CTM_VOTER "CTM_VOTER"
Ashay Jaiswal6d308da2017-02-18 09:59:23 +053059#define SW_QC3_VOTER "SW_QC3_VOTER"
Nicholas Troast20ae1912017-02-15 10:15:32 -080060#define AICL_RERUN_VOTER "AICL_RERUN_VOTER"
Nicholas Troastf9e44992017-03-14 09:06:56 -070061#define LEGACY_UNKNOWN_VOTER "LEGACY_UNKNOWN_VOTER"
Abhijeet Dharmapurikar3c93db32017-04-17 17:36:14 -070062#define CC2_WA_VOTER "CC2_WA_VOTER"
Abhijeet Dharmapurikarc31b4ab2017-04-27 19:20:31 -070063#define QNOVO_VOTER "QNOVO_VOTER"
64#define BATT_PROFILE_VOTER "BATT_PROFILE_VOTER"
Ashay Jaiswal1bf41332017-05-03 15:10:25 +053065#define OTG_DELAY_VOTER "OTG_DELAY_VOTER"
Abhijeet Dharmapurikar38ef1422017-05-18 15:37:56 -070066#define USBIN_I_VOTER "USBIN_I_VOTER"
Ashay Jaiswal2f3b0c12017-06-14 16:04:45 +053067#define WEAK_CHARGER_VOTER "WEAK_CHARGER_VOTER"
Abhijeet Dharmapurikar66d2c442017-07-12 11:55:36 -070068#define OTG_VOTER "OTG_VOTER"
Harry Yanga796cf72017-07-19 19:26:45 -070069#define FCC_CHANGE_VOTER "FCC_CHANGE_VOTER"
Ashay Jaiswal1829fcf2017-02-02 22:45:22 +053070
Nicholas Troast8995a702016-12-05 10:22:22 -080071#define VCONN_MAX_ATTEMPTS 3
72#define OTG_MAX_ATTEMPTS 3
Ashay Jaiswal2f3b0c12017-06-14 16:04:45 +053073#define BOOST_BACK_STORM_COUNT 3
74#define WEAK_CHG_STORM_COUNT 8
Nicholas Troast8995a702016-12-05 10:22:22 -080075
Nicholas Troast320839e2016-06-03 10:18:00 -070076enum smb_mode {
77 PARALLEL_MASTER = 0,
78 PARALLEL_SLAVE,
79 NUM_MODES,
80};
81
Harry Yang1369b7a2016-09-27 15:59:50 -070082enum {
Harry Yang755a34b2016-11-01 01:18:51 -070083 QC_CHARGER_DETECTION_WA_BIT = BIT(0),
84 BOOST_BACK_WA = BIT(1),
85 TYPEC_CC2_REMOVAL_WA_BIT = BIT(2),
Ashay Jaiswal67ec7072017-02-16 14:14:58 +053086 QC_AUTH_INTERRUPT_WA_BIT = BIT(3),
Ashay Jaiswal7c241382017-03-06 15:26:38 +053087 OTG_WA = BIT(4),
Harry Yang1369b7a2016-09-27 15:59:50 -070088};
89
Subbaraman Narayanamurthybbd7f452017-02-06 16:22:48 -080090enum smb_irq_index {
91 CHG_ERROR_IRQ = 0,
92 CHG_STATE_CHANGE_IRQ,
93 STEP_CHG_STATE_CHANGE_IRQ,
94 STEP_CHG_SOC_UPDATE_FAIL_IRQ,
95 STEP_CHG_SOC_UPDATE_REQ_IRQ,
96 OTG_FAIL_IRQ,
97 OTG_OVERCURRENT_IRQ,
98 OTG_OC_DIS_SW_STS_IRQ,
99 TESTMODE_CHANGE_DET_IRQ,
100 BATT_TEMP_IRQ,
101 BATT_OCP_IRQ,
102 BATT_OV_IRQ,
103 BATT_LOW_IRQ,
104 BATT_THERM_ID_MISS_IRQ,
105 BATT_TERM_MISS_IRQ,
106 USBIN_COLLAPSE_IRQ,
107 USBIN_LT_3P6V_IRQ,
108 USBIN_UV_IRQ,
109 USBIN_OV_IRQ,
110 USBIN_PLUGIN_IRQ,
111 USBIN_SRC_CHANGE_IRQ,
112 USBIN_ICL_CHANGE_IRQ,
113 TYPE_C_CHANGE_IRQ,
114 DCIN_COLLAPSE_IRQ,
115 DCIN_LT_3P6V_IRQ,
116 DCIN_UV_IRQ,
117 DCIN_OV_IRQ,
118 DCIN_PLUGIN_IRQ,
119 DIV2_EN_DG_IRQ,
120 DCIN_ICL_CHANGE_IRQ,
121 WDOG_SNARL_IRQ,
122 WDOG_BARK_IRQ,
123 AICL_FAIL_IRQ,
124 AICL_DONE_IRQ,
125 HIGH_DUTY_CYCLE_IRQ,
126 INPUT_CURRENT_LIMIT_IRQ,
127 TEMPERATURE_CHANGE_IRQ,
128 SWITCH_POWER_OK_IRQ,
129 SMB_IRQ_MAX,
130};
131
132struct smb_irq_info {
133 const char *name;
134 const irq_handler_t handler;
135 const bool wake;
136 const struct storm_watch storm_data;
137 struct smb_irq_data *irq_data;
138 int irq;
139};
140
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +0530141static const unsigned int smblib_extcon_cable[] = {
142 EXTCON_USB,
143 EXTCON_USB_HOST,
144 EXTCON_NONE,
145};
146
Nicholas Troast34db5032016-03-28 12:26:44 -0700147struct smb_regulator {
148 struct regulator_dev *rdev;
149 struct regulator_desc rdesc;
150};
151
152struct smb_irq_data {
Nicholas Troast47ae4612016-08-03 09:49:36 -0700153 void *parent_data;
154 const char *name;
155 struct storm_watch storm_data;
Nicholas Troast34db5032016-03-28 12:26:44 -0700156};
157
158struct smb_chg_param {
159 const char *name;
160 u16 reg;
161 int min_u;
162 int max_u;
163 int step_u;
Harry Yangf8b41252016-08-10 14:21:10 -0700164 int (*get_proc)(struct smb_chg_param *param,
165 u8 val_raw);
166 int (*set_proc)(struct smb_chg_param *param,
167 int val_u,
168 u8 *val_raw);
Nicholas Troast34db5032016-03-28 12:26:44 -0700169};
170
Anirudh Ghayal4da3df92017-01-25 18:55:57 +0530171struct smb_chg_freq {
172 unsigned int freq_5V;
173 unsigned int freq_6V_8V;
174 unsigned int freq_9V;
175 unsigned int freq_12V;
176 unsigned int freq_removal;
177 unsigned int freq_below_otg_threshold;
178 unsigned int freq_above_otg_threshold;
179};
180
Nicholas Troast34db5032016-03-28 12:26:44 -0700181struct smb_params {
182 struct smb_chg_param fcc;
183 struct smb_chg_param fv;
184 struct smb_chg_param usb_icl;
Harry Yang1d1034c2016-06-15 12:09:42 -0700185 struct smb_chg_param icl_stat;
Harry Yang360bd532016-09-26 11:03:22 -0700186 struct smb_chg_param otg_cl;
Nicholas Troast34db5032016-03-28 12:26:44 -0700187 struct smb_chg_param dc_icl;
Abhijeet Dharmapurikar5cf5faf2016-06-21 14:20:24 -0700188 struct smb_chg_param dc_icl_pt_lv;
189 struct smb_chg_param dc_icl_pt_hv;
190 struct smb_chg_param dc_icl_div2_lv;
191 struct smb_chg_param dc_icl_div2_mid_lv;
192 struct smb_chg_param dc_icl_div2_mid_hv;
193 struct smb_chg_param dc_icl_div2_hv;
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -0700194 struct smb_chg_param jeita_cc_comp;
Harry Yangf6df8b02016-10-05 15:38:03 -0700195 struct smb_chg_param freq_buck;
Harry Yangd89ff1f2016-12-05 14:59:11 -0800196 struct smb_chg_param freq_boost;
Nicholas Troast34db5032016-03-28 12:26:44 -0700197};
198
Harry Yang1d1034c2016-06-15 12:09:42 -0700199struct parallel_params {
200 struct power_supply *psy;
Harry Yang1d1034c2016-06-15 12:09:42 -0700201};
202
Harry Yangba874ce2016-08-19 14:17:01 -0700203struct smb_iio {
204 struct iio_channel *temp_chan;
205 struct iio_channel *temp_max_chan;
206 struct iio_channel *usbin_i_chan;
207 struct iio_channel *usbin_v_chan;
Nicholas Troast7dbcad22016-10-05 13:30:18 -0700208 struct iio_channel *batt_i_chan;
Nicholas Troastc8434ac2017-02-14 16:11:56 -0800209 struct iio_channel *connector_temp_chan;
Nicholas Troastae0ea542017-01-31 19:23:10 -0800210 struct iio_channel *connector_temp_thr1_chan;
211 struct iio_channel *connector_temp_thr2_chan;
212 struct iio_channel *connector_temp_thr3_chan;
Harry Yangba874ce2016-08-19 14:17:01 -0700213};
214
Harry Yang5e2bb712016-10-18 16:47:48 -0700215struct reg_info {
216 u16 reg;
217 u8 mask;
218 u8 val;
219 u8 bak;
220 const char *desc;
221};
222
Nicholas Troast34db5032016-03-28 12:26:44 -0700223struct smb_charger {
224 struct device *dev;
Abhijeet Dharmapurikar31b98f32016-10-14 12:25:23 -0700225 char *name;
Nicholas Troast34db5032016-03-28 12:26:44 -0700226 struct regmap *regmap;
Subbaraman Narayanamurthybbd7f452017-02-06 16:22:48 -0800227 struct smb_irq_info *irq_info;
Nicholas Troast34db5032016-03-28 12:26:44 -0700228 struct smb_params param;
Harry Yangba874ce2016-08-19 14:17:01 -0700229 struct smb_iio iio;
Nicholas Troast34db5032016-03-28 12:26:44 -0700230 int *debug_mask;
Nicholas Troast320839e2016-06-03 10:18:00 -0700231 enum smb_mode mode;
Anirudh Ghayal4da3df92017-01-25 18:55:57 +0530232 struct smb_chg_freq chg_freq;
Abhijeet Dharmapurikar7442e422017-02-08 13:35:14 -0800233 int smb_version;
Ashay Jaiswal1bf41332017-05-03 15:10:25 +0530234 int otg_delay_ms;
Ashay Jaiswal2f3b0c12017-06-14 16:04:45 +0530235 int *weak_chg_icl_ua;
Nicholas Troast34db5032016-03-28 12:26:44 -0700236
237 /* locks */
Abhijeet Dharmapurikar11330d92017-04-17 12:15:19 -0700238 struct mutex lock;
Harry Yangbacd2222016-05-11 16:43:51 -0700239 struct mutex write_lock;
Nicholas Troast34db5032016-03-28 12:26:44 -0700240 struct mutex ps_change_lock;
Nicholas Troastb11015f2017-01-17 17:56:45 -0800241 struct mutex otg_oc_lock;
Nicholas Troast85d3a5a2017-05-03 10:19:43 -0700242 struct mutex vconn_oc_lock;
Nicholas Troast34db5032016-03-28 12:26:44 -0700243
244 /* power supplies */
245 struct power_supply *batt_psy;
246 struct power_supply *usb_psy;
Harry Yangf3023592016-07-20 14:56:41 -0700247 struct power_supply *dc_psy;
Harry Yang5e1a5222016-07-26 15:16:04 -0700248 struct power_supply *bms_psy;
Nicholas Troast34db5032016-03-28 12:26:44 -0700249 struct power_supply_desc usb_psy_desc;
Abhijeet Dharmapurikara8bd6f02017-01-30 15:43:04 -0800250 struct power_supply *usb_main_psy;
Fenglin Wu80826e02017-04-25 21:45:08 +0800251 struct power_supply *usb_port_psy;
252 enum power_supply_type real_charger_type;
Nicholas Troast34db5032016-03-28 12:26:44 -0700253
Harry Yang5e1a5222016-07-26 15:16:04 -0700254 /* notifiers */
255 struct notifier_block nb;
256
Harry Yang1d1034c2016-06-15 12:09:42 -0700257 /* parallel charging */
258 struct parallel_params pl;
259
Nicholas Troast34db5032016-03-28 12:26:44 -0700260 /* regulators */
261 struct smb_regulator *vbus_vreg;
262 struct smb_regulator *vconn_vreg;
263 struct regulator *dpdm_reg;
264
265 /* votables */
Nicholas Troast34db5032016-03-28 12:26:44 -0700266 struct votable *dc_suspend_votable;
267 struct votable *fcc_votable;
Abhijeet Dharmapurikarf9805d42016-05-17 18:38:42 -0700268 struct votable *fv_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700269 struct votable *usb_icl_votable;
270 struct votable *dc_icl_votable;
Abhijeet Dharmapurikar4b13c6e2016-10-05 15:15:10 -0700271 struct votable *pd_disallowed_votable_indirect;
Nicholas Troast34db5032016-03-28 12:26:44 -0700272 struct votable *pd_allowed_votable;
Harry Yang1d1034c2016-06-15 12:09:42 -0700273 struct votable *awake_votable;
274 struct votable *pl_disable_votable;
Abhijeet Dharmapurikaree54de02016-07-08 14:51:47 -0700275 struct votable *chg_disable_votable;
Harry Yangaba1f5f2016-09-28 10:47:29 -0700276 struct votable *pl_enable_votable_indirect;
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +0530277 struct votable *hvdcp_disable_votable_indirect;
278 struct votable *hvdcp_enable_votable;
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700279 struct votable *apsd_disable_votable;
Ashay Jaiswal6d308da2017-02-18 09:59:23 +0530280 struct votable *hvdcp_hw_inov_dis_votable;
Harry Yang4bf7d962017-03-13 16:51:43 -0700281 struct votable *usb_irq_enable_votable;
Abhijeet Dharmapurikar3c93db32017-04-17 17:36:14 -0700282 struct votable *typec_irq_disable_votable;
Nicholas Troast34db5032016-03-28 12:26:44 -0700283
284 /* work */
Harry Yang5e1a5222016-07-26 15:16:04 -0700285 struct work_struct bms_update_work;
Harry Yang755a34b2016-11-01 01:18:51 -0700286 struct work_struct rdstd_cc2_detach_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700287 struct delayed_work hvdcp_detect_work;
288 struct delayed_work ps_change_timeout_work;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700289 struct delayed_work clear_hdc_work;
Nicholas Troastb11015f2017-01-17 17:56:45 -0800290 struct work_struct otg_oc_work;
291 struct work_struct vconn_oc_work;
292 struct delayed_work otg_ss_done_work;
Ashay Jaiswal4d825782017-02-18 10:11:34 +0530293 struct delayed_work icl_change_work;
Ashay Jaiswalc0361672017-03-21 12:24:16 +0530294 struct delayed_work pl_enable_work;
Abhijeet Dharmapurikar3c93db32017-04-17 17:36:14 -0700295 struct work_struct legacy_detection_work;
Ashay Jaiswal1bf41332017-05-03 15:10:25 +0530296 struct delayed_work uusb_otg_work;
Anirudh Ghayal36feefe2017-05-26 09:41:25 +0530297 struct delayed_work bb_removal_work;
Nicholas Troast34db5032016-03-28 12:26:44 -0700298
299 /* cached status */
300 int voltage_min_uv;
301 int voltage_max_uv;
Abhijeet Dharmapurikar76e2af52016-10-06 17:25:01 -0700302 int pd_active;
Abhijeet Dharmapurikard92eca62016-10-07 19:04:33 -0700303 bool system_suspend_supported;
Harry Yangd89ff1f2016-12-05 14:59:11 -0800304 int boost_threshold_ua;
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700305 int system_temp_level;
306 int thermal_levels;
307 int *thermal_mitigation;
Harry Yang631b99e2016-11-17 11:24:25 -0800308 int dcp_icl_ua;
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700309 int fake_capacity;
Harry Yang589dd422017-07-28 18:41:42 -0700310 int fake_batt_status;
Harry Yangfe913842016-08-10 12:27:28 -0700311 bool step_chg_enabled;
Ashay Jaiswal9aba44a2017-07-20 17:41:36 +0530312 bool sw_jeita_enabled;
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700313 bool is_hdc;
Subbaraman Narayanamurthy270a2652016-10-04 17:08:42 -0700314 bool chg_done;
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +0530315 bool micro_usb_mode;
Nicholas Troast8995a702016-12-05 10:22:22 -0800316 bool otg_en;
317 bool vconn_en;
Ashay Jaiswalda8669b2017-02-10 23:24:23 +0530318 bool suspend_input_on_debug_batt;
Nicholas Troast8995a702016-12-05 10:22:22 -0800319 int otg_attempts;
320 int vconn_attempts;
Abhijeet Dharmapurikar7442e422017-02-08 13:35:14 -0800321 int default_icl_ua;
Ashay Jaiswal7c241382017-03-06 15:26:38 +0530322 int otg_cl_ua;
Ashay Jaiswal8507aa52017-04-14 09:42:32 +0530323 bool uusb_apsd_rerun_done;
Abhijeet Dharmapurikar0e432812017-04-17 14:52:46 -0700324 bool pd_hard_reset;
Nicholas Troast8c28e0f2017-03-22 14:44:49 -0700325 bool typec_present;
Abhijeet Dharmapurikarb0403c42017-04-17 12:26:26 -0700326 u8 typec_status[5];
Abhijeet Dharmapurikar3c93db32017-04-17 17:36:14 -0700327 bool typec_legacy_valid;
Abhijeet Dharmapurikar2ec2a792017-05-01 20:00:25 -0700328 int fake_input_current_limited;
Abhijeet Dharmapurikar255da952017-05-24 20:52:09 -0700329 bool pr_swap_in_progress;
Nicholas Troaste1932e42017-04-12 12:38:18 -0700330 int typec_mode;
Abhijeet Dharmapurikar109802f712017-07-07 18:30:54 -0700331 int usb_icl_change_irq_enabled;
Anirudh Ghayal941acaa2017-07-19 16:04:44 +0530332 u32 jeita_status;
Anirudh Ghayal1121f5d2017-07-26 20:26:20 +0530333 u8 float_cfg;
Harry Yangf7251982016-09-16 11:14:49 -0700334
335 /* workaround flag */
336 u32 wa_flags;
Abhijeet Dharmapurikar0e432812017-04-17 14:52:46 -0700337 bool cc2_detach_wa_active;
Abhijeet Dharmapurikar3c93db32017-04-17 17:36:14 -0700338 bool typec_en_dis_active;
Harry Yangd89ff1f2016-12-05 14:59:11 -0800339 int boost_current_ua;
Harry Yange8e38ce2017-03-09 11:22:44 -0800340 int temp_speed_reading_count;
Ashay Jaiswal4aa2c0c2016-12-07 19:39:38 +0530341
342 /* extcon for VBUS / ID notification to USB for uUSB */
343 struct extcon_dev *extcon;
Abhijeet Dharmapurikara8bd6f02017-01-30 15:43:04 -0800344
Abhijeet Dharmapurikarc31b4ab2017-04-27 19:20:31 -0700345 /* battery profile */
346 int batt_profile_fcc_ua;
347 int batt_profile_fv_uv;
348
Harry Yang603e3802017-02-09 17:45:12 -0800349 /* qnovo */
Ashay Jaiswal6d308da2017-02-18 09:59:23 +0530350 int usb_icl_delta_ua;
351 int pulse_cnt;
Nicholas Troast34db5032016-03-28 12:26:44 -0700352};
353
354int smblib_read(struct smb_charger *chg, u16 addr, u8 *val);
355int smblib_masked_write(struct smb_charger *chg, u16 addr, u8 mask, u8 val);
356int smblib_write(struct smb_charger *chg, u16 addr, u8 val);
357
Nicholas Troast4c310492016-05-12 17:56:35 -0700358int smblib_get_charge_param(struct smb_charger *chg,
359 struct smb_chg_param *param, int *val_u);
360int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend);
361
Nicholas Troast34db5032016-03-28 12:26:44 -0700362int smblib_enable_charging(struct smb_charger *chg, bool enable);
Nicholas Troast4c310492016-05-12 17:56:35 -0700363int smblib_set_charge_param(struct smb_charger *chg,
364 struct smb_chg_param *param, int val_u);
365int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend);
366int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend);
Nicholas Troast34db5032016-03-28 12:26:44 -0700367
Harry Yangfe913842016-08-10 12:27:28 -0700368int smblib_mapping_soc_from_field_value(struct smb_chg_param *param,
369 int val_u, u8 *val_raw);
370int smblib_mapping_cc_delta_to_field_value(struct smb_chg_param *param,
371 u8 val_raw);
372int smblib_mapping_cc_delta_from_field_value(struct smb_chg_param *param,
373 int val_u, u8 *val_raw);
Anirudh Ghayal4da3df92017-01-25 18:55:57 +0530374int smblib_set_chg_freq(struct smb_chg_param *param,
375 int val_u, u8 *val_raw);
Harry Yangfe913842016-08-10 12:27:28 -0700376
Nicholas Troast34db5032016-03-28 12:26:44 -0700377int smblib_vbus_regulator_enable(struct regulator_dev *rdev);
378int smblib_vbus_regulator_disable(struct regulator_dev *rdev);
379int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev);
380
381int smblib_vconn_regulator_enable(struct regulator_dev *rdev);
382int smblib_vconn_regulator_disable(struct regulator_dev *rdev);
383int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev);
384
385irqreturn_t smblib_handle_debug(int irq, void *data);
Nicholas Troast8995a702016-12-05 10:22:22 -0800386irqreturn_t smblib_handle_otg_overcurrent(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700387irqreturn_t smblib_handle_chg_state_change(int irq, void *data);
Abhijeet Dharmapurikar2644cd62016-07-20 16:54:55 -0700388irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700389irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data);
390irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data);
Subbaraman Narayanamurthy09327482017-02-06 16:33:12 -0800391irqreturn_t smblib_handle_usbin_uv(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700392irqreturn_t smblib_handle_usb_plugin(int irq, void *data);
393irqreturn_t smblib_handle_usb_source_change(int irq, void *data);
Harry Yang6fe72ab2016-06-14 16:21:39 -0700394irqreturn_t smblib_handle_icl_change(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700395irqreturn_t smblib_handle_usb_typec_change(int irq, void *data);
Abhijeet Dharmapurikar23916642016-10-03 10:38:50 -0700396irqreturn_t smblib_handle_dc_plugin(int irq, void *data);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700397irqreturn_t smblib_handle_high_duty_cycle(int irq, void *data);
Nicholas Troastabedaf72016-09-16 11:07:45 -0700398irqreturn_t smblib_handle_switcher_power_ok(int irq, void *data);
Nicholas Troast15dc0c82016-10-18 15:15:21 -0700399irqreturn_t smblib_handle_wdog_bark(int irq, void *data);
Nicholas Troast34db5032016-03-28 12:26:44 -0700400
401int smblib_get_prop_input_suspend(struct smb_charger *chg,
402 union power_supply_propval *val);
403int smblib_get_prop_batt_present(struct smb_charger *chg,
404 union power_supply_propval *val);
405int smblib_get_prop_batt_capacity(struct smb_charger *chg,
406 union power_supply_propval *val);
407int smblib_get_prop_batt_status(struct smb_charger *chg,
408 union power_supply_propval *val);
409int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
410 union power_supply_propval *val);
Subbaraman Narayanamurthyb491d022016-10-10 20:22:48 -0700411int smblib_get_prop_batt_charge_done(struct smb_charger *chg,
412 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700413int smblib_get_prop_batt_health(struct smb_charger *chg,
414 union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700415int smblib_get_prop_system_temp_level(struct smb_charger *chg,
416 union power_supply_propval *val);
Abhijeet Dharmapurikaracf32002017-05-11 11:54:17 -0700417int smblib_get_prop_system_temp_level_max(struct smb_charger *chg,
418 union power_supply_propval *val);
Abhijeet Dharmapurikar0e369002016-09-07 17:25:36 -0700419int smblib_get_prop_input_current_limited(struct smb_charger *chg,
420 union power_supply_propval *val);
Nicholas Troast66b21d72016-09-20 15:33:20 -0700421int smblib_get_prop_batt_voltage_now(struct smb_charger *chg,
422 union power_supply_propval *val);
423int smblib_get_prop_batt_current_now(struct smb_charger *chg,
424 union power_supply_propval *val);
425int smblib_get_prop_batt_temp(struct smb_charger *chg,
426 union power_supply_propval *val);
Nicholas Troast4fe68d02017-07-26 14:17:34 -0700427int smblib_get_prop_batt_charge_counter(struct smb_charger *chg,
428 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700429int smblib_set_prop_input_suspend(struct smb_charger *chg,
430 const union power_supply_propval *val);
Abhijeet Dharmapurikar9e7e48c2016-08-23 12:55:49 -0700431int smblib_set_prop_batt_capacity(struct smb_charger *chg,
432 const union power_supply_propval *val);
Harry Yang589dd422017-07-28 18:41:42 -0700433int smblib_set_prop_batt_status(struct smb_charger *chg,
434 const union power_supply_propval *val);
Abhijeet Dharmapurikar99fb8942016-07-08 11:39:23 -0700435int smblib_set_prop_system_temp_level(struct smb_charger *chg,
436 const union power_supply_propval *val);
Abhijeet Dharmapurikar2ec2a792017-05-01 20:00:25 -0700437int smblib_set_prop_input_current_limited(struct smb_charger *chg,
438 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700439
Harry Yangf3023592016-07-20 14:56:41 -0700440int smblib_get_prop_dc_present(struct smb_charger *chg,
441 union power_supply_propval *val);
442int smblib_get_prop_dc_online(struct smb_charger *chg,
443 union power_supply_propval *val);
444int smblib_get_prop_dc_current_max(struct smb_charger *chg,
445 union power_supply_propval *val);
446int smblib_set_prop_dc_current_max(struct smb_charger *chg,
447 const union power_supply_propval *val);
448
Nicholas Troast34db5032016-03-28 12:26:44 -0700449int smblib_get_prop_usb_present(struct smb_charger *chg,
450 union power_supply_propval *val);
451int smblib_get_prop_usb_online(struct smb_charger *chg,
452 union power_supply_propval *val);
453int smblib_get_prop_usb_suspend(struct smb_charger *chg,
454 union power_supply_propval *val);
Nicholas Troast7f55c922017-07-25 13:18:03 -0700455int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
456 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700457int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
458 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700459int smblib_get_prop_usb_current_now(struct smb_charger *chg,
460 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700461int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
462 union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700463int smblib_get_prop_typec_power_role(struct smb_charger *chg,
464 union power_supply_propval *val);
465int smblib_get_prop_pd_allowed(struct smb_charger *chg,
466 union power_supply_propval *val);
Nicholas Troast133a7f52016-06-29 13:48:20 -0700467int smblib_get_prop_input_current_settled(struct smb_charger *chg,
468 union power_supply_propval *val);
Fenglin Wuef4730e2017-01-11 18:16:25 +0800469int smblib_get_prop_input_voltage_settled(struct smb_charger *chg,
470 union power_supply_propval *val);
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700471int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
472 union power_supply_propval *val);
Abhijeet Dharmapurikarb9598872016-10-17 16:58:58 -0700473int smblib_get_pe_start(struct smb_charger *chg,
474 union power_supply_propval *val);
Harry Yangba874ce2016-08-19 14:17:01 -0700475int smblib_get_prop_charger_temp(struct smb_charger *chg,
476 union power_supply_propval *val);
477int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
478 union power_supply_propval *val);
Nicholas Troast7fdbd2e2017-02-08 10:47:37 -0800479int smblib_get_prop_die_health(struct smb_charger *chg,
Nicholas Troastb021dd92017-01-31 18:43:38 -0800480 union power_supply_propval *val);
Harry Yang40192cb2017-02-25 23:25:17 -0800481int smblib_get_prop_charge_qnovo_enable(struct smb_charger *chg,
482 union power_supply_propval *val);
Abhijeet Dharmapurikard92eca62016-10-07 19:04:33 -0700483int smblib_set_prop_pd_current_max(struct smb_charger *chg,
484 const union power_supply_propval *val);
Nicholas Troast7f55c922017-07-25 13:18:03 -0700485int smblib_set_prop_sdp_current_max(struct smb_charger *chg,
Nicholas Troast34db5032016-03-28 12:26:44 -0700486 const union power_supply_propval *val);
Nicholas Troast7f55c922017-07-25 13:18:03 -0700487int smblib_set_prop_pd_voltage_max(struct smb_charger *chg,
Nicholas Troast34db5032016-03-28 12:26:44 -0700488 const union power_supply_propval *val);
Nicholas Troast7f55c922017-07-25 13:18:03 -0700489int smblib_set_prop_pd_voltage_min(struct smb_charger *chg,
Nicholas Troast34db5032016-03-28 12:26:44 -0700490 const union power_supply_propval *val);
Harry Yangd89ff1f2016-12-05 14:59:11 -0800491int smblib_set_prop_boost_current(struct smb_charger *chg,
492 const union power_supply_propval *val);
Nicholas Troast34db5032016-03-28 12:26:44 -0700493int smblib_set_prop_typec_power_role(struct smb_charger *chg,
494 const union power_supply_propval *val);
495int smblib_set_prop_pd_active(struct smb_charger *chg,
496 const union power_supply_propval *val);
Abhijeet Dharmapurikarf8a7a4a2016-10-07 18:46:45 -0700497int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
498 const union power_supply_propval *val);
Nicholas Troast7dbcad22016-10-05 13:30:18 -0700499int smblib_get_prop_slave_current_now(struct smb_charger *chg,
500 union power_supply_propval *val);
Fenglin Wuedd70792016-11-22 13:16:19 +0800501int smblib_set_prop_ship_mode(struct smb_charger *chg,
502 const union power_supply_propval *val);
Harry Yang40192cb2017-02-25 23:25:17 -0800503int smblib_set_prop_charge_qnovo_enable(struct smb_charger *chg,
504 const union power_supply_propval *val);
Ashay Jaiswal2fb369d2017-01-12 21:38:29 +0530505void smblib_suspend_on_debug_battery(struct smb_charger *chg);
Abhijeet Dharmapurikar9dd61292017-01-25 16:40:08 -0800506int smblib_rerun_apsd_if_required(struct smb_charger *chg);
Abhijeet Dharmapurikara8bd6f02017-01-30 15:43:04 -0800507int smblib_get_prop_fcc_delta(struct smb_charger *chg,
Anirudh Ghayal9d0196d2017-07-23 23:02:48 +0530508 union power_supply_propval *val);
Abhijeet Dharmapurikar74021fc2017-02-06 18:39:19 -0800509int smblib_icl_override(struct smb_charger *chg, bool override);
Ashay Jaiswal6d308da2017-02-18 09:59:23 +0530510int smblib_dp_dm(struct smb_charger *chg, int val);
Abhijeet Dharmapurikar3a580042017-07-24 09:43:00 -0700511int smblib_disable_hw_jeita(struct smb_charger *chg, bool disable);
Ashay Jaiswal6d308da2017-02-18 09:59:23 +0530512int smblib_rerun_aicl(struct smb_charger *chg);
Ashay Jaiswalae1586d2017-03-22 23:18:51 +0530513int smblib_set_icl_current(struct smb_charger *chg, int icl_ua);
Abhijeet Dharmapurikareecf5582017-04-24 13:33:07 -0700514int smblib_get_icl_current(struct smb_charger *chg, int *icl_ua);
Abhijeet Dharmapurikarf59c8352017-03-23 14:04:05 -0700515int smblib_get_charge_current(struct smb_charger *chg, int *total_current_ua);
Abhijeet Dharmapurikar255da952017-05-24 20:52:09 -0700516int smblib_get_prop_pr_swap_in_progress(struct smb_charger *chg,
517 union power_supply_propval *val);
518int smblib_set_prop_pr_swap_in_progress(struct smb_charger *chg,
519 const union power_supply_propval *val);
Nicholas Troast7dbcad22016-10-05 13:30:18 -0700520
Nicholas Troast34db5032016-03-28 12:26:44 -0700521int smblib_init(struct smb_charger *chg);
Abhijeet Dharmapurikar8e9e7572016-06-06 16:13:14 -0700522int smblib_deinit(struct smb_charger *chg);
Nicholas Troast34db5032016-03-28 12:26:44 -0700523#endif /* __SMB2_CHARGER_H */