import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / ssw / fxla2203 / fxla2203_driver.c
1
2 #include <ssw.h>
3 #include "cust_ssw_fxla2203.h"
4 #include "cust_gpio_usage.h"
5 //#include <mach/mt_gpio.h>
6
7
8
9 unsigned int ch_swap;
10 unsigned int en;
11 unsigned int curr_ssw_mode = SSW_SING_TALK;
12 struct mutex ssw_mutex;
13
14 unsigned int get_sim_switch_type(void)
15 {
16 printk("[ccci/ssw]FXLA2203\n");
17 return SSW_EXT_FXLA2203;
18 }
19 EXPORT_SYMBOL(get_sim_switch_type);
20
21
22 //sim switch hardware initial
23 static int ssw_init(unsigned int mode)
24 {
25 SSW_DBG("ssw_init: %d \n", mode);
26
27 unsigned int ch_mode, en_mode;
28 ch_swap = GPIO_SSW_CH_SWAP_PIN;
29 en = GPIO_SSW_EN_PIN;
30 ch_mode = GPIO_SSW_CH_SWAP_PIN_M_GPIO;
31 en_mode = GPIO_SSW_EN_PIN_M_GPIO;
32
33
34 //initial Ch_Swap pin: 1, host1->sim slot1, host2->sim slot2; 0, host1->sim slot2, host2->sim slot1
35 mt_set_gpio_mode(ch_swap, ch_mode);
36 mt_set_gpio_dir(ch_swap, GPIO_DIR_OUT);
37
38 //initial EN pin: 1, enable sim slot; 0, disable sim slot
39 mt_set_gpio_mode(en, en_mode);
40 mt_set_gpio_dir(en, GPIO_DIR_OUT);
41
42 curr_ssw_mode = mode;
43 if (mode == SSW_DUAL_TALK) {
44 mt_set_gpio_out(ch_swap, SSW_DUAL_TALK);
45
46 } else if (mode == SSW_SING_TALK) {
47 mt_set_gpio_out(ch_swap, SSW_SING_TALK);
48 }
49
50 mt_set_gpio_out(en, GPIO_OUT_ONE);
51
52 SSW_DBG("ssw_init: ch_swap=(%d %d %d), en=(%d %d %d) \n",
53 ch_swap, ch_mode, mt_get_gpio_out(ch_swap),
54 en, en_mode, mt_get_gpio_out(en));
55
56 return SSW_SUCCESS;
57 }
58
59
60 int ssw_switch_mode(char *buf, unsigned int len)
61 {
62 int ret = 0;
63 unsigned int mode = *((unsigned int *)buf);
64 unsigned int type = (mode&0xFFFF0000)>>16;
65
66 if (type != get_sim_switch_type()) {
67 SSW_DBG("[Error]sim switch type is mis-match: type(%d, %d)", type, get_sim_switch_type());
68 return SSW_INVALID_PARA;
69 }
70 SSW_DBG("sim switch: %d -> %d \n", curr_ssw_mode, mode);
71
72 mutex_lock(&ssw_mutex);
73
74 if (curr_ssw_mode != mode) {
75 curr_ssw_mode = mode;
76
77 if (curr_ssw_mode == SSW_DUAL_TALK)
78 mt_set_gpio_out(ch_swap, SSW_DUAL_TALK);
79 else if (curr_ssw_mode == SSW_SING_TALK)
80 mt_set_gpio_out(ch_swap, SSW_SING_TALK);
81 }
82
83 mutex_unlock(&ssw_mutex);
84
85 SSW_DBG("sim switch(%d) OK, ch_swap=%d, en=%d \n", curr_ssw_mode,
86 mt_get_gpio_out(ch_swap), mt_get_gpio_out(en));
87
88 return SSW_SUCCESS;
89
90 }
91 EXPORT_SYMBOL(ssw_switch_mode);
92
93
94 static int ssw_probe(struct platform_device *dev)
95 {
96 ssw_init(default_mode);
97 mutex_init(&ssw_mutex);
98
99 register_ccci_kern_func(ID_SSW_SWITCH_MODE, ssw_switch_mode);
100
101 return 0;
102 }
103
104 static int ssw_remove(struct platform_device *dev)
105 {
106 //SSW_DBG("ssw_remove \n");
107 return 0;
108 }
109
110 static void ssw_shutdown(struct platform_device *dev)
111 {
112 //SSW_DBG("ssw_shutdown \n");
113 }
114
115 static int ssw_suspend(struct platform_device *dev, pm_message_t state)
116 {
117 //SSW_DBG("ssw_suspend \n");
118 return 0;
119 }
120
121 static int ssw_resume(struct platform_device *dev)
122 {
123 //SSW_DBG("ssw_resume \n");
124 return 0;
125 }
126
127
128 static struct platform_driver ssw_driver =
129 {
130 .driver = {
131 .name = "sim-switch",
132 },
133 .probe = ssw_probe,
134 .remove = ssw_remove,
135 .shutdown = ssw_shutdown,
136 .suspend = ssw_suspend,
137 .resume = ssw_resume,
138 };
139
140
141 static int __init ssw_driver_init(void)
142 {
143 int ret = 0;
144
145 ret = platform_driver_register(&ssw_driver);
146 if (ret) {
147 SSW_DBG("ssw_driver register fail(%d)\n", ret);
148 return ret;
149 }
150
151 return ret;
152 }
153
154
155 static void __exit ssw_driver_exit(void)
156 {
157 return;
158 }
159
160
161 module_init(ssw_driver_init);
162 module_exit(ssw_driver_exit);
163
164
165 MODULE_DESCRIPTION("MTK SIM Switch Driver");
166 MODULE_AUTHOR("Anny <Anny.Hu@mediatek.com>");
167 MODULE_LICENSE("GPL");
168
169