3 #include "cust_ssw_fxla2203.h"
4 #include "cust_gpio_usage.h"
5 //#include <mach/mt_gpio.h>
11 unsigned int curr_ssw_mode
= SSW_SING_TALK
;
12 struct mutex ssw_mutex
;
14 unsigned int get_sim_switch_type(void)
16 printk("[ccci/ssw]FXLA2203\n");
17 return SSW_EXT_FXLA2203
;
19 EXPORT_SYMBOL(get_sim_switch_type
);
22 //sim switch hardware initial
23 static int ssw_init(unsigned int mode
)
25 SSW_DBG("ssw_init: %d \n", mode
);
27 unsigned int ch_mode
, en_mode
;
28 ch_swap
= GPIO_SSW_CH_SWAP_PIN
;
30 ch_mode
= GPIO_SSW_CH_SWAP_PIN_M_GPIO
;
31 en_mode
= GPIO_SSW_EN_PIN_M_GPIO
;
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
);
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
);
43 if (mode
== SSW_DUAL_TALK
) {
44 mt_set_gpio_out(ch_swap
, SSW_DUAL_TALK
);
46 } else if (mode
== SSW_SING_TALK
) {
47 mt_set_gpio_out(ch_swap
, SSW_SING_TALK
);
50 mt_set_gpio_out(en
, GPIO_OUT_ONE
);
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
));
60 int ssw_switch_mode(char *buf
, unsigned int len
)
63 unsigned int mode
= *((unsigned int *)buf
);
64 unsigned int type
= (mode
&0xFFFF0000)>>16;
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
;
70 SSW_DBG("sim switch: %d -> %d \n", curr_ssw_mode
, mode
);
72 mutex_lock(&ssw_mutex
);
74 if (curr_ssw_mode
!= mode
) {
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
);
83 mutex_unlock(&ssw_mutex
);
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
));
91 EXPORT_SYMBOL(ssw_switch_mode
);
94 static int ssw_probe(struct platform_device
*dev
)
96 ssw_init(default_mode
);
97 mutex_init(&ssw_mutex
);
99 register_ccci_kern_func(ID_SSW_SWITCH_MODE
, ssw_switch_mode
);
104 static int ssw_remove(struct platform_device
*dev
)
106 //SSW_DBG("ssw_remove \n");
110 static void ssw_shutdown(struct platform_device
*dev
)
112 //SSW_DBG("ssw_shutdown \n");
115 static int ssw_suspend(struct platform_device
*dev
, pm_message_t state
)
117 //SSW_DBG("ssw_suspend \n");
121 static int ssw_resume(struct platform_device
*dev
)
123 //SSW_DBG("ssw_resume \n");
128 static struct platform_driver ssw_driver
=
131 .name
= "sim-switch",
134 .remove
= ssw_remove
,
135 .shutdown
= ssw_shutdown
,
136 .suspend
= ssw_suspend
,
137 .resume
= ssw_resume
,
141 static int __init
ssw_driver_init(void)
145 ret
= platform_driver_register(&ssw_driver
);
147 SSW_DBG("ssw_driver register fail(%d)\n", ret
);
155 static void __exit
ssw_driver_exit(void)
161 module_init(ssw_driver_init
);
162 module_exit(ssw_driver_exit
);
165 MODULE_DESCRIPTION("MTK SIM Switch Driver");
166 MODULE_AUTHOR("Anny <Anny.Hu@mediatek.com>");
167 MODULE_LICENSE("GPL");