extcon-max14526.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <linux/device.h>
  3. #include <linux/devm-helpers.h>
  4. #include <linux/delay.h>
  5. #include <linux/err.h>
  6. #include <linux/extcon-provider.h>
  7. #include <linux/i2c.h>
  8. #include <linux/mod_devicetable.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/module.h>
  11. #include <linux/pm.h>
  12. #include <linux/regmap.h>
  13. /* I2C addresses of MUIC internal registers */
  14. #define MAX14526_DEVICE_ID 0x00
  15. #define MAX14526_ID 0x02
  16. /* CONTROL_1 register masks */
  17. #define MAX14526_CONTROL_1 0x01
  18. #define ID_2P2 BIT(6)
  19. #define ID_620 BIT(5)
  20. #define ID_200 BIT(4)
  21. #define VLDO BIT(3)
  22. #define SEMREN BIT(2)
  23. #define ADC_EN BIT(1)
  24. #define CP_EN BIT(0)
  25. /* CONTROL_2 register masks */
  26. #define MAX14526_CONTROL_2 0x02
  27. #define INTPOL BIT(7)
  28. #define INT_EN BIT(6)
  29. #define MIC_LP BIT(5)
  30. #define CP_AUD BIT(4)
  31. #define CHG_TYPE BIT(1)
  32. #define USB_DET_DIS BIT(0)
  33. /* SW_CONTROL register masks */
  34. #define MAX14526_SW_CONTROL 0x03
  35. #define SW_DATA 0x00
  36. #define SW_UART 0x01
  37. #define SW_AUDIO 0x02
  38. #define SW_OPEN 0x07
  39. /* INT_STATUS register masks */
  40. #define MAX14526_INT_STAT 0x04
  41. #define CHGDET BIT(7)
  42. #define MR_COMP BIT(6)
  43. #define SENDEND BIT(5)
  44. #define V_VBUS BIT(4)
  45. /* STATUS register masks */
  46. #define MAX14526_STATUS 0x05
  47. #define CPORT BIT(7)
  48. #define CHPORT BIT(6)
  49. #define C1COMP BIT(0)
  50. enum max14526_idno_resistance {
  51. MAX14526_GND,
  52. MAX14526_24KOHM,
  53. MAX14526_56KOHM,
  54. MAX14526_100KOHM,
  55. MAX14526_130KOHM,
  56. MAX14526_180KOHM,
  57. MAX14526_240KOHM,
  58. MAX14526_330KOHM,
  59. MAX14526_430KOHM,
  60. MAX14526_620KOHM,
  61. MAX14526_910KOHM,
  62. MAX14526_OPEN
  63. };
  64. enum max14526_field_idx {
  65. VENDOR_ID, CHIP_REV, /* DEVID */
  66. DM, DP, /* SW_CONTROL */
  67. MAX14526_N_REGMAP_FIELDS
  68. };
  69. static const struct reg_field max14526_reg_field[MAX14526_N_REGMAP_FIELDS] = {
  70. [VENDOR_ID] = REG_FIELD(MAX14526_DEVICE_ID, 4, 7),
  71. [CHIP_REV] = REG_FIELD(MAX14526_DEVICE_ID, 0, 3),
  72. [DM] = REG_FIELD(MAX14526_SW_CONTROL, 0, 2),
  73. [DP] = REG_FIELD(MAX14526_SW_CONTROL, 3, 5),
  74. };
  75. struct max14526_data {
  76. struct i2c_client *client;
  77. struct extcon_dev *edev;
  78. struct regmap *regmap;
  79. struct regmap_field *rfield[MAX14526_N_REGMAP_FIELDS];
  80. int last_state;
  81. int cable;
  82. };
  83. enum max14526_muic_modes {
  84. MAX14526_OTG = MAX14526_GND, /* no power */
  85. MAX14526_MHL = MAX14526_56KOHM, /* no power */
  86. MAX14526_OTG_Y = MAX14526_GND | V_VBUS,
  87. MAX14526_MHL_CHG = MAX14526_GND | V_VBUS | CHGDET,
  88. MAX14526_NONE = MAX14526_OPEN,
  89. MAX14526_USB = MAX14526_OPEN | V_VBUS,
  90. MAX14526_CHG = MAX14526_OPEN | V_VBUS | CHGDET,
  91. };
  92. static const unsigned int max14526_extcon_cable[] = {
  93. EXTCON_USB,
  94. EXTCON_USB_HOST,
  95. EXTCON_CHG_USB_FAST,
  96. EXTCON_DISP_MHL,
  97. EXTCON_NONE,
  98. };
  99. static int max14526_ap_usb_mode(struct max14526_data *priv)
  100. {
  101. struct device *dev = &priv->client->dev;
  102. int ret;
  103. /* Enable USB Path */
  104. ret = regmap_field_write(priv->rfield[DM], SW_DATA);
  105. if (ret)
  106. return ret;
  107. ret = regmap_field_write(priv->rfield[DP], SW_DATA);
  108. if (ret)
  109. return ret;
  110. /* Enable 200K, Charger Pump and ADC */
  111. ret = regmap_write(priv->regmap, MAX14526_CONTROL_1,
  112. ID_200 | ADC_EN | CP_EN);
  113. if (ret)
  114. return ret;
  115. dev_dbg(dev, "AP USB mode set\n");
  116. return 0;
  117. }
  118. static irqreturn_t max14526_interrupt(int irq, void *dev_id)
  119. {
  120. struct max14526_data *priv = dev_id;
  121. struct device *dev = &priv->client->dev;
  122. int state, ret;
  123. /*
  124. * Upon an MUIC IRQ (MUIC_INT_N falls), wait at least 70ms
  125. * before reading INT_STAT and STATUS. After the reads,
  126. * MUIC_INT_N returns to high (but the INT_STAT and STATUS
  127. * contents will be held).
  128. */
  129. msleep(100);
  130. ret = regmap_read(priv->regmap, MAX14526_INT_STAT, &state);
  131. if (ret)
  132. dev_err(dev, "failed to read MUIC state %d\n", ret);
  133. if (state == priv->last_state)
  134. return IRQ_HANDLED;
  135. /* Detach previous device */
  136. extcon_set_state_sync(priv->edev, priv->cable, false);
  137. switch (state) {
  138. case MAX14526_USB:
  139. priv->cable = EXTCON_USB;
  140. break;
  141. case MAX14526_CHG:
  142. priv->cable = EXTCON_CHG_USB_FAST;
  143. break;
  144. case MAX14526_OTG:
  145. case MAX14526_OTG_Y:
  146. priv->cable = EXTCON_USB_HOST;
  147. break;
  148. case MAX14526_MHL:
  149. case MAX14526_MHL_CHG:
  150. priv->cable = EXTCON_DISP_MHL;
  151. break;
  152. case MAX14526_NONE:
  153. default:
  154. priv->cable = EXTCON_NONE;
  155. break;
  156. }
  157. extcon_set_state_sync(priv->edev, priv->cable, true);
  158. priv->last_state = state;
  159. return IRQ_HANDLED;
  160. }
  161. static const struct regmap_config max14526_regmap_config = {
  162. .reg_bits = 8,
  163. .val_bits = 8,
  164. .max_register = MAX14526_STATUS,
  165. };
  166. static int max14526_probe(struct i2c_client *client)
  167. {
  168. struct device *dev = &client->dev;
  169. struct max14526_data *priv;
  170. int ret, dev_id, rev, i;
  171. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  172. if (!priv)
  173. return -ENOMEM;
  174. priv->client = client;
  175. i2c_set_clientdata(client, priv);
  176. priv->regmap = devm_regmap_init_i2c(client, &max14526_regmap_config);
  177. if (IS_ERR(priv->regmap))
  178. return dev_err_probe(dev, PTR_ERR(priv->regmap), "cannot allocate regmap\n");
  179. for (i = 0; i < MAX14526_N_REGMAP_FIELDS; i++) {
  180. priv->rfield[i] = devm_regmap_field_alloc(dev, priv->regmap,
  181. max14526_reg_field[i]);
  182. if (IS_ERR(priv->rfield[i]))
  183. return dev_err_probe(dev, PTR_ERR(priv->rfield[i]),
  184. "cannot allocate regmap field\n");
  185. }
  186. /* Detect if MUIC version is supported */
  187. ret = regmap_field_read(priv->rfield[VENDOR_ID], &dev_id);
  188. if (ret)
  189. return dev_err_probe(dev, ret, "failed to read MUIC ID\n");
  190. regmap_field_read(priv->rfield[CHIP_REV], &rev);
  191. if (dev_id == MAX14526_ID)
  192. dev_info(dev, "detected MAX14526 MUIC with id 0x%x, rev 0x%x\n", dev_id, rev);
  193. else
  194. dev_err_probe(dev, -EINVAL, "MUIC vendor id 0x%X is not recognized\n", dev_id);
  195. priv->edev = devm_extcon_dev_allocate(dev, max14526_extcon_cable);
  196. if (IS_ERR(priv->edev))
  197. return dev_err_probe(dev, (IS_ERR(priv->edev)),
  198. "failed to allocate extcon device\n");
  199. ret = devm_extcon_dev_register(dev, priv->edev);
  200. if (ret < 0)
  201. return dev_err_probe(dev, ret, "failed to register extcon device\n");
  202. ret = max14526_ap_usb_mode(priv);
  203. if (ret < 0)
  204. return dev_err_probe(dev, ret, "failed to set AP USB mode\n");
  205. regmap_write_bits(priv->regmap, MAX14526_CONTROL_2, INT_EN, INT_EN);
  206. regmap_write_bits(priv->regmap, MAX14526_CONTROL_2, USB_DET_DIS, (u32)~USB_DET_DIS);
  207. ret = devm_request_threaded_irq(dev, client->irq, NULL, &max14526_interrupt,
  208. IRQF_ONESHOT | IRQF_SHARED, client->name, priv);
  209. if (ret)
  210. return dev_err_probe(dev, ret, "failed to register IRQ\n");
  211. irq_wake_thread(client->irq, priv);
  212. return 0;
  213. }
  214. static int max14526_resume(struct device *dev)
  215. {
  216. struct i2c_client *client = to_i2c_client(dev);
  217. struct max14526_data *priv = i2c_get_clientdata(client);
  218. irq_wake_thread(client->irq, priv);
  219. return 0;
  220. }
  221. static DEFINE_SIMPLE_DEV_PM_OPS(max14526_pm_ops, NULL, max14526_resume);
  222. static const struct of_device_id max14526_match[] = {
  223. { .compatible = "maxim,max14526" },
  224. { /* sentinel */ }
  225. };
  226. MODULE_DEVICE_TABLE(of, max14526_match);
  227. static const struct i2c_device_id max14526_id[] = {
  228. { "max14526" },
  229. { }
  230. };
  231. MODULE_DEVICE_TABLE(i2c, max14526_id);
  232. static struct i2c_driver max14526_driver = {
  233. .driver = {
  234. .name = "max14526",
  235. .of_match_table = max14526_match,
  236. .pm = &max14526_pm_ops,
  237. },
  238. .probe = max14526_probe,
  239. .id_table = max14526_id,
  240. };
  241. module_i2c_driver(max14526_driver);
  242. MODULE_AUTHOR("Svyatoslav Ryhel <clamor95@gmail.com>");
  243. MODULE_DESCRIPTION("MAX14526 extcon driver to support MUIC");
  244. MODULE_LICENSE("GPL");