muic_notifier.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. #define pr_fmt(fmt) "[MUIC] " fmt
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/device.h>
  5. #include <linux/notifier.h>
  6. #if IS_ENABLED(CONFIG_ANDROID_SWITCH) || IS_ENABLED(CONFIG_SWITCH)
  7. #include <linux/switch.h>
  8. #endif /* CONFIG_ANDROID_SWITCH || CONFIG_SWITCH */
  9. #include <linux/muic/common/muic.h>
  10. #include <linux/muic/common/muic_notifier.h>
  11. #if IS_ENABLED(CONFIG_DRV_SAMSUNG)
  12. #include <linux/sec_class.h>
  13. #endif
  14. #define SET_MUIC_NOTIFIER_BLOCK(nb, fn, dev) do { \
  15. (nb)->notifier_call = (fn); \
  16. (nb)->priority = (dev); \
  17. } while (0)
  18. #define DESTROY_MUIC_NOTIFIER_BLOCK(nb) \
  19. SET_MUIC_NOTIFIER_BLOCK(nb, NULL, -1)
  20. struct device *switch_device;
  21. EXPORT_SYMBOL(switch_device);
  22. static struct muic_notifier_struct muic_notifier;
  23. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  24. static struct muic_notifier_struct muic_pdic_notifier;
  25. #endif
  26. static int muic_uses_new_noti;
  27. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  28. static int muic_pdic_uses_new_noti;
  29. #endif
  30. static int muic_notifier_init_done;
  31. static int muic_notifier_init(void);
  32. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  33. #if IS_ENABLED(CONFIG_ANDROID_SWITCH) || IS_ENABLED(CONFIG_SWITCH)
  34. struct switch_dev switch_muic_dev = {
  35. .name = "attached_muic_cable",
  36. };
  37. static void send_muic_cable_intent(int type)
  38. {
  39. pr_info("%s: MUIC attached_muic_cable type(%d)\n", __func__, type);
  40. switch_set_state(&switch_muic_dev, type);
  41. }
  42. #endif /* CONFIG_ANDROID_SWITCH || CONFIG_SWITCH */
  43. #endif
  44. void muic_notifier_set_new_noti(bool flag)
  45. {
  46. muic_uses_new_noti = flag ? 1 : 0;
  47. }
  48. EXPORT_SYMBOL(muic_notifier_set_new_noti);
  49. static void __set_noti_cxt_dest(int attach, int type, int dest)
  50. {
  51. if (type < 0) {
  52. muic_notifier.cmd = attach;
  53. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  54. muic_notifier.cxt.attach = attach;
  55. muic_notifier.cxt.dest = dest;
  56. #endif
  57. return;
  58. }
  59. /* Old Interface */
  60. muic_notifier.cmd = attach;
  61. muic_notifier.attached_dev = type;
  62. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  63. /* New Interface */
  64. #if defined(CONFIG_USE_DEDICATED_MUIC)
  65. muic_notifier.cxt.src = PDIC_NOTIFY_DEV_DEDICATED_MUIC;
  66. #else
  67. muic_notifier.cxt.src = PDIC_NOTIFY_DEV_MUIC;
  68. #endif
  69. muic_notifier.cxt.dest = dest;
  70. muic_notifier.cxt.id = PDIC_NOTIFY_ID_ATTACH;
  71. muic_notifier.cxt.attach = attach;
  72. muic_notifier.cxt.cable_type = type;
  73. muic_notifier.cxt.rprd = 0;
  74. #endif
  75. }
  76. static void __set_noti_cxt(int attach, int type)
  77. {
  78. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  79. __set_noti_cxt_dest(attach, type, PDIC_NOTIFY_DEV_ALL);
  80. #else
  81. __set_noti_cxt_dest(attach, type, 0);
  82. #endif
  83. }
  84. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  85. static void __set_pdic_noti_cxt(int attach, int type)
  86. {
  87. if (type < 0) {
  88. muic_pdic_notifier.cmd = attach;
  89. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  90. muic_pdic_notifier.cxt.attach = attach;
  91. #endif
  92. return;
  93. }
  94. /* Old Interface */
  95. muic_pdic_notifier.cmd = attach;
  96. muic_pdic_notifier.attached_dev = type;
  97. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  98. /* New Interface */
  99. #if defined(CONFIG_USE_DEDICATED_MUIC)
  100. muic_pdic_notifier.cxt.src = PDIC_NOTIFY_DEV_DEDICATED_MUIC;
  101. #else
  102. muic_pdic_notifier.cxt.src = PDIC_NOTIFY_DEV_MUIC;
  103. #endif
  104. muic_pdic_notifier.cxt.dest = PDIC_NOTIFY_DEV_ALL;
  105. muic_pdic_notifier.cxt.id = PDIC_NOTIFY_ID_ATTACH;
  106. muic_pdic_notifier.cxt.attach = attach;
  107. muic_pdic_notifier.cxt.cable_type = type;
  108. muic_pdic_notifier.cxt.rprd = 0;
  109. #endif
  110. }
  111. #endif
  112. #if IS_ENABLED(CONFIG_MUIC_POGO)
  113. static void __set_pogo_noti_cxt(int attach, int type)
  114. {
  115. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  116. if (type < 0) {
  117. muic_notifier.pogo_cxt.attach = attach;
  118. return;
  119. }
  120. /* New Interface */
  121. muic_notifier.pogo_cxt.src = PDIC_NOTIFY_DEV_MUIC;
  122. muic_notifier.pogo_cxt.dest = PDIC_NOTIFY_DEV_ALL;
  123. muic_notifier.pogo_cxt.id = PDIC_NOTIFY_ID_POGO;
  124. muic_notifier.pogo_cxt.attach = attach;
  125. muic_notifier.pogo_cxt.cable_type = type;
  126. muic_notifier.pogo_cxt.rprd = 0;
  127. #endif
  128. }
  129. #endif /* CONFIG_MUIC_POGO */
  130. int muic_notifier_register(struct notifier_block *nb, notifier_fn_t notifier,
  131. muic_notifier_device_t listener)
  132. {
  133. int ret = 0;
  134. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  135. void *pcxt;
  136. #endif
  137. pr_info("%s: listener=%d register\n", __func__, listener);
  138. if (!muic_notifier_init_done)
  139. muic_notifier_init();
  140. SET_MUIC_NOTIFIER_BLOCK(nb, notifier, listener);
  141. ret = blocking_notifier_chain_register(&(muic_notifier.notifier_call_chain), nb);
  142. if (ret < 0)
  143. pr_err("%s: blocking_notifier_chain_register error(%d)\n",
  144. __func__, ret);
  145. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  146. pcxt = muic_uses_new_noti ? &(muic_notifier.cxt) :
  147. (void *)&(muic_notifier.attached_dev);
  148. /* current muic's attached_device status notify */
  149. nb->notifier_call(nb, muic_notifier.cxt.attach, pcxt);
  150. #if IS_ENABLED(CONFIG_MUIC_POGO)
  151. nb->notifier_call(nb, muic_notifier.pogo_cxt.attach, &(muic_notifier.pogo_cxt));
  152. #endif /* CONFIG_MUIC_POGO */
  153. #else
  154. nb->notifier_call(nb, muic_notifier.cmd,
  155. &(muic_notifier.attached_dev));
  156. #endif
  157. return ret;
  158. }
  159. EXPORT_SYMBOL(muic_notifier_register);
  160. int muic_notifier_unregister(struct notifier_block *nb)
  161. {
  162. int ret = 0;
  163. pr_info("%s: listener=%d unregister\n", __func__, nb->priority);
  164. ret = blocking_notifier_chain_unregister(&(muic_notifier.notifier_call_chain), nb);
  165. if (ret < 0)
  166. pr_err("%s: blocking_notifier_chain_unregister error(%d)\n",
  167. __func__, ret);
  168. DESTROY_MUIC_NOTIFIER_BLOCK(nb);
  169. return ret;
  170. }
  171. EXPORT_SYMBOL(muic_notifier_unregister);
  172. static int muic_notifier_notify(void)
  173. {
  174. int ret = 0;
  175. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  176. void *pcxt;
  177. pr_info("%s: CMD=%d, DATA=%d\n", __func__, muic_notifier.cxt.attach,
  178. muic_notifier.cxt.cable_type);
  179. pcxt = muic_uses_new_noti ? &(muic_notifier.cxt) :
  180. (void *)&(muic_notifier.attached_dev);
  181. ret = blocking_notifier_call_chain(&(muic_notifier.notifier_call_chain),
  182. muic_notifier.cxt.attach, pcxt);
  183. #else
  184. pr_info("%s: CMD=%d, DATA=%d\n", __func__, muic_notifier.cmd,
  185. muic_notifier.attached_dev);
  186. ret = blocking_notifier_call_chain(&(muic_notifier.notifier_call_chain),
  187. muic_notifier.cmd, &(muic_notifier.attached_dev));
  188. #endif
  189. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  190. #if IS_ENABLED(CONFIG_ANDROID_SWITCH) || IS_ENABLED(CONFIG_SWITCH)
  191. #if defined(CONFIG_MUIC_SUPPORT_PDIC) && defined(CONFIG_PDIC_NOTIFIER)
  192. if (muic_notifier.cxt.attach != 0)
  193. send_muic_cable_intent(muic_notifier.cxt.cable_type);
  194. else
  195. send_muic_cable_intent(0);
  196. #else
  197. if (muic_notifier.cmd != 0)
  198. send_muic_cable_intent(muic_notifier.attached_dev);
  199. else
  200. send_muic_cable_intent(0);
  201. #if IS_ENABLED(CONFIG_MUIC_POGO)
  202. if (muic_notifier.pogo_cxt.cable_type)
  203. send_muic_cable_intent(muic_notifier.pogo_cxt.cable_type);
  204. #endif /* CONFIG_MUIC_POGO */
  205. #endif /* CONFIG_MUIC_SUPPORT_PDIC */
  206. #endif /* CONFIG_ANDROID_SWITCH || CONFIG_SWITCH */
  207. #endif /* CONFIG_SEC_FACTORY */
  208. switch (ret) {
  209. case NOTIFY_STOP_MASK:
  210. case NOTIFY_BAD:
  211. pr_err("%s: notify error occur(0x%x)\n", __func__, ret);
  212. break;
  213. case NOTIFY_DONE:
  214. case NOTIFY_OK:
  215. pr_info("%s: notify done(0x%x)\n", __func__, ret);
  216. break;
  217. default:
  218. pr_info("%s: notify status unknown(0x%x)\n", __func__, ret);
  219. break;
  220. }
  221. return ret;
  222. }
  223. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  224. int muic_pdic_notifier_register(struct notifier_block *nb, notifier_fn_t notifier,
  225. muic_notifier_device_t listener)
  226. {
  227. int ret = 0;
  228. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  229. void *pcxt;
  230. #endif
  231. pr_info("%s: listener=%d register\n", __func__, listener);
  232. SET_MUIC_NOTIFIER_BLOCK(nb, notifier, listener);
  233. ret = blocking_notifier_chain_register(&(muic_pdic_notifier.notifier_call_chain), nb);
  234. if (ret < 0)
  235. pr_err("%s: blocking_notifier_chain_register error(%d)\n",
  236. __func__, ret);
  237. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  238. pcxt = muic_pdic_uses_new_noti ? &(muic_pdic_notifier.cxt) : \
  239. (void *)&(muic_pdic_notifier.attached_dev);
  240. /* current muic's attached_device status notify */
  241. nb->notifier_call(nb, muic_pdic_notifier.cxt.attach, pcxt);
  242. #else
  243. nb->notifier_call(nb, muic_pdic_notifier.cmd,
  244. &(muic_pdic_notifier.attached_dev));
  245. #endif
  246. return ret;
  247. }
  248. EXPORT_SYMBOL(muic_pdic_notifier_register);
  249. int muic_pdic_notifier_unregister(struct notifier_block *nb)
  250. {
  251. int ret = 0;
  252. pr_info("%s: listener=%d unregister\n", __func__, nb->priority);
  253. ret = blocking_notifier_chain_unregister(&(muic_pdic_notifier.notifier_call_chain), nb);
  254. if (ret < 0)
  255. pr_err("%s: blocking_notifier_chain_unregister error(%d)\n",
  256. __func__, ret);
  257. DESTROY_MUIC_NOTIFIER_BLOCK(nb);
  258. return ret;
  259. }
  260. EXPORT_SYMBOL(muic_pdic_notifier_unregister);
  261. static int muic_pdic_notifier_notify(void)
  262. {
  263. int ret = 0;
  264. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  265. void *pcxt;
  266. pr_info("%s: CMD=%d, DATA=%d\n", __func__, muic_pdic_notifier.cxt.attach,
  267. muic_pdic_notifier.cxt.cable_type);
  268. pcxt = muic_pdic_uses_new_noti ? &(muic_pdic_notifier.cxt) : \
  269. (void *)&(muic_pdic_notifier.attached_dev);
  270. ret = blocking_notifier_call_chain(&(muic_pdic_notifier.notifier_call_chain),
  271. muic_pdic_notifier.cxt.attach, pcxt);
  272. #else
  273. pr_info("%s: CMD=%d, DATA=%d\n", __func__, muic_pdic_notifier.cmd,
  274. muic_pdic_notifier.attached_dev);
  275. ret = blocking_notifier_call_chain(&(muic_pdic_notifier.notifier_call_chain),
  276. muic_pdic_notifier.cmd, &(muic_pdic_notifier.attached_dev));
  277. #endif
  278. switch (ret) {
  279. case NOTIFY_STOP_MASK:
  280. case NOTIFY_BAD:
  281. pr_err("%s: notify error occur(0x%x)\n", __func__, ret);
  282. break;
  283. case NOTIFY_DONE:
  284. case NOTIFY_OK:
  285. pr_info("%s: notify done(0x%x)\n", __func__, ret);
  286. break;
  287. default:
  288. pr_info("%s: notify status unknown(0x%x)\n", __func__, ret);
  289. break;
  290. }
  291. return ret;
  292. }
  293. #endif /* CONFIG_PDIC_SLSI_NON_MCU */
  294. #if IS_ENABLED(CONFIG_MUIC_POGO)
  295. static int muic_pogo_notifier_notify(void)
  296. {
  297. int ret = 0;
  298. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  299. void *pcxt = &(muic_notifier.pogo_cxt);
  300. pr_info("%s: CMD=%d, DATA=%d\n", __func__, muic_notifier.pogo_cxt.attach,
  301. muic_notifier.pogo_cxt.cable_type);
  302. ret = blocking_notifier_call_chain(&(muic_notifier.notifier_call_chain),
  303. muic_notifier.pogo_cxt.attach, pcxt);
  304. #endif
  305. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  306. #if defined(CONFIG_MUIC_SUPPORT_PDIC) && defined(CONFIG_PDIC_NOTIFIER)
  307. if (muic_notifier.pogo_cxt.attach != 0)
  308. send_muic_cable_intent(muic_notifier.pogo_cxt.cable_type);
  309. else
  310. send_muic_cable_intent(0);
  311. if (muic_notifier.cxt.cable_type)
  312. send_muic_cable_intent(muic_notifier.cxt.cable_type);
  313. #endif /* CONFIG_MUIC_SUPPORT_CCIC */
  314. #endif /* CONFIG_SEC_FACTORY */
  315. switch (ret) {
  316. case NOTIFY_STOP_MASK:
  317. case NOTIFY_BAD:
  318. pr_err("%s: notify error occur(0x%x)\n", __func__, ret);
  319. break;
  320. case NOTIFY_DONE:
  321. case NOTIFY_OK:
  322. pr_info("%s: notify done(0x%x)\n", __func__, ret);
  323. break;
  324. default:
  325. pr_info("%s: notify status unknown(0x%x)\n", __func__, ret);
  326. break;
  327. }
  328. return ret;
  329. }
  330. void muic_pogo_notifier_attach_attached_dev(muic_attached_dev_t new_dev)
  331. {
  332. pr_info("%s: (%d)\n", __func__, new_dev);
  333. __set_pogo_noti_cxt(MUIC_NOTIFY_CMD_ATTACH, new_dev);
  334. /* muic's attached_device attach broadcast */
  335. muic_pogo_notifier_notify();
  336. }
  337. EXPORT_SYMBOL(muic_pogo_notifier_attach_attached_dev);
  338. void muic_pogo_notifier_detach_attached_dev(muic_attached_dev_t cur_dev)
  339. {
  340. pr_info("%s: (%d)\n", __func__, cur_dev);
  341. __set_pogo_noti_cxt(MUIC_NOTIFY_CMD_DETACH, -1);
  342. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  343. if (muic_notifier.pogo_cxt.cable_type != cur_dev)
  344. pr_warn("%s: attached_dev of muic_notifier(%d) != muic_data(%d)\n",
  345. __func__, muic_notifier.pogo_cxt.cable_type, cur_dev);
  346. if (muic_notifier.pogo_cxt.cable_type != ATTACHED_DEV_NONE_MUIC) {
  347. /* muic's attached_device detach broadcast */
  348. muic_pogo_notifier_notify();
  349. }
  350. #endif
  351. __set_pogo_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  352. }
  353. EXPORT_SYMBOL(muic_pogo_notifier_detach_attached_dev);
  354. #endif /* CONFIG_MUIC_POGO */
  355. void muic_notifier_attach_attached_dev(muic_attached_dev_t new_dev)
  356. {
  357. pr_info("%s: (%d)\n", __func__, new_dev);
  358. __set_noti_cxt(MUIC_NOTIFY_CMD_ATTACH, new_dev);
  359. /* muic's attached_device attach broadcast */
  360. muic_notifier_notify();
  361. }
  362. EXPORT_SYMBOL(muic_notifier_attach_attached_dev);
  363. void muic_pdic_notifier_attach_attached_dev(muic_attached_dev_t new_dev)
  364. {
  365. pr_info("%s: (%d)\n", __func__, new_dev);
  366. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  367. __set_pdic_noti_cxt(MUIC_PDIC_NOTIFY_CMD_ATTACH, new_dev);
  368. /* muic's attached_device attach broadcast */
  369. muic_pdic_notifier_notify();
  370. #else
  371. __set_noti_cxt(MUIC_PDIC_NOTIFY_CMD_ATTACH, new_dev);
  372. /* muic's attached_device attach broadcast */
  373. muic_notifier_notify();
  374. #endif
  375. }
  376. EXPORT_SYMBOL(muic_pdic_notifier_attach_attached_dev);
  377. void muic_pdic_notifier_detach_attached_dev(muic_attached_dev_t new_dev)
  378. {
  379. pr_info("%s: (%d)\n", __func__, new_dev);
  380. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  381. __set_pdic_noti_cxt(MUIC_PDIC_NOTIFY_CMD_DETACH, new_dev);
  382. /* muic's attached_device attach broadcast */
  383. muic_pdic_notifier_notify();
  384. #else
  385. __set_noti_cxt(MUIC_PDIC_NOTIFY_CMD_DETACH, muic_notifier.attached_dev);
  386. /* muic's attached_device attach broadcast */
  387. muic_notifier_notify();
  388. #endif
  389. }
  390. EXPORT_SYMBOL(muic_pdic_notifier_detach_attached_dev);
  391. void muic_notifier_detach_attached_dev(muic_attached_dev_t cur_dev)
  392. {
  393. pr_info("%s: (%d)\n", __func__, cur_dev);
  394. __set_noti_cxt(MUIC_NOTIFY_CMD_DETACH, -1);
  395. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  396. if (muic_notifier.cxt.cable_type != cur_dev)
  397. pr_warn("%s: attached_dev of muic_notifier(%d) != muic_data(%d)\n",
  398. __func__, muic_notifier.cxt.cable_type, cur_dev);
  399. if (muic_notifier.cxt.cable_type != ATTACHED_DEV_NONE_MUIC) {
  400. /* muic's attached_device detach broadcast */
  401. muic_notifier_notify();
  402. }
  403. #else
  404. if (muic_notifier.attached_dev != cur_dev)
  405. pr_warn("%s: attached_dev of muic_notifier(%d) != muic_data(%d)\n",
  406. __func__, muic_notifier.attached_dev, cur_dev);
  407. if (muic_notifier.attached_dev != ATTACHED_DEV_NONE_MUIC) {
  408. /* muic's attached_device detach broadcast */
  409. muic_notifier_notify();
  410. }
  411. #endif
  412. __set_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  413. }
  414. EXPORT_SYMBOL(muic_notifier_detach_attached_dev);
  415. void muic_notifier_logically_attach_attached_dev(muic_attached_dev_t new_dev)
  416. {
  417. pr_info("%s: (%d)\n", __func__, new_dev);
  418. __set_noti_cxt(MUIC_NOTIFY_CMD_ATTACH, new_dev);
  419. /* muic's attached_device attach broadcast */
  420. muic_notifier_notify();
  421. }
  422. EXPORT_SYMBOL(muic_notifier_logically_attach_attached_dev);
  423. void muic_notifier_logically_detach_attached_dev(muic_attached_dev_t cur_dev)
  424. {
  425. pr_info("%s: (%d)\n", __func__, cur_dev);
  426. __set_noti_cxt(MUIC_NOTIFY_CMD_DETACH, cur_dev);
  427. /* muic's attached_device detach broadcast */
  428. muic_notifier_notify();
  429. __set_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  430. }
  431. EXPORT_SYMBOL(muic_notifier_logically_detach_attached_dev);
  432. #if IS_ENABLED(CONFIG_VIRTUAL_MUIC)
  433. void vt_muic_notifier_attach_attached_dev(muic_attached_dev_t new_dev)
  434. {
  435. pr_info("%s: (%d)\n", __func__, new_dev);
  436. __set_noti_cxt_dest(MUIC_NOTIFY_CMD_ATTACH, new_dev, PDIC_NOTIFY_DEV_PDIC);
  437. /* muic's attached_device attach broadcast */
  438. muic_notifier_notify();
  439. }
  440. EXPORT_SYMBOL(vt_muic_notifier_attach_attached_dev);
  441. void vt_muic_notifier_detach_attached_dev(muic_attached_dev_t cur_dev)
  442. {
  443. pr_info("%s: (%d)\n", __func__, cur_dev);
  444. __set_noti_cxt_dest(MUIC_NOTIFY_CMD_DETACH, -1, PDIC_NOTIFY_DEV_PDIC);
  445. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  446. if (muic_notifier.cxt.cable_type != cur_dev)
  447. pr_warn("%s: attached_dev of muic_notifier(%d) != muic_data(%d)\n",
  448. __func__, muic_notifier.cxt.cable_type, cur_dev);
  449. if (muic_notifier.cxt.cable_type != ATTACHED_DEV_NONE_MUIC) {
  450. /* muic's attached_device detach broadcast */
  451. muic_notifier_notify();
  452. }
  453. #else
  454. if (muic_notifier.attached_dev != cur_dev)
  455. pr_warn("%s: attached_dev of muic_notifier(%d) != muic_data(%d)\n",
  456. __func__, muic_notifier.attached_dev, cur_dev);
  457. if (muic_notifier.attached_dev != ATTACHED_DEV_NONE_MUIC) {
  458. /* muic's attached_device detach broadcast */
  459. muic_notifier_notify();
  460. }
  461. #endif
  462. __set_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  463. }
  464. EXPORT_SYMBOL(vt_muic_notifier_detach_attached_dev);
  465. #endif
  466. static int muic_notifier_init(void)
  467. {
  468. int ret = 0;
  469. pr_info("%s\n", __func__);
  470. if (muic_notifier_init_done) {
  471. pr_info("%s already registered\n", __func__);
  472. return ret;
  473. }
  474. muic_notifier_init_done = 1;
  475. #if IS_ENABLED(CONFIG_DRV_SAMSUNG)
  476. switch_device = sec_device_create(NULL, "switch");
  477. if (IS_ERR(switch_device)) {
  478. pr_err("%s Failed to create device(switch)!\n", __func__);
  479. ret = -ENODEV;
  480. }
  481. #endif
  482. #if IS_ENABLED(CONFIG_PDIC_NOTIFIER)
  483. muic_uses_new_noti = 1;
  484. #endif
  485. BLOCKING_INIT_NOTIFIER_HEAD(&(muic_notifier.notifier_call_chain));
  486. __set_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  487. #if IS_ENABLED(CONFIG_PDIC_SLSI_NON_MCU)
  488. BLOCKING_INIT_NOTIFIER_HEAD(&(muic_pdic_notifier.notifier_call_chain));
  489. __set_pdic_noti_cxt(0, ATTACHED_DEV_UNKNOWN_MUIC);
  490. muic_pdic_uses_new_noti = 1;
  491. #endif
  492. #if IS_ENABLED(CONFIG_MUIC_POGO)
  493. __set_pogo_noti_cxt(0, ATTACHED_DEV_NONE_MUIC);
  494. #endif /* CONFIG_MUIC_POGO */
  495. #if IS_ENABLED(CONFIG_SEC_FACTORY)
  496. #if IS_ENABLED(CONFIG_ANDROID_SWITCH) || IS_ENABLED(CONFIG_SWITCH)
  497. ret = switch_dev_register(&switch_muic_dev);
  498. if (ret < 0)
  499. pr_err("%s: Failed to register attached_muic_cable switch(%d)\n",
  500. __func__, ret);
  501. #endif /* CONFIG_ANDROID_SWITCH || CONFIG_SWITCH */
  502. #endif
  503. return ret;
  504. }
  505. static void __exit muic_notifier_exit(void)
  506. {
  507. pr_info("%s: exit\n", __func__);
  508. }
  509. device_initcall(muic_notifier_init);
  510. module_exit(muic_notifier_exit);
  511. MODULE_AUTHOR("Samsung USB Team");
  512. MODULE_DESCRIPTION("Muic Notifier");
  513. MODULE_LICENSE("GPL");