s2dos05.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550
  1. /*
  2. * s2dos05.c - Regulator driver for the Samsung s2dos05
  3. *
  4. * Copyright (C) 2016 Samsung Electronics
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #include <linux/module.h>
  22. #include <linux/bug.h>
  23. #include <linux/delay.h>
  24. #include <linux/err.h>
  25. #include <linux/gpio.h>
  26. #include <linux/slab.h>
  27. #include <linux/module.h>
  28. #include <linux/regmap.h>
  29. #include <linux/i2c.h>
  30. #include <linux/of_gpio.h>
  31. #include <linux/irq.h>
  32. #include <linux/interrupt.h>
  33. #include <linux/version.h>
  34. #include <linux/platform_device.h>
  35. #include <linux/regulator/driver.h>
  36. #include <linux/regulator/machine.h>
  37. #include <linux/regulator/s2dos05.h>
  38. #include <linux/regulator/of_regulator.h>
  39. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  40. #include <linux/regulator/pmic_class.h>
  41. #endif
  42. #if IS_ENABLED(CONFIG_REGULATOR_DEBUG_CONTROL)
  43. #include <linux/regulator/debug-regulator.h>
  44. #endif
  45. #if IS_ENABLED(CONFIG_SEC_PM)
  46. #include <linux/sec_class.h>
  47. #include <linux/fb.h>
  48. #endif /* CONFIG_SEC_PM */
  49. #if IS_ENABLED(CONFIG_SEC_ABC)
  50. #include <linux/sti/abc_common.h>
  51. #endif /* CONFIG_SEC_ABC */
  52. #if IS_ENABLED(CONFIG_SEC_PM_QCOM)
  53. extern int msm_drm_register_notifier_client(struct notifier_block *nb);
  54. extern int msm_drm_unregister_notifier_client(struct notifier_block *nb);
  55. #endif
  56. struct s2dos05_data {
  57. struct s2dos05_dev *iodev;
  58. int num_regulators;
  59. struct regulator_dev *rdev[S2DOS05_REGULATOR_MAX];
  60. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  61. u8 read_addr;
  62. u8 read_val;
  63. struct device *dev;
  64. #endif
  65. #if IS_ENABLED(CONFIG_SEC_PM)
  66. struct notifier_block fb_block __maybe_unused;
  67. struct delayed_work fd_work __maybe_unused;
  68. bool fd_work_init;
  69. #endif /* CONFIG_SEC_PM */
  70. #if IS_ENABLED(CONFIG_SEC_ABC)
  71. atomic_t i2c_fail_count;
  72. #endif /* CONFIG_SEC_ABC */
  73. };
  74. #if IS_ENABLED(CONFIG_SEC_ABC)
  75. #define s2dos05_i2c_abc_event(arg...) \
  76. __s2dos05_i2c_abc_event((char *)__func__, ##arg)
  77. static void __s2dos05_i2c_abc_event(char *func, struct s2dos05_data *info, int ret)
  78. {
  79. char buf[64];
  80. char *type;
  81. int count;
  82. const int fail_threshold_cnt = 2;
  83. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  84. type = "INFO";
  85. #else
  86. type = "WARN";
  87. #endif /* CONFIG_SEC_FACTORY */
  88. if (ret < 0) {
  89. count = atomic_inc_return(&info->i2c_fail_count);
  90. if (count >= fail_threshold_cnt) {
  91. atomic_set(&info->i2c_fail_count, 0);
  92. snprintf(buf, sizeof(buf), "MODULE=pmic@%s=%s_fail", type, func);
  93. sec_abc_send_event(buf);
  94. }
  95. } else {
  96. atomic_set(&info->i2c_fail_count, 0);
  97. }
  98. }
  99. static void s2dos05_irq_abc_event(const char *irq_desc)
  100. {
  101. char buf[64];
  102. char *type;
  103. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  104. type = "WARN";
  105. #else
  106. type = "WARN"; /* Diamond: black screen issue in user binary */
  107. #endif /* CONFIG_SEC_FACTORY */
  108. snprintf(buf, sizeof(buf), "MODULE=pmic@%s=s2dos05_%s", type, irq_desc);
  109. sec_abc_send_event(buf);
  110. }
  111. #else
  112. #define s2dos05_i2c_abc_event(arg...) do {} while (0)
  113. #define s2dos05_irq_abc_event(arg...) do {} while (0)
  114. #endif /* CONFIG_SEC_ABC */
  115. int s2dos05_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest)
  116. {
  117. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  118. struct s2dos05_dev *s2dos05 = info->iodev;
  119. int ret;
  120. mutex_lock(&s2dos05->i2c_lock);
  121. ret = i2c_smbus_read_byte_data(i2c, reg);
  122. mutex_unlock(&s2dos05->i2c_lock);
  123. s2dos05_i2c_abc_event(info, ret);
  124. if (ret < 0) {
  125. pr_info("%s:%s reg(0x%02hhx), ret(%d)\n",
  126. MFD_DEV_NAME, __func__, reg, ret);
  127. return ret;
  128. }
  129. ret &= 0xff;
  130. *dest = ret;
  131. return 0;
  132. }
  133. EXPORT_SYMBOL_GPL(s2dos05_read_reg);
  134. int s2dos05_bulk_read(struct i2c_client *i2c, u8 reg, int count, u8 *buf)
  135. {
  136. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  137. struct s2dos05_dev *s2dos05 = info->iodev;
  138. int ret;
  139. mutex_lock(&s2dos05->i2c_lock);
  140. ret = i2c_smbus_read_i2c_block_data(i2c, reg, count, buf);
  141. mutex_unlock(&s2dos05->i2c_lock);
  142. s2dos05_i2c_abc_event(info, ret);
  143. if (ret < 0)
  144. return ret;
  145. return 0;
  146. }
  147. EXPORT_SYMBOL_GPL(s2dos05_bulk_read);
  148. int s2dos05_read_word(struct i2c_client *i2c, u8 reg)
  149. {
  150. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  151. struct s2dos05_dev *s2dos05 = info->iodev;
  152. int ret;
  153. mutex_lock(&s2dos05->i2c_lock);
  154. ret = i2c_smbus_read_word_data(i2c, reg);
  155. mutex_unlock(&s2dos05->i2c_lock);
  156. s2dos05_i2c_abc_event(info, ret);
  157. if (ret < 0)
  158. return ret;
  159. return ret;
  160. }
  161. EXPORT_SYMBOL_GPL(s2dos05_read_word);
  162. int s2dos05_write_reg(struct i2c_client *i2c, u8 reg, u8 value)
  163. {
  164. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  165. struct s2dos05_dev *s2dos05 = info->iodev;
  166. int ret;
  167. mutex_lock(&s2dos05->i2c_lock);
  168. ret = i2c_smbus_write_byte_data(i2c, reg, value);
  169. mutex_unlock(&s2dos05->i2c_lock);
  170. s2dos05_i2c_abc_event(info, ret);
  171. if (ret < 0)
  172. pr_info("%s:%s reg(0x%02hhx), ret(%d)\n",
  173. MFD_DEV_NAME, __func__, reg, ret);
  174. return ret;
  175. }
  176. EXPORT_SYMBOL_GPL(s2dos05_write_reg);
  177. int s2dos05_bulk_write(struct i2c_client *i2c, u8 reg, int count, u8 *buf)
  178. {
  179. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  180. struct s2dos05_dev *s2dos05 = info->iodev;
  181. int ret;
  182. mutex_lock(&s2dos05->i2c_lock);
  183. ret = i2c_smbus_write_i2c_block_data(i2c, reg, count, buf);
  184. mutex_unlock(&s2dos05->i2c_lock);
  185. s2dos05_i2c_abc_event(info, ret);
  186. if (ret < 0)
  187. return ret;
  188. return 0;
  189. }
  190. EXPORT_SYMBOL_GPL(s2dos05_bulk_write);
  191. int s2dos05_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask)
  192. {
  193. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  194. struct s2dos05_dev *s2dos05 = info->iodev;
  195. int ret;
  196. u8 old_val, new_val;
  197. mutex_lock(&s2dos05->i2c_lock);
  198. ret = i2c_smbus_read_byte_data(i2c, reg);
  199. if (ret >= 0) {
  200. old_val = ret & 0xff;
  201. new_val = (val & mask) | (old_val & (~mask));
  202. ret = i2c_smbus_write_byte_data(i2c, reg, new_val);
  203. }
  204. mutex_unlock(&s2dos05->i2c_lock);
  205. s2dos05_i2c_abc_event(info, ret);
  206. return ret;
  207. }
  208. EXPORT_SYMBOL_GPL(s2dos05_update_reg);
  209. static int s2m_enable(struct regulator_dev *rdev)
  210. {
  211. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  212. struct i2c_client *i2c = info->iodev->i2c;
  213. return s2dos05_update_reg(i2c, rdev->desc->enable_reg,
  214. rdev->desc->enable_mask,
  215. rdev->desc->enable_mask);
  216. }
  217. static int s2m_disable_regmap(struct regulator_dev *rdev)
  218. {
  219. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  220. struct i2c_client *i2c = info->iodev->i2c;
  221. u8 val;
  222. if (rdev->desc->enable_is_inverted)
  223. val = rdev->desc->enable_mask;
  224. else
  225. val = 0;
  226. return s2dos05_update_reg(i2c, rdev->desc->enable_reg,
  227. val, rdev->desc->enable_mask);
  228. }
  229. static int s2m_is_enabled_regmap(struct regulator_dev *rdev)
  230. {
  231. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  232. struct i2c_client *i2c = info->iodev->i2c;
  233. int ret;
  234. u8 val;
  235. ret = s2dos05_read_reg(i2c, rdev->desc->enable_reg, &val);
  236. if (ret < 0)
  237. return ret;
  238. if (rdev->desc->enable_is_inverted)
  239. return (val & rdev->desc->enable_mask) == 0;
  240. else
  241. return (val & rdev->desc->enable_mask) != 0;
  242. }
  243. static int s2m_get_voltage_sel_regmap(struct regulator_dev *rdev)
  244. {
  245. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  246. struct i2c_client *i2c = info->iodev->i2c;
  247. int ret;
  248. u8 val;
  249. ret = s2dos05_read_reg(i2c, rdev->desc->vsel_reg, &val);
  250. if (ret < 0)
  251. return ret;
  252. val &= rdev->desc->vsel_mask;
  253. return val;
  254. }
  255. static int s2m_set_voltage_sel_regmap(struct regulator_dev *rdev, unsigned sel)
  256. {
  257. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  258. struct i2c_client *i2c = info->iodev->i2c;
  259. int ret;
  260. ret = s2dos05_update_reg(i2c, rdev->desc->vsel_reg,
  261. sel, rdev->desc->vsel_mask);
  262. if (ret < 0)
  263. goto out;
  264. if (rdev->desc->apply_bit)
  265. ret = s2dos05_update_reg(i2c, rdev->desc->apply_reg,
  266. rdev->desc->apply_bit,
  267. rdev->desc->apply_bit);
  268. return ret;
  269. out:
  270. pr_warn("%s: failed to set voltage_sel_regmap\n", rdev->desc->name);
  271. return ret;
  272. }
  273. static int s2m_set_voltage_sel_regmap_buck(struct regulator_dev *rdev,
  274. unsigned sel)
  275. {
  276. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  277. struct i2c_client *i2c = info->iodev->i2c;
  278. int ret;
  279. ret = s2dos05_write_reg(i2c, rdev->desc->vsel_reg, sel);
  280. if (ret < 0)
  281. goto out;
  282. if (rdev->desc->apply_bit)
  283. ret = s2dos05_update_reg(i2c, rdev->desc->apply_reg,
  284. rdev->desc->apply_bit,
  285. rdev->desc->apply_bit);
  286. return ret;
  287. out:
  288. pr_warn("%s: failed to set voltage_sel_regmap\n", rdev->desc->name);
  289. return ret;
  290. }
  291. static int s2m_set_voltage_time_sel(struct regulator_dev *rdev,
  292. unsigned int old_selector,
  293. unsigned int new_selector)
  294. {
  295. int old_volt, new_volt;
  296. /* sanity check */
  297. if (!rdev->desc->ops->list_voltage)
  298. return -EINVAL;
  299. old_volt = rdev->desc->ops->list_voltage(rdev, old_selector);
  300. new_volt = rdev->desc->ops->list_voltage(rdev, new_selector);
  301. if (old_selector < new_selector)
  302. return DIV_ROUND_UP(new_volt - old_volt, S2DOS05_RAMP_DELAY);
  303. return 0;
  304. }
  305. #if IS_ENABLED(CONFIG_SEC_PM)
  306. static int s2m_ssd_convert_uA_to_reg_val(bool enable, int min_uA, int max_uA,
  307. u8 *val, u8 *mask)
  308. {
  309. u8 sel = 0;
  310. if (enable) {
  311. while (2000 * (sel + 1) < min_uA)
  312. sel++;
  313. if (2000 * (sel + 1) > max_uA)
  314. return -EINVAL;
  315. }
  316. *val = (!enable << 3) | (sel << 5);
  317. *mask = S2DOS05_ELVSS_SSD_EN_MASK | S2DOS05_ELVSS_SEL_SSD_MASK;
  318. return 0;
  319. }
  320. static int s2m_set_elvss_ssd_current_limit(struct regulator_dev *rdev,
  321. int min_uA, int max_uA)
  322. {
  323. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  324. struct i2c_client *i2c = info->iodev->i2c;
  325. int ret;
  326. bool enable;
  327. u8 val = 0, mask = 0;
  328. enable = min_uA || max_uA;
  329. ret = s2m_ssd_convert_uA_to_reg_val(enable, min_uA, max_uA, &val, &mask);
  330. if (ret < 0)
  331. return ret;
  332. ret = s2dos05_update_reg(i2c, S2DOS05_REG_SSD_TSD, val, mask);
  333. return ret;
  334. }
  335. static int s2m_get_elvss_ssd_current_limit(struct regulator_dev *rdev)
  336. {
  337. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  338. struct i2c_client *i2c = info->iodev->i2c;
  339. int ret;
  340. bool enable;
  341. u8 val;
  342. ret = s2dos05_read_reg(i2c, S2DOS05_REG_SSD_TSD, &val);
  343. if (ret < 0)
  344. return ret;
  345. enable = !(val & S2DOS05_ELVSS_SSD_EN_MASK);
  346. if (!enable)
  347. return 0;
  348. ret = (val & S2DOS05_ELVSS_SEL_SSD_MASK) >> 5;
  349. return (ret + 1) * 2000;
  350. }
  351. #if IS_ENABLED(CONFIG_ARCH_QCOM)
  352. static int s2m_elvss_fd_is_enabled(struct regulator_dev *rdev)
  353. {
  354. /* Always return false due to timing issue */
  355. return 0;
  356. }
  357. #else
  358. static int s2m_elvss_fd_is_enabled(struct regulator_dev *rdev)
  359. {
  360. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  361. struct i2c_client *i2c = info->iodev->i2c;
  362. int ret;
  363. u8 val;
  364. ret = s2dos05_read_reg(i2c, S2DOS05_REG_UVLO_FD, &val);
  365. if (ret < 0) {
  366. /* If failed to read FD status, suppose it is not enabled */
  367. pr_info("%s: fail to read i2c address\n", __func__);
  368. return 0;
  369. }
  370. return !(val & 0x1);
  371. }
  372. #endif
  373. #define DEFAULT_ENABLE_FD_DELAY_MS 500
  374. static int s2m_elvss_fd_enable(struct regulator_dev *rdev)
  375. {
  376. int ret = 0;
  377. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  378. unsigned int delay = info->iodev->pdata->enable_fd_delay_ms;
  379. if (delay)
  380. delay = msecs_to_jiffies(delay);
  381. /* To guarantee fd_work is initialized */
  382. if (info->fd_work_init) {
  383. ret = schedule_delayed_work(&info->fd_work, delay);
  384. if(!ret)
  385. pr_info("%s: schedule_delayed_work error!\n", __func__);
  386. }
  387. return ret;
  388. }
  389. static int s2m_elvss_fd_disable(struct regulator_dev *rdev)
  390. {
  391. struct s2dos05_data *info = rdev_get_drvdata(rdev);
  392. if (info->fd_work_init)
  393. cancel_delayed_work_sync(&info->fd_work);
  394. return 0;
  395. }
  396. #endif /* CONFIG_SEC_PM */
  397. static struct regulator_ops s2dos05_ldo_ops = {
  398. .list_voltage = regulator_list_voltage_linear,
  399. .map_voltage = regulator_map_voltage_linear,
  400. .is_enabled = s2m_is_enabled_regmap,
  401. .enable = s2m_enable,
  402. .disable = s2m_disable_regmap,
  403. .get_voltage_sel = s2m_get_voltage_sel_regmap,
  404. .set_voltage_sel = s2m_set_voltage_sel_regmap,
  405. .set_voltage_time_sel = s2m_set_voltage_time_sel,
  406. };
  407. static struct regulator_ops s2dos05_buck_ops = {
  408. .list_voltage = regulator_list_voltage_linear,
  409. .map_voltage = regulator_map_voltage_linear,
  410. .is_enabled = s2m_is_enabled_regmap,
  411. .enable = s2m_enable,
  412. .disable = s2m_disable_regmap,
  413. .get_voltage_sel = s2m_get_voltage_sel_regmap,
  414. .set_voltage_sel = s2m_set_voltage_sel_regmap_buck,
  415. .set_voltage_time_sel = s2m_set_voltage_time_sel,
  416. };
  417. #if IS_ENABLED(CONFIG_SEC_PM)
  418. static struct regulator_ops s2dos05_elvss_ssd_ops = {
  419. .set_current_limit = s2m_set_elvss_ssd_current_limit,
  420. .get_current_limit = s2m_get_elvss_ssd_current_limit,
  421. };
  422. static struct regulator_ops s2dos05_elvss_fd_ops = {
  423. .is_enabled = s2m_elvss_fd_is_enabled,
  424. .enable = s2m_elvss_fd_enable,
  425. .disable = s2m_elvss_fd_disable,
  426. };
  427. #endif /* CONFIG_SEC_PM */
  428. #define _BUCK(macro) S2DOS05_BUCK##macro
  429. #define _buck_ops(num) s2dos05_buck_ops##num
  430. #define _LDO(macro) S2DOS05_LDO##macro
  431. #define _REG(ctrl) S2DOS05_REG##ctrl
  432. #define _ldo_ops(num) s2dos05_ldo_ops##num
  433. #define _MASK(macro) S2DOS05_ENABLE_MASK##macro
  434. #define _TIME(macro) S2DOS05_ENABLE_TIME##macro
  435. #define BUCK_DESC(_name, _id, _ops, m, s, v, e, em, t) { \
  436. .name = _name, \
  437. .id = _id, \
  438. .ops = _ops, \
  439. .type = REGULATOR_VOLTAGE, \
  440. .owner = THIS_MODULE, \
  441. .min_uV = m, \
  442. .uV_step = s, \
  443. .n_voltages = S2DOS05_BUCK_N_VOLTAGES, \
  444. .vsel_reg = v, \
  445. .vsel_mask = S2DOS05_BUCK_VSEL_MASK, \
  446. .enable_reg = e, \
  447. .enable_mask = em, \
  448. .enable_time = t \
  449. }
  450. #define LDO_DESC(_name, _id, _ops, m, s, v, e, em, t) { \
  451. .name = _name, \
  452. .id = _id, \
  453. .ops = _ops, \
  454. .type = REGULATOR_VOLTAGE, \
  455. .owner = THIS_MODULE, \
  456. .min_uV = m, \
  457. .uV_step = s, \
  458. .n_voltages = S2DOS05_LDO_N_VOLTAGES, \
  459. .vsel_reg = v, \
  460. .vsel_mask = S2DOS05_LDO_VSEL_MASK, \
  461. .enable_reg = e, \
  462. .enable_mask = em, \
  463. .enable_time = t \
  464. }
  465. #if IS_ENABLED(CONFIG_SEC_PM)
  466. #define ELVSS_DESC(_name, _id) { \
  467. .name = _name, \
  468. .id = _id, \
  469. .ops = &s2dos05_elvss_ssd_ops, \
  470. .type = REGULATOR_CURRENT, \
  471. .owner = THIS_MODULE, \
  472. }
  473. #define ELVSS_FD_DESC(_name, _id) { \
  474. .name = _name, \
  475. .id = _id, \
  476. .ops = &s2dos05_elvss_fd_ops, \
  477. .type = REGULATOR_CURRENT, \
  478. .owner = THIS_MODULE, \
  479. }
  480. #endif /* CONFIG_SEC_PM */
  481. static struct regulator_desc regulators[S2DOS05_REGULATOR_MAX] = {
  482. /* name, id, ops, min_uv, uV_step, vsel_reg, enable_reg */
  483. LDO_DESC("s2dos05-ldo1", _LDO(1), &_ldo_ops(), _LDO(_MIN1),
  484. _LDO(_STEP1), _REG(_LDO1_CFG),
  485. _REG(_EN), _MASK(_L1), _TIME(_LDO)),
  486. LDO_DESC("s2dos05-ldo2", _LDO(2), &_ldo_ops(), _LDO(_MIN1),
  487. _LDO(_STEP1), _REG(_LDO2_CFG),
  488. _REG(_EN), _MASK(_L2), _TIME(_LDO)),
  489. LDO_DESC("s2dos05-ldo3", _LDO(3), &_ldo_ops(), _LDO(_MIN2),
  490. _LDO(_STEP1), _REG(_LDO3_CFG),
  491. _REG(_EN), _MASK(_L3), _TIME(_LDO)),
  492. LDO_DESC("s2dos05-ldo4", _LDO(4), &_ldo_ops(), _LDO(_MIN2),
  493. _LDO(_STEP1), _REG(_LDO4_CFG),
  494. _REG(_EN), _MASK(_L4), _TIME(_LDO)),
  495. BUCK_DESC("s2dos05-buck1", _BUCK(1), &_buck_ops(), _BUCK(_MIN1),
  496. _BUCK(_STEP1), _REG(_BUCK_VOUT),
  497. _REG(_EN), _MASK(_B1), _TIME(_BUCK)),
  498. #if IS_ENABLED(CONFIG_SEC_PM)
  499. ELVSS_DESC("s2dos05-elvss-ssd", S2DOS05_ELVSS_SSD),
  500. ELVSS_FD_DESC("s2dos05-avdd-elvdd-elvss-fd", S2DOS05_ELVSS_FD),
  501. #endif /* CONFIG_SEC_PM */
  502. };
  503. #if IS_ENABLED(CONFIG_SEC_PM)
  504. static void s2dos05_irq_notifier_call_chain(struct s2dos05_data *s2dos05,
  505. u8 reg_val)
  506. {
  507. int i;
  508. int data = reg_val;
  509. for (i = 0; i < s2dos05->num_regulators; i++)
  510. regulator_notifier_call_chain(s2dos05->rdev[i],
  511. REGULATOR_EVENT_FAIL, (void *)&data);
  512. }
  513. #endif /* CONFIG_SEC_PM */
  514. static irqreturn_t s2dos05_irq_thread(int irq, void *irq_data)
  515. {
  516. struct s2dos05_data *s2dos05 = irq_data;
  517. u8 val = 0;
  518. #if IS_ENABLED(CONFIG_SEC_PM)
  519. u8 scp_val[2] = { 0, };
  520. const char *irq_bit[] = { "ocd", "uvlo", "scp", "ssd", "tsd", "pwrmt" };
  521. char irq_name[32];
  522. ssize_t ret = 0;
  523. unsigned long bit, tmp;
  524. #endif /* CONFIG_SEC_PM */
  525. s2dos05_read_reg(s2dos05->iodev->i2c, S2DOS05_REG_IRQ, &val);
  526. pr_info("%s:irq(%d) S2DOS05_REG_IRQ : 0x%02hhx\n", __func__, irq, val);
  527. #if IS_ENABLED(CONFIG_SEC_PM)
  528. tmp = val;
  529. for_each_set_bit(bit, &tmp, ARRAY_SIZE(irq_bit)) {
  530. ret += sprintf(irq_name + ret, " %s", irq_bit[bit]);
  531. s2dos05_irq_abc_event(irq_bit[bit]);
  532. }
  533. pr_info("%s: irq:%s\n", __func__, irq_name);
  534. /* Show which regulator's SCP occurs */
  535. if (0x04 & val) {
  536. if (s2dos05->iodev->is_sm3080) {
  537. /* SM3080 */
  538. s2dos05_read_reg(s2dos05->iodev->i2c, INT_STATUS1, &scp_val[0]);
  539. pr_info("%s:INT_STATUS1(0x%02hhx)\n", __func__, scp_val[0]);
  540. } else {
  541. /* S2DOS05 */
  542. s2dos05_read_reg(s2dos05->iodev->i2c, FAULT_STATUS1, &scp_val[0]);
  543. s2dos05_read_reg(s2dos05->iodev->i2c, FAULT_STATUS2, &scp_val[1]);
  544. pr_info("%s:FAULT_STATUS1(0x%02hhx), FAULT_STATUS2(0x%02hhx)\n", __func__, scp_val[0], scp_val[1]);
  545. }
  546. }
  547. #endif /* CONFIG_SEC_PM */
  548. #if IS_ENABLED(CONFIG_SEC_PM)
  549. s2dos05_irq_notifier_call_chain(s2dos05, val);
  550. #endif /* CONFIG_SEC_PM */
  551. return IRQ_HANDLED;
  552. }
  553. #if IS_ENABLED(CONFIG_OF)
  554. static int s2dos05_pmic_dt_parse_pdata(struct device *dev,
  555. struct s2dos05_platform_data *pdata)
  556. {
  557. struct device_node *pmic_np, *regulators_np, *reg_np;
  558. struct s2dos05_regulator_data *rdata;
  559. size_t i;
  560. int ret;
  561. u32 val;
  562. pmic_np = dev->of_node;
  563. if (!pmic_np) {
  564. dev_err(dev, "could not find pmic sub-node\n");
  565. return -ENODEV;
  566. }
  567. pdata->dp_pmic_irq = of_get_named_gpio(pmic_np, "s2dos05,s2dos05_int", 0);
  568. if (pdata->dp_pmic_irq < 0)
  569. pr_err("%s error reading s2dos05_irq = %d\n",
  570. __func__, pdata->dp_pmic_irq);
  571. pdata->wakeup = of_property_read_bool(pmic_np, "s2dos05,wakeup");
  572. #if IS_ENABLED(CONFIG_SEC_PM)
  573. if (!of_property_read_string(pmic_np, "sec_disp_pmic_name",
  574. &pdata->sec_disp_pmic_name))
  575. dev_info(dev, "sec_disp_pmic_name: %s\n",
  576. pdata->sec_disp_pmic_name);
  577. #endif /* CONFIG_SEC_PM */
  578. pdata->adc_mode = 0;
  579. ret = of_property_read_u32(pmic_np, "adc_mode", &val);
  580. if (ret)
  581. return -EINVAL;
  582. pdata->adc_mode = val;
  583. pdata->adc_sync_mode = 0;
  584. ret = of_property_read_u32(pmic_np, "adc_sync_mode", &val);
  585. if (ret)
  586. return -EINVAL;
  587. pdata->adc_sync_mode = val;
  588. #if IS_ENABLED(CONFIG_SEC_PM)
  589. pdata->ocl_elvss = -1;
  590. ret = of_property_read_u32(pmic_np, "ocl_elvss", &val);
  591. if (!ret) {
  592. pdata->ocl_elvss = val;
  593. dev_info(dev, "get ocl elvss value: %d\n", pdata->ocl_elvss);
  594. }
  595. pdata->enable_fd_delay_ms = DEFAULT_ENABLE_FD_DELAY_MS;
  596. ret = of_property_read_u32(pmic_np, "enable_fd_delay_ms", &val);
  597. if (!ret) {
  598. pdata->enable_fd_delay_ms = val;
  599. dev_info(dev, "enable_fd_delay_ms: %u\n", pdata->enable_fd_delay_ms);
  600. }
  601. #endif
  602. regulators_np = of_find_node_by_name(pmic_np, "regulators");
  603. if (!regulators_np) {
  604. dev_err(dev, "could not find regulators sub-node\n");
  605. return -EINVAL;
  606. }
  607. /* count the number of regulators to be supported in pmic */
  608. pdata->num_regulators = 0;
  609. for_each_child_of_node(regulators_np, reg_np) {
  610. pdata->num_regulators++;
  611. }
  612. rdata = devm_kzalloc(dev, sizeof(*rdata) *
  613. pdata->num_regulators, GFP_KERNEL);
  614. if (!rdata) {
  615. dev_err(dev,
  616. "could not allocate memory for regulator data\n");
  617. return -ENOMEM;
  618. }
  619. pdata->regulators = rdata;
  620. pdata->num_rdata = 0;
  621. for_each_child_of_node(regulators_np, reg_np) {
  622. for (i = 0; i < ARRAY_SIZE(regulators); i++)
  623. if (!of_node_cmp(reg_np->name,
  624. regulators[i].name))
  625. break;
  626. if (i == ARRAY_SIZE(regulators)) {
  627. dev_warn(dev,
  628. "don't know how to configure regulator %s\n",
  629. reg_np->name);
  630. continue;
  631. }
  632. rdata->id = i;
  633. rdata->initdata = of_get_regulator_init_data(
  634. dev, reg_np,
  635. &regulators[i]);
  636. rdata->reg_node = reg_np;
  637. rdata++;
  638. pdata->num_rdata++;
  639. }
  640. of_node_put(regulators_np);
  641. return 0;
  642. }
  643. #else
  644. static int s2dos05_pmic_dt_parse_pdata(struct s2dos05_dev *iodev,
  645. struct s2dos05_platform_data *pdata)
  646. {
  647. return 0;
  648. }
  649. #endif /* CONFIG_OF */
  650. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  651. static ssize_t s2dos05_read_store(struct device *dev,
  652. struct device_attribute *attr,
  653. const char *buf, size_t size)
  654. {
  655. struct s2dos05_data *s2dos05 = dev_get_drvdata(dev);
  656. int ret;
  657. u8 val, reg_addr;
  658. if (buf == NULL) {
  659. pr_info("%s: empty buffer\n", __func__);
  660. return -1;
  661. }
  662. ret = kstrtou8(buf, 0, &reg_addr);
  663. if (ret < 0)
  664. pr_info("%s: fail to transform i2c address\n", __func__);
  665. ret = s2dos05_read_reg(s2dos05->iodev->i2c, reg_addr, &val);
  666. if (ret < 0)
  667. pr_info("%s: fail to read i2c address\n", __func__);
  668. pr_info("%s: reg(0x%02hhx) data(0x%02hhx)\n", __func__, reg_addr, val);
  669. s2dos05->read_addr = reg_addr;
  670. s2dos05->read_val = val;
  671. return size;
  672. }
  673. static ssize_t s2dos05_read_show(struct device *dev,
  674. struct device_attribute *attr,
  675. char *buf)
  676. {
  677. struct s2dos05_data *s2dos05 = dev_get_drvdata(dev);
  678. return sprintf(buf, "0x%02hhx: 0x%02hhx\n", s2dos05->read_addr,
  679. s2dos05->read_val);
  680. }
  681. static ssize_t s2dos05_write_store(struct device *dev,
  682. struct device_attribute *attr,
  683. const char *buf, size_t size)
  684. {
  685. struct s2dos05_data *s2dos05 = dev_get_drvdata(dev);
  686. int ret;
  687. u8 reg = 0, data = 0;
  688. if (buf == NULL) {
  689. pr_info("%s: empty buffer\n", __func__);
  690. return size;
  691. }
  692. ret = sscanf(buf, "0x%02hhx 0x%02hhx", &reg, &data);
  693. if (ret != 2) {
  694. pr_info("%s: input error\n", __func__);
  695. return size;
  696. }
  697. pr_info("%s: reg(0x%02hhx) data(0x%02hhx)\n", __func__, reg, data);
  698. ret = s2dos05_write_reg(s2dos05->iodev->i2c, reg, data);
  699. if (ret < 0)
  700. pr_info("%s: fail to write i2c addr/data\n", __func__);
  701. return size;
  702. }
  703. static ssize_t s2dos05_write_show(struct device *dev,
  704. struct device_attribute *attr,
  705. char *buf)
  706. {
  707. return sprintf(buf, "echo (register addr.) (data) > s2dos05_write\n");
  708. }
  709. #define ATTR_REGULATOR (2)
  710. static struct pmic_device_attribute regulator_attr[] = {
  711. PMIC_ATTR(s2dos05_write, S_IRUGO | S_IWUSR, s2dos05_write_show, s2dos05_write_store),
  712. PMIC_ATTR(s2dos05_read, S_IRUGO | S_IWUSR, s2dos05_read_show, s2dos05_read_store),
  713. };
  714. static int s2dos05_create_sysfs(struct s2dos05_data *s2dos05)
  715. {
  716. struct device *s2dos05_pmic = s2dos05->dev;
  717. struct device *dev = s2dos05->iodev->dev;
  718. char device_name[32] = {0, };
  719. int err = -ENODEV, i = 0;
  720. pr_info("%s()\n", __func__);
  721. s2dos05->read_addr = 0;
  722. s2dos05->read_val = 0;
  723. /* Dynamic allocation for device name */
  724. snprintf(device_name, sizeof(device_name) - 1, "%s@%s",
  725. dev_driver_string(dev), dev_name(dev));
  726. s2dos05_pmic = pmic_device_create(s2dos05, device_name);
  727. s2dos05->dev = s2dos05_pmic;
  728. /* Create sysfs entries */
  729. for (i = 0; i < ATTR_REGULATOR; i++) {
  730. err = device_create_file(s2dos05_pmic, &regulator_attr[i].dev_attr);
  731. if (err)
  732. goto remove_pmic_device;
  733. }
  734. return 0;
  735. remove_pmic_device:
  736. for (i--; i >= 0; i--)
  737. device_remove_file(s2dos05_pmic, &regulator_attr[i].dev_attr);
  738. pmic_device_destroy(s2dos05_pmic->devt);
  739. return -1;
  740. }
  741. #endif
  742. #if IS_ENABLED(CONFIG_SEC_PM)
  743. static ssize_t enable_fd_show(struct device *dev, struct device_attribute *attr,
  744. char *buf)
  745. {
  746. struct s2dos05_data *info = dev_get_drvdata(dev);
  747. struct i2c_client *i2c = info->iodev->i2c;
  748. u8 uvlo_fd;
  749. bool enabled;
  750. s2dos05_read_reg(i2c, S2DOS05_REG_UVLO_FD, &uvlo_fd);
  751. dev_info(&i2c->dev, "%s: uvlo_fd(0x%02X)\n", __func__, uvlo_fd);
  752. enabled = !(uvlo_fd & 1);
  753. return sprintf(buf, "%s\n", enabled ? "enabled" : "disabled");
  754. }
  755. static ssize_t enable_fd_store(struct device *dev, struct device_attribute *attr,
  756. const char *buf, size_t count)
  757. {
  758. struct s2dos05_data *info = dev_get_drvdata(dev);
  759. struct i2c_client *i2c = info->iodev->i2c;
  760. int ret;
  761. bool enable;
  762. u8 uvlo_fd;
  763. ret = strtobool(buf, &enable);
  764. if (ret)
  765. return ret;
  766. dev_info(&i2c->dev, "%s: enable(%d)\n", __func__, enable);
  767. uvlo_fd = !enable;
  768. ret = s2dos05_update_reg(i2c, S2DOS05_REG_UVLO_FD, uvlo_fd, 1);
  769. if (ret < 0) {
  770. dev_err(&i2c->dev, "%s: Failed to update FD(%d)\n", __func__, ret);
  771. return ret;
  772. }
  773. return count;
  774. }
  775. static DEVICE_ATTR(enable_fd, 0664, enable_fd_show, enable_fd_store);
  776. static void __maybe_unused handle_fd_work(struct work_struct *work)
  777. {
  778. struct s2dos05_data *s2dos05 =
  779. container_of(to_delayed_work(work), struct s2dos05_data, fd_work);
  780. struct i2c_client *i2c = s2dos05->iodev->i2c;
  781. u8 uvlo_fd = 0;
  782. int ret;
  783. dev_info(&i2c->dev, "%s: Enable FD\n", __func__);
  784. ret = s2dos05_update_reg(i2c, S2DOS05_REG_UVLO_FD, 0, 1);
  785. if (ret < 0)
  786. dev_err(&i2c->dev, "%s: Failed to enable FD(%d)\n", __func__, ret);
  787. s2dos05_read_reg(i2c, S2DOS05_REG_UVLO_FD, &uvlo_fd);
  788. dev_info(&i2c->dev, "%s: uvlo_fd(0x%02X)\n", __func__, uvlo_fd);
  789. }
  790. static int __maybe_unused fb_state_change(struct notifier_block *nb, unsigned long val,
  791. void *data)
  792. {
  793. struct s2dos05_data *s2dos05 =
  794. container_of(nb, struct s2dos05_data, fb_block);
  795. #if !IS_ENABLED(CONFIG_SEC_PM_QCOM)
  796. struct i2c_client *i2c = s2dos05->iodev->i2c;
  797. struct fb_event *evdata = data;
  798. struct fb_info *info = evdata->info;
  799. int ret;
  800. #endif
  801. unsigned int blank;
  802. if (val != FB_EVENT_BLANK)
  803. return 0;
  804. #if IS_ENABLED(CONFIG_SEC_PM_QCOM)
  805. blank = *(int *)data;
  806. #else
  807. /*
  808. * If FBNODE is not zero, it is not primary display(LCD)
  809. * and don't need to process these scheduling.
  810. */
  811. if (info->node)
  812. return NOTIFY_OK;
  813. blank = *(int *)evdata->data;
  814. #endif
  815. if (blank == FB_BLANK_UNBLANK) {
  816. #if IS_ENABLED(CONFIG_SEC_PM_QCOM)
  817. schedule_delayed_work(&s2dos05->fd_work, msecs_to_jiffies(500));
  818. #else
  819. dev_info(&i2c->dev, "%s: Enable FD\n", __func__);
  820. ret = s2dos05_update_reg(i2c, S2DOS05_REG_UVLO_FD, 0, 1);
  821. if (ret < 0)
  822. dev_err(&i2c->dev, "%s: Failed to enable FD(%d)\n",
  823. __func__, ret);
  824. #endif
  825. }
  826. #if IS_ENABLED(CONFIG_SEC_PM_QCOM)
  827. else {
  828. cancel_delayed_work_sync(&s2dos05->fd_work);
  829. }
  830. #endif
  831. return NOTIFY_OK;
  832. }
  833. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  834. #define VALID_REG S2DOS05_REG_EN /* Register address for validation */
  835. #define VALID_MASK 0xE0 /* NA(reserved) bit */
  836. static ssize_t validation_show(struct device *dev,
  837. struct device_attribute *attr, char *buf)
  838. {
  839. struct s2dos05_data *s2dos05 = dev_get_drvdata(dev);
  840. struct i2c_client *i2c = s2dos05->iodev->i2c;
  841. int ret;
  842. bool result = false;
  843. u8 val;
  844. ret = s2dos05_read_reg(i2c, VALID_REG, &val);
  845. if (ret < 0) {
  846. dev_err(dev, "%s: fail to read reg\n", __func__);
  847. goto out;
  848. }
  849. dev_info(dev, "%s: initial state: reg(0x%02X) data(0x%02X)\n", __func__,
  850. VALID_REG, val);
  851. ret = s2dos05_update_reg(i2c, VALID_REG, VALID_MASK, VALID_MASK);
  852. if (ret < 0) {
  853. dev_err(dev, "%s: fail to update reg\n", __func__);
  854. goto out;
  855. }
  856. ret = s2dos05_read_reg(i2c, VALID_REG, &val);
  857. if (ret < 0) {
  858. dev_err(dev, "%s: fail to read reg\n", __func__);
  859. goto out;
  860. }
  861. dev_info(dev, "%s: updated state: reg(0x%02x) data(0x%02x)\n", __func__,
  862. VALID_REG, val);
  863. result = (val & VALID_MASK) == VALID_MASK;
  864. /* No need change to init value(0x00), but, do it */
  865. s2dos05_update_reg(i2c, VALID_REG, 0x00, VALID_MASK);
  866. out:
  867. dev_info(dev, "%s: result: %s\n", __func__, result ? "ok" : "not ok");
  868. return sprintf(buf, "%d\n", result);
  869. }
  870. static DEVICE_ATTR(validation, 0444, validation_show, NULL);
  871. /* for LDO burnt: enable/disable all regulator, support only for sm3080 due to hidden register */
  872. #define NUM_REG 7 /* number of regulator to control */
  873. struct power_sequence {
  874. int regulator;
  875. int delay; /* delay after regulator control */
  876. };
  877. static ssize_t enable_pwr_store(struct device *dev,
  878. struct device_attribute *attr, const char *buf, size_t count)
  879. {
  880. struct s2dos05_data *info = dev_get_drvdata(dev);
  881. struct i2c_client *i2c = info->iodev->i2c;
  882. u8 reg_status, ctrl;
  883. u8 val, mask;
  884. int i;
  885. bool enable;
  886. int ret;
  887. /* { regulator - delay } sequence */
  888. struct power_sequence en_order[NUM_REG] = {
  889. { S2DOS05_LDO1, 0 },
  890. { S2DOS05_LDO4, 900 },
  891. { SM3080_AVDD, 100 },
  892. { SM3080_ELVDD, 10 },
  893. { SM3080_ELVSS, 1000 },
  894. { S2DOS05_LDO2, 0 },
  895. { S2DOS05_LDO3, 0 } };
  896. struct power_sequence dis_order[NUM_REG] = {
  897. { S2DOS05_LDO3, 5 },
  898. { S2DOS05_LDO2, 450 },
  899. { SM3080_ELVDD, 0 },
  900. { SM3080_ELVSS, 50 },
  901. { SM3080_AVDD, 50 },
  902. { S2DOS05_LDO4, 50 },
  903. { S2DOS05_LDO1, 10 } };
  904. struct power_sequence *order; /* be selected by enable */
  905. ret = strtobool(buf, &enable);
  906. if (ret)
  907. return ret;
  908. s2dos05_read_reg(i2c, S2DOS05_REG_STAT, &reg_status);
  909. s2dos05_read_reg(i2c, S2DOS05_REG_EN, &ctrl);
  910. dev_info(&i2c->dev, "++%s: en(%d), status(0x%02x), ctrl(0x%02x)\n",
  911. __func__, enable, reg_status, ctrl);
  912. order = enable ? en_order : dis_order;
  913. for (i = 0; i < NUM_REG; i++) {
  914. val = enable << order[i].regulator;
  915. mask = 1 << order[i].regulator;
  916. ret = s2dos05_update_reg(i2c, S2DOS05_REG_EN, val, mask);
  917. msleep(order[i].delay);
  918. }
  919. /* enable fd because of el power on */
  920. if (enable)
  921. ret = s2dos05_update_reg(i2c, S2DOS05_REG_UVLO_FD, 0, 1);
  922. s2dos05_read_reg(i2c, S2DOS05_REG_STAT, &reg_status);
  923. s2dos05_read_reg(i2c, S2DOS05_REG_EN, &ctrl);
  924. dev_info(&i2c->dev, "--%s: en(%d), status(0x%02x), ctrl(0x%02x)\n",
  925. __func__, enable, reg_status, ctrl);
  926. return count;
  927. }
  928. static ssize_t enable_pwr_show(struct device *dev,
  929. struct device_attribute *attr, char *buf)
  930. {
  931. struct s2dos05_data *s2dos05 = dev_get_drvdata(dev);
  932. struct i2c_client *i2c = s2dos05->iodev->i2c;
  933. u8 reg_status, ctrl;
  934. s2dos05_read_reg(i2c, S2DOS05_REG_STAT, &reg_status);
  935. s2dos05_read_reg(i2c, S2DOS05_REG_EN, &ctrl);
  936. dev_info(&i2c->dev, "%s: status(0x%02x), ctrl(0x%02x)\n",
  937. __func__, reg_status, ctrl);
  938. return sprintf(buf, "0x%02x\n0x%02x\n", reg_status, ctrl);
  939. }
  940. static DEVICE_ATTR(enable_pwr, 0664, enable_pwr_show, enable_pwr_store);
  941. #endif /* CONFIG_SEC_FACTORY */
  942. #if IS_ENABLED(CONFIG_SEC_PM) && IS_ENABLED(CONFIG_SEC_PM_QCOM)
  943. static void sec_set_fd(struct s2dos05_data *info)
  944. {
  945. info->fb_block.notifier_call = fb_state_change;
  946. msm_drm_register_notifier_client(&info->fb_block);
  947. INIT_DELAYED_WORK(&info->fd_work, handle_fd_work);
  948. info->fd_work_init = false;
  949. }
  950. #elif IS_ENABLED(CONFIG_SEC_PM) && IS_ENABLED(CONFIG_REGULATOR_S2DOS05_ELVSS_FD)
  951. static void sec_set_fd(struct s2dos05_data *info)
  952. {
  953. INIT_DELAYED_WORK(&info->fd_work, handle_fd_work);
  954. info->fd_work_init = true;
  955. }
  956. #elif IS_ENABLED(CONFIG_SEC_PM)
  957. static void sec_set_fd(struct s2dos05_data *info)
  958. {
  959. info->fb_block.notifier_call = fb_state_change;
  960. fb_register_client(&info->fb_block);
  961. info->fd_work_init = false;
  962. }
  963. #else
  964. static void sec_set_fd(struct s2dos05_data *info)
  965. {
  966. info->fd_work_init = false;
  967. }
  968. #endif
  969. static int s2dos05_sec_pm_init(struct s2dos05_data *info)
  970. {
  971. struct s2dos05_dev *iodev = info->iodev;
  972. struct device *dev = &iodev->i2c->dev;
  973. const char *sec_disp_pmic_name = iodev->pdata->sec_disp_pmic_name;
  974. int ret = 0;
  975. if (sec_disp_pmic_name)
  976. iodev->sec_disp_pmic_dev =
  977. sec_device_create(info, sec_disp_pmic_name);
  978. else
  979. iodev->sec_disp_pmic_dev =
  980. sec_device_create(info, "disp_pmic");
  981. if (unlikely(IS_ERR(iodev->sec_disp_pmic_dev))) {
  982. ret = PTR_ERR(iodev->sec_disp_pmic_dev);
  983. dev_err(dev, "%s: Failed to create disp_pmic(%d)\n", __func__,
  984. ret);
  985. return ret;
  986. }
  987. dev_info(dev, "%s: Enable FD\n", __func__);
  988. ret = s2dos05_update_reg(iodev->i2c, S2DOS05_REG_UVLO_FD, 0, 1);
  989. if (ret < 0) {
  990. dev_err(dev, "%s: Failed to enable FD(%d)\n", __func__, ret);
  991. goto remove_sec_disp_pmic_dev;
  992. }
  993. /* To separate FD operation */
  994. sec_set_fd(info);
  995. ret = device_create_file(iodev->sec_disp_pmic_dev, &dev_attr_enable_fd);
  996. if (ret) {
  997. dev_err(dev, "%s: Failed to create enable_fd(%d)\n", __func__,
  998. ret);
  999. goto remove_sec_disp_pmic_dev;
  1000. }
  1001. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  1002. ret = device_create_file(iodev->sec_disp_pmic_dev, &dev_attr_validation);
  1003. if (ret) {
  1004. pr_err("s2dos05_sysfs: failed to create validation file, %s\n",
  1005. dev_attr_validation.attr.name);
  1006. goto remove_sec_disp_enable_fd;
  1007. }
  1008. if (iodev->is_sm3080) {
  1009. ret = device_create_file(iodev->sec_disp_pmic_dev, &dev_attr_enable_pwr);
  1010. if (ret) {
  1011. pr_err("s2dos05_sysfs: failed to create enable_pwr file, %s\n",
  1012. dev_attr_enable_pwr.attr.name);
  1013. goto remove_sec_disp_validation;
  1014. }
  1015. }
  1016. #endif /* CONFIG_SEC_FACTORY */
  1017. return 0;
  1018. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  1019. remove_sec_disp_validation:
  1020. device_remove_file(info->iodev->sec_disp_pmic_dev, &dev_attr_validation);
  1021. remove_sec_disp_enable_fd:
  1022. device_remove_file(info->iodev->sec_disp_pmic_dev, &dev_attr_enable_fd);
  1023. #endif /* CONFIG_SEC_FACTORY */
  1024. remove_sec_disp_pmic_dev:
  1025. sec_device_destroy(iodev->sec_disp_pmic_dev->devt);
  1026. return ret;
  1027. }
  1028. static void s2dos05_sec_pm_deinit(struct s2dos05_data *info)
  1029. {
  1030. device_remove_file(info->iodev->sec_disp_pmic_dev, &dev_attr_enable_fd);
  1031. #if IS_ENABLED(CONFIG_SEC_PM_QCOM)
  1032. msm_drm_unregister_notifier_client(&info->fb_block);
  1033. #endif
  1034. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  1035. device_remove_file(info->iodev->sec_disp_pmic_dev, &dev_attr_validation);
  1036. device_remove_file(info->iodev->sec_disp_pmic_dev, &dev_attr_enable_pwr);
  1037. #endif /* CONFIG_SEC_FACTORY */
  1038. sec_device_destroy(info->iodev->sec_disp_pmic_dev->devt);
  1039. }
  1040. #endif /* CONFIG_SEC_PM */
  1041. static int __s2dos05_pmic_probe(struct i2c_client *i2c)
  1042. {
  1043. struct s2dos05_dev *iodev;
  1044. struct s2dos05_platform_data *pdata = i2c->dev.platform_data;
  1045. struct regulator_config config = { };
  1046. struct s2dos05_data *s2dos05;
  1047. size_t i;
  1048. int ret = 0;
  1049. u8 val = 0, mask = 0;
  1050. pr_info("%s:%s\n", MFD_DEV_NAME, __func__);
  1051. iodev = devm_kzalloc(&i2c->dev, sizeof(struct s2dos05_dev), GFP_KERNEL);
  1052. if (!iodev) {
  1053. dev_err(&i2c->dev, "%s: Failed to alloc mem for s2dos05\n",
  1054. __func__);
  1055. return -ENOMEM;
  1056. }
  1057. if (i2c->dev.of_node) {
  1058. pdata = devm_kzalloc(&i2c->dev,
  1059. sizeof(struct s2dos05_platform_data), GFP_KERNEL);
  1060. if (!pdata) {
  1061. dev_err(&i2c->dev, "Failed to allocate memory\n");
  1062. ret = -ENOMEM;
  1063. goto err_pdata;
  1064. }
  1065. ret = s2dos05_pmic_dt_parse_pdata(&i2c->dev, pdata);
  1066. if (ret < 0) {
  1067. dev_err(&i2c->dev, "Failed to get device of_node\n");
  1068. goto err_pdata;
  1069. }
  1070. i2c->dev.platform_data = pdata;
  1071. } else
  1072. pdata = i2c->dev.platform_data;
  1073. iodev->dev = &i2c->dev;
  1074. iodev->i2c = i2c;
  1075. if (pdata) {
  1076. iodev->pdata = pdata;
  1077. iodev->wakeup = pdata->wakeup;
  1078. } else {
  1079. ret = -EINVAL;
  1080. goto err_pdata;
  1081. }
  1082. mutex_init(&iodev->i2c_lock);
  1083. s2dos05 = devm_kzalloc(&i2c->dev, sizeof(struct s2dos05_data),
  1084. GFP_KERNEL);
  1085. if (!s2dos05) {
  1086. pr_info("[%s:%d] if (!s2dos05)\n", __FILE__, __LINE__);
  1087. ret = -ENOMEM;
  1088. goto err_s2dos05_data;
  1089. }
  1090. #if IS_ENABLED(CONFIG_SEC_ABC)
  1091. atomic_set(&s2dos05->i2c_fail_count, 0);
  1092. #endif /* CONFIG_SEC_ABC */
  1093. i2c_set_clientdata(i2c, s2dos05);
  1094. s2dos05->iodev = iodev;
  1095. s2dos05->num_regulators = pdata->num_rdata;
  1096. for (i = 0; i < pdata->num_rdata; i++) {
  1097. int id = pdata->regulators[i].id;
  1098. config.dev = &i2c->dev;
  1099. config.init_data = pdata->regulators[i].initdata;
  1100. config.driver_data = s2dos05;
  1101. config.of_node = pdata->regulators[i].reg_node;
  1102. s2dos05->rdev[i] = devm_regulator_register(&i2c->dev,
  1103. &regulators[id], &config);
  1104. if (IS_ERR(s2dos05->rdev[i])) {
  1105. ret = PTR_ERR(s2dos05->rdev[i]);
  1106. dev_err(&i2c->dev, "regulator init failed for %d\n",
  1107. id);
  1108. s2dos05->rdev[i] = NULL;
  1109. goto err_s2dos05_data;
  1110. }
  1111. #if IS_ENABLED(CONFIG_REGULATOR_DEBUG_CONTROL)
  1112. ret = devm_regulator_debug_register(&i2c->dev, s2dos05->rdev[i]);
  1113. if (ret)
  1114. dev_err(&i2c->dev, "failed to register debug regulator for %lu, rc=%d\n",
  1115. i, ret);
  1116. #endif
  1117. }
  1118. #if IS_ENABLED(CONFIG_SEC_PM)
  1119. ret = s2dos05_read_reg(i2c, S2DOS05_REG_DEVICE_ID_PGM, &val);
  1120. if (ret < 0) {
  1121. dev_err(&i2c->dev, "Failed to read DEVICE ID address\n");
  1122. goto err_s2dos05_data;
  1123. }
  1124. if (val & (1 << 7)) {
  1125. iodev->is_sm3080 = true;
  1126. dev_info(&i2c->dev, "SM3080 DEVICE ID: 0x%02X\n", val);
  1127. }
  1128. /* set OCL_ELVSS */
  1129. if (pdata->ocl_elvss > -1) {
  1130. s2dos05_update_reg(i2c, S2DOS05_REG_OCL, pdata->ocl_elvss, S2DOS05_OCL_ELVSS_MASK);
  1131. pr_info("%s: set ocl elvss: %d\n", __func__, pdata->ocl_elvss);
  1132. }
  1133. ret = s2dos05_sec_pm_init(s2dos05);
  1134. if (ret < 0)
  1135. goto err_s2dos05_data;
  1136. #endif /* CONFIG_SEC_PM */
  1137. iodev->adc_mode = pdata->adc_mode;
  1138. iodev->adc_sync_mode = pdata->adc_sync_mode;
  1139. if (iodev->adc_mode > 0)
  1140. s2dos05_powermeter_init(iodev);
  1141. val = (S2DOS05_IRQ_PWRMT_MASK | S2DOS05_IRQ_TSD_MASK
  1142. | S2DOS05_IRQ_UVLO_MASK | S2DOS05_IRQ_OCD_MASK);
  1143. mask = (S2DOS05_IRQ_PWRMT_MASK | S2DOS05_IRQ_TSD_MASK | S2DOS05_IRQ_SSD_MASK
  1144. | S2DOS05_IRQ_SCP_MASK | S2DOS05_IRQ_UVLO_MASK | S2DOS05_IRQ_OCD_MASK);
  1145. ret = s2dos05_update_reg(iodev->i2c, S2DOS05_REG_IRQ_MASK, val, mask);
  1146. if (ret < 0) {
  1147. dev_err(&i2c->dev, "Failed to mask IRQ MASK address\n");
  1148. return ret;
  1149. }
  1150. if (pdata->dp_pmic_irq > 0) {
  1151. iodev->dp_pmic_irq = gpio_to_irq(pdata->dp_pmic_irq);
  1152. pr_info("%s : dp_pmic_irq = %d\n", __func__, iodev->dp_pmic_irq);
  1153. if (iodev->dp_pmic_irq > 0) {
  1154. ret = request_threaded_irq(iodev->dp_pmic_irq,
  1155. NULL, s2dos05_irq_thread,
  1156. IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
  1157. "dp-pmic-irq", s2dos05);
  1158. if (ret) {
  1159. dev_err(&i2c->dev,
  1160. "%s: Failed to Request IRQ\n", __func__);
  1161. goto err_s2dos05_data;
  1162. }
  1163. ret = enable_irq_wake(iodev->dp_pmic_irq);
  1164. if (ret < 0)
  1165. dev_err(&i2c->dev,
  1166. "%s: Failed to Enable Wakeup Source(%d)\n",
  1167. __func__, ret);
  1168. } else {
  1169. dev_err(&i2c->dev, "%s: Failed gpio_to_irq(%d)\n",
  1170. __func__, iodev->dp_pmic_irq);
  1171. goto err_s2dos05_data;
  1172. }
  1173. }
  1174. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  1175. ret = s2dos05_create_sysfs(s2dos05);
  1176. if (ret < 0) {
  1177. pr_err("%s: s2dos05_create_sysfs fail\n", __func__);
  1178. goto err_s2dos05_data;
  1179. }
  1180. #endif
  1181. return ret;
  1182. err_s2dos05_data:
  1183. mutex_destroy(&iodev->i2c_lock);
  1184. err_pdata:
  1185. return ret;
  1186. }
  1187. #if IS_ENABLED(CONFIG_OF)
  1188. static struct of_device_id s2dos05_i2c_dt_ids[] = {
  1189. { .compatible = "samsung,s2dos05pmic" },
  1190. { },
  1191. };
  1192. #endif /* CONFIG_OF */
  1193. static int __s2dos05_pmic_remove(struct i2c_client *i2c)
  1194. {
  1195. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  1196. #if IS_ENABLED(CONFIG_DRV_SAMSUNG_PMIC)
  1197. struct device *s2dos05_pmic = info->dev;
  1198. int i = 0;
  1199. dev_info(&i2c->dev, "%s\n", __func__);
  1200. /* Remove sysfs entries */
  1201. for (i = 0; i < ATTR_REGULATOR; i++)
  1202. device_remove_file(s2dos05_pmic, &regulator_attr[i].dev_attr);
  1203. pmic_device_destroy(s2dos05_pmic->devt);
  1204. #else
  1205. dev_info(&i2c->dev, "%s\n", __func__);
  1206. #endif
  1207. if (info->iodev->adc_mode > 0)
  1208. s2dos05_powermeter_deinit(info->iodev);
  1209. #if IS_ENABLED(CONFIG_SEC_PM)
  1210. s2dos05_sec_pm_deinit(info);
  1211. #endif /* CONFIG_SEC_PM */
  1212. return 0;
  1213. }
  1214. #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0)
  1215. static int s2dos05_pmic_probe(struct i2c_client *i2c)
  1216. {
  1217. return __s2dos05_pmic_probe(i2c);
  1218. }
  1219. #else
  1220. static int s2dos05_pmic_probe(struct i2c_client *i2c,
  1221. const struct i2c_device_id *dev_id)
  1222. {
  1223. return __s2dos05_pmic_probe(i2c);
  1224. }
  1225. #endif
  1226. #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
  1227. static void s2dos05_pmic_remove(struct i2c_client *i2c)
  1228. {
  1229. __s2dos05_pmic_remove(i2c);
  1230. }
  1231. #else
  1232. static int s2dos05_pmic_remove(struct i2c_client *i2c)
  1233. {
  1234. return __s2dos05_pmic_remove(i2c);
  1235. }
  1236. #endif
  1237. #if IS_ENABLED(CONFIG_PM)
  1238. static int s2dos05_pmic_suspend(struct device *dev)
  1239. {
  1240. struct i2c_client *i2c = to_i2c_client(dev);
  1241. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  1242. struct s2dos05_dev *s2dos05 = info->iodev;
  1243. pr_info("%s adc_mode : %d\n", __func__, s2dos05->adc_mode);
  1244. if (s2dos05->adc_mode > 0) {
  1245. s2dos05_read_reg(s2dos05->i2c,
  1246. S2DOS05_REG_PWRMT_CTRL2, &s2dos05->adc_en_val);
  1247. if (s2dos05->adc_en_val & 0x80)
  1248. s2dos05_update_reg(s2dos05->i2c,
  1249. S2DOS05_REG_PWRMT_CTRL2,
  1250. 0, ADC_EN_MASK);
  1251. }
  1252. return 0;
  1253. }
  1254. static int s2dos05_pmic_resume(struct device *dev)
  1255. {
  1256. struct i2c_client *i2c = to_i2c_client(dev);
  1257. struct s2dos05_data *info = i2c_get_clientdata(i2c);
  1258. struct s2dos05_dev *s2dos05 = info->iodev;
  1259. pr_info("%s adc_mode : %d\n", __func__, s2dos05->adc_mode);
  1260. if (s2dos05->adc_mode > 0) {
  1261. #if IS_ENABLED(CONFIG_SEC_PM)
  1262. int ret;
  1263. ret = s2dos05_update_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2,
  1264. s2dos05->adc_en_val & 0x80, ADC_EN_MASK);
  1265. if (ret < 0)
  1266. pr_err("%s: Failed to update_reg: %d\n", __func__, ret);
  1267. #else
  1268. s2dos05_update_reg(s2dos05->i2c, S2DOS05_REG_PWRMT_CTRL2,
  1269. s2dos05->adc_en_val & 0x80, ADC_EN_MASK);
  1270. #endif /* CONFIG_SEC_PM */
  1271. }
  1272. return 0;
  1273. }
  1274. #else
  1275. #define s2dos05_pmic_suspend NULL
  1276. #define s2dos05_pmic_resume NULL
  1277. #endif /* CONFIG_PM */
  1278. static const struct dev_pm_ops s2dos05_pmic_pm = {
  1279. .suspend = s2dos05_pmic_suspend,
  1280. .resume = s2dos05_pmic_resume,
  1281. };
  1282. #if IS_ENABLED(CONFIG_OF)
  1283. static const struct i2c_device_id s2dos05_pmic_id[] = {
  1284. {"s2dos05-regulator", 0},
  1285. {},
  1286. };
  1287. #endif
  1288. static struct i2c_driver s2dos05_i2c_driver = {
  1289. .driver = {
  1290. .name = "s2dos05-regulator",
  1291. .owner = THIS_MODULE,
  1292. .pm = &s2dos05_pmic_pm,
  1293. #if IS_ENABLED(CONFIG_OF)
  1294. .of_match_table = s2dos05_i2c_dt_ids,
  1295. #endif /* CONFIG_OF */
  1296. .suppress_bind_attrs = true,
  1297. },
  1298. .probe = s2dos05_pmic_probe,
  1299. .remove = s2dos05_pmic_remove,
  1300. .id_table = s2dos05_pmic_id,
  1301. };
  1302. static int __init s2dos05_i2c_init(void)
  1303. {
  1304. pr_info("%s:%s\n", MFD_DEV_NAME, __func__);
  1305. return i2c_add_driver(&s2dos05_i2c_driver);
  1306. }
  1307. subsys_initcall(s2dos05_i2c_init);
  1308. static void __exit s2dos05_i2c_exit(void)
  1309. {
  1310. i2c_del_driver(&s2dos05_i2c_driver);
  1311. }
  1312. module_exit(s2dos05_i2c_exit);
  1313. MODULE_DESCRIPTION("SAMSUNG s2dos05 Regulator Driver");
  1314. MODULE_LICENSE("GPL");