max77888_charger.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525
  1. /*
  2. * max77888_charger.c
  3. * Samsung max77888 Charger Driver
  4. *
  5. * Copyright (C) 2012 Samsung Electronics
  6. *
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/mfd/max77888.h>
  13. #include <linux/mfd/max77888-private.h>
  14. #ifdef CONFIG_USB_HOST_NOTIFY
  15. #include <linux/host_notify.h>
  16. #endif
  17. #include <linux/debugfs.h>
  18. #include <linux/seq_file.h>
  19. static struct dentry *max77888_dentry;
  20. #define ENABLE 1
  21. #define DISABLE 0
  22. #define RECOVERY_DELAY 3000
  23. #define RECOVERY_CNT 5
  24. #define REDUCE_CURRENT_STEP 100
  25. #define MINIMUM_INPUT_CURRENT 300
  26. #define SIOP_INPUT_LIMIT_CURRENT 1200
  27. #define SIOP_CHARGING_LIMIT_CURRENT 1000
  28. #ifndef SLOW_CHARGING_CURRENT_STANDARD
  29. #define SLOW_CHARGING_CURRENT_STANDARD 1000
  30. #endif
  31. struct max77888_charger_data {
  32. struct max77888_dev *max77888;
  33. struct power_supply psy_chg;
  34. struct workqueue_struct *wqueue;
  35. struct work_struct chgin_work;
  36. struct delayed_work isr_work;
  37. struct delayed_work wpc_work; /* wpc detect work */
  38. struct delayed_work chgin_init_work; /* chgin init work */
  39. /* mutex */
  40. struct mutex irq_lock;
  41. struct mutex ops_lock;
  42. /* wakelock */
  43. struct wake_lock wpc_wake_lock;
  44. struct wake_lock chgin_wake_lock;
  45. unsigned int is_charging;
  46. unsigned int charging_type;
  47. unsigned int battery_state;
  48. unsigned int battery_present;
  49. unsigned int cable_type;
  50. unsigned int charging_current_max;
  51. unsigned int charging_current;
  52. unsigned int vbus_state;
  53. int aicl_on;
  54. int status;
  55. int siop_level;
  56. int irq_bypass;
  57. int irq_batp;
  58. int irq_battery;
  59. int irq_chg;
  60. int irq_chgin;
  61. /* software regulation */
  62. bool soft_reg_state;
  63. int soft_reg_current;
  64. /* unsufficient power */
  65. bool reg_loop_deted;
  66. int pmic_ver;
  67. int input_curr_limit_step;
  68. int charging_curr_step;
  69. sec_battery_platform_data_t *pdata;
  70. };
  71. static enum power_supply_property sec_charger_props[] = {
  72. POWER_SUPPLY_PROP_STATUS,
  73. POWER_SUPPLY_PROP_CHARGE_TYPE,
  74. POWER_SUPPLY_PROP_HEALTH,
  75. POWER_SUPPLY_PROP_ONLINE,
  76. POWER_SUPPLY_PROP_CURRENT_MAX,
  77. POWER_SUPPLY_PROP_CURRENT_AVG,
  78. POWER_SUPPLY_PROP_CURRENT_NOW,
  79. POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
  80. #if defined(CONFIG_BATTERY_SWELLING)
  81. POWER_SUPPLY_PROP_VOLTAGE_MAX,
  82. #endif
  83. };
  84. static void max77888_charger_initialize(struct max77888_charger_data *charger);
  85. static int max77888_get_vbus_state(struct max77888_charger_data *charger);
  86. static int max77888_get_charger_state(struct max77888_charger_data *charger);
  87. static u8 max77888_get_float_voltage_data(int float_voltage);
  88. static void max77888_dump_reg(struct max77888_charger_data *charger)
  89. {
  90. u8 reg_data;
  91. u32 reg_addr;
  92. pr_info("%s\n", __func__);
  93. for (reg_addr = 0xB0; reg_addr <= 0xC5; reg_addr++) {
  94. max77888_read_reg(charger->max77888->i2c, reg_addr, &reg_data);
  95. pr_info("max77888: c: 0x%02x(0x%02x)\n", reg_addr, reg_data);
  96. }
  97. }
  98. static bool max77888_charger_unlock(struct max77888_charger_data *chg_data)
  99. {
  100. struct i2c_client *i2c = chg_data->max77888->i2c;
  101. u8 reg_data;
  102. u8 chgprot;
  103. int retry_cnt = 0;
  104. bool need_init = false;
  105. do {
  106. max77888_read_reg(i2c, MAX77888_CHG_REG_CHG_CNFG_06, &reg_data);
  107. chgprot = ((reg_data & 0x0C) >> 2);
  108. if (chgprot != 0x03) {
  109. pr_err("%s: unlock err, chgprot(0x%x), retry(%d)\n",
  110. __func__, chgprot, retry_cnt);
  111. max77888_write_reg(i2c, MAX77888_CHG_REG_CHG_CNFG_06,
  112. (0x03 << 2));
  113. need_init = true;
  114. msleep(20);
  115. } else {
  116. pr_debug("%s: unlock success, chgprot(0x%x)\n",
  117. __func__, chgprot);
  118. break;
  119. }
  120. } while ((chgprot != 0x03) && (++retry_cnt < 10));
  121. return need_init;
  122. }
  123. static void check_charger_unlock_state(struct max77888_charger_data *chg_data)
  124. {
  125. bool need_reg_init;
  126. pr_debug("%s\n", __func__);
  127. need_reg_init = max77888_charger_unlock(chg_data);
  128. if (need_reg_init) {
  129. pr_err("%s: charger locked state, reg init\n", __func__);
  130. max77888_charger_initialize(chg_data);
  131. }
  132. }
  133. static int max77888_get_battery_present(struct max77888_charger_data *charger)
  134. {
  135. u8 reg_data;
  136. if (max77888_read_reg(charger->max77888->i2c,
  137. MAX77888_CHG_REG_CHG_INT_OK, &reg_data) < 0) {
  138. /* Eventhough there is an error,
  139. don't do power-off */
  140. return 1;
  141. }
  142. pr_debug("%s: CHG_INT_OK(0x%02x)\n", __func__, reg_data);
  143. #if defined(CONFIG_CHARGER_MAX77888)
  144. reg_data = ((reg_data & MAX77888_BATP_OK) >> MAX77888_BATP_OK_SHIFT);
  145. #else
  146. reg_data = ((reg_data & MAX77888_DETBAT) >> MAX77888_DETBAT_SHIFT);
  147. #endif
  148. return reg_data;
  149. }
  150. static void max77888_set_charger_state(struct max77888_charger_data *charger,
  151. int enable)
  152. {
  153. u8 reg_data;
  154. max77888_read_reg(charger->max77888->i2c,
  155. MAX77888_CHG_REG_CHG_CNFG_00, &reg_data);
  156. if (enable)
  157. reg_data |= MAX77888_MODE_CHGR;
  158. else
  159. reg_data &= ~MAX77888_MODE_CHGR;
  160. pr_debug("%s: CHG_CNFG_00(0x%02x)\n", __func__, reg_data);
  161. max77888_write_reg(charger->max77888->i2c,
  162. MAX77888_CHG_REG_CHG_CNFG_00, reg_data);
  163. }
  164. static void max77888_set_buck(struct max77888_charger_data *charger,
  165. int enable)
  166. {
  167. u8 reg_data;
  168. max77888_read_reg(charger->max77888->i2c,
  169. MAX77888_CHG_REG_CHG_CNFG_00, &reg_data);
  170. if (enable)
  171. reg_data |= MAX77888_MODE_BUCK;
  172. else
  173. reg_data &= ~MAX77888_MODE_BUCK;
  174. pr_debug("%s: CHG_CNFG_00(0x%02x)\n", __func__, reg_data);
  175. max77888_write_reg(charger->max77888->i2c,
  176. MAX77888_CHG_REG_CHG_CNFG_00, reg_data);
  177. }
  178. static void max77888_check_slow_charging(struct max77888_charger_data *charger, int set_current_reg)
  179. {
  180. /* under 500mA, slow rate */
  181. if (set_current_reg <= (SLOW_CHARGING_CURRENT_STANDARD / charger->input_curr_limit_step) &&
  182. (charger->cable_type != POWER_SUPPLY_TYPE_BATTERY)) {
  183. charger->aicl_on = true;
  184. pr_info("%s: slow charging on : set_current_reg(0x%02x), cable type(%d)\n", __func__, set_current_reg, charger->cable_type);
  185. }
  186. else
  187. charger->aicl_on = false;
  188. }
  189. static void max77888_set_input_current(struct max77888_charger_data *charger,
  190. int cur)
  191. {
  192. int set_current_reg, now_current_reg;
  193. int vbus_state, curr_step, delay;
  194. u8 set_reg, reg_data;
  195. int chg_state;
  196. mutex_lock(&charger->ops_lock);
  197. max77888_read_reg(charger->max77888->i2c,
  198. MAX77888_CHG_REG_CHG_INT_MASK, &reg_data);
  199. reg_data |= (0x1 << 6);
  200. max77888_write_reg(charger->max77888->i2c,
  201. MAX77888_CHG_REG_CHG_INT_MASK, reg_data);
  202. set_reg = MAX77888_CHG_REG_CHG_CNFG_09;
  203. charger->input_curr_limit_step = 25;
  204. if (cur <= 0) {
  205. /* disable only buck because power onoff test issue */
  206. max77888_write_reg(charger->max77888->i2c,
  207. set_reg, 0x19);
  208. max77888_set_buck(charger, DISABLE);
  209. goto exit;
  210. } else
  211. max77888_set_buck(charger, ENABLE);
  212. set_current_reg = cur / charger->input_curr_limit_step;
  213. if (charger->cable_type == POWER_SUPPLY_TYPE_BATTERY) {
  214. if (charger->status != POWER_SUPPLY_STATUS_CHARGING)
  215. goto set_input_current;
  216. else
  217. goto exit;
  218. }
  219. max77888_read_reg(charger->max77888->i2c,
  220. set_reg, &reg_data);
  221. if (reg_data == set_current_reg) {
  222. /* check uvlo */
  223. while((set_current_reg > (MINIMUM_INPUT_CURRENT / charger->input_curr_limit_step)) && (set_current_reg < 255)) {
  224. vbus_state = max77888_get_vbus_state(charger);
  225. if ((vbus_state == 0x00) || (vbus_state == 0x01)) {
  226. /* UVLO */
  227. set_current_reg -= 5;
  228. if (set_current_reg < (MINIMUM_INPUT_CURRENT / charger->input_curr_limit_step))
  229. set_current_reg = (MINIMUM_INPUT_CURRENT / charger->input_curr_limit_step);
  230. max77888_write_reg(charger->max77888->i2c,
  231. set_reg, set_current_reg);
  232. pr_info("%s: set_current_reg(0x%02x)\n", __func__, set_current_reg);
  233. chg_state = max77888_get_charger_state(charger);
  234. if ((chg_state != POWER_SUPPLY_STATUS_CHARGING) &&
  235. (chg_state != POWER_SUPPLY_STATUS_FULL))
  236. break;
  237. msleep(50);
  238. } else
  239. break;
  240. }
  241. goto exit;
  242. }
  243. if (reg_data == 0) {
  244. now_current_reg = SOFT_CHG_START_CURR / charger->input_curr_limit_step;
  245. max77888_write_reg(charger->max77888->i2c,
  246. set_reg, now_current_reg);
  247. msleep(SOFT_CHG_START_DUR);
  248. } else
  249. now_current_reg = reg_data;
  250. if (cur <= 1000) {
  251. curr_step = 1;
  252. delay = 50;
  253. } else {
  254. curr_step = SOFT_CHG_CURR_STEP / charger->input_curr_limit_step;
  255. delay = SOFT_CHG_STEP_DUR;
  256. }
  257. now_current_reg += (curr_step);
  258. while (now_current_reg < set_current_reg &&
  259. charger->cable_type != POWER_SUPPLY_TYPE_BATTERY)
  260. {
  261. now_current_reg = min(now_current_reg, set_current_reg);
  262. max77888_write_reg(charger->max77888->i2c,
  263. set_reg, now_current_reg);
  264. msleep(delay);
  265. vbus_state = max77888_get_vbus_state(charger);
  266. if ((vbus_state == 0x00) || (vbus_state == 0x01)) {
  267. /* UVLO */
  268. if (now_current_reg > (curr_step * 3))
  269. now_current_reg -= (curr_step * 3);
  270. /* current limit 300mA */
  271. if (now_current_reg < (MINIMUM_INPUT_CURRENT / charger->input_curr_limit_step))
  272. now_current_reg = (MINIMUM_INPUT_CURRENT / charger->input_curr_limit_step);
  273. curr_step /= 2;
  274. max77888_write_reg(charger->max77888->i2c,
  275. set_reg, now_current_reg);
  276. pr_info("%s: now_current_reg(0x%02x)\n", __func__, now_current_reg);
  277. chg_state = max77888_get_charger_state(charger);
  278. if ((chg_state != POWER_SUPPLY_STATUS_CHARGING) &&
  279. (chg_state != POWER_SUPPLY_STATUS_FULL))
  280. goto exit;
  281. if (curr_step < 2) {
  282. goto exit;
  283. }
  284. msleep(50);
  285. } else
  286. now_current_reg += (curr_step);
  287. }
  288. set_input_current:
  289. pr_info("%s: reg_data(0x%02x), input(%d)\n",
  290. __func__, set_current_reg, cur);
  291. max77888_write_reg(charger->max77888->i2c,
  292. set_reg, set_current_reg);
  293. exit:
  294. /* slow charging check */
  295. max77888_read_reg(charger->max77888->i2c,
  296. set_reg, &reg_data);
  297. max77888_check_slow_charging(charger, reg_data);
  298. max77888_read_reg(charger->max77888->i2c,
  299. MAX77888_CHG_REG_CHG_INT_MASK, &reg_data);
  300. reg_data &= ~(0x1 << 6);
  301. max77888_write_reg(charger->max77888->i2c,
  302. MAX77888_CHG_REG_CHG_INT_MASK, reg_data);
  303. mutex_unlock(&charger->ops_lock);
  304. }
  305. static int max77888_get_input_current(struct max77888_charger_data *charger)
  306. {
  307. u8 reg_data;
  308. int get_current = 0;
  309. max77888_read_reg(charger->max77888->i2c,
  310. MAX77888_CHG_REG_CHG_CNFG_09, &reg_data);
  311. pr_info("%s: CHG_CNFG_09(0x%02x)\n", __func__, reg_data);
  312. charger->input_curr_limit_step = 25;
  313. get_current = reg_data * charger->input_curr_limit_step;
  314. pr_debug("%s: get input current: %dmA\n", __func__, get_current);
  315. return get_current;
  316. }
  317. static void max77888_set_topoff_current(struct max77888_charger_data *charger,
  318. int cur, int timeout)
  319. {
  320. u8 reg_data;
  321. if (cur >= 350)
  322. reg_data = 0x07;
  323. else if (cur >= 300)
  324. reg_data = 0x06;
  325. else if (cur >= 250)
  326. reg_data = 0x05;
  327. else if (cur >= 200)
  328. reg_data = 0x04;
  329. else if (cur >= 175)
  330. reg_data = 0x03;
  331. else if (cur >= 150)
  332. reg_data = 0x02;
  333. else if (cur >= 125)
  334. reg_data = 0x01;
  335. else
  336. reg_data = 0x00;
  337. /* always set 70min */
  338. reg_data |= (0x7 << 3);
  339. pr_info("%s: reg_data(0x%02x), topoff(%d)\n", __func__, reg_data, cur);
  340. max77888_write_reg(charger->max77888->i2c,
  341. MAX77888_CHG_REG_CHG_CNFG_03, reg_data);
  342. }
  343. static void max77888_set_charge_current(struct max77888_charger_data *charger,
  344. int cur)
  345. {
  346. u8 reg_data = 0;
  347. max77888_read_reg(charger->max77888->i2c,
  348. MAX77888_CHG_REG_CHG_CNFG_02, &reg_data);
  349. reg_data &= ~MAX77888_CHG_CC;
  350. if (!cur) {
  351. /* No charger */
  352. max77888_write_reg(charger->max77888->i2c,
  353. MAX77888_CHG_REG_CHG_CNFG_02, reg_data);
  354. } else {
  355. reg_data |= ((cur * 10 / charger->charging_curr_step) << 0);
  356. max77888_write_reg(charger->max77888->i2c,
  357. MAX77888_CHG_REG_CHG_CNFG_02, reg_data);
  358. }
  359. pr_info("%s: reg_data(0x%02x), charge(%d)\n",
  360. __func__, reg_data, cur);
  361. }
  362. /*
  363. static int max77888_get_charge_current(struct max77888_charger_data *charger)
  364. {
  365. u8 reg_data;
  366. int get_current;
  367. max77888_read_reg(charger->max77888->i2c,
  368. MAX77888_CHG_REG_CHG_CNFG_02, &reg_data);
  369. pr_debug("%s: CHG_CNFG_02(0x%02x)\n", __func__, reg_data);
  370. reg_data &= MAX77888_CHG_CC;
  371. get_current = reg_data * charger->charging_curr_step / 10;
  372. pr_debug("%s: get charge current: %dmA\n", __func__, get_current);
  373. return get_current;
  374. }
  375. */
  376. static void reduce_input_current(struct max77888_charger_data *charger, int cur)
  377. {
  378. u8 set_reg;
  379. u8 set_value;
  380. unsigned int min_input_current = 0;
  381. if ((!charger->is_charging) || mutex_is_locked(&charger->ops_lock))
  382. return;
  383. set_reg = MAX77888_CHG_REG_CHG_CNFG_09;
  384. min_input_current = MINIMUM_INPUT_CURRENT;
  385. charger->input_curr_limit_step = 25;
  386. if (!max77888_read_reg(charger->max77888->i2c,
  387. set_reg, &set_value)) {
  388. if ((set_value <= (min_input_current / charger->input_curr_limit_step)) ||
  389. (set_value <= (cur / charger->input_curr_limit_step)))
  390. return;
  391. set_value -= (cur / charger->input_curr_limit_step);
  392. set_value = (set_value < (min_input_current / charger->input_curr_limit_step)) ?
  393. (min_input_current / charger->input_curr_limit_step) : set_value;
  394. max77888_write_reg(charger->max77888->i2c,
  395. set_reg, set_value);
  396. pr_info("%s: set current: reg:(0x%x), val:(0x%x)\n",
  397. __func__, set_reg, set_value);
  398. }
  399. }
  400. static int max77888_get_vbus_state(struct max77888_charger_data *charger)
  401. {
  402. u8 reg_data;
  403. max77888_read_reg(charger->max77888->i2c,
  404. MAX77888_CHG_REG_CHG_DTLS_00, &reg_data);
  405. reg_data = ((reg_data & MAX77888_CHGIN_DTLS) >>
  406. MAX77888_CHGIN_DTLS_SHIFT);
  407. switch (reg_data) {
  408. case 0x00:
  409. pr_info("%s: VBUS is invalid. CHGIN < CHGIN_UVLO\n",
  410. __func__);
  411. break;
  412. case 0x01:
  413. pr_info("%s: VBUS is invalid. CHGIN < MBAT+CHGIN2SYS" \
  414. "and CHGIN > CHGIN_UVLO\n", __func__);
  415. break;
  416. case 0x02:
  417. pr_info("%s: VBUS is invalid. CHGIN > CHGIN_OVLO",
  418. __func__);
  419. break;
  420. case 0x03:
  421. break;
  422. default:
  423. break;
  424. }
  425. return reg_data;
  426. }
  427. static int max77888_get_charger_state(struct max77888_charger_data *charger)
  428. {
  429. int state;
  430. u8 reg_data;
  431. max77888_read_reg(charger->max77888->i2c,
  432. MAX77888_CHG_REG_CHG_DTLS_01, &reg_data);
  433. reg_data = ((reg_data & MAX77888_CHG_DTLS) >> MAX77888_CHG_DTLS_SHIFT);
  434. pr_info("%s: CHG_DTLS : 0x%2x\n", __func__, reg_data);
  435. switch (reg_data) {
  436. case 0x0:
  437. case 0x1:
  438. case 0x2:
  439. state = POWER_SUPPLY_STATUS_CHARGING;
  440. break;
  441. case 0x3:
  442. case 0x4:
  443. state = POWER_SUPPLY_STATUS_FULL;
  444. break;
  445. case 0x5:
  446. case 0x6:
  447. case 0x7:
  448. state = POWER_SUPPLY_STATUS_NOT_CHARGING;
  449. break;
  450. case 0x8:
  451. case 0xA:
  452. case 0xB:
  453. state = POWER_SUPPLY_STATUS_DISCHARGING;
  454. break;
  455. default:
  456. state = POWER_SUPPLY_STATUS_UNKNOWN;
  457. break;
  458. }
  459. return state;
  460. }
  461. static int max77888_get_health_state(struct max77888_charger_data *charger)
  462. {
  463. int state;
  464. int vbus_state;
  465. u8 chg_dtls_00, chg_dtls, reg_data;
  466. u8 chg_cnfg_00, chg_cnfg_01 ,chg_cnfg_02, chg_cnfg_04, chg_cnfg_09, chg_cnfg_12;
  467. max77888_read_reg(charger->max77888->i2c,
  468. MAX77888_CHG_REG_CHG_DTLS_01, &reg_data);
  469. reg_data = ((reg_data & MAX77888_BAT_DTLS) >> MAX77888_BAT_DTLS_SHIFT);
  470. pr_info("%s: reg_data(0x%x)\n", __func__, reg_data);
  471. switch (reg_data) {
  472. case 0x00:
  473. pr_info("%s: No battery and the charger is suspended\n",
  474. __func__);
  475. state = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
  476. break;
  477. case 0x01:
  478. pr_info("%s: battery is okay "
  479. "but its voltage is low(~VPQLB)\n", __func__);
  480. state = POWER_SUPPLY_HEALTH_GOOD;
  481. break;
  482. case 0x02:
  483. pr_info("%s: battery dead\n", __func__);
  484. state = POWER_SUPPLY_HEALTH_DEAD;
  485. break;
  486. case 0x03:
  487. state = POWER_SUPPLY_HEALTH_GOOD;
  488. break;
  489. case 0x04:
  490. pr_info("%s: battery is okay" \
  491. "but its voltage is low\n", __func__);
  492. state = POWER_SUPPLY_HEALTH_GOOD;
  493. break;
  494. case 0x05:
  495. pr_info("%s: battery ovp\n", __func__);
  496. state = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  497. break;
  498. default:
  499. pr_info("%s: battery unknown : 0x%d\n", __func__, reg_data);
  500. state = POWER_SUPPLY_HEALTH_UNKNOWN;
  501. break;
  502. }
  503. if (state == POWER_SUPPLY_HEALTH_GOOD) {
  504. union power_supply_propval value;
  505. psy_do_property("battery", get,
  506. POWER_SUPPLY_PROP_HEALTH, value);
  507. /* VBUS OVP state return battery OVP state */
  508. vbus_state = max77888_get_vbus_state(charger);
  509. /* read CHG_DTLS and detecting battery terminal error */
  510. max77888_read_reg(charger->max77888->i2c,
  511. MAX77888_CHG_REG_CHG_DTLS_01, &chg_dtls);
  512. chg_dtls = ((chg_dtls & MAX77888_CHG_DTLS) >>
  513. MAX77888_CHG_DTLS_SHIFT);
  514. max77888_read_reg(charger->max77888->i2c,
  515. MAX77888_CHG_REG_CHG_CNFG_00, &chg_cnfg_00);
  516. /* print the log at the abnormal case */
  517. if((charger->is_charging == 1) && (chg_dtls & 0x08)) {
  518. max77888_read_reg(charger->max77888->i2c,
  519. MAX77888_CHG_REG_CHG_DTLS_00, &chg_dtls_00);
  520. max77888_read_reg(charger->max77888->i2c,
  521. MAX77888_CHG_REG_CHG_CNFG_01, &chg_cnfg_01);
  522. max77888_read_reg(charger->max77888->i2c,
  523. MAX77888_CHG_REG_CHG_CNFG_02, &chg_cnfg_02);
  524. max77888_read_reg(charger->max77888->i2c,
  525. MAX77888_CHG_REG_CHG_CNFG_04, &chg_cnfg_04);
  526. max77888_read_reg(charger->max77888->i2c,
  527. MAX77888_CHG_REG_CHG_CNFG_09, &chg_cnfg_09);
  528. max77888_read_reg(charger->max77888->i2c,
  529. MAX77888_CHG_REG_CHG_CNFG_12, &chg_cnfg_12);
  530. pr_info("%s: CHG_DTLS_00(0x%x), CHG_DTLS_01(0x%x), CHG_CNFG_00(0x%x)\n",
  531. __func__, chg_dtls_00, chg_dtls, chg_cnfg_00);
  532. pr_info("%s: CHG_CNFG_01(0x%x), CHG_CNFG_02(0x%x), CHG_CNFG_04(0x%x)\n",
  533. __func__, chg_cnfg_01, chg_cnfg_02, chg_cnfg_04);
  534. pr_info("%s: CHG_CNFG_09(0x%x), CHG_CNFG_12(0x%x)\n",
  535. __func__, chg_cnfg_09, chg_cnfg_12);
  536. }
  537. pr_info("%s: vbus_state : 0x%d, chg_dtls : 0x%d\n", __func__, vbus_state, chg_dtls);
  538. /* OVP is higher priority */
  539. if (vbus_state == 0x02) { /* CHGIN_OVLO */
  540. pr_info("%s: vbus ovp\n", __func__);
  541. state = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  542. } else if (((vbus_state == 0x0) || (vbus_state == 0x01)) &&(chg_dtls & 0x08) && \
  543. (chg_cnfg_00 & MAX77888_MODE_BUCK) && \
  544. (chg_cnfg_00 & MAX77888_MODE_CHGR)) {
  545. pr_info("%s: vbus is under\n", __func__);
  546. state = POWER_SUPPLY_HEALTH_UNDERVOLTAGE;
  547. } else if((value.intval == POWER_SUPPLY_HEALTH_UNDERVOLTAGE) && \
  548. !((vbus_state == 0x0) || (vbus_state == 0x01))){
  549. max77888_set_input_current(charger,
  550. charger->charging_current_max);
  551. }
  552. }
  553. return state;
  554. }
  555. static int sec_chg_get_property(struct power_supply *psy,
  556. enum power_supply_property psp,
  557. union power_supply_propval *val)
  558. {
  559. struct max77888_charger_data *charger =
  560. container_of(psy, struct max77888_charger_data, psy_chg);
  561. u8 reg_data;
  562. switch (psp) {
  563. case POWER_SUPPLY_PROP_ONLINE:
  564. val->intval = POWER_SUPPLY_TYPE_BATTERY;
  565. if (max77888_read_reg(charger->max77888->i2c,
  566. MAX77888_CHG_REG_CHG_INT_OK, &reg_data) == 0) {
  567. if (reg_data & MAX77888_CHGIN_OK)
  568. val->intval = POWER_SUPPLY_TYPE_MAINS;
  569. }
  570. break;
  571. case POWER_SUPPLY_PROP_STATUS:
  572. val->intval = max77888_get_charger_state(charger);
  573. break;
  574. case POWER_SUPPLY_PROP_HEALTH:
  575. val->intval = max77888_get_health_state(charger);
  576. break;
  577. case POWER_SUPPLY_PROP_CURRENT_MAX:
  578. val->intval = max77888_get_input_current(charger);
  579. break;
  580. case POWER_SUPPLY_PROP_CURRENT_AVG:
  581. val->intval = charger->charging_current;
  582. break;
  583. case POWER_SUPPLY_PROP_CURRENT_NOW:
  584. val->intval = max77888_get_input_current(charger);
  585. break;
  586. case POWER_SUPPLY_PROP_CHARGE_TYPE:
  587. if (!charger->is_charging)
  588. val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
  589. else if (charger->aicl_on)
  590. {
  591. val->intval = POWER_SUPPLY_CHARGE_TYPE_SLOW;
  592. pr_info("%s: slow-charging mode\n", __func__);
  593. }
  594. else
  595. val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
  596. break;
  597. case POWER_SUPPLY_PROP_PRESENT:
  598. val->intval = max77888_get_battery_present(charger);
  599. break;
  600. #if defined(CONFIG_BATTERY_SWELLING)
  601. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  602. max77888_read_reg(charger->max77888->i2c,
  603. MAX77888_CHG_REG_CHG_CNFG_04, &reg_data);
  604. val->intval = reg_data;
  605. pr_info("%s: battery cv voltage 0x%x\n", __func__, val->intval);
  606. break;
  607. #endif
  608. default:
  609. return -EINVAL;
  610. }
  611. return 0;
  612. }
  613. static int sec_chg_set_property(struct power_supply *psy,
  614. enum power_supply_property psp,
  615. const union power_supply_propval *val)
  616. {
  617. struct max77888_charger_data *charger =
  618. container_of(psy, struct max77888_charger_data, psy_chg);
  619. union power_supply_propval value;
  620. int set_charging_current, set_charging_current_max;
  621. const int usb_charging_current = charger->pdata->charging_current[
  622. POWER_SUPPLY_TYPE_USB].fast_charging_current;
  623. u8 chg_cnfg_00 = 0;
  624. #if defined(CONFIG_BATTERY_SWELLING)
  625. u8 reg_data;
  626. #endif
  627. switch (psp) {
  628. case POWER_SUPPLY_PROP_STATUS:
  629. charger->status = val->intval;
  630. break;
  631. /* val->intval : type */
  632. case POWER_SUPPLY_PROP_ONLINE:
  633. /* check and unlock */
  634. check_charger_unlock_state(charger);
  635. if (val->intval == POWER_SUPPLY_TYPE_POWER_SHARING) {
  636. u8 reg_mask = 0;
  637. psy_do_property("ps", get,
  638. POWER_SUPPLY_PROP_STATUS, value);
  639. reg_mask = (CHG_CNFG_00_OTG_MASK
  640. | CHG_CNFG_00_BOOST_MASK
  641. | CHG_CNFG_00_CHG_MASK
  642. | CHG_CNFG_00_BUCK_MASK
  643. | CHG_CNFG_00_DIS_MUIC_CTRL_MASK);
  644. if (value.intval) {
  645. chg_cnfg_00 = CHG_CNFG_00_OTG_MASK
  646. | CHG_CNFG_00_BOOST_MASK
  647. | CHG_CNFG_00_DIS_MUIC_CTRL_MASK;
  648. pr_info("%s: ps enable \n", __func__);
  649. } else {
  650. chg_cnfg_00 = CHG_CNFG_00_BUCK_MASK;
  651. pr_info("%s: ps disable\n", __func__);
  652. }
  653. max77888_update_reg(charger->max77888->i2c, MAX77888_CHG_REG_CHG_CNFG_00,
  654. chg_cnfg_00, reg_mask);
  655. break;
  656. }
  657. charger->cable_type = val->intval;
  658. if (val->intval == POWER_SUPPLY_TYPE_OTG)
  659. break;
  660. psy_do_property("battery", get,
  661. POWER_SUPPLY_PROP_HEALTH, value);
  662. if (val->intval == POWER_SUPPLY_TYPE_BATTERY) {
  663. charger->is_charging = false;
  664. charger->aicl_on = false;
  665. set_charging_current = 0;
  666. set_charging_current_max =
  667. charger->pdata->charging_current[
  668. POWER_SUPPLY_TYPE_USB].input_current_limit;
  669. } else {
  670. charger->is_charging = true;
  671. charger->charging_current_max =
  672. charger->pdata->charging_current
  673. [charger->cable_type].input_current_limit;
  674. charger->charging_current =
  675. charger->pdata->charging_current
  676. [charger->cable_type].fast_charging_current;
  677. /* decrease the charging current according to siop level */
  678. set_charging_current =
  679. charger->charging_current * charger->siop_level / 100;
  680. if (set_charging_current > 0 &&
  681. set_charging_current < usb_charging_current)
  682. set_charging_current = usb_charging_current;
  683. set_charging_current_max =
  684. charger->charging_current_max;
  685. if (charger->siop_level < 100 &&
  686. set_charging_current_max > SIOP_INPUT_LIMIT_CURRENT) {
  687. set_charging_current_max = SIOP_INPUT_LIMIT_CURRENT;
  688. if (set_charging_current > SIOP_CHARGING_LIMIT_CURRENT)
  689. set_charging_current = SIOP_CHARGING_LIMIT_CURRENT;
  690. }
  691. }
  692. max77888_set_charger_state(charger, charger->is_charging);
  693. /* if battery full, only disable charging */
  694. if ((charger->status == POWER_SUPPLY_STATUS_CHARGING) ||
  695. (charger->status == POWER_SUPPLY_STATUS_DISCHARGING) ||
  696. (value.intval == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE)) {
  697. /* current setting */
  698. max77888_set_charge_current(charger,
  699. set_charging_current);
  700. /* if battery is removed, disable input current and reenable input current
  701. * to enable buck always */
  702. if (value.intval == POWER_SUPPLY_HEALTH_UNSPEC_FAILURE)
  703. max77888_set_input_current(charger, 0);
  704. else
  705. max77888_set_input_current(charger,
  706. set_charging_current_max);
  707. max77888_set_topoff_current(charger,
  708. charger->pdata->charging_current[
  709. val->intval].full_check_current_1st,
  710. charger->pdata->charging_current[
  711. val->intval].full_check_current_2nd);
  712. }
  713. break;
  714. /* val->intval : input charging current */
  715. case POWER_SUPPLY_PROP_CURRENT_MAX:
  716. charger->charging_current_max = val->intval;
  717. break;
  718. /* val->intval : charging current */
  719. case POWER_SUPPLY_PROP_CURRENT_AVG:
  720. charger->charging_current = val->intval;
  721. break;
  722. case POWER_SUPPLY_PROP_CURRENT_NOW:
  723. max77888_set_charge_current(charger,
  724. val->intval);
  725. max77888_set_input_current(charger,
  726. val->intval);
  727. break;
  728. case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
  729. charger->siop_level = val->intval;
  730. if (charger->is_charging) {
  731. /* decrease the charging current according to siop level */
  732. int current_now =
  733. charger->charging_current * val->intval / 100;
  734. /* do forced set charging current */
  735. if (current_now > 0 &&
  736. current_now < usb_charging_current)
  737. current_now = usb_charging_current;
  738. if (charger->cable_type == POWER_SUPPLY_TYPE_MAINS) {
  739. if (charger->siop_level < 100 ) {
  740. set_charging_current_max = SIOP_INPUT_LIMIT_CURRENT;
  741. } else {
  742. set_charging_current_max =
  743. charger->charging_current_max;
  744. }
  745. if (charger->siop_level < 100 &&
  746. current_now > SIOP_CHARGING_LIMIT_CURRENT)
  747. current_now = SIOP_CHARGING_LIMIT_CURRENT;
  748. max77888_set_input_current(charger,
  749. set_charging_current_max);
  750. }
  751. max77888_set_charge_current(charger, current_now);
  752. }
  753. break;
  754. #if defined(CONFIG_BATTERY_SWELLING)
  755. case POWER_SUPPLY_PROP_VOLTAGE_MAX:
  756. pr_info("%s: float voltage(%d)\n", __func__, val->intval);
  757. reg_data = max77888_get_float_voltage_data(val->intval);
  758. max77888_update_reg(charger->max77888->i2c, MAX77888_CHG_REG_CHG_CNFG_04,
  759. (reg_data << CHG_CNFG_04_CHG_CV_PRM_SHIFT),
  760. CHG_CNFG_04_CHG_CV_PRM_MASK);
  761. max77888_read_reg(charger->max77888->i2c,
  762. MAX77888_CHG_REG_CHG_CNFG_04, &reg_data);
  763. pr_info("%s: battery cv voltage set to 0x%x\n", __func__, reg_data);
  764. break;
  765. #endif
  766. default:
  767. return -EINVAL;
  768. }
  769. return 0;
  770. }
  771. static u8 max77888_get_float_voltage_data(
  772. int float_voltage)
  773. {
  774. u8 data = 0x13;
  775. if (float_voltage == 4224)
  776. data = 0x14;
  777. else
  778. data = (float_voltage - 3725) / 25;
  779. return data;
  780. }
  781. static void max77888_charger_initialize(struct max77888_charger_data *charger)
  782. {
  783. u8 reg_data;
  784. pr_debug("%s\n", __func__);
  785. /* unmasked: CHGIN_I, WCIN_I, BATP_I, BYP_I */
  786. max77888_write_reg(charger->max77888->i2c,
  787. MAX77888_CHG_REG_CHG_INT_MASK, 0x9a);
  788. /* unlock charger setting protect */
  789. reg_data = (0x03 << 2);
  790. max77888_write_reg(charger->max77888->i2c,
  791. MAX77888_CHG_REG_CHG_CNFG_06, reg_data);
  792. /*
  793. * fast charge timer disable
  794. * restart threshold disable
  795. * pre-qual charge enable(default)
  796. */
  797. reg_data = (0x0 << 0) | (0x03 << 4);
  798. max77888_write_reg(charger->max77888->i2c,
  799. MAX77888_CHG_REG_CHG_CNFG_01, reg_data);
  800. /*
  801. * charge current 466mA(default)
  802. * otg current limit 900mA
  803. */
  804. max77888_read_reg(charger->max77888->i2c,
  805. MAX77888_CHG_REG_CHG_CNFG_02, &reg_data);
  806. reg_data |= (1 << 7);
  807. max77888_write_reg(charger->max77888->i2c,
  808. MAX77888_CHG_REG_CHG_CNFG_02, reg_data);
  809. /*
  810. * top off current 100mA
  811. * top off timer 70min
  812. */
  813. reg_data = (0x07 << 3);
  814. max77888_write_reg(charger->max77888->i2c,
  815. MAX77888_CHG_REG_CHG_CNFG_03, reg_data);
  816. /*
  817. * cv voltage 4.2V or 4.35V
  818. * MINVSYS 3.6V(default)
  819. */
  820. reg_data = max77888_get_float_voltage_data(charger->pdata->chg_float_voltage);
  821. max77888_update_reg(charger->max77888->i2c, MAX77888_CHG_REG_CHG_CNFG_04,
  822. (reg_data << CHG_CNFG_04_CHG_CV_PRM_SHIFT),
  823. CHG_CNFG_04_CHG_CV_PRM_MASK);
  824. max77888_read_reg(charger->max77888->i2c,
  825. MAX77888_CHG_REG_CHG_CNFG_04, &reg_data);
  826. pr_info("%s: battery CV voltage : %d(0x%x)\n", __func__, charger->pdata->chg_float_voltage, reg_data);
  827. max77888_dump_reg(charger);
  828. }
  829. static void sec_chg_isr_work(struct work_struct *work)
  830. {
  831. struct max77888_charger_data *charger =
  832. container_of(work, struct max77888_charger_data, isr_work.work);
  833. union power_supply_propval val;
  834. if (charger->pdata->full_check_type ==
  835. SEC_BATTERY_FULLCHARGED_CHGINT) {
  836. val.intval = max77888_get_charger_state(charger);
  837. switch (val.intval) {
  838. case POWER_SUPPLY_STATUS_DISCHARGING:
  839. pr_err("%s: Interrupted but Discharging\n", __func__);
  840. break;
  841. case POWER_SUPPLY_STATUS_NOT_CHARGING:
  842. pr_err("%s: Interrupted but NOT Charging\n", __func__);
  843. break;
  844. case POWER_SUPPLY_STATUS_FULL:
  845. pr_info("%s: Interrupted by Full\n", __func__);
  846. psy_do_property("battery", set,
  847. POWER_SUPPLY_PROP_STATUS, val);
  848. break;
  849. case POWER_SUPPLY_STATUS_CHARGING:
  850. pr_err("%s: Interrupted but Charging\n", __func__);
  851. break;
  852. case POWER_SUPPLY_STATUS_UNKNOWN:
  853. default:
  854. pr_err("%s: Invalid Charger Status\n", __func__);
  855. break;
  856. }
  857. }
  858. if (charger->pdata->ovp_uvlo_check_type ==
  859. SEC_BATTERY_OVP_UVLO_CHGINT) {
  860. val.intval = max77888_get_health_state(charger);
  861. switch (val.intval) {
  862. case POWER_SUPPLY_HEALTH_OVERHEAT:
  863. case POWER_SUPPLY_HEALTH_COLD:
  864. pr_err("%s: Interrupted but Hot/Cold\n", __func__);
  865. break;
  866. case POWER_SUPPLY_HEALTH_DEAD:
  867. pr_err("%s: Interrupted but Dead\n", __func__);
  868. break;
  869. case POWER_SUPPLY_HEALTH_OVERVOLTAGE:
  870. case POWER_SUPPLY_HEALTH_UNDERVOLTAGE:
  871. pr_info("%s: Interrupted by OVP/UVLO\n", __func__);
  872. psy_do_property("battery", set,
  873. POWER_SUPPLY_PROP_HEALTH, val);
  874. break;
  875. case POWER_SUPPLY_HEALTH_UNSPEC_FAILURE:
  876. pr_err("%s: Interrupted but Unspec\n", __func__);
  877. break;
  878. case POWER_SUPPLY_HEALTH_GOOD:
  879. pr_err("%s: Interrupted but Good\n", __func__);
  880. break;
  881. case POWER_SUPPLY_HEALTH_UNKNOWN:
  882. default:
  883. pr_err("%s: Invalid Charger Health\n", __func__);
  884. break;
  885. }
  886. }
  887. }
  888. static irqreturn_t sec_chg_irq_thread(int irq, void *irq_data)
  889. {
  890. struct max77888_charger_data *charger = irq_data;
  891. pr_info("%s: Charger interrupt occured\n", __func__);
  892. if ((charger->pdata->full_check_type ==
  893. SEC_BATTERY_FULLCHARGED_CHGINT) ||
  894. (charger->pdata->ovp_uvlo_check_type ==
  895. SEC_BATTERY_OVP_UVLO_CHGINT))
  896. schedule_delayed_work(&charger->isr_work, 0);
  897. return IRQ_HANDLED;
  898. }
  899. static irqreturn_t max77888_bypass_irq(int irq, void *data)
  900. {
  901. struct max77888_charger_data *chg_data = data;
  902. u8 dtls_02;
  903. u8 byp_dtls;
  904. u8 chg_cnfg_00;
  905. u8 vbus_state;
  906. pr_info("%s: irq(%d)\n", __func__, irq);
  907. /* check and unlock */
  908. check_charger_unlock_state(chg_data);
  909. max77888_read_reg(chg_data->max77888->i2c,
  910. MAX77888_CHG_REG_CHG_DTLS_02,
  911. &dtls_02);
  912. byp_dtls = ((dtls_02 & MAX77888_BYP_DTLS) >>
  913. MAX77888_BYP_DTLS_SHIFT);
  914. pr_info("%s: BYP_DTLS(0x%02x)\n", __func__, byp_dtls);
  915. vbus_state = max77888_get_vbus_state(chg_data);
  916. if (byp_dtls & 0x1) {
  917. pr_info("%s: bypass overcurrent limit\n", __func__);
  918. #ifdef CONFIG_USB_HOST_NOTIFY
  919. sec_otg_notify(HNOTIFY_OVERCURRENT);
  920. #endif
  921. /* disable the register values just related to OTG and
  922. keep the values about the charging */
  923. max77888_read_reg(chg_data->max77888->i2c,
  924. MAX77888_CHG_REG_CHG_CNFG_00, &chg_cnfg_00);
  925. chg_cnfg_00 &= ~(CHG_CNFG_00_OTG_MASK
  926. | CHG_CNFG_00_BOOST_MASK
  927. | CHG_CNFG_00_DIS_MUIC_CTRL_MASK);
  928. max77888_write_reg(chg_data->max77888->i2c,
  929. MAX77888_CHG_REG_CHG_CNFG_00,
  930. chg_cnfg_00);
  931. }
  932. if ((byp_dtls & 0x8) && (vbus_state < 0x03)) {
  933. reduce_input_current(chg_data, REDUCE_CURRENT_STEP);
  934. }
  935. return IRQ_HANDLED;
  936. }
  937. static void max77888_chgin_isr_work(struct work_struct *work)
  938. {
  939. struct max77888_charger_data *charger = container_of(work,
  940. struct max77888_charger_data, chgin_work);
  941. u8 chgin_dtls, chg_dtls, chg_cnfg_00, reg_data;
  942. u8 prev_chgin_dtls = 0xff;
  943. int battery_health;
  944. union power_supply_propval value;
  945. int stable_count = 0;
  946. wake_lock(&charger->chgin_wake_lock);
  947. max77888_read_reg(charger->max77888->i2c,
  948. MAX77888_CHG_REG_CHG_INT_MASK, &reg_data);
  949. reg_data |= (1 << 6);
  950. max77888_write_reg(charger->max77888->i2c,
  951. MAX77888_CHG_REG_CHG_INT_MASK, reg_data);
  952. while (1) {
  953. psy_do_property("battery", get,
  954. POWER_SUPPLY_PROP_HEALTH, value);
  955. battery_health = value.intval;
  956. max77888_read_reg(charger->max77888->i2c,
  957. MAX77888_CHG_REG_CHG_DTLS_00,
  958. &chgin_dtls);
  959. chgin_dtls = ((chgin_dtls & MAX77888_CHGIN_DTLS) >>
  960. MAX77888_CHGIN_DTLS_SHIFT);
  961. max77888_read_reg(charger->max77888->i2c,
  962. MAX77888_CHG_REG_CHG_DTLS_01, &chg_dtls);
  963. chg_dtls = ((chg_dtls & MAX77888_CHG_DTLS) >>
  964. MAX77888_CHG_DTLS_SHIFT);
  965. max77888_read_reg(charger->max77888->i2c,
  966. MAX77888_CHG_REG_CHG_CNFG_00, &chg_cnfg_00);
  967. if (prev_chgin_dtls == chgin_dtls)
  968. stable_count++;
  969. else
  970. stable_count = 0;
  971. if (stable_count > 10) {
  972. pr_info("%s: irq(%d), chgin(0x%x), chg_dtls(0x%x) prev 0x%x\n",
  973. __func__, charger->irq_chgin,
  974. chgin_dtls, chg_dtls, prev_chgin_dtls);
  975. if (charger->is_charging) {
  976. if ((chgin_dtls == 0x02) && \
  977. (battery_health != POWER_SUPPLY_HEALTH_OVERVOLTAGE)) {
  978. pr_info("%s: charger is over voltage\n",
  979. __func__);
  980. value.intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
  981. psy_do_property("battery", set,
  982. POWER_SUPPLY_PROP_HEALTH, value);
  983. } else if (((chgin_dtls == 0x0) || (chgin_dtls == 0x01)) &&(chg_dtls & 0x08) && \
  984. (chg_cnfg_00 & MAX77888_MODE_BUCK) && \
  985. (chg_cnfg_00 & MAX77888_MODE_CHGR) && \
  986. (battery_health != POWER_SUPPLY_HEALTH_UNDERVOLTAGE)) {
  987. pr_info("%s, vbus_state : 0x%d, chg_state : 0x%d\n", __func__, chgin_dtls, chg_dtls);
  988. pr_info("%s: vBus is undervoltage\n", __func__);
  989. value.intval = POWER_SUPPLY_HEALTH_UNDERVOLTAGE;
  990. psy_do_property("battery", set,
  991. POWER_SUPPLY_PROP_HEALTH, value);
  992. }
  993. } else {
  994. if ((battery_health == \
  995. POWER_SUPPLY_HEALTH_OVERVOLTAGE) &&
  996. (chgin_dtls != 0x02)) {
  997. pr_info("%s: vbus_state : 0x%d, chg_state : 0x%d\n", __func__, chgin_dtls, chg_dtls);
  998. pr_info("%s: overvoltage->normal\n", __func__);
  999. value.intval = POWER_SUPPLY_HEALTH_GOOD;
  1000. psy_do_property("battery", set,
  1001. POWER_SUPPLY_PROP_HEALTH, value);
  1002. } else if ((battery_health == \
  1003. POWER_SUPPLY_HEALTH_UNDERVOLTAGE) &&
  1004. !((chgin_dtls == 0x0) || (chgin_dtls == 0x01))){
  1005. pr_info("%s: vbus_state : 0x%d, chg_state : 0x%d\n", __func__, chgin_dtls, chg_dtls);
  1006. pr_info("%s: undervoltage->normal\n", __func__);
  1007. value.intval = POWER_SUPPLY_HEALTH_GOOD;
  1008. psy_do_property("battery", set,
  1009. POWER_SUPPLY_PROP_HEALTH, value);
  1010. max77888_set_input_current(charger,
  1011. charger->charging_current_max);
  1012. }
  1013. }
  1014. break;
  1015. }
  1016. if (charger->is_charging) {
  1017. /* reduce only at CC MODE */
  1018. if (((chgin_dtls == 0x0) || (chgin_dtls == 0x01)) &&
  1019. (chg_dtls == 0x01) && (stable_count > 2))
  1020. reduce_input_current(charger, REDUCE_CURRENT_STEP);
  1021. }
  1022. prev_chgin_dtls = chgin_dtls;
  1023. msleep(100);
  1024. }
  1025. max77888_read_reg(charger->max77888->i2c,
  1026. MAX77888_CHG_REG_CHG_INT_MASK, &reg_data);
  1027. reg_data &= ~(1 << 6);
  1028. max77888_write_reg(charger->max77888->i2c,
  1029. MAX77888_CHG_REG_CHG_INT_MASK, reg_data);
  1030. wake_unlock(&charger->chgin_wake_lock);
  1031. }
  1032. static irqreturn_t max77888_chgin_irq(int irq, void *data)
  1033. {
  1034. struct max77888_charger_data *charger = data;
  1035. queue_work(charger->wqueue, &charger->chgin_work);
  1036. return IRQ_HANDLED;
  1037. }
  1038. static int max77888_debugfs_show(struct seq_file *s, void *data)
  1039. {
  1040. struct max77888_charger_data *charger = s->private;
  1041. u8 reg;
  1042. u8 reg_data;
  1043. seq_printf(s, "MAX77888 CHARGER IC :\n");
  1044. seq_printf(s, "==================\n");
  1045. for (reg = 0xB0; reg <= 0xC5; reg++) {
  1046. max77888_read_reg(charger->max77888->i2c, reg, &reg_data);
  1047. seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
  1048. }
  1049. seq_printf(s, "\n");
  1050. return 0;
  1051. }
  1052. static int max77888_debugfs_open(struct inode *inode, struct file *file)
  1053. {
  1054. return single_open(file, max77888_debugfs_show, inode->i_private);
  1055. }
  1056. static const struct file_operations max77888_debugfs_fops = {
  1057. .open = max77888_debugfs_open,
  1058. .read = seq_read,
  1059. .llseek = seq_lseek,
  1060. .release = single_release,
  1061. };
  1062. /* register chgin isr after sec_battery_probe */
  1063. static void max77888_chgin_init_work(struct work_struct *work)
  1064. {
  1065. struct max77888_charger_data *charger = container_of(work,
  1066. struct max77888_charger_data,
  1067. chgin_init_work.work);
  1068. int ret;
  1069. pr_info("%s \n", __func__);
  1070. ret = request_threaded_irq(charger->irq_chgin, NULL,
  1071. max77888_chgin_irq, 0, "chgin-irq", charger);
  1072. if (ret < 0) {
  1073. pr_err("%s: fail to request chgin IRQ: %d: %d\n",
  1074. __func__, charger->irq_chgin, ret);
  1075. }
  1076. }
  1077. #ifdef CONFIG_OF
  1078. static int sec_charger_read_u32_index_dt(const struct device_node *np,
  1079. const char *propname,
  1080. u32 index, u32 *out_value)
  1081. {
  1082. struct property *prop = of_find_property(np, propname, NULL);
  1083. u32 len = (index + 1) * sizeof(*out_value);
  1084. if (!prop)
  1085. return (-EINVAL);
  1086. if (!prop->value)
  1087. return (-ENODATA);
  1088. if (len > prop->length)
  1089. return (-EOVERFLOW);
  1090. *out_value = be32_to_cpup(((__be32 *)prop->value) + index);
  1091. return 0;
  1092. }
  1093. static int sec_charger_parse_dt(struct max77888_charger_data *charger)
  1094. {
  1095. struct device_node *np = of_find_node_by_name(NULL, "charger");
  1096. sec_battery_platform_data_t *pdata = charger->pdata;
  1097. int ret = 0;
  1098. int len;
  1099. if (np == NULL) {
  1100. pr_err("%s np NULL\n", __func__);
  1101. } else {
  1102. int i;
  1103. ret = of_property_read_u32(np, "battery,chg_float_voltage",
  1104. &pdata->chg_float_voltage);
  1105. if (ret < 0)
  1106. pr_err("%s error reading battery,chg_float_voltage %d\n", __func__, ret);
  1107. ret = of_property_read_u32(np, "battery,ovp_uvlo_check_type",
  1108. &pdata->ovp_uvlo_check_type);
  1109. if (ret < 0)
  1110. pr_err("%s error reading battery,ovp_uvlo_check_type %d\n", __func__, ret);
  1111. ret = of_property_read_u32(np, "battery,full_check_type",
  1112. &pdata->full_check_type);
  1113. if (ret < 0)
  1114. pr_err("%s error reading battery,full_check_type %d\n", __func__, ret);
  1115. of_get_property(np, "battery,input_current_limit", &len);
  1116. len = len / sizeof(u32);
  1117. pdata->charging_current = kzalloc(sizeof(sec_charging_current_t) * len,
  1118. GFP_KERNEL);
  1119. for(i = 0; i < len; i++) {
  1120. ret = sec_charger_read_u32_index_dt(np,
  1121. "battery,input_current_limit", i,
  1122. &pdata->charging_current[i].input_current_limit);
  1123. if (ret < 0)
  1124. pr_err("%s error reading battery,input_current_limit %d\n", __func__, ret);
  1125. ret = sec_charger_read_u32_index_dt(np,
  1126. "battery,fast_charging_current", i,
  1127. &pdata->charging_current[i].fast_charging_current);
  1128. if (ret < 0)
  1129. pr_err("%s error reading battery,fast_charging_current %d\n", __func__, ret);
  1130. ret = sec_charger_read_u32_index_dt(np,
  1131. "battery,full_check_current_1st", i,
  1132. &pdata->charging_current[i].full_check_current_1st);
  1133. if (ret < 0)
  1134. pr_err("%s error reading battery,full_check_current_1st %d\n", __func__, ret);
  1135. ret = sec_charger_read_u32_index_dt(np,
  1136. "battery,full_check_current_2nd", i,
  1137. &pdata->charging_current[i].full_check_current_2nd);
  1138. if (ret < 0)
  1139. pr_err("%s error reading battery,full_check_current_2nd %d\n", __func__, ret);
  1140. }
  1141. #if defined(CONFIG_MACH_MONDRIAN)
  1142. /* check battery company*/
  1143. if(sec_bat_check_battery_company() == BATT_TYPE_SDI) {
  1144. for(i = 0; i < len; i++) {
  1145. ret = sec_charger_read_u32_index_dt(np,
  1146. "battery,full_check_current_1st_sdi", i,
  1147. &pdata->charging_current[i].full_check_current_1st);
  1148. if (ret < 0)
  1149. pr_err("%s error reading battery,full_check_current_1st %d\n", __func__, ret);
  1150. }
  1151. }
  1152. #endif
  1153. }
  1154. return ret;
  1155. }
  1156. #endif
  1157. static __devinit int max77888_charger_probe(struct platform_device *pdev)
  1158. {
  1159. struct max77888_dev *iodev = dev_get_drvdata(pdev->dev.parent);
  1160. struct max77888_platform_data *pdata = dev_get_platdata(iodev->dev);
  1161. struct max77888_charger_data *charger;
  1162. int ret = 0;
  1163. u8 reg_data;
  1164. pr_info("%s: MAX77888 Charger driver probe\n", __func__);
  1165. charger = kzalloc(sizeof(*charger), GFP_KERNEL);
  1166. if (!charger)
  1167. return -ENOMEM;
  1168. pdata->charger_data = kzalloc(sizeof(sec_battery_platform_data_t), GFP_KERNEL);
  1169. if (!pdata->charger_data)
  1170. return -ENOMEM;
  1171. charger->max77888 = iodev;
  1172. charger->pdata = pdata->charger_data;
  1173. charger->aicl_on = false;
  1174. charger->siop_level = 100;
  1175. #ifdef CONFIG_OF
  1176. if (sec_charger_parse_dt(charger))
  1177. dev_err(&pdev->dev,
  1178. "%s : Failed to get charger int\n", __func__);
  1179. #endif
  1180. platform_set_drvdata(pdev, charger);
  1181. charger->psy_chg.name = "sec-charger";
  1182. charger->psy_chg.type = POWER_SUPPLY_TYPE_UNKNOWN;
  1183. charger->psy_chg.get_property = sec_chg_get_property;
  1184. charger->psy_chg.set_property = sec_chg_set_property;
  1185. charger->psy_chg.properties = sec_charger_props;
  1186. charger->psy_chg.num_properties = ARRAY_SIZE(sec_charger_props);
  1187. mutex_init(&charger->ops_lock);
  1188. if (charger->pdata->chg_gpio_init) {
  1189. if (!charger->pdata->chg_gpio_init()) {
  1190. pr_err("%s: Failed to Initialize GPIO\n", __func__);
  1191. goto err_free;
  1192. }
  1193. }
  1194. max77888_charger_initialize(charger);
  1195. if (max77888_read_reg(charger->max77888->i2c, MAX77888_PMIC_REG_PMIC_ID1, &reg_data) < 0) {
  1196. pr_err("device not found on this channel (this is not an error)\n");
  1197. ret = -ENODEV;
  1198. goto err_free;
  1199. } else {
  1200. charger->pmic_ver = (reg_data & 0xf);
  1201. pr_info("%s: device found: ver.0x%x\n", __func__,
  1202. charger->pmic_ver);
  1203. }
  1204. charger->input_curr_limit_step = 25;
  1205. charger->charging_curr_step= 400; // 0.1mA unit
  1206. charger->wqueue =
  1207. create_singlethread_workqueue(dev_name(&pdev->dev));
  1208. if (!charger->wqueue) {
  1209. pr_err("%s: Fail to Create Workqueue\n", __func__);
  1210. goto err_free;
  1211. }
  1212. wake_lock_init(&charger->chgin_wake_lock, WAKE_LOCK_SUSPEND,
  1213. "charger-chgin");
  1214. INIT_WORK(&charger->chgin_work, max77888_chgin_isr_work);
  1215. INIT_DELAYED_WORK(&charger->chgin_init_work, max77888_chgin_init_work);
  1216. ret = power_supply_register(&pdev->dev, &charger->psy_chg);
  1217. if (ret) {
  1218. pr_err("%s: Failed to Register psy_chg\n", __func__);
  1219. goto err_power_supply_register;
  1220. }
  1221. if (charger->pdata->chg_irq) {
  1222. INIT_DELAYED_WORK_DEFERRABLE(
  1223. &charger->isr_work, sec_chg_isr_work);
  1224. ret = request_threaded_irq(charger->pdata->chg_irq,
  1225. NULL, sec_chg_irq_thread,
  1226. charger->pdata->chg_irq_attr,
  1227. "charger-irq", charger);
  1228. if (ret) {
  1229. pr_err("%s: Failed to Reqeust IRQ\n", __func__);
  1230. goto err_irq;
  1231. }
  1232. }
  1233. charger->irq_chgin = pdata->irq_base + MAX77888_CHG_IRQ_CHGIN_I;
  1234. /* enable chgin irq after sec_battery_probe */
  1235. queue_delayed_work(charger->wqueue, &charger->chgin_init_work,
  1236. msecs_to_jiffies(3000));
  1237. charger->irq_bypass = pdata->irq_base + MAX77888_CHG_IRQ_BYP_I;
  1238. ret = request_threaded_irq(charger->irq_bypass, NULL,
  1239. max77888_bypass_irq, 0, "bypass-irq", charger);
  1240. if (ret < 0)
  1241. pr_err("%s: fail to request bypass IRQ: %d: %d\n",
  1242. __func__, charger->irq_bypass, ret);
  1243. max77888_dentry = debugfs_create_file("max77888-regs",
  1244. S_IRUSR, NULL, charger, &max77888_debugfs_fops);
  1245. return 0;
  1246. err_irq:
  1247. power_supply_unregister(&charger->psy_chg);
  1248. err_power_supply_register:
  1249. destroy_workqueue(charger->wqueue);
  1250. err_free:
  1251. kfree(charger);
  1252. return ret;
  1253. }
  1254. static int __devexit max77888_charger_remove(struct platform_device *pdev)
  1255. {
  1256. struct max77888_charger_data *charger =
  1257. platform_get_drvdata(pdev);
  1258. destroy_workqueue(charger->wqueue);
  1259. free_irq(charger->pdata->chg_irq, NULL);
  1260. power_supply_unregister(&charger->psy_chg);
  1261. kfree(charger);
  1262. return 0;
  1263. }
  1264. #if defined CONFIG_PM
  1265. static int max77888_charger_suspend(struct device *dev)
  1266. {
  1267. return 0;
  1268. }
  1269. static int max77888_charger_resume(struct device *dev)
  1270. {
  1271. return 0;
  1272. }
  1273. #else
  1274. #define max77888_charger_suspend NULL
  1275. #define max77888_charger_resume NULL
  1276. #endif
  1277. static void max77888_charger_shutdown(struct device *dev)
  1278. {
  1279. struct max77888_charger_data *charger = dev_get_drvdata(dev);
  1280. u8 reg_data;
  1281. pr_info("%s: MAX77888 Charger driver shutdown\n", __func__);
  1282. if (!charger->max77888->i2c) {
  1283. pr_err("%s: no max77888 i2c client\n", __func__);
  1284. return;
  1285. }
  1286. reg_data = 0x04;
  1287. max77888_write_reg(charger->max77888->i2c,
  1288. MAX77888_CHG_REG_CHG_CNFG_00, reg_data);
  1289. reg_data = 0x19;
  1290. max77888_write_reg(charger->max77888->i2c,
  1291. MAX77888_CHG_REG_CHG_CNFG_09, reg_data);
  1292. reg_data = 0x19;
  1293. max77888_write_reg(charger->max77888->i2c,
  1294. MAX77888_CHG_REG_CHG_CNFG_10, reg_data);
  1295. pr_info("func:%s \n", __func__);
  1296. }
  1297. static SIMPLE_DEV_PM_OPS(max77888_charger_pm_ops, max77888_charger_suspend,
  1298. max77888_charger_resume);
  1299. static struct platform_driver max77888_charger_driver = {
  1300. .driver = {
  1301. .name = "max77888-charger",
  1302. .owner = THIS_MODULE,
  1303. .pm = &max77888_charger_pm_ops,
  1304. .shutdown = max77888_charger_shutdown,
  1305. },
  1306. .probe = max77888_charger_probe,
  1307. .remove = __devexit_p(max77888_charger_remove),
  1308. };
  1309. static int __init max77888_charger_init(void)
  1310. {
  1311. pr_info("func:%s\n", __func__);
  1312. return platform_driver_register(&max77888_charger_driver);
  1313. }
  1314. module_init(max77888_charger_init);
  1315. static void __exit max77888_charger_exit(void)
  1316. {
  1317. platform_driver_register(&max77888_charger_driver);
  1318. }
  1319. module_exit(max77888_charger_exit);
  1320. MODULE_DESCRIPTION("max77888 charger driver");
  1321. MODULE_AUTHOR("Samsung Electronics");
  1322. MODULE_LICENSE("GPL");