rk808.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * MFD core driver for Rockchip RK808/RK818
  4. *
  5. * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
  6. *
  7. * Author: Chris Zhong <[email protected]>
  8. * Author: Zhang Qing <[email protected]>
  9. *
  10. * Copyright (C) 2016 PHYTEC Messtechnik GmbH
  11. *
  12. * Author: Wadim Egorov <[email protected]>
  13. */
  14. #include <linux/i2c.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/mfd/rk808.h>
  17. #include <linux/mfd/core.h>
  18. #include <linux/module.h>
  19. #include <linux/of_device.h>
  20. #include <linux/regmap.h>
  21. #include <linux/reboot.h>
  22. struct rk808_reg_data {
  23. int addr;
  24. int mask;
  25. int value;
  26. };
  27. static bool rk808_is_volatile_reg(struct device *dev, unsigned int reg)
  28. {
  29. /*
  30. * Notes:
  31. * - Technically the ROUND_30s bit makes RTC_CTRL_REG volatile, but
  32. * we don't use that feature. It's better to cache.
  33. * - It's unlikely we care that RK808_DEVCTRL_REG is volatile since
  34. * bits are cleared in case when we shutoff anyway, but better safe.
  35. */
  36. switch (reg) {
  37. case RK808_SECONDS_REG ... RK808_WEEKS_REG:
  38. case RK808_RTC_STATUS_REG:
  39. case RK808_VB_MON_REG:
  40. case RK808_THERMAL_REG:
  41. case RK808_DCDC_UV_STS_REG:
  42. case RK808_LDO_UV_STS_REG:
  43. case RK808_DCDC_PG_REG:
  44. case RK808_LDO_PG_REG:
  45. case RK808_DEVCTRL_REG:
  46. case RK808_INT_STS_REG1:
  47. case RK808_INT_STS_REG2:
  48. return true;
  49. }
  50. return false;
  51. }
  52. static bool rk817_is_volatile_reg(struct device *dev, unsigned int reg)
  53. {
  54. /*
  55. * Notes:
  56. * - Technically the ROUND_30s bit makes RTC_CTRL_REG volatile, but
  57. * we don't use that feature. It's better to cache.
  58. */
  59. switch (reg) {
  60. case RK817_SECONDS_REG ... RK817_WEEKS_REG:
  61. case RK817_RTC_STATUS_REG:
  62. case RK817_CODEC_DTOP_LPT_SRST:
  63. case RK817_GAS_GAUGE_ADC_CONFIG0 ... RK817_GAS_GAUGE_CUR_ADC_K0:
  64. case RK817_PMIC_CHRG_STS:
  65. case RK817_PMIC_CHRG_OUT:
  66. case RK817_PMIC_CHRG_IN:
  67. case RK817_INT_STS_REG0:
  68. case RK817_INT_STS_REG1:
  69. case RK817_INT_STS_REG2:
  70. case RK817_SYS_STS:
  71. return true;
  72. }
  73. return false;
  74. }
  75. static const struct regmap_config rk818_regmap_config = {
  76. .reg_bits = 8,
  77. .val_bits = 8,
  78. .max_register = RK818_USB_CTRL_REG,
  79. .cache_type = REGCACHE_RBTREE,
  80. .volatile_reg = rk808_is_volatile_reg,
  81. };
  82. static const struct regmap_config rk805_regmap_config = {
  83. .reg_bits = 8,
  84. .val_bits = 8,
  85. .max_register = RK805_OFF_SOURCE_REG,
  86. .cache_type = REGCACHE_RBTREE,
  87. .volatile_reg = rk808_is_volatile_reg,
  88. };
  89. static const struct regmap_config rk808_regmap_config = {
  90. .reg_bits = 8,
  91. .val_bits = 8,
  92. .max_register = RK808_IO_POL_REG,
  93. .cache_type = REGCACHE_RBTREE,
  94. .volatile_reg = rk808_is_volatile_reg,
  95. };
  96. static const struct regmap_config rk817_regmap_config = {
  97. .reg_bits = 8,
  98. .val_bits = 8,
  99. .max_register = RK817_GPIO_INT_CFG,
  100. .cache_type = REGCACHE_NONE,
  101. .volatile_reg = rk817_is_volatile_reg,
  102. };
  103. static const struct resource rtc_resources[] = {
  104. DEFINE_RES_IRQ(RK808_IRQ_RTC_ALARM),
  105. };
  106. static const struct resource rk817_rtc_resources[] = {
  107. DEFINE_RES_IRQ(RK817_IRQ_RTC_ALARM),
  108. };
  109. static const struct resource rk805_key_resources[] = {
  110. DEFINE_RES_IRQ(RK805_IRQ_PWRON_RISE),
  111. DEFINE_RES_IRQ(RK805_IRQ_PWRON_FALL),
  112. };
  113. static const struct resource rk817_pwrkey_resources[] = {
  114. DEFINE_RES_IRQ(RK817_IRQ_PWRON_RISE),
  115. DEFINE_RES_IRQ(RK817_IRQ_PWRON_FALL),
  116. };
  117. static const struct resource rk817_charger_resources[] = {
  118. DEFINE_RES_IRQ(RK817_IRQ_PLUG_IN),
  119. DEFINE_RES_IRQ(RK817_IRQ_PLUG_OUT),
  120. };
  121. static const struct mfd_cell rk805s[] = {
  122. { .name = "rk808-clkout", },
  123. { .name = "rk808-regulator", },
  124. { .name = "rk805-pinctrl", },
  125. {
  126. .name = "rk808-rtc",
  127. .num_resources = ARRAY_SIZE(rtc_resources),
  128. .resources = &rtc_resources[0],
  129. },
  130. { .name = "rk805-pwrkey",
  131. .num_resources = ARRAY_SIZE(rk805_key_resources),
  132. .resources = &rk805_key_resources[0],
  133. },
  134. };
  135. static const struct mfd_cell rk808s[] = {
  136. { .name = "rk808-clkout", },
  137. { .name = "rk808-regulator", },
  138. {
  139. .name = "rk808-rtc",
  140. .num_resources = ARRAY_SIZE(rtc_resources),
  141. .resources = rtc_resources,
  142. },
  143. };
  144. static const struct mfd_cell rk817s[] = {
  145. { .name = "rk808-clkout",},
  146. { .name = "rk808-regulator",},
  147. {
  148. .name = "rk805-pwrkey",
  149. .num_resources = ARRAY_SIZE(rk817_pwrkey_resources),
  150. .resources = &rk817_pwrkey_resources[0],
  151. },
  152. {
  153. .name = "rk808-rtc",
  154. .num_resources = ARRAY_SIZE(rk817_rtc_resources),
  155. .resources = &rk817_rtc_resources[0],
  156. },
  157. { .name = "rk817-codec",},
  158. {
  159. .name = "rk817-charger",
  160. .num_resources = ARRAY_SIZE(rk817_charger_resources),
  161. .resources = &rk817_charger_resources[0],
  162. },
  163. };
  164. static const struct mfd_cell rk818s[] = {
  165. { .name = "rk808-clkout", },
  166. { .name = "rk808-regulator", },
  167. {
  168. .name = "rk808-rtc",
  169. .num_resources = ARRAY_SIZE(rtc_resources),
  170. .resources = rtc_resources,
  171. },
  172. };
  173. static const struct rk808_reg_data rk805_pre_init_reg[] = {
  174. {RK805_BUCK1_CONFIG_REG, RK805_BUCK1_2_ILMAX_MASK,
  175. RK805_BUCK1_2_ILMAX_4000MA},
  176. {RK805_BUCK2_CONFIG_REG, RK805_BUCK1_2_ILMAX_MASK,
  177. RK805_BUCK1_2_ILMAX_4000MA},
  178. {RK805_BUCK3_CONFIG_REG, RK805_BUCK3_4_ILMAX_MASK,
  179. RK805_BUCK3_ILMAX_3000MA},
  180. {RK805_BUCK4_CONFIG_REG, RK805_BUCK3_4_ILMAX_MASK,
  181. RK805_BUCK4_ILMAX_3500MA},
  182. {RK805_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_400MA},
  183. {RK805_THERMAL_REG, TEMP_HOTDIE_MSK, TEMP115C},
  184. };
  185. static const struct rk808_reg_data rk808_pre_init_reg[] = {
  186. { RK808_BUCK3_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_150MA },
  187. { RK808_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_200MA },
  188. { RK808_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
  189. { RK808_BUCK1_CONFIG_REG, BUCK1_RATE_MASK, BUCK_ILMIN_200MA },
  190. { RK808_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_200MA },
  191. { RK808_DCDC_UV_ACT_REG, BUCK_UV_ACT_MASK, BUCK_UV_ACT_DISABLE},
  192. { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT |
  193. VB_LO_SEL_3500MV },
  194. };
  195. static const struct rk808_reg_data rk817_pre_init_reg[] = {
  196. {RK817_RTC_CTRL_REG, RTC_STOP, RTC_STOP},
  197. /* Codec specific registers */
  198. { RK817_CODEC_DTOP_VUCTL, MASK_ALL, 0x03 },
  199. { RK817_CODEC_DTOP_VUCTIME, MASK_ALL, 0x00 },
  200. { RK817_CODEC_DTOP_LPT_SRST, MASK_ALL, 0x00 },
  201. { RK817_CODEC_DTOP_DIGEN_CLKE, MASK_ALL, 0x00 },
  202. /* from vendor driver, CODEC_AREF_RTCFG0 not defined in data sheet */
  203. { RK817_CODEC_AREF_RTCFG0, MASK_ALL, 0x00 },
  204. { RK817_CODEC_AREF_RTCFG1, MASK_ALL, 0x06 },
  205. { RK817_CODEC_AADC_CFG0, MASK_ALL, 0xc8 },
  206. /* from vendor driver, CODEC_AADC_CFG1 not defined in data sheet */
  207. { RK817_CODEC_AADC_CFG1, MASK_ALL, 0x00 },
  208. { RK817_CODEC_DADC_VOLL, MASK_ALL, 0x00 },
  209. { RK817_CODEC_DADC_VOLR, MASK_ALL, 0x00 },
  210. { RK817_CODEC_DADC_SR_ACL0, MASK_ALL, 0x00 },
  211. { RK817_CODEC_DADC_ALC1, MASK_ALL, 0x00 },
  212. { RK817_CODEC_DADC_ALC2, MASK_ALL, 0x00 },
  213. { RK817_CODEC_DADC_NG, MASK_ALL, 0x00 },
  214. { RK817_CODEC_DADC_HPF, MASK_ALL, 0x00 },
  215. { RK817_CODEC_DADC_RVOLL, MASK_ALL, 0xff },
  216. { RK817_CODEC_DADC_RVOLR, MASK_ALL, 0xff },
  217. { RK817_CODEC_AMIC_CFG0, MASK_ALL, 0x70 },
  218. { RK817_CODEC_AMIC_CFG1, MASK_ALL, 0x00 },
  219. { RK817_CODEC_DMIC_PGA_GAIN, MASK_ALL, 0x66 },
  220. { RK817_CODEC_DMIC_LMT1, MASK_ALL, 0x00 },
  221. { RK817_CODEC_DMIC_LMT2, MASK_ALL, 0x00 },
  222. { RK817_CODEC_DMIC_NG1, MASK_ALL, 0x00 },
  223. { RK817_CODEC_DMIC_NG2, MASK_ALL, 0x00 },
  224. /* from vendor driver, CODEC_ADAC_CFG0 not defined in data sheet */
  225. { RK817_CODEC_ADAC_CFG0, MASK_ALL, 0x00 },
  226. { RK817_CODEC_ADAC_CFG1, MASK_ALL, 0x07 },
  227. { RK817_CODEC_DDAC_POPD_DACST, MASK_ALL, 0x82 },
  228. { RK817_CODEC_DDAC_VOLL, MASK_ALL, 0x00 },
  229. { RK817_CODEC_DDAC_VOLR, MASK_ALL, 0x00 },
  230. { RK817_CODEC_DDAC_SR_LMT0, MASK_ALL, 0x00 },
  231. { RK817_CODEC_DDAC_LMT1, MASK_ALL, 0x00 },
  232. { RK817_CODEC_DDAC_LMT2, MASK_ALL, 0x00 },
  233. { RK817_CODEC_DDAC_MUTE_MIXCTL, MASK_ALL, 0xa0 },
  234. { RK817_CODEC_DDAC_RVOLL, MASK_ALL, 0xff },
  235. { RK817_CODEC_DADC_RVOLR, MASK_ALL, 0xff },
  236. { RK817_CODEC_AMIC_CFG0, MASK_ALL, 0x70 },
  237. { RK817_CODEC_AMIC_CFG1, MASK_ALL, 0x00 },
  238. { RK817_CODEC_DMIC_PGA_GAIN, MASK_ALL, 0x66 },
  239. { RK817_CODEC_DMIC_LMT1, MASK_ALL, 0x00 },
  240. { RK817_CODEC_DMIC_LMT2, MASK_ALL, 0x00 },
  241. { RK817_CODEC_DMIC_NG1, MASK_ALL, 0x00 },
  242. { RK817_CODEC_DMIC_NG2, MASK_ALL, 0x00 },
  243. /* from vendor driver, CODEC_ADAC_CFG0 not defined in data sheet */
  244. { RK817_CODEC_ADAC_CFG0, MASK_ALL, 0x00 },
  245. { RK817_CODEC_ADAC_CFG1, MASK_ALL, 0x07 },
  246. { RK817_CODEC_DDAC_POPD_DACST, MASK_ALL, 0x82 },
  247. { RK817_CODEC_DDAC_VOLL, MASK_ALL, 0x00 },
  248. { RK817_CODEC_DDAC_VOLR, MASK_ALL, 0x00 },
  249. { RK817_CODEC_DDAC_SR_LMT0, MASK_ALL, 0x00 },
  250. { RK817_CODEC_DDAC_LMT1, MASK_ALL, 0x00 },
  251. { RK817_CODEC_DDAC_LMT2, MASK_ALL, 0x00 },
  252. { RK817_CODEC_DDAC_MUTE_MIXCTL, MASK_ALL, 0xa0 },
  253. { RK817_CODEC_DDAC_RVOLL, MASK_ALL, 0xff },
  254. { RK817_CODEC_DDAC_RVOLR, MASK_ALL, 0xff },
  255. { RK817_CODEC_AHP_ANTI0, MASK_ALL, 0x00 },
  256. { RK817_CODEC_AHP_ANTI1, MASK_ALL, 0x00 },
  257. { RK817_CODEC_AHP_CFG0, MASK_ALL, 0xe0 },
  258. { RK817_CODEC_AHP_CFG1, MASK_ALL, 0x1f },
  259. { RK817_CODEC_AHP_CP, MASK_ALL, 0x09 },
  260. { RK817_CODEC_ACLASSD_CFG1, MASK_ALL, 0x69 },
  261. { RK817_CODEC_ACLASSD_CFG2, MASK_ALL, 0x44 },
  262. { RK817_CODEC_APLL_CFG0, MASK_ALL, 0x04 },
  263. { RK817_CODEC_APLL_CFG1, MASK_ALL, 0x00 },
  264. { RK817_CODEC_APLL_CFG2, MASK_ALL, 0x30 },
  265. { RK817_CODEC_APLL_CFG3, MASK_ALL, 0x19 },
  266. { RK817_CODEC_APLL_CFG4, MASK_ALL, 0x65 },
  267. { RK817_CODEC_APLL_CFG5, MASK_ALL, 0x01 },
  268. { RK817_CODEC_DI2S_CKM, MASK_ALL, 0x01 },
  269. { RK817_CODEC_DI2S_RSD, MASK_ALL, 0x00 },
  270. { RK817_CODEC_DI2S_RXCR1, MASK_ALL, 0x00 },
  271. { RK817_CODEC_DI2S_RXCR2, MASK_ALL, 0x17 },
  272. { RK817_CODEC_DI2S_RXCMD_TSD, MASK_ALL, 0x00 },
  273. { RK817_CODEC_DI2S_TXCR1, MASK_ALL, 0x00 },
  274. { RK817_CODEC_DI2S_TXCR2, MASK_ALL, 0x17 },
  275. { RK817_CODEC_DI2S_TXCR3_TXCMD, MASK_ALL, 0x00 },
  276. {RK817_GPIO_INT_CFG, RK817_INT_POL_MSK, RK817_INT_POL_L},
  277. {RK817_SYS_CFG(1), RK817_HOTDIE_TEMP_MSK | RK817_TSD_TEMP_MSK,
  278. RK817_HOTDIE_105 | RK817_TSD_140},
  279. };
  280. static const struct rk808_reg_data rk818_pre_init_reg[] = {
  281. /* improve efficiency */
  282. { RK818_BUCK2_CONFIG_REG, BUCK2_RATE_MASK, BUCK_ILMIN_250MA },
  283. { RK818_BUCK4_CONFIG_REG, BUCK_ILMIN_MASK, BUCK_ILMIN_250MA },
  284. { RK818_BOOST_CONFIG_REG, BOOST_ILMIN_MASK, BOOST_ILMIN_100MA },
  285. { RK818_USB_CTRL_REG, RK818_USB_ILIM_SEL_MASK,
  286. RK818_USB_ILMIN_2000MA },
  287. /* close charger when usb lower then 3.4V */
  288. { RK818_USB_CTRL_REG, RK818_USB_CHG_SD_VSEL_MASK,
  289. (0x7 << 4) },
  290. /* no action when vref */
  291. { RK818_H5V_EN_REG, BIT(1), RK818_REF_RDY_CTRL },
  292. /* enable HDMI 5V */
  293. { RK818_H5V_EN_REG, BIT(0), RK818_H5V_EN },
  294. { RK808_VB_MON_REG, MASK_ALL, VB_LO_ACT |
  295. VB_LO_SEL_3500MV },
  296. };
  297. static const struct regmap_irq rk805_irqs[] = {
  298. [RK805_IRQ_PWRON_RISE] = {
  299. .mask = RK805_IRQ_PWRON_RISE_MSK,
  300. .reg_offset = 0,
  301. },
  302. [RK805_IRQ_VB_LOW] = {
  303. .mask = RK805_IRQ_VB_LOW_MSK,
  304. .reg_offset = 0,
  305. },
  306. [RK805_IRQ_PWRON] = {
  307. .mask = RK805_IRQ_PWRON_MSK,
  308. .reg_offset = 0,
  309. },
  310. [RK805_IRQ_PWRON_LP] = {
  311. .mask = RK805_IRQ_PWRON_LP_MSK,
  312. .reg_offset = 0,
  313. },
  314. [RK805_IRQ_HOTDIE] = {
  315. .mask = RK805_IRQ_HOTDIE_MSK,
  316. .reg_offset = 0,
  317. },
  318. [RK805_IRQ_RTC_ALARM] = {
  319. .mask = RK805_IRQ_RTC_ALARM_MSK,
  320. .reg_offset = 0,
  321. },
  322. [RK805_IRQ_RTC_PERIOD] = {
  323. .mask = RK805_IRQ_RTC_PERIOD_MSK,
  324. .reg_offset = 0,
  325. },
  326. [RK805_IRQ_PWRON_FALL] = {
  327. .mask = RK805_IRQ_PWRON_FALL_MSK,
  328. .reg_offset = 0,
  329. },
  330. };
  331. static const struct regmap_irq rk808_irqs[] = {
  332. /* INT_STS */
  333. [RK808_IRQ_VOUT_LO] = {
  334. .mask = RK808_IRQ_VOUT_LO_MSK,
  335. .reg_offset = 0,
  336. },
  337. [RK808_IRQ_VB_LO] = {
  338. .mask = RK808_IRQ_VB_LO_MSK,
  339. .reg_offset = 0,
  340. },
  341. [RK808_IRQ_PWRON] = {
  342. .mask = RK808_IRQ_PWRON_MSK,
  343. .reg_offset = 0,
  344. },
  345. [RK808_IRQ_PWRON_LP] = {
  346. .mask = RK808_IRQ_PWRON_LP_MSK,
  347. .reg_offset = 0,
  348. },
  349. [RK808_IRQ_HOTDIE] = {
  350. .mask = RK808_IRQ_HOTDIE_MSK,
  351. .reg_offset = 0,
  352. },
  353. [RK808_IRQ_RTC_ALARM] = {
  354. .mask = RK808_IRQ_RTC_ALARM_MSK,
  355. .reg_offset = 0,
  356. },
  357. [RK808_IRQ_RTC_PERIOD] = {
  358. .mask = RK808_IRQ_RTC_PERIOD_MSK,
  359. .reg_offset = 0,
  360. },
  361. /* INT_STS2 */
  362. [RK808_IRQ_PLUG_IN_INT] = {
  363. .mask = RK808_IRQ_PLUG_IN_INT_MSK,
  364. .reg_offset = 1,
  365. },
  366. [RK808_IRQ_PLUG_OUT_INT] = {
  367. .mask = RK808_IRQ_PLUG_OUT_INT_MSK,
  368. .reg_offset = 1,
  369. },
  370. };
  371. static const struct regmap_irq rk818_irqs[] = {
  372. /* INT_STS */
  373. [RK818_IRQ_VOUT_LO] = {
  374. .mask = RK818_IRQ_VOUT_LO_MSK,
  375. .reg_offset = 0,
  376. },
  377. [RK818_IRQ_VB_LO] = {
  378. .mask = RK818_IRQ_VB_LO_MSK,
  379. .reg_offset = 0,
  380. },
  381. [RK818_IRQ_PWRON] = {
  382. .mask = RK818_IRQ_PWRON_MSK,
  383. .reg_offset = 0,
  384. },
  385. [RK818_IRQ_PWRON_LP] = {
  386. .mask = RK818_IRQ_PWRON_LP_MSK,
  387. .reg_offset = 0,
  388. },
  389. [RK818_IRQ_HOTDIE] = {
  390. .mask = RK818_IRQ_HOTDIE_MSK,
  391. .reg_offset = 0,
  392. },
  393. [RK818_IRQ_RTC_ALARM] = {
  394. .mask = RK818_IRQ_RTC_ALARM_MSK,
  395. .reg_offset = 0,
  396. },
  397. [RK818_IRQ_RTC_PERIOD] = {
  398. .mask = RK818_IRQ_RTC_PERIOD_MSK,
  399. .reg_offset = 0,
  400. },
  401. [RK818_IRQ_USB_OV] = {
  402. .mask = RK818_IRQ_USB_OV_MSK,
  403. .reg_offset = 0,
  404. },
  405. /* INT_STS2 */
  406. [RK818_IRQ_PLUG_IN] = {
  407. .mask = RK818_IRQ_PLUG_IN_MSK,
  408. .reg_offset = 1,
  409. },
  410. [RK818_IRQ_PLUG_OUT] = {
  411. .mask = RK818_IRQ_PLUG_OUT_MSK,
  412. .reg_offset = 1,
  413. },
  414. [RK818_IRQ_CHG_OK] = {
  415. .mask = RK818_IRQ_CHG_OK_MSK,
  416. .reg_offset = 1,
  417. },
  418. [RK818_IRQ_CHG_TE] = {
  419. .mask = RK818_IRQ_CHG_TE_MSK,
  420. .reg_offset = 1,
  421. },
  422. [RK818_IRQ_CHG_TS1] = {
  423. .mask = RK818_IRQ_CHG_TS1_MSK,
  424. .reg_offset = 1,
  425. },
  426. [RK818_IRQ_TS2] = {
  427. .mask = RK818_IRQ_TS2_MSK,
  428. .reg_offset = 1,
  429. },
  430. [RK818_IRQ_CHG_CVTLIM] = {
  431. .mask = RK818_IRQ_CHG_CVTLIM_MSK,
  432. .reg_offset = 1,
  433. },
  434. [RK818_IRQ_DISCHG_ILIM] = {
  435. .mask = RK818_IRQ_DISCHG_ILIM_MSK,
  436. .reg_offset = 1,
  437. },
  438. };
  439. static const struct regmap_irq rk817_irqs[RK817_IRQ_END] = {
  440. REGMAP_IRQ_REG_LINE(0, 8),
  441. REGMAP_IRQ_REG_LINE(1, 8),
  442. REGMAP_IRQ_REG_LINE(2, 8),
  443. REGMAP_IRQ_REG_LINE(3, 8),
  444. REGMAP_IRQ_REG_LINE(4, 8),
  445. REGMAP_IRQ_REG_LINE(5, 8),
  446. REGMAP_IRQ_REG_LINE(6, 8),
  447. REGMAP_IRQ_REG_LINE(7, 8),
  448. REGMAP_IRQ_REG_LINE(8, 8),
  449. REGMAP_IRQ_REG_LINE(9, 8),
  450. REGMAP_IRQ_REG_LINE(10, 8),
  451. REGMAP_IRQ_REG_LINE(11, 8),
  452. REGMAP_IRQ_REG_LINE(12, 8),
  453. REGMAP_IRQ_REG_LINE(13, 8),
  454. REGMAP_IRQ_REG_LINE(14, 8),
  455. REGMAP_IRQ_REG_LINE(15, 8),
  456. REGMAP_IRQ_REG_LINE(16, 8),
  457. REGMAP_IRQ_REG_LINE(17, 8),
  458. REGMAP_IRQ_REG_LINE(18, 8),
  459. REGMAP_IRQ_REG_LINE(19, 8),
  460. REGMAP_IRQ_REG_LINE(20, 8),
  461. REGMAP_IRQ_REG_LINE(21, 8),
  462. REGMAP_IRQ_REG_LINE(22, 8),
  463. REGMAP_IRQ_REG_LINE(23, 8)
  464. };
  465. static struct regmap_irq_chip rk805_irq_chip = {
  466. .name = "rk805",
  467. .irqs = rk805_irqs,
  468. .num_irqs = ARRAY_SIZE(rk805_irqs),
  469. .num_regs = 1,
  470. .status_base = RK805_INT_STS_REG,
  471. .mask_base = RK805_INT_STS_MSK_REG,
  472. .ack_base = RK805_INT_STS_REG,
  473. .init_ack_masked = true,
  474. };
  475. static const struct regmap_irq_chip rk808_irq_chip = {
  476. .name = "rk808",
  477. .irqs = rk808_irqs,
  478. .num_irqs = ARRAY_SIZE(rk808_irqs),
  479. .num_regs = 2,
  480. .irq_reg_stride = 2,
  481. .status_base = RK808_INT_STS_REG1,
  482. .mask_base = RK808_INT_STS_MSK_REG1,
  483. .ack_base = RK808_INT_STS_REG1,
  484. .init_ack_masked = true,
  485. };
  486. static struct regmap_irq_chip rk817_irq_chip = {
  487. .name = "rk817",
  488. .irqs = rk817_irqs,
  489. .num_irqs = ARRAY_SIZE(rk817_irqs),
  490. .num_regs = 3,
  491. .irq_reg_stride = 2,
  492. .status_base = RK817_INT_STS_REG0,
  493. .mask_base = RK817_INT_STS_MSK_REG0,
  494. .ack_base = RK817_INT_STS_REG0,
  495. .init_ack_masked = true,
  496. };
  497. static const struct regmap_irq_chip rk818_irq_chip = {
  498. .name = "rk818",
  499. .irqs = rk818_irqs,
  500. .num_irqs = ARRAY_SIZE(rk818_irqs),
  501. .num_regs = 2,
  502. .irq_reg_stride = 2,
  503. .status_base = RK818_INT_STS_REG1,
  504. .mask_base = RK818_INT_STS_MSK_REG1,
  505. .ack_base = RK818_INT_STS_REG1,
  506. .init_ack_masked = true,
  507. };
  508. static struct i2c_client *rk808_i2c_client;
  509. static void rk808_pm_power_off(void)
  510. {
  511. int ret;
  512. unsigned int reg, bit;
  513. struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
  514. switch (rk808->variant) {
  515. case RK805_ID:
  516. reg = RK805_DEV_CTRL_REG;
  517. bit = DEV_OFF;
  518. break;
  519. case RK808_ID:
  520. reg = RK808_DEVCTRL_REG,
  521. bit = DEV_OFF_RST;
  522. break;
  523. case RK809_ID:
  524. case RK817_ID:
  525. reg = RK817_SYS_CFG(3);
  526. bit = DEV_OFF;
  527. break;
  528. case RK818_ID:
  529. reg = RK818_DEVCTRL_REG;
  530. bit = DEV_OFF;
  531. break;
  532. default:
  533. return;
  534. }
  535. ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
  536. if (ret)
  537. dev_err(&rk808_i2c_client->dev, "Failed to shutdown device!\n");
  538. }
  539. static int rk808_restart_notify(struct notifier_block *this, unsigned long mode, void *cmd)
  540. {
  541. struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
  542. unsigned int reg, bit;
  543. int ret;
  544. switch (rk808->variant) {
  545. case RK809_ID:
  546. case RK817_ID:
  547. reg = RK817_SYS_CFG(3);
  548. bit = DEV_RST;
  549. break;
  550. default:
  551. return NOTIFY_DONE;
  552. }
  553. ret = regmap_update_bits(rk808->regmap, reg, bit, bit);
  554. if (ret)
  555. dev_err(&rk808_i2c_client->dev, "Failed to restart device!\n");
  556. return NOTIFY_DONE;
  557. }
  558. static struct notifier_block rk808_restart_handler = {
  559. .notifier_call = rk808_restart_notify,
  560. .priority = 192,
  561. };
  562. static void rk8xx_shutdown(struct i2c_client *client)
  563. {
  564. struct rk808 *rk808 = i2c_get_clientdata(client);
  565. int ret;
  566. switch (rk808->variant) {
  567. case RK805_ID:
  568. ret = regmap_update_bits(rk808->regmap,
  569. RK805_GPIO_IO_POL_REG,
  570. SLP_SD_MSK,
  571. SHUTDOWN_FUN);
  572. break;
  573. case RK809_ID:
  574. case RK817_ID:
  575. ret = regmap_update_bits(rk808->regmap,
  576. RK817_SYS_CFG(3),
  577. RK817_SLPPIN_FUNC_MSK,
  578. SLPPIN_DN_FUN);
  579. break;
  580. default:
  581. return;
  582. }
  583. if (ret)
  584. dev_warn(&client->dev,
  585. "Cannot switch to power down function\n");
  586. }
  587. static const struct of_device_id rk808_of_match[] = {
  588. { .compatible = "rockchip,rk805" },
  589. { .compatible = "rockchip,rk808" },
  590. { .compatible = "rockchip,rk809" },
  591. { .compatible = "rockchip,rk817" },
  592. { .compatible = "rockchip,rk818" },
  593. { },
  594. };
  595. MODULE_DEVICE_TABLE(of, rk808_of_match);
  596. static int rk808_probe(struct i2c_client *client,
  597. const struct i2c_device_id *id)
  598. {
  599. struct device_node *np = client->dev.of_node;
  600. struct rk808 *rk808;
  601. const struct rk808_reg_data *pre_init_reg;
  602. const struct mfd_cell *cells;
  603. int nr_pre_init_regs;
  604. int nr_cells;
  605. int msb, lsb;
  606. unsigned char pmic_id_msb, pmic_id_lsb;
  607. int ret;
  608. int i;
  609. rk808 = devm_kzalloc(&client->dev, sizeof(*rk808), GFP_KERNEL);
  610. if (!rk808)
  611. return -ENOMEM;
  612. if (of_device_is_compatible(np, "rockchip,rk817") ||
  613. of_device_is_compatible(np, "rockchip,rk809")) {
  614. pmic_id_msb = RK817_ID_MSB;
  615. pmic_id_lsb = RK817_ID_LSB;
  616. } else {
  617. pmic_id_msb = RK808_ID_MSB;
  618. pmic_id_lsb = RK808_ID_LSB;
  619. }
  620. /* Read chip variant */
  621. msb = i2c_smbus_read_byte_data(client, pmic_id_msb);
  622. if (msb < 0) {
  623. dev_err(&client->dev, "failed to read the chip id at 0x%x\n",
  624. RK808_ID_MSB);
  625. return msb;
  626. }
  627. lsb = i2c_smbus_read_byte_data(client, pmic_id_lsb);
  628. if (lsb < 0) {
  629. dev_err(&client->dev, "failed to read the chip id at 0x%x\n",
  630. RK808_ID_LSB);
  631. return lsb;
  632. }
  633. rk808->variant = ((msb << 8) | lsb) & RK8XX_ID_MSK;
  634. dev_info(&client->dev, "chip id: 0x%x\n", (unsigned int)rk808->variant);
  635. switch (rk808->variant) {
  636. case RK805_ID:
  637. rk808->regmap_cfg = &rk805_regmap_config;
  638. rk808->regmap_irq_chip = &rk805_irq_chip;
  639. pre_init_reg = rk805_pre_init_reg;
  640. nr_pre_init_regs = ARRAY_SIZE(rk805_pre_init_reg);
  641. cells = rk805s;
  642. nr_cells = ARRAY_SIZE(rk805s);
  643. break;
  644. case RK808_ID:
  645. rk808->regmap_cfg = &rk808_regmap_config;
  646. rk808->regmap_irq_chip = &rk808_irq_chip;
  647. pre_init_reg = rk808_pre_init_reg;
  648. nr_pre_init_regs = ARRAY_SIZE(rk808_pre_init_reg);
  649. cells = rk808s;
  650. nr_cells = ARRAY_SIZE(rk808s);
  651. break;
  652. case RK818_ID:
  653. rk808->regmap_cfg = &rk818_regmap_config;
  654. rk808->regmap_irq_chip = &rk818_irq_chip;
  655. pre_init_reg = rk818_pre_init_reg;
  656. nr_pre_init_regs = ARRAY_SIZE(rk818_pre_init_reg);
  657. cells = rk818s;
  658. nr_cells = ARRAY_SIZE(rk818s);
  659. break;
  660. case RK809_ID:
  661. case RK817_ID:
  662. rk808->regmap_cfg = &rk817_regmap_config;
  663. rk808->regmap_irq_chip = &rk817_irq_chip;
  664. pre_init_reg = rk817_pre_init_reg;
  665. nr_pre_init_regs = ARRAY_SIZE(rk817_pre_init_reg);
  666. cells = rk817s;
  667. nr_cells = ARRAY_SIZE(rk817s);
  668. break;
  669. default:
  670. dev_err(&client->dev, "Unsupported RK8XX ID %lu\n",
  671. rk808->variant);
  672. return -EINVAL;
  673. }
  674. rk808->i2c = client;
  675. i2c_set_clientdata(client, rk808);
  676. rk808->regmap = devm_regmap_init_i2c(client, rk808->regmap_cfg);
  677. if (IS_ERR(rk808->regmap)) {
  678. dev_err(&client->dev, "regmap initialization failed\n");
  679. return PTR_ERR(rk808->regmap);
  680. }
  681. if (!client->irq) {
  682. dev_err(&client->dev, "No interrupt support, no core IRQ\n");
  683. return -EINVAL;
  684. }
  685. ret = regmap_add_irq_chip(rk808->regmap, client->irq,
  686. IRQF_ONESHOT, -1,
  687. rk808->regmap_irq_chip, &rk808->irq_data);
  688. if (ret) {
  689. dev_err(&client->dev, "Failed to add irq_chip %d\n", ret);
  690. return ret;
  691. }
  692. for (i = 0; i < nr_pre_init_regs; i++) {
  693. ret = regmap_update_bits(rk808->regmap,
  694. pre_init_reg[i].addr,
  695. pre_init_reg[i].mask,
  696. pre_init_reg[i].value);
  697. if (ret) {
  698. dev_err(&client->dev,
  699. "0x%x write err\n",
  700. pre_init_reg[i].addr);
  701. return ret;
  702. }
  703. }
  704. ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE,
  705. cells, nr_cells, NULL, 0,
  706. regmap_irq_get_domain(rk808->irq_data));
  707. if (ret) {
  708. dev_err(&client->dev, "failed to add MFD devices %d\n", ret);
  709. goto err_irq;
  710. }
  711. if (of_property_read_bool(np, "rockchip,system-power-controller")) {
  712. rk808_i2c_client = client;
  713. pm_power_off = rk808_pm_power_off;
  714. switch (rk808->variant) {
  715. case RK809_ID:
  716. case RK817_ID:
  717. ret = register_restart_handler(&rk808_restart_handler);
  718. if (ret)
  719. dev_warn(&client->dev, "failed to register rst handler, %d\n", ret);
  720. break;
  721. default:
  722. dev_dbg(&client->dev, "pmic controlled board reset not supported\n");
  723. break;
  724. }
  725. }
  726. return 0;
  727. err_irq:
  728. regmap_del_irq_chip(client->irq, rk808->irq_data);
  729. return ret;
  730. }
  731. static void rk808_remove(struct i2c_client *client)
  732. {
  733. struct rk808 *rk808 = i2c_get_clientdata(client);
  734. regmap_del_irq_chip(client->irq, rk808->irq_data);
  735. /**
  736. * pm_power_off may points to a function from another module.
  737. * Check if the pointer is set by us and only then overwrite it.
  738. */
  739. if (pm_power_off == rk808_pm_power_off)
  740. pm_power_off = NULL;
  741. unregister_restart_handler(&rk808_restart_handler);
  742. }
  743. static int __maybe_unused rk8xx_suspend(struct device *dev)
  744. {
  745. struct rk808 *rk808 = i2c_get_clientdata(to_i2c_client(dev));
  746. int ret = 0;
  747. switch (rk808->variant) {
  748. case RK805_ID:
  749. ret = regmap_update_bits(rk808->regmap,
  750. RK805_GPIO_IO_POL_REG,
  751. SLP_SD_MSK,
  752. SLEEP_FUN);
  753. break;
  754. case RK809_ID:
  755. case RK817_ID:
  756. ret = regmap_update_bits(rk808->regmap,
  757. RK817_SYS_CFG(3),
  758. RK817_SLPPIN_FUNC_MSK,
  759. SLPPIN_SLP_FUN);
  760. break;
  761. default:
  762. break;
  763. }
  764. return ret;
  765. }
  766. static int __maybe_unused rk8xx_resume(struct device *dev)
  767. {
  768. struct rk808 *rk808 = i2c_get_clientdata(to_i2c_client(dev));
  769. int ret = 0;
  770. switch (rk808->variant) {
  771. case RK809_ID:
  772. case RK817_ID:
  773. ret = regmap_update_bits(rk808->regmap,
  774. RK817_SYS_CFG(3),
  775. RK817_SLPPIN_FUNC_MSK,
  776. SLPPIN_NULL_FUN);
  777. break;
  778. default:
  779. break;
  780. }
  781. return ret;
  782. }
  783. static SIMPLE_DEV_PM_OPS(rk8xx_pm_ops, rk8xx_suspend, rk8xx_resume);
  784. static struct i2c_driver rk808_i2c_driver = {
  785. .driver = {
  786. .name = "rk808",
  787. .of_match_table = rk808_of_match,
  788. .pm = &rk8xx_pm_ops,
  789. },
  790. .probe = rk808_probe,
  791. .remove = rk808_remove,
  792. .shutdown = rk8xx_shutdown,
  793. };
  794. module_i2c_driver(rk808_i2c_driver);
  795. MODULE_LICENSE("GPL");
  796. MODULE_AUTHOR("Chris Zhong <[email protected]>");
  797. MODULE_AUTHOR("Zhang Qing <[email protected]>");
  798. MODULE_AUTHOR("Wadim Egorov <[email protected]>");
  799. MODULE_DESCRIPTION("RK808/RK818 PMIC driver");