fxla2203_driver.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include <ssw.h>
  2. #include "cust_ssw_fxla2203.h"
  3. #include "cust_gpio_usage.h"
  4. /*#include <mach/mt_gpio.h>*/
  5. unsigned int ch_swap;
  6. unsigned int en;
  7. unsigned int curr_ssw_mode = SSW_SING_TALK;
  8. struct mutex ssw_mutex;
  9. unsigned int get_sim_switch_type(void)
  10. {
  11. SSW_DBG("[ccci/ssw]FXLA2203\n");
  12. return SSW_EXT_FXLA2203;
  13. }
  14. /*sim switch hardware initial*/
  15. static int ssw_init(unsigned int mode)
  16. {
  17. unsigned int ch_mode, en_mode;
  18. SSW_DBG("ssw_init: %d\n", mode);
  19. ch_swap = GPIO_SSW_CH_SWAP_PIN;
  20. en = GPIO_SSW_EN_PIN;
  21. ch_mode = GPIO_SSW_CH_SWAP_PIN_M_GPIO;
  22. en_mode = GPIO_SSW_EN_PIN_M_GPIO;
  23. /*initial Ch_Swap pin: 1, host1->sim slot1, host2->sim slot2; 0, host1->sim slot2, host2->sim slot1 */
  24. mt_set_gpio_mode(ch_swap, ch_mode);
  25. mt_set_gpio_dir(ch_swap, GPIO_DIR_OUT);
  26. /*initial EN pin: 1, enable sim slot; 0, disable sim slot */
  27. mt_set_gpio_mode(en, en_mode);
  28. mt_set_gpio_dir(en, GPIO_DIR_OUT);
  29. curr_ssw_mode = mode;
  30. if (mode == SSW_DUAL_TALK)
  31. mt_set_gpio_out(ch_swap, SSW_DUAL_TALK);
  32. else if (mode == SSW_SING_TALK)
  33. mt_set_gpio_out(ch_swap, SSW_SING_TALK);
  34. mt_set_gpio_out(en, GPIO_OUT_ONE);
  35. SSW_DBG("ssw_init: ch_swap=(%d %d %d), en=(%d %d %d)\n",
  36. ch_swap, ch_mode, mt_get_gpio_out(ch_swap),
  37. en, en_mode, mt_get_gpio_out(en));
  38. return SSW_SUCCESS;
  39. }
  40. int ssw_switch_mode(char *buf, unsigned int len)
  41. {
  42. int ret = 0;
  43. unsigned int mode = *((unsigned int *)buf);
  44. unsigned int type = (mode & 0xFFFF0000) >> 16;
  45. if (type != get_sim_switch_type()) {
  46. SSW_DBG("[Error]sim switch type is mis-match: type(%d, %d)",
  47. type, get_sim_switch_type());
  48. return SSW_INVALID_PARA;
  49. }
  50. SSW_DBG("sim switch: %d -> %d\n", curr_ssw_mode, mode);
  51. mutex_lock(&ssw_mutex);
  52. if (curr_ssw_mode != mode) {
  53. curr_ssw_mode = mode;
  54. if (curr_ssw_mode == SSW_DUAL_TALK)
  55. mt_set_gpio_out(ch_swap, SSW_DUAL_TALK);
  56. else if (curr_ssw_mode == SSW_SING_TALK)
  57. mt_set_gpio_out(ch_swap, SSW_SING_TALK);
  58. }
  59. mutex_unlock(&ssw_mutex);
  60. SSW_DBG("sim switch(%d) OK, ch_swap=%d, en=%d\n", curr_ssw_mode,
  61. mt_get_gpio_out(ch_swap), mt_get_gpio_out(en));
  62. return SSW_SUCCESS;
  63. }
  64. static int ssw_probe(struct platform_device *dev)
  65. {
  66. ssw_init(default_mode);
  67. mutex_init(&ssw_mutex);
  68. register_ccci_kern_func(ID_SSW_SWITCH_MODE, ssw_switch_mode);
  69. return 0;
  70. }
  71. static int ssw_remove(struct platform_device *dev)
  72. {
  73. /*SSW_DBG("ssw_remove\n"); */
  74. return 0;
  75. }
  76. static void ssw_shutdown(struct platform_device *dev)
  77. {
  78. /*SSW_DBG("ssw_shutdown\n"); */
  79. }
  80. static int ssw_suspend(struct platform_device *dev, pm_message_t state)
  81. {
  82. /*SSW_DBG("ssw_suspend\n"); */
  83. return 0;
  84. }
  85. static int ssw_resume(struct platform_device *dev)
  86. {
  87. /*SSW_DBG("ssw_resume\n"); */
  88. return 0;
  89. }
  90. static struct platform_driver ssw_driver = {
  91. .driver = {
  92. .name = "sim-switch",
  93. },
  94. .probe = ssw_probe,
  95. .remove = ssw_remove,
  96. .shutdown = ssw_shutdown,
  97. .suspend = ssw_suspend,
  98. .resume = ssw_resume,
  99. };
  100. static int __init ssw_driver_init(void)
  101. {
  102. int ret = 0;
  103. ret = platform_driver_register(&ssw_driver);
  104. if (ret) {
  105. SSW_DBG("ssw_driver register fail(%d)\n", ret);
  106. return ret;
  107. }
  108. return ret;
  109. }
  110. static void __exit ssw_driver_exit(void)
  111. {
  112. }
  113. module_init(ssw_driver_init);
  114. module_exit(ssw_driver_exit);
  115. MODULE_DESCRIPTION("MTK SIM Switch Driver");
  116. MODULE_AUTHOR("Anny <Anny.Hu@mediatek.com>");
  117. MODULE_LICENSE("GPL");