cpcap-charger.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Motorola CPCAP PMIC battery charger driver
  4. *
  5. * Copyright (C) 2017 Tony Lindgren <tony@atomide.com>
  6. *
  7. * Rewritten for Linux power framework with some parts based on
  8. * earlier driver found in the Motorola Linux kernel:
  9. *
  10. * Copyright (C) 2009-2010 Motorola, Inc.
  11. */
  12. #include <linux/atomic.h>
  13. #include <linux/init.h>
  14. #include <linux/module.h>
  15. #include <linux/slab.h>
  16. #include <linux/err.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/notifier.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/power_supply.h>
  22. #include <linux/regmap.h>
  23. #include <linux/gpio/consumer.h>
  24. #include <linux/usb/phy_companion.h>
  25. #include <linux/phy/omap_usb.h>
  26. #include <linux/usb/otg.h>
  27. #include <linux/iio/consumer.h>
  28. #include <linux/mfd/motorola-cpcap.h>
  29. /*
  30. * CPCAP_REG_CRM register bits. For documentation of somewhat similar hardware,
  31. * see NXP "MC13783 Power Management and Audio Circuit Users's Guide"
  32. * MC13783UG.pdf chapter "8.5 Battery Interface Register Summary". The registers
  33. * and values for CPCAP are different, but some of the internal components seem
  34. * similar. Also see the Motorola Linux kernel cpcap-regbits.h. CPCAP_REG_CHRGR_1
  35. * bits that seem to describe the CRM register.
  36. */
  37. #define CPCAP_REG_CRM_UNUSED_641_15 BIT(15) /* 641 = register number */
  38. #define CPCAP_REG_CRM_UNUSED_641_14 BIT(14) /* 641 = register number */
  39. #define CPCAP_REG_CRM_CHRG_LED_EN BIT(13) /* Charger LED */
  40. #define CPCAP_REG_CRM_RVRSMODE BIT(12) /* USB VBUS output enable */
  41. #define CPCAP_REG_CRM_ICHRG_TR1 BIT(11) /* Trickle charge current */
  42. #define CPCAP_REG_CRM_ICHRG_TR0 BIT(10)
  43. #define CPCAP_REG_CRM_FET_OVRD BIT(9) /* 0 = hardware, 1 = FET_CTRL */
  44. #define CPCAP_REG_CRM_FET_CTRL BIT(8) /* BPFET 1 if FET_OVRD set */
  45. #define CPCAP_REG_CRM_VCHRG3 BIT(7) /* Charge voltage bits */
  46. #define CPCAP_REG_CRM_VCHRG2 BIT(6)
  47. #define CPCAP_REG_CRM_VCHRG1 BIT(5)
  48. #define CPCAP_REG_CRM_VCHRG0 BIT(4)
  49. #define CPCAP_REG_CRM_ICHRG3 BIT(3) /* Charge current bits */
  50. #define CPCAP_REG_CRM_ICHRG2 BIT(2)
  51. #define CPCAP_REG_CRM_ICHRG1 BIT(1)
  52. #define CPCAP_REG_CRM_ICHRG0 BIT(0)
  53. /* CPCAP_REG_CRM trickle charge voltages */
  54. #define CPCAP_REG_CRM_TR(val) (((val) & 0x3) << 10)
  55. #define CPCAP_REG_CRM_TR_0A00 CPCAP_REG_CRM_TR(0x0)
  56. #define CPCAP_REG_CRM_TR_0A24 CPCAP_REG_CRM_TR(0x1)
  57. #define CPCAP_REG_CRM_TR_0A48 CPCAP_REG_CRM_TR(0x2)
  58. #define CPCAP_REG_CRM_TR_0A72 CPCAP_REG_CRM_TR(0x4)
  59. /*
  60. * CPCAP_REG_CRM charge voltages based on the ADC channel 1 values.
  61. * Note that these register bits don't match MC13783UG.pdf VCHRG
  62. * register bits.
  63. */
  64. #define CPCAP_REG_CRM_VCHRG(val) (((val) & 0xf) << 4)
  65. #define CPCAP_REG_CRM_VCHRG_3V80 CPCAP_REG_CRM_VCHRG(0x0)
  66. #define CPCAP_REG_CRM_VCHRG_4V10 CPCAP_REG_CRM_VCHRG(0x1)
  67. #define CPCAP_REG_CRM_VCHRG_4V12 CPCAP_REG_CRM_VCHRG(0x2)
  68. #define CPCAP_REG_CRM_VCHRG_4V15 CPCAP_REG_CRM_VCHRG(0x3)
  69. #define CPCAP_REG_CRM_VCHRG_4V17 CPCAP_REG_CRM_VCHRG(0x4)
  70. #define CPCAP_REG_CRM_VCHRG_4V20 CPCAP_REG_CRM_VCHRG(0x5)
  71. #define CPCAP_REG_CRM_VCHRG_4V23 CPCAP_REG_CRM_VCHRG(0x6)
  72. #define CPCAP_REG_CRM_VCHRG_4V25 CPCAP_REG_CRM_VCHRG(0x7)
  73. #define CPCAP_REG_CRM_VCHRG_4V27 CPCAP_REG_CRM_VCHRG(0x8)
  74. #define CPCAP_REG_CRM_VCHRG_4V30 CPCAP_REG_CRM_VCHRG(0x9)
  75. #define CPCAP_REG_CRM_VCHRG_4V33 CPCAP_REG_CRM_VCHRG(0xa)
  76. #define CPCAP_REG_CRM_VCHRG_4V35 CPCAP_REG_CRM_VCHRG(0xb)
  77. #define CPCAP_REG_CRM_VCHRG_4V38 CPCAP_REG_CRM_VCHRG(0xc)
  78. #define CPCAP_REG_CRM_VCHRG_4V40 CPCAP_REG_CRM_VCHRG(0xd)
  79. #define CPCAP_REG_CRM_VCHRG_4V42 CPCAP_REG_CRM_VCHRG(0xe)
  80. #define CPCAP_REG_CRM_VCHRG_4V44 CPCAP_REG_CRM_VCHRG(0xf)
  81. /*
  82. * CPCAP_REG_CRM charge currents. These seem to match MC13783UG.pdf
  83. * values in "Table 8-3. Charge Path Regulator Current Limit
  84. * Characteristics" for the nominal values.
  85. *
  86. * Except 70mA and 1.596A and unlimited, these are simply 88.7mA / step.
  87. */
  88. #define CPCAP_REG_CRM_ICHRG(val) (((val) & 0xf) << 0)
  89. #define CPCAP_REG_CRM_ICHRG_0A000 CPCAP_REG_CRM_ICHRG(0x0)
  90. #define CPCAP_REG_CRM_ICHRG_0A070 CPCAP_REG_CRM_ICHRG(0x1)
  91. #define CPCAP_REG_CRM_ICHRG_0A177 CPCAP_REG_CRM_ICHRG(0x2)
  92. #define CPCAP_REG_CRM_ICHRG_0A266 CPCAP_REG_CRM_ICHRG(0x3)
  93. #define CPCAP_REG_CRM_ICHRG_0A355 CPCAP_REG_CRM_ICHRG(0x4)
  94. #define CPCAP_REG_CRM_ICHRG_0A443 CPCAP_REG_CRM_ICHRG(0x5)
  95. #define CPCAP_REG_CRM_ICHRG_0A532 CPCAP_REG_CRM_ICHRG(0x6)
  96. #define CPCAP_REG_CRM_ICHRG_0A621 CPCAP_REG_CRM_ICHRG(0x7)
  97. #define CPCAP_REG_CRM_ICHRG_0A709 CPCAP_REG_CRM_ICHRG(0x8)
  98. #define CPCAP_REG_CRM_ICHRG_0A798 CPCAP_REG_CRM_ICHRG(0x9)
  99. #define CPCAP_REG_CRM_ICHRG_0A886 CPCAP_REG_CRM_ICHRG(0xa)
  100. #define CPCAP_REG_CRM_ICHRG_0A975 CPCAP_REG_CRM_ICHRG(0xb)
  101. #define CPCAP_REG_CRM_ICHRG_1A064 CPCAP_REG_CRM_ICHRG(0xc)
  102. #define CPCAP_REG_CRM_ICHRG_1A152 CPCAP_REG_CRM_ICHRG(0xd)
  103. #define CPCAP_REG_CRM_ICHRG_1A596 CPCAP_REG_CRM_ICHRG(0xe)
  104. #define CPCAP_REG_CRM_ICHRG_NO_LIMIT CPCAP_REG_CRM_ICHRG(0xf)
  105. /* CPCAP_REG_VUSBC register bits needed for VBUS */
  106. #define CPCAP_BIT_VBUS_SWITCH BIT(0) /* VBUS boost to 5V */
  107. enum {
  108. CPCAP_CHARGER_IIO_BATTDET,
  109. CPCAP_CHARGER_IIO_VOLTAGE,
  110. CPCAP_CHARGER_IIO_VBUS,
  111. CPCAP_CHARGER_IIO_CHRG_CURRENT,
  112. CPCAP_CHARGER_IIO_BATT_CURRENT,
  113. CPCAP_CHARGER_IIO_NR,
  114. };
  115. struct cpcap_charger_ddata {
  116. struct device *dev;
  117. struct regmap *reg;
  118. struct list_head irq_list;
  119. struct delayed_work detect_work;
  120. struct delayed_work vbus_work;
  121. struct gpio_desc *gpio[2]; /* gpio_reven0 & 1 */
  122. struct iio_channel *channels[CPCAP_CHARGER_IIO_NR];
  123. struct power_supply *usb;
  124. struct phy_companion comparator; /* For USB VBUS */
  125. unsigned int vbus_enabled:1;
  126. unsigned int feeding_vbus:1;
  127. atomic_t active;
  128. int status;
  129. int voltage;
  130. int limit_current;
  131. };
  132. struct cpcap_interrupt_desc {
  133. int irq;
  134. struct list_head node;
  135. const char *name;
  136. };
  137. struct cpcap_charger_ints_state {
  138. bool chrg_det;
  139. bool rvrs_chrg;
  140. bool vbusov;
  141. bool chrg_se1b;
  142. bool rvrs_mode;
  143. bool chrgcurr2;
  144. bool chrgcurr1;
  145. bool vbusvld;
  146. bool battdetb;
  147. };
  148. static enum power_supply_property cpcap_charger_props[] = {
  149. POWER_SUPPLY_PROP_STATUS,
  150. POWER_SUPPLY_PROP_ONLINE,
  151. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
  152. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
  153. POWER_SUPPLY_PROP_VOLTAGE_NOW,
  154. POWER_SUPPLY_PROP_CURRENT_NOW,
  155. };
  156. static int cpcap_charger_get_charge_voltage(struct cpcap_charger_ddata *ddata)
  157. {
  158. struct iio_channel *channel;
  159. int error, value = 0;
  160. channel = ddata->channels[CPCAP_CHARGER_IIO_VOLTAGE];
  161. error = iio_read_channel_processed(channel, &value);
  162. if (error < 0) {
  163. dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
  164. return 0;
  165. }
  166. return value;
  167. }
  168. static int cpcap_charger_get_charge_current(struct cpcap_charger_ddata *ddata)
  169. {
  170. struct iio_channel *channel;
  171. int error, value = 0;
  172. channel = ddata->channels[CPCAP_CHARGER_IIO_CHRG_CURRENT];
  173. error = iio_read_channel_processed(channel, &value);
  174. if (error < 0) {
  175. dev_warn(ddata->dev, "%s failed: %i\n", __func__, error);
  176. return 0;
  177. }
  178. return value;
  179. }
  180. static int cpcap_charger_get_property(struct power_supply *psy,
  181. enum power_supply_property psp,
  182. union power_supply_propval *val)
  183. {
  184. struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
  185. switch (psp) {
  186. case POWER_SUPPLY_PROP_STATUS:
  187. val->intval = ddata->status;
  188. break;
  189. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  190. val->intval = ddata->limit_current;
  191. break;
  192. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  193. val->intval = ddata->voltage;
  194. break;
  195. case POWER_SUPPLY_PROP_VOLTAGE_NOW:
  196. if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
  197. val->intval = cpcap_charger_get_charge_voltage(ddata) *
  198. 1000;
  199. else
  200. val->intval = 0;
  201. break;
  202. case POWER_SUPPLY_PROP_CURRENT_NOW:
  203. if (ddata->status == POWER_SUPPLY_STATUS_CHARGING)
  204. val->intval = cpcap_charger_get_charge_current(ddata) *
  205. 1000;
  206. else
  207. val->intval = 0;
  208. break;
  209. case POWER_SUPPLY_PROP_ONLINE:
  210. val->intval = ddata->status == POWER_SUPPLY_STATUS_CHARGING;
  211. break;
  212. default:
  213. return -EINVAL;
  214. }
  215. return 0;
  216. }
  217. static int cpcap_charger_match_voltage(int voltage)
  218. {
  219. switch (voltage) {
  220. case 0 ... 4100000 - 1: return 3800000;
  221. case 4100000 ... 4120000 - 1: return 4100000;
  222. case 4120000 ... 4150000 - 1: return 4120000;
  223. case 4150000 ... 4170000 - 1: return 4150000;
  224. case 4170000 ... 4200000 - 1: return 4170000;
  225. case 4200000 ... 4230000 - 1: return 4200000;
  226. case 4230000 ... 4250000 - 1: return 4230000;
  227. case 4250000 ... 4270000 - 1: return 4250000;
  228. case 4270000 ... 4300000 - 1: return 4270000;
  229. case 4300000 ... 4330000 - 1: return 4300000;
  230. case 4330000 ... 4350000 - 1: return 4330000;
  231. case 4350000 ... 4380000 - 1: return 4350000;
  232. case 4380000 ... 4400000 - 1: return 4380000;
  233. case 4400000 ... 4420000 - 1: return 4400000;
  234. case 4420000 ... 4440000 - 1: return 4420000;
  235. case 4440000: return 4440000;
  236. default: return 0;
  237. }
  238. }
  239. static int
  240. cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata)
  241. {
  242. union power_supply_propval prop;
  243. struct power_supply *battery;
  244. int voltage = ddata->voltage;
  245. int error;
  246. battery = power_supply_get_by_name("battery");
  247. if (battery) {
  248. error = power_supply_get_property(battery,
  249. POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE,
  250. &prop);
  251. if (!error)
  252. voltage = prop.intval;
  253. power_supply_put(battery);
  254. }
  255. return voltage;
  256. }
  257. static int cpcap_charger_current_to_regval(int microamp)
  258. {
  259. int miliamp = microamp / 1000;
  260. int res;
  261. if (miliamp < 0)
  262. return -EINVAL;
  263. if (miliamp < 70)
  264. return CPCAP_REG_CRM_ICHRG(0x0);
  265. if (miliamp < 177)
  266. return CPCAP_REG_CRM_ICHRG(0x1);
  267. if (miliamp >= 1596)
  268. return CPCAP_REG_CRM_ICHRG(0xe);
  269. res = microamp / 88666;
  270. if (res > 0xd)
  271. res = 0xd;
  272. return CPCAP_REG_CRM_ICHRG(res);
  273. }
  274. static int cpcap_charger_set_property(struct power_supply *psy,
  275. enum power_supply_property psp,
  276. const union power_supply_propval *val)
  277. {
  278. struct cpcap_charger_ddata *ddata = dev_get_drvdata(psy->dev.parent);
  279. int voltage, batvolt;
  280. switch (psp) {
  281. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  282. if (cpcap_charger_current_to_regval(val->intval) < 0)
  283. return -EINVAL;
  284. ddata->limit_current = val->intval;
  285. schedule_delayed_work(&ddata->detect_work, 0);
  286. break;
  287. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  288. voltage = cpcap_charger_match_voltage(val->intval);
  289. batvolt = cpcap_charger_get_bat_const_charge_voltage(ddata);
  290. if (voltage > batvolt)
  291. voltage = batvolt;
  292. ddata->voltage = voltage;
  293. schedule_delayed_work(&ddata->detect_work, 0);
  294. break;
  295. default:
  296. return -EINVAL;
  297. }
  298. return 0;
  299. }
  300. static int cpcap_charger_property_is_writeable(struct power_supply *psy,
  301. enum power_supply_property psp)
  302. {
  303. switch (psp) {
  304. case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
  305. case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
  306. return 1;
  307. default:
  308. return 0;
  309. }
  310. }
  311. static void cpcap_charger_set_cable_path(struct cpcap_charger_ddata *ddata,
  312. bool enabled)
  313. {
  314. if (!ddata->gpio[0])
  315. return;
  316. gpiod_set_value(ddata->gpio[0], enabled);
  317. }
  318. static void cpcap_charger_set_inductive_path(struct cpcap_charger_ddata *ddata,
  319. bool enabled)
  320. {
  321. if (!ddata->gpio[1])
  322. return;
  323. gpiod_set_value(ddata->gpio[1], enabled);
  324. }
  325. static void cpcap_charger_update_state(struct cpcap_charger_ddata *ddata,
  326. int state)
  327. {
  328. const char *status;
  329. if (state > POWER_SUPPLY_STATUS_FULL) {
  330. dev_warn(ddata->dev, "unknown state: %i\n", state);
  331. return;
  332. }
  333. ddata->status = state;
  334. switch (state) {
  335. case POWER_SUPPLY_STATUS_DISCHARGING:
  336. status = "DISCONNECTED";
  337. break;
  338. case POWER_SUPPLY_STATUS_NOT_CHARGING:
  339. status = "DETECTING";
  340. break;
  341. case POWER_SUPPLY_STATUS_CHARGING:
  342. status = "CHARGING";
  343. break;
  344. case POWER_SUPPLY_STATUS_FULL:
  345. status = "DONE";
  346. break;
  347. default:
  348. return;
  349. }
  350. dev_dbg(ddata->dev, "state: %s\n", status);
  351. }
  352. static int cpcap_charger_disable(struct cpcap_charger_ddata *ddata)
  353. {
  354. int error;
  355. error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
  356. CPCAP_REG_CRM_FET_OVRD |
  357. CPCAP_REG_CRM_FET_CTRL);
  358. if (error)
  359. dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
  360. return error;
  361. }
  362. static int cpcap_charger_enable(struct cpcap_charger_ddata *ddata,
  363. int max_voltage, int charge_current,
  364. int trickle_current)
  365. {
  366. int error;
  367. if (!max_voltage || !charge_current)
  368. return -EINVAL;
  369. dev_dbg(ddata->dev, "enable: %i %i %i\n",
  370. max_voltage, charge_current, trickle_current);
  371. error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM, 0x3fff,
  372. CPCAP_REG_CRM_CHRG_LED_EN |
  373. trickle_current |
  374. CPCAP_REG_CRM_FET_OVRD |
  375. CPCAP_REG_CRM_FET_CTRL |
  376. max_voltage |
  377. charge_current);
  378. if (error)
  379. dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
  380. return error;
  381. }
  382. static bool cpcap_charger_vbus_valid(struct cpcap_charger_ddata *ddata)
  383. {
  384. int error, value = 0;
  385. struct iio_channel *channel =
  386. ddata->channels[CPCAP_CHARGER_IIO_VBUS];
  387. error = iio_read_channel_processed(channel, &value);
  388. if (error >= 0)
  389. return value > 3900;
  390. dev_err(ddata->dev, "error reading VBUS: %i\n", error);
  391. return false;
  392. }
  393. /* VBUS control functions for the USB PHY companion */
  394. static void cpcap_charger_vbus_work(struct work_struct *work)
  395. {
  396. struct cpcap_charger_ddata *ddata;
  397. bool vbus = false;
  398. int error;
  399. ddata = container_of(work, struct cpcap_charger_ddata,
  400. vbus_work.work);
  401. if (ddata->vbus_enabled) {
  402. vbus = cpcap_charger_vbus_valid(ddata);
  403. if (vbus) {
  404. dev_dbg(ddata->dev, "VBUS already provided\n");
  405. return;
  406. }
  407. ddata->feeding_vbus = true;
  408. cpcap_charger_set_cable_path(ddata, false);
  409. cpcap_charger_set_inductive_path(ddata, false);
  410. error = cpcap_charger_disable(ddata);
  411. if (error)
  412. goto out_err;
  413. cpcap_charger_update_state(ddata,
  414. POWER_SUPPLY_STATUS_DISCHARGING);
  415. error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
  416. CPCAP_BIT_VBUS_SWITCH,
  417. CPCAP_BIT_VBUS_SWITCH);
  418. if (error)
  419. goto out_err;
  420. error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
  421. CPCAP_REG_CRM_RVRSMODE,
  422. CPCAP_REG_CRM_RVRSMODE);
  423. if (error)
  424. goto out_err;
  425. } else {
  426. error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
  427. CPCAP_BIT_VBUS_SWITCH, 0);
  428. if (error)
  429. goto out_err;
  430. error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
  431. CPCAP_REG_CRM_RVRSMODE, 0);
  432. if (error)
  433. goto out_err;
  434. cpcap_charger_set_cable_path(ddata, true);
  435. cpcap_charger_set_inductive_path(ddata, true);
  436. ddata->feeding_vbus = false;
  437. }
  438. return;
  439. out_err:
  440. cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
  441. dev_err(ddata->dev, "%s could not %s vbus: %i\n", __func__,
  442. ddata->vbus_enabled ? "enable" : "disable", error);
  443. }
  444. static int cpcap_charger_set_vbus(struct phy_companion *comparator,
  445. bool enabled)
  446. {
  447. struct cpcap_charger_ddata *ddata =
  448. container_of(comparator, struct cpcap_charger_ddata,
  449. comparator);
  450. ddata->vbus_enabled = enabled;
  451. schedule_delayed_work(&ddata->vbus_work, 0);
  452. return 0;
  453. }
  454. /* Charger interrupt handling functions */
  455. static int cpcap_charger_get_ints_state(struct cpcap_charger_ddata *ddata,
  456. struct cpcap_charger_ints_state *s)
  457. {
  458. int val, error;
  459. error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val);
  460. if (error)
  461. return error;
  462. s->chrg_det = val & BIT(13);
  463. s->rvrs_chrg = val & BIT(12);
  464. s->vbusov = val & BIT(11);
  465. error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val);
  466. if (error)
  467. return error;
  468. s->chrg_se1b = val & BIT(13);
  469. s->rvrs_mode = val & BIT(6);
  470. s->chrgcurr2 = val & BIT(5);
  471. s->chrgcurr1 = val & BIT(4);
  472. s->vbusvld = val & BIT(3);
  473. error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val);
  474. if (error)
  475. return error;
  476. s->battdetb = val & BIT(6);
  477. return 0;
  478. }
  479. static int cpcap_charger_voltage_to_regval(int voltage)
  480. {
  481. int offset;
  482. switch (voltage) {
  483. case 0 ... 4100000 - 1:
  484. return 0;
  485. case 4100000 ... 4200000 - 1:
  486. offset = 1;
  487. break;
  488. case 4200000 ... 4300000 - 1:
  489. offset = 0;
  490. break;
  491. case 4300000 ... 4380000 - 1:
  492. offset = -1;
  493. break;
  494. case 4380000 ... 4440000:
  495. offset = -2;
  496. break;
  497. default:
  498. return 0;
  499. }
  500. return ((voltage - 4100000) / 20000) + offset;
  501. }
  502. static void cpcap_charger_disconnect(struct cpcap_charger_ddata *ddata,
  503. int state, unsigned long delay)
  504. {
  505. int error;
  506. /* Update battery state before disconnecting the charger */
  507. switch (state) {
  508. case POWER_SUPPLY_STATUS_DISCHARGING:
  509. case POWER_SUPPLY_STATUS_FULL:
  510. power_supply_changed(ddata->usb);
  511. break;
  512. default:
  513. break;
  514. }
  515. error = cpcap_charger_disable(ddata);
  516. if (error) {
  517. cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
  518. return;
  519. }
  520. cpcap_charger_update_state(ddata, state);
  521. power_supply_changed(ddata->usb);
  522. schedule_delayed_work(&ddata->detect_work, delay);
  523. }
  524. static void cpcap_usb_detect(struct work_struct *work)
  525. {
  526. struct cpcap_charger_ddata *ddata;
  527. struct cpcap_charger_ints_state s;
  528. int error, new_state;
  529. ddata = container_of(work, struct cpcap_charger_ddata,
  530. detect_work.work);
  531. error = cpcap_charger_get_ints_state(ddata, &s);
  532. if (error)
  533. return;
  534. /* Just init the state if a charger is connected with no chrg_det set */
  535. if (!s.chrg_det && s.chrgcurr1 && s.vbusvld) {
  536. cpcap_charger_update_state(ddata,
  537. POWER_SUPPLY_STATUS_NOT_CHARGING);
  538. return;
  539. }
  540. /*
  541. * If battery voltage is higher than charge voltage, it may have been
  542. * charged to 4.35V by Android. Try again in 10 minutes.
  543. */
  544. if (cpcap_charger_get_charge_voltage(ddata) > ddata->voltage) {
  545. cpcap_charger_disconnect(ddata,
  546. POWER_SUPPLY_STATUS_NOT_CHARGING,
  547. HZ * 60 * 10);
  548. return;
  549. }
  550. /* Delay for 80ms to avoid vbus bouncing when usb cable is plugged in */
  551. usleep_range(80000, 120000);
  552. /* Throttle chrgcurr2 interrupt for charger done and retry */
  553. switch (ddata->status) {
  554. case POWER_SUPPLY_STATUS_CHARGING:
  555. if (s.chrgcurr2)
  556. break;
  557. new_state = POWER_SUPPLY_STATUS_FULL;
  558. if (s.chrgcurr1 && s.vbusvld) {
  559. cpcap_charger_disconnect(ddata, new_state, HZ * 5);
  560. return;
  561. }
  562. break;
  563. case POWER_SUPPLY_STATUS_FULL:
  564. if (!s.chrgcurr2)
  565. break;
  566. if (s.vbusvld)
  567. new_state = POWER_SUPPLY_STATUS_NOT_CHARGING;
  568. else
  569. new_state = POWER_SUPPLY_STATUS_DISCHARGING;
  570. cpcap_charger_disconnect(ddata, new_state, HZ * 5);
  571. return;
  572. default:
  573. break;
  574. }
  575. if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) &&
  576. s.chrgcurr1) {
  577. int max_current;
  578. int vchrg, ichrg;
  579. union power_supply_propval val;
  580. struct power_supply *battery;
  581. battery = power_supply_get_by_name("battery");
  582. if (IS_ERR_OR_NULL(battery)) {
  583. dev_err(ddata->dev, "battery power_supply not available %li\n",
  584. PTR_ERR(battery));
  585. return;
  586. }
  587. error = power_supply_get_property(battery, POWER_SUPPLY_PROP_PRESENT, &val);
  588. power_supply_put(battery);
  589. if (error)
  590. goto out_err;
  591. if (val.intval) {
  592. max_current = 1596000;
  593. } else {
  594. dev_info(ddata->dev, "battery not inserted, charging disabled\n");
  595. max_current = 0;
  596. }
  597. if (max_current > ddata->limit_current)
  598. max_current = ddata->limit_current;
  599. ichrg = cpcap_charger_current_to_regval(max_current);
  600. vchrg = cpcap_charger_voltage_to_regval(ddata->voltage);
  601. error = cpcap_charger_enable(ddata,
  602. CPCAP_REG_CRM_VCHRG(vchrg),
  603. ichrg, 0);
  604. if (error)
  605. goto out_err;
  606. cpcap_charger_update_state(ddata,
  607. POWER_SUPPLY_STATUS_CHARGING);
  608. } else {
  609. error = cpcap_charger_disable(ddata);
  610. if (error)
  611. goto out_err;
  612. cpcap_charger_update_state(ddata,
  613. POWER_SUPPLY_STATUS_DISCHARGING);
  614. }
  615. power_supply_changed(ddata->usb);
  616. return;
  617. out_err:
  618. cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
  619. dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
  620. }
  621. static irqreturn_t cpcap_charger_irq_thread(int irq, void *data)
  622. {
  623. struct cpcap_charger_ddata *ddata = data;
  624. if (!atomic_read(&ddata->active))
  625. return IRQ_NONE;
  626. schedule_delayed_work(&ddata->detect_work, 0);
  627. return IRQ_HANDLED;
  628. }
  629. static int cpcap_usb_init_irq(struct platform_device *pdev,
  630. struct cpcap_charger_ddata *ddata,
  631. const char *name)
  632. {
  633. struct cpcap_interrupt_desc *d;
  634. int irq, error;
  635. irq = platform_get_irq_byname(pdev, name);
  636. if (irq < 0)
  637. return -ENODEV;
  638. error = devm_request_threaded_irq(ddata->dev, irq, NULL,
  639. cpcap_charger_irq_thread,
  640. IRQF_SHARED | IRQF_ONESHOT,
  641. name, ddata);
  642. if (error) {
  643. dev_err(ddata->dev, "could not get irq %s: %i\n",
  644. name, error);
  645. return error;
  646. }
  647. d = devm_kzalloc(ddata->dev, sizeof(*d), GFP_KERNEL);
  648. if (!d)
  649. return -ENOMEM;
  650. d->name = name;
  651. d->irq = irq;
  652. list_add(&d->node, &ddata->irq_list);
  653. return 0;
  654. }
  655. static const char * const cpcap_charger_irqs[] = {
  656. /* REG_INT_0 */
  657. "chrg_det", "rvrs_chrg",
  658. /* REG_INT1 */
  659. "chrg_se1b", "se0conn", "rvrs_mode", "chrgcurr2", "chrgcurr1", "vbusvld",
  660. /* REG_INT_3 */
  661. "battdetb",
  662. };
  663. static int cpcap_usb_init_interrupts(struct platform_device *pdev,
  664. struct cpcap_charger_ddata *ddata)
  665. {
  666. int i, error;
  667. for (i = 0; i < ARRAY_SIZE(cpcap_charger_irqs); i++) {
  668. error = cpcap_usb_init_irq(pdev, ddata, cpcap_charger_irqs[i]);
  669. if (error)
  670. return error;
  671. }
  672. return 0;
  673. }
  674. static void cpcap_charger_init_optional_gpios(struct cpcap_charger_ddata *ddata)
  675. {
  676. int i;
  677. for (i = 0; i < 2; i++) {
  678. ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode",
  679. i, GPIOD_OUT_HIGH);
  680. if (IS_ERR(ddata->gpio[i])) {
  681. dev_info(ddata->dev, "no mode change GPIO%i: %li\n",
  682. i, PTR_ERR(ddata->gpio[i]));
  683. ddata->gpio[i] = NULL;
  684. }
  685. }
  686. }
  687. static int cpcap_charger_init_iio(struct cpcap_charger_ddata *ddata)
  688. {
  689. const char * const names[CPCAP_CHARGER_IIO_NR] = {
  690. "battdetb", "battp", "vbus", "chg_isense", "batti",
  691. };
  692. int error, i;
  693. for (i = 0; i < CPCAP_CHARGER_IIO_NR; i++) {
  694. ddata->channels[i] = devm_iio_channel_get(ddata->dev,
  695. names[i]);
  696. if (IS_ERR(ddata->channels[i])) {
  697. error = PTR_ERR(ddata->channels[i]);
  698. goto out_err;
  699. }
  700. if (!ddata->channels[i]->indio_dev) {
  701. error = -ENXIO;
  702. goto out_err;
  703. }
  704. }
  705. return 0;
  706. out_err:
  707. if (error != -EPROBE_DEFER)
  708. dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n",
  709. error);
  710. return error;
  711. }
  712. static char *cpcap_charger_supplied_to[] = {
  713. "battery",
  714. };
  715. static const struct power_supply_desc cpcap_charger_usb_desc = {
  716. .name = "usb",
  717. .type = POWER_SUPPLY_TYPE_USB,
  718. .properties = cpcap_charger_props,
  719. .num_properties = ARRAY_SIZE(cpcap_charger_props),
  720. .get_property = cpcap_charger_get_property,
  721. .set_property = cpcap_charger_set_property,
  722. .property_is_writeable = cpcap_charger_property_is_writeable,
  723. };
  724. static const struct of_device_id cpcap_charger_id_table[] = {
  725. {
  726. .compatible = "motorola,mapphone-cpcap-charger",
  727. },
  728. {},
  729. };
  730. MODULE_DEVICE_TABLE(of, cpcap_charger_id_table);
  731. static int cpcap_charger_probe(struct platform_device *pdev)
  732. {
  733. struct cpcap_charger_ddata *ddata;
  734. struct power_supply_config psy_cfg = {};
  735. int error;
  736. ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
  737. if (!ddata)
  738. return -ENOMEM;
  739. ddata->dev = &pdev->dev;
  740. ddata->voltage = 4200000;
  741. ddata->limit_current = 532000;
  742. ddata->reg = dev_get_regmap(ddata->dev->parent, NULL);
  743. if (!ddata->reg)
  744. return -ENODEV;
  745. INIT_LIST_HEAD(&ddata->irq_list);
  746. INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect);
  747. INIT_DELAYED_WORK(&ddata->vbus_work, cpcap_charger_vbus_work);
  748. platform_set_drvdata(pdev, ddata);
  749. error = cpcap_charger_init_iio(ddata);
  750. if (error)
  751. return error;
  752. atomic_set(&ddata->active, 1);
  753. psy_cfg.of_node = pdev->dev.of_node;
  754. psy_cfg.drv_data = ddata;
  755. psy_cfg.supplied_to = cpcap_charger_supplied_to;
  756. psy_cfg.num_supplicants = ARRAY_SIZE(cpcap_charger_supplied_to);
  757. ddata->usb = devm_power_supply_register(ddata->dev,
  758. &cpcap_charger_usb_desc,
  759. &psy_cfg);
  760. if (IS_ERR(ddata->usb)) {
  761. error = PTR_ERR(ddata->usb);
  762. dev_err(ddata->dev, "failed to register USB charger: %i\n",
  763. error);
  764. return error;
  765. }
  766. error = cpcap_usb_init_interrupts(pdev, ddata);
  767. if (error)
  768. return error;
  769. ddata->comparator.set_vbus = cpcap_charger_set_vbus;
  770. error = omap_usb2_set_comparator(&ddata->comparator);
  771. if (error == -ENODEV) {
  772. dev_info(ddata->dev, "charger needs phy, deferring probe\n");
  773. return -EPROBE_DEFER;
  774. }
  775. cpcap_charger_init_optional_gpios(ddata);
  776. schedule_delayed_work(&ddata->detect_work, 0);
  777. return 0;
  778. }
  779. static void cpcap_charger_shutdown(struct platform_device *pdev)
  780. {
  781. struct cpcap_charger_ddata *ddata = platform_get_drvdata(pdev);
  782. int error;
  783. atomic_set(&ddata->active, 0);
  784. error = omap_usb2_set_comparator(NULL);
  785. if (error)
  786. dev_warn(ddata->dev, "could not clear USB comparator: %i\n",
  787. error);
  788. error = cpcap_charger_disable(ddata);
  789. if (error) {
  790. cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_UNKNOWN);
  791. dev_warn(ddata->dev, "could not clear charger: %i\n",
  792. error);
  793. }
  794. cpcap_charger_update_state(ddata, POWER_SUPPLY_STATUS_DISCHARGING);
  795. cancel_delayed_work_sync(&ddata->vbus_work);
  796. cancel_delayed_work_sync(&ddata->detect_work);
  797. }
  798. static void cpcap_charger_remove(struct platform_device *pdev)
  799. {
  800. cpcap_charger_shutdown(pdev);
  801. }
  802. static struct platform_driver cpcap_charger_driver = {
  803. .probe = cpcap_charger_probe,
  804. .driver = {
  805. .name = "cpcap-charger",
  806. .of_match_table = cpcap_charger_id_table,
  807. },
  808. .shutdown = cpcap_charger_shutdown,
  809. .remove_new = cpcap_charger_remove,
  810. };
  811. module_platform_driver(cpcap_charger_driver);
  812. MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
  813. MODULE_DESCRIPTION("CPCAP Battery Charger Interface driver");
  814. MODULE_LICENSE("GPL v2");
  815. MODULE_ALIAS("platform:cpcap-charger");