s5m-core.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. * s5m-core.h
  3. *
  4. * Copyright (c) 2011 Samsung Electronics Co., Ltd
  5. * http://www.samsung.com
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License as published by the
  9. * Free Software Foundation; either version 2 of the License, or (at your
  10. * option) any later version.
  11. *
  12. */
  13. #ifndef __LINUX_MFD_S5M_CORE_H
  14. #define __LINUX_MFD_S5M_CORE_H
  15. #define NUM_IRQ_REGS 4
  16. enum s5m_device_type {
  17. S5M8751X,
  18. S5M8763X,
  19. S5M8767X,
  20. };
  21. /* S5M8767 registers */
  22. enum s5m8767_reg {
  23. S5M8767_REG_ID,
  24. S5M8767_REG_INT1,
  25. S5M8767_REG_INT2,
  26. S5M8767_REG_INT3,
  27. S5M8767_REG_INT1M,
  28. S5M8767_REG_INT2M,
  29. S5M8767_REG_INT3M,
  30. S5M8767_REG_STATUS1,
  31. S5M8767_REG_STATUS2,
  32. S5M8767_REG_STATUS3,
  33. S5M8767_REG_CTRL1,
  34. S5M8767_REG_CTRL2,
  35. S5M8767_REG_LOWBAT1,
  36. S5M8767_REG_LOWBAT2,
  37. S5M8767_REG_BUCHG,
  38. S5M8767_REG_DVSRAMP,
  39. S5M8767_REG_DVSTIMER2 = 0x10,
  40. S5M8767_REG_DVSTIMER3,
  41. S5M8767_REG_DVSTIMER4,
  42. S5M8767_REG_LDO1,
  43. S5M8767_REG_LDO2,
  44. S5M8767_REG_LDO3,
  45. S5M8767_REG_LDO4,
  46. S5M8767_REG_LDO5,
  47. S5M8767_REG_LDO6,
  48. S5M8767_REG_LDO7,
  49. S5M8767_REG_LDO8,
  50. S5M8767_REG_LDO9,
  51. S5M8767_REG_LDO10,
  52. S5M8767_REG_LDO11,
  53. S5M8767_REG_LDO12,
  54. S5M8767_REG_LDO13,
  55. S5M8767_REG_LDO14 = 0x20,
  56. S5M8767_REG_LDO15,
  57. S5M8767_REG_LDO16,
  58. S5M8767_REG_LDO17,
  59. S5M8767_REG_LDO18,
  60. S5M8767_REG_LDO19,
  61. S5M8767_REG_LDO20,
  62. S5M8767_REG_LDO21,
  63. S5M8767_REG_LDO22,
  64. S5M8767_REG_LDO23,
  65. S5M8767_REG_LDO24,
  66. S5M8767_REG_LDO25,
  67. S5M8767_REG_LDO26,
  68. S5M8767_REG_LDO27,
  69. S5M8767_REG_LDO28,
  70. S5M8767_REG_UVLO = 0x31,
  71. S5M8767_REG_BUCK1CTRL1,
  72. S5M8767_REG_BUCK1CTRL2,
  73. S5M8767_REG_BUCK2CTRL,
  74. S5M8767_REG_BUCK2DVS1,
  75. S5M8767_REG_BUCK2DVS2,
  76. S5M8767_REG_BUCK2DVS3,
  77. S5M8767_REG_BUCK2DVS4,
  78. S5M8767_REG_BUCK2DVS5,
  79. S5M8767_REG_BUCK2DVS6,
  80. S5M8767_REG_BUCK2DVS7,
  81. S5M8767_REG_BUCK2DVS8,
  82. S5M8767_REG_BUCK3CTRL,
  83. S5M8767_REG_BUCK3DVS1,
  84. S5M8767_REG_BUCK3DVS2,
  85. S5M8767_REG_BUCK3DVS3,
  86. S5M8767_REG_BUCK3DVS4,
  87. S5M8767_REG_BUCK3DVS5,
  88. S5M8767_REG_BUCK3DVS6,
  89. S5M8767_REG_BUCK3DVS7,
  90. S5M8767_REG_BUCK3DVS8,
  91. S5M8767_REG_BUCK4CTRL,
  92. S5M8767_REG_BUCK4DVS1,
  93. S5M8767_REG_BUCK4DVS2,
  94. S5M8767_REG_BUCK4DVS3,
  95. S5M8767_REG_BUCK4DVS4,
  96. S5M8767_REG_BUCK4DVS5,
  97. S5M8767_REG_BUCK4DVS6,
  98. S5M8767_REG_BUCK4DVS7,
  99. S5M8767_REG_BUCK4DVS8,
  100. S5M8767_REG_BUCK5CTRL1,
  101. S5M8767_REG_BUCK5CTRL2,
  102. S5M8767_REG_BUCK5CTRL3,
  103. S5M8767_REG_BUCK5CTRL4,
  104. S5M8767_REG_BUCK5CTRL5,
  105. S5M8767_REG_BUCK6CTRL1,
  106. S5M8767_REG_BUCK6CTRL2,
  107. S5M8767_REG_BUCK7CTRL1,
  108. S5M8767_REG_BUCK7CTRL2,
  109. S5M8767_REG_BUCK8CTRL1,
  110. S5M8767_REG_BUCK8CTRL2,
  111. S5M8767_REG_BUCK9CTRL1,
  112. S5M8767_REG_BUCK9CTRL2,
  113. S5M8767_REG_LDO1CTRL,
  114. S5M8767_REG_LDO2_1CTRL,
  115. S5M8767_REG_LDO2_2CTRL,
  116. S5M8767_REG_LDO2_3CTRL,
  117. S5M8767_REG_LDO2_4CTRL,
  118. S5M8767_REG_LDO3CTRL,
  119. S5M8767_REG_LDO4CTRL,
  120. S5M8767_REG_LDO5CTRL,
  121. S5M8767_REG_LDO6CTRL,
  122. S5M8767_REG_LDO7CTRL,
  123. S5M8767_REG_LDO8CTRL,
  124. S5M8767_REG_LDO9CTRL,
  125. S5M8767_REG_LDO10CTRL,
  126. S5M8767_REG_LDO11CTRL,
  127. S5M8767_REG_LDO12CTRL,
  128. S5M8767_REG_LDO13CTRL,
  129. S5M8767_REG_LDO14CTRL,
  130. S5M8767_REG_LDO15CTRL,
  131. S5M8767_REG_LDO16CTRL,
  132. S5M8767_REG_LDO17CTRL,
  133. S5M8767_REG_LDO18CTRL,
  134. S5M8767_REG_LDO19CTRL,
  135. S5M8767_REG_LDO20CTRL,
  136. S5M8767_REG_LDO21CTRL,
  137. S5M8767_REG_LDO22CTRL,
  138. S5M8767_REG_LDO23CTRL,
  139. S5M8767_REG_LDO24CTRL,
  140. S5M8767_REG_LDO25CTRL,
  141. S5M8767_REG_LDO26CTRL,
  142. S5M8767_REG_LDO27CTRL,
  143. S5M8767_REG_LDO28CTRL,
  144. };
  145. /* S5M8763 registers */
  146. enum s5m8763_reg {
  147. S5M8763_REG_IRQ1,
  148. S5M8763_REG_IRQ2,
  149. S5M8763_REG_IRQ3,
  150. S5M8763_REG_IRQ4,
  151. S5M8763_REG_IRQM1,
  152. S5M8763_REG_IRQM2,
  153. S5M8763_REG_IRQM3,
  154. S5M8763_REG_IRQM4,
  155. S5M8763_REG_STATUS1,
  156. S5M8763_REG_STATUS2,
  157. S5M8763_REG_STATUSM1,
  158. S5M8763_REG_STATUSM2,
  159. S5M8763_REG_CHGR1,
  160. S5M8763_REG_CHGR2,
  161. S5M8763_REG_LDO_ACTIVE_DISCHARGE1,
  162. S5M8763_REG_LDO_ACTIVE_DISCHARGE2,
  163. S5M8763_REG_BUCK_ACTIVE_DISCHARGE3,
  164. S5M8763_REG_ONOFF1,
  165. S5M8763_REG_ONOFF2,
  166. S5M8763_REG_ONOFF3,
  167. S5M8763_REG_ONOFF4,
  168. S5M8763_REG_BUCK1_VOLTAGE1,
  169. S5M8763_REG_BUCK1_VOLTAGE2,
  170. S5M8763_REG_BUCK1_VOLTAGE3,
  171. S5M8763_REG_BUCK1_VOLTAGE4,
  172. S5M8763_REG_BUCK2_VOLTAGE1,
  173. S5M8763_REG_BUCK2_VOLTAGE2,
  174. S5M8763_REG_BUCK3,
  175. S5M8763_REG_BUCK4,
  176. S5M8763_REG_LDO1_LDO2,
  177. S5M8763_REG_LDO3,
  178. S5M8763_REG_LDO4,
  179. S5M8763_REG_LDO5,
  180. S5M8763_REG_LDO6,
  181. S5M8763_REG_LDO7,
  182. S5M8763_REG_LDO7_LDO8,
  183. S5M8763_REG_LDO9_LDO10,
  184. S5M8763_REG_LDO11,
  185. S5M8763_REG_LDO12,
  186. S5M8763_REG_LDO13,
  187. S5M8763_REG_LDO14,
  188. S5M8763_REG_LDO15,
  189. S5M8763_REG_LDO16,
  190. S5M8763_REG_BKCHR,
  191. S5M8763_REG_LBCNFG1,
  192. S5M8763_REG_LBCNFG2,
  193. };
  194. enum s5m8767_irq {
  195. S5M8767_IRQ_PWRR,
  196. S5M8767_IRQ_PWRF,
  197. S5M8767_IRQ_PWR1S,
  198. S5M8767_IRQ_JIGR,
  199. S5M8767_IRQ_JIGF,
  200. S5M8767_IRQ_LOWBAT2,
  201. S5M8767_IRQ_LOWBAT1,
  202. S5M8767_IRQ_MRB,
  203. S5M8767_IRQ_DVSOK2,
  204. S5M8767_IRQ_DVSOK3,
  205. S5M8767_IRQ_DVSOK4,
  206. S5M8767_IRQ_RTC60S,
  207. S5M8767_IRQ_RTCA1,
  208. S5M8767_IRQ_RTCA2,
  209. S5M8767_IRQ_SMPL,
  210. S5M8767_IRQ_RTC1S,
  211. S5M8767_IRQ_WTSR,
  212. S5M8767_IRQ_NR,
  213. };
  214. #define S5M8767_IRQ_PWRR_MASK (1 << 0)
  215. #define S5M8767_IRQ_PWRF_MASK (1 << 1)
  216. #define S5M8767_IRQ_PWR1S_MASK (1 << 3)
  217. #define S5M8767_IRQ_JIGR_MASK (1 << 4)
  218. #define S5M8767_IRQ_JIGF_MASK (1 << 5)
  219. #define S5M8767_IRQ_LOWBAT2_MASK (1 << 6)
  220. #define S5M8767_IRQ_LOWBAT1_MASK (1 << 7)
  221. #define S5M8767_IRQ_MRB_MASK (1 << 2)
  222. #define S5M8767_IRQ_DVSOK2_MASK (1 << 3)
  223. #define S5M8767_IRQ_DVSOK3_MASK (1 << 4)
  224. #define S5M8767_IRQ_DVSOK4_MASK (1 << 5)
  225. #define S5M8767_IRQ_RTC60S_MASK (1 << 0)
  226. #define S5M8767_IRQ_RTCA1_MASK (1 << 1)
  227. #define S5M8767_IRQ_RTCA2_MASK (1 << 2)
  228. #define S5M8767_IRQ_SMPL_MASK (1 << 3)
  229. #define S5M8767_IRQ_RTC1S_MASK (1 << 4)
  230. #define S5M8767_IRQ_WTSR_MASK (1 << 5)
  231. enum s5m8763_irq {
  232. S5M8763_IRQ_DCINF,
  233. S5M8763_IRQ_DCINR,
  234. S5M8763_IRQ_JIGF,
  235. S5M8763_IRQ_JIGR,
  236. S5M8763_IRQ_PWRONF,
  237. S5M8763_IRQ_PWRONR,
  238. S5M8763_IRQ_WTSREVNT,
  239. S5M8763_IRQ_SMPLEVNT,
  240. S5M8763_IRQ_ALARM1,
  241. S5M8763_IRQ_ALARM0,
  242. S5M8763_IRQ_ONKEY1S,
  243. S5M8763_IRQ_TOPOFFR,
  244. S5M8763_IRQ_DCINOVPR,
  245. S5M8763_IRQ_CHGRSTF,
  246. S5M8763_IRQ_DONER,
  247. S5M8763_IRQ_CHGFAULT,
  248. S5M8763_IRQ_LOBAT1,
  249. S5M8763_IRQ_LOBAT2,
  250. S5M8763_IRQ_NR,
  251. };
  252. #define S5M8763_IRQ_DCINF_MASK (1 << 2)
  253. #define S5M8763_IRQ_DCINR_MASK (1 << 3)
  254. #define S5M8763_IRQ_JIGF_MASK (1 << 4)
  255. #define S5M8763_IRQ_JIGR_MASK (1 << 5)
  256. #define S5M8763_IRQ_PWRONF_MASK (1 << 6)
  257. #define S5M8763_IRQ_PWRONR_MASK (1 << 7)
  258. #define S5M8763_IRQ_WTSREVNT_MASK (1 << 0)
  259. #define S5M8763_IRQ_SMPLEVNT_MASK (1 << 1)
  260. #define S5M8763_IRQ_ALARM1_MASK (1 << 2)
  261. #define S5M8763_IRQ_ALARM0_MASK (1 << 3)
  262. #define S5M8763_IRQ_ONKEY1S_MASK (1 << 0)
  263. #define S5M8763_IRQ_TOPOFFR_MASK (1 << 2)
  264. #define S5M8763_IRQ_DCINOVPR_MASK (1 << 3)
  265. #define S5M8763_IRQ_CHGRSTF_MASK (1 << 4)
  266. #define S5M8763_IRQ_DONER_MASK (1 << 5)
  267. #define S5M8763_IRQ_CHGFAULT_MASK (1 << 7)
  268. #define S5M8763_IRQ_LOBAT1_MASK (1 << 0)
  269. #define S5M8763_IRQ_LOBAT2_MASK (1 << 1)
  270. #define S5M8763_ENRAMP (1 << 4)
  271. /**
  272. * struct s5m87xx_dev - s5m87xx master device for sub-drivers
  273. * @dev: master device of the chip (can be used to access platform data)
  274. * @i2c: i2c client private data for regulator
  275. * @rtc: i2c client private data for rtc
  276. * @iolock: mutex for serializing io access
  277. * @irqlock: mutex for buslock
  278. * @irq_base: base IRQ number for s5m87xx, required for IRQs
  279. * @irq: generic IRQ number for s5m87xx
  280. * @ono: power onoff IRQ number for s5m87xx
  281. * @irq_masks_cur: currently active value
  282. * @irq_masks_cache: cached hardware value
  283. * @type: indicate which s5m87xx "variant" is used
  284. */
  285. struct s5m87xx_dev {
  286. struct device *dev;
  287. struct regmap *regmap;
  288. struct i2c_client *i2c;
  289. struct i2c_client *rtc;
  290. struct mutex iolock;
  291. struct mutex irqlock;
  292. int device_type;
  293. int irq_base;
  294. int irq;
  295. int ono;
  296. u8 irq_masks_cur[NUM_IRQ_REGS];
  297. u8 irq_masks_cache[NUM_IRQ_REGS];
  298. int type;
  299. bool wakeup;
  300. };
  301. int s5m_irq_init(struct s5m87xx_dev *s5m87xx);
  302. void s5m_irq_exit(struct s5m87xx_dev *s5m87xx);
  303. int s5m_irq_resume(struct s5m87xx_dev *s5m87xx);
  304. extern int s5m_reg_read(struct s5m87xx_dev *s5m87xx, u8 reg, void *dest);
  305. extern int s5m_bulk_read(struct s5m87xx_dev *s5m87xx, u8 reg, int count, u8 *buf);
  306. extern int s5m_reg_write(struct s5m87xx_dev *s5m87xx, u8 reg, u8 value);
  307. extern int s5m_bulk_write(struct s5m87xx_dev *s5m87xx, u8 reg, int count, u8 *buf);
  308. extern int s5m_reg_update(struct s5m87xx_dev *s5m87xx, u8 reg, u8 val, u8 mask);
  309. struct s5m_platform_data {
  310. struct s5m_regulator_data *regulators;
  311. int device_type;
  312. int num_regulators;
  313. int irq_base;
  314. int (*cfg_pmic_irq)(void);
  315. int ono;
  316. bool wakeup;
  317. bool buck_voltage_lock;
  318. int buck_gpios[3];
  319. int buck2_voltage[8];
  320. bool buck2_gpiodvs;
  321. int buck3_voltage[8];
  322. bool buck3_gpiodvs;
  323. int buck4_voltage[8];
  324. bool buck4_gpiodvs;
  325. int buck_set1;
  326. int buck_set2;
  327. int buck_set3;
  328. int buck2_enable;
  329. int buck3_enable;
  330. int buck4_enable;
  331. int buck_default_idx;
  332. int buck2_default_idx;
  333. int buck3_default_idx;
  334. int buck4_default_idx;
  335. int buck_ramp_delay;
  336. bool buck2_ramp_enable;
  337. bool buck3_ramp_enable;
  338. bool buck4_ramp_enable;
  339. };
  340. #endif /* __LINUX_MFD_S5M_CORE_H */