cpcap-charger.c 25 KB

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