support internal modem v0.10
authorcmy <cmy@cmy-desktop.(none)>
Fri, 28 Jan 2011 06:17:43 +0000 (22:17 -0800)
committercmy <cmy@cmy-desktop.(none)>
Fri, 28 Jan 2011 06:17:43 +0000 (22:17 -0800)
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/rk29_modem/Kconfig [new file with mode: 0644]
drivers/misc/rk29_modem/Makefile [new file with mode: 0644]
drivers/misc/rk29_modem/modem_rockchip_demo.c [new file with mode: 0755]
drivers/misc/rk29_modem/rk29_modem.c [new file with mode: 0755]
drivers/misc/rk29_modem/rk29_modem.h [new file with mode: 0755]
drivers/usb/serial/option.c

index 94e5c7b8df927fbd372726400ab1ddf15acb1fcd..1f67cb9b0b82626cc48331cef2302040d38f66e1 100644 (file)
@@ -291,5 +291,6 @@ config STE
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
+source "drivers/misc/rk29_modem/Kconfig"
 
 endif # MISC_DEVICES
index 932b3a87cfce58ebbe7298be9265f87ab2afea54..1265365196f835f4cd24c1b99d483377db602cea 100644 (file)
@@ -29,3 +29,4 @@ obj-y                         += cb710/
 obj-$(CONFIG_WL127X_RFKILL)    += wl127x-rfkill.o
 obj-$(CONFIG_APANIC)           += apanic.o
 obj-$(CONFIG_STE)              += ste.o
+obj-$(CONFIG_RK29_SUPPORT_MODEM)        += rk29_modem/
diff --git a/drivers/misc/rk29_modem/Kconfig b/drivers/misc/rk29_modem/Kconfig
new file mode 100644 (file)
index 0000000..70113c1
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# USB Serial device configuration
+#
+
+menuconfig RK29_SUPPORT_MODEM
+       tristate "RK29 support Modem"
+       depends on USB11_HOST_EN
+       ---help---
+         Say Y here if you have a support modem
+
+choice
+       depends on RK29_SUPPORT_MODEM
+       prompt  "Select 3G Modem"
+
+ config MODEM_ROCKCHIP_DEMO
+       bool "ROCKCHIP_GENERAL_MODEM_DEVICE"
+
+#    config MODEM_ZTE_MG3732
+#        bool "ZTE_MG3732"
+
+#config MODEM_ZTE_MF210
+#      bool "ZTE_MF210"
+       
+#config MODEM_ZTE_AD3812
+#      bool "ZTE_AD3812"
+
+#config MODEM_THINKWILL_ME800
+#      bool "THINKWILL_ME800"
+
+#config MODEM_HUAWEI_EM660
+#      bool "HUAWEI_EM660"
+       
+#config MODEM_HUAWEI_EM770
+#      bool "HUAWEI_EM770"
+
+#config MODEM_HUAWEI_EM660C
+ #        bool "HUAWEI_EM660C"
+
+#config MODEM_ZTE_MU301        
+#      bool "ZTE_MU301"
+
+#config MODEM_TDM_330
+#      bool "TDM_330"
+
+endchoice
+
diff --git a/drivers/misc/rk29_modem/Makefile b/drivers/misc/rk29_modem/Makefile
new file mode 100644 (file)
index 0000000..6d5c5ad
--- /dev/null
@@ -0,0 +1,16 @@
+obj-$(CONFIG_RK29_SUPPORT_MODEM)              += rk29_modem.o
+
+obj-$(CONFIG_MODEM_ROCKCHIP_DEMO)              +=modem_rockchip_demo.o
+
+obj-$(CONFIG_MODEM_ZTE_MG3732)                 +=modem_zte_mg3732.o
+
+#obj-$(CONFIG_MODEM_ZTE_MF210)                         += modem_zte_mf210.o
+#obj-$(CONFIG_MODEM_ZTE_AD3812)                 += modem_zte_ad3812.o
+#obj-$(CONFIG_MODEM_THINKWILL_ME800)   += modem_thinkwill_me800.o
+#obj-$(CONFIG_MODEM_HUAWEI_EM660)              += modem_huawei_em660.o
+#obj-$(CONFIG_MODEM_HUAWEI_EM770)              += modem_huawei_em770.o
+#obj-$(CONFIG_MODEM_HUAWEI_EM660C)     += modem_huawei_em660c.o
+#obj-$(CONFIG_MODEM_ZTE_MU301)                 += modem_zte_mu301.o
+#obj-$(CONFIG_MODEM_TDM_330)                   += modem_tdm_330.o
+
+
diff --git a/drivers/misc/rk29_modem/modem_rockchip_demo.c b/drivers/misc/rk29_modem/modem_rockchip_demo.c
new file mode 100755 (executable)
index 0000000..c5e6a68
--- /dev/null
@@ -0,0 +1,146 @@
+#include <linux/kernel.h>\r
+#include <linux/module.h>\r
+#include <linux/moduleparam.h>\r
+#include <linux/init.h>\r
+#include <linux/device.h>\r
+#include <linux/errno.h>\r
+#include <linux/types.h>\r
+#include <linux/stat.h>         /* permission constants */\r
+#include <linux/io.h>\r
+#include <linux/vmalloc.h>\r
+#include <asm/io.h>\r
+#include <asm/sizes.h>\r
+#include <mach/iomux.h>\r
+#include <mach/gpio.h>\r
+//#include <asm/arch/iomux.h>\r
+#include <linux/delay.h>\r
+\r
+#include "rk29_modem.h"\r
+\r
+/****************************************************************\r
+        huawei-em660/em660c/em770\r
+        zte-ad3812/mf210/mu301\r
+        thinkwill-me800                                                                \r
+\r
+*****************************************************************/\r
+\r
+static int modem_enable(void){\r
+       printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);\r
+       // PG1: 3G reset\r
+         /*arch/arm/mach-rockchip/iomux.c*/\r
+//     rockchip_mux_api_set(G3_RESET_IOMUX_NAME, G3_RESET_IOMUX_MODE);\r
+       // PB0: 3G poweron\r
+//     rockchip_mux_api_set(G3_POWER_ON_IOMUX_NAME, G3_POWER_ON_IOMUX_MODE);\r
+       // PG0: 3G Radio On/Off\r
+//     rockchip_mux_api_set(G3_RADIO_ON_OFF_IOMUX_NAME, G3_RADIO_ON_OFF_IOMUX_MODE);\r
+//     msleep(10);\r
+       \r
+       /*3G Modem Power On*/\r
+        int ret = gpio_request(G3_POWER_ON, NULL);\r
+        if(ret != 0)\r
+        {\r
+            gpio_free(G3_POWER_ON);\r
+            printk(">>>>>> G3_POWER_ON gpio_request err \n ");\r
+           return ret;\r
+        }\r
+        gpio_direction_output(G3_POWER_ON, G3_POWER_ENABLE);\r
+//        gpio_set_value(FB_LCD_CABC_EN_PIN, GPIO_LOW);\r
+\r
+//     GPIOSetPinDirection(G3_POWER_ON, GPIO_OUT);\r
+//     GPIOSetPinLevel(G3_POWER_ON, G3_POWER_ENABLE);\r
+       msleep(100);\r
+       gpio_free(G3_POWER_ON);\r
+       \r
+       /*3G Modem Radio On*/\r
+//     GPIOSetPinDirection(G3_RADIO_ON_OFF, GPIO_OUT);\r
+//     GPIOSetPinLevel(G3_RADIO_ON_OFF, G3_RADIO_ENABLE);\r
+//     msleep(100);\r
+\r
+       /*3G Modem Reset Controll if needed*/\r
+//     if(G3_RESET){\r
+//             GPIOSetPinDirection(G3_RESET, GPIO_OUT);\r
+//             GPIOSetPinLevel(G3_RESET, G3_RESET_ENABLE);\r
+//             msleep(120);\r
+//             GPIOSetPinLevel(G3_RESET, G3_RESET_DISABLE);\r
+//     }\r
+       return 0;\r
+}\r
+\r
+static int modem_disable(void){\r
+       printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);\r
+       // PG1: 3G reset\r
+//     rockchip_mux_api_set(G3_RESET_IOMUX_NAME, G3_RESET_IOMUX_MODE);\r
+       // PB0: 3G poweron\r
+//     rockchip_mux_api_set(G3_POWER_ON_IOMUX_NAME, G3_POWER_ON_IOMUX_MODE);\r
+       // PG0: 3G On/Off\r
+//     rockchip_mux_api_set(G3_RADIO_ON_OFF_IOMUX_NAME, G3_RADIO_ON_OFF_IOMUX_MODE);\r
+//     msleep(10);\r
+\r
+#if 1\r
+        int ret = gpio_request(G3_POWER_ON, NULL);\r
+        if(ret != 0)\r
+        {\r
+            gpio_free(G3_POWER_ON);\r
+            printk(">>>>>> G3_POWER_ON gpio_request err \n ");\r
+           return ret;\r
+        }\r
+        gpio_direction_output(G3_POWER_ON, G3_POWER_DISABLE);\r
+#else  \r
+       /*3G Modem Power off*/\r
+       GPIOSetPinDirection(G3_POWER_ON, GPIO_OUT);\r
+       GPIOSetPinLevel(G3_POWER_ON, G3_POWER_DISABLE);\r
+#endif\r
+       msleep(100);\r
+       gpio_free(G3_POWER_ON);\r
+\r
+       /*3G Modem  Radio off*/\r
+//     GPIOSetPinDirection(G3_RADIO_ON_OFF, GPIO_OUT);\r
+//     GPIOSetPinLevel(G3_RADIO_ON_OFF, G3_RADIO_DISABLE);\r
+//     msleep(10);\r
+\r
+       /*3G Modem Reset enable if needed*/\r
+//     if(G3_RESET){\r
+//             GPIOSetPinDirection(G3_RESET, GPIO_OUT);\r
+//             GPIOSetPinLevel(G3_RESET, G3_RESET_ENABLE);\r
+//     }\r
+       return 0;\r
+}\r
+\r
+static int modem_sleep(void){\r
+       printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);\r
+       \r
+       return 0;\r
+}\r
+\r
+static int modem_init(void){\r
+    return modem_disable();\r
+}\r
+\r
+struct rk29_modem_t rk29_modem = {\r
+       .name    = "ThinkWill_ME800",\r
+       .enable  = modem_enable,\r
+       .disable = modem_disable,\r
+       .sleep   = modem_sleep,\r
+       .init    = modem_init,\r
+};\r
+\r
+static int __init rk29_modem_init(void)\r
+{\r
+       return rk29_modem_register(&rk29_modem);\r
+}\r
+\r
+static void __exit rk29_modem_exit(void)\r
+{\r
+       rk29_modem_unregister(&rk29_modem);\r
+}\r
+\r
+\r
+late_initcall(rk29_modem_init);\r
+//module_init(rk29_modem_init);\r
+module_exit(rk29_modem_exit);\r
+\r
+MODULE_AUTHOR("lintao lintao@rock-chips.com");\r
+MODULE_DESCRIPTION("ROCKCHIP modem driver");\r
+MODULE_LICENSE("GPL");\r
+\r
+\r
diff --git a/drivers/misc/rk29_modem/rk29_modem.c b/drivers/misc/rk29_modem/rk29_modem.c
new file mode 100755 (executable)
index 0000000..0a3279d
--- /dev/null
@@ -0,0 +1,145 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/stat.h>         /* permission constants */
+
+#include <asm/io.h>
+#include <asm/sizes.h>
+
+#include "rk29_modem.h"
+
+struct rk29_modem_t *g_rk29_modem = NULL;
+
+extern void rk29_host11_driver_enable(void);
+extern void rk29_host11_driver_disable(void);
+
+static ssize_t modem_status_write(struct class *cls, const char *_buf, size_t _count)
+{
+       struct rk29_modem_t *rk29_modem = g_rk29_modem;
+
+    int new_mode = simple_strtoul(_buf, NULL, 16);
+    printk("[%s] new_mode: %s\n", __func__, _buf);
+    
+    if(rk29_modem == NULL){
+       printk("!!!! g_rk29_modem is NULL !!!!\n");
+       return _count;
+    }
+    
+    if(new_mode == rk29_modem->cur_mode){
+       printk("[%s] current already in %d mode\n", __func__, new_mode);
+        return _count;
+    }
+    
+    switch(new_mode){
+    case MODEM_DISABLE:
+       if(rk29_modem->disable){
+               printk("modem disable!\n");
+//             rk29_host11_driver_disable();
+  //           mdelay(10);
+               rk29_modem->disable();
+               rk29_modem->cur_mode = new_mode;
+       }
+       break;
+       
+    case MODEM_ENABLE :
+       if(rk29_modem->enable){
+               printk("modem enable!\n");
+//             rk29_host11_driver_enable();
+//             mdelay(100);
+               rk29_modem->enable();
+               rk29_modem->cur_mode = new_mode;
+       }
+       break;
+       
+    case MODEM_SLEEP:
+       if(rk29_modem->sleep){
+               printk("modem sleep!\n");
+               rk29_modem->sleep();
+               rk29_modem->cur_mode = new_mode;
+       }
+       break;
+       
+    default:
+       printk("[%s] invalid new mode: %d\n", __func__, new_mode);
+       break;
+    }
+    
+       return _count;
+}
+
+static ssize_t modem_status_read(struct class *cls, char *_buf)
+{
+       struct rk29_modem_t *rk29_modem = g_rk29_modem;
+       
+//     printk("Modem type: %s, cur_mode = %d\n", rk29_modem->name, rk29_modem->cur_mode);
+       
+       return sprintf(_buf, "%d\n", rk29_modem->cur_mode);
+}
+
+static struct class *rk29_modem_class = NULL;
+static CLASS_ATTR(modem_status, 0666, modem_status_read, modem_status_write);
+
+int modem_is_turn_on()
+{
+    return (g_rk29_modem->cur_mode != 0);
+}
+
+void turn_off_modem()
+{
+    modem_status_write( NULL, "0", sizeof("0") );
+}
+
+void turn_on_modem()
+{
+    modem_status_write( NULL, "1", sizeof("1") );
+}
+
+int rk29_modem_register(struct rk29_modem_t *rk29_modem){
+       int ret = -1;
+       
+       if(rk29_modem == NULL)
+               return -1;
+
+#if 1
+       if(rk29_modem->enable) rk29_modem->enable();
+#else
+       if(rk29_modem->disable) rk29_modem->disable();
+#endif 
+       rk29_modem_class = class_create(THIS_MODULE, "rk291x_modem");
+       if(rk29_modem_class == NULL){
+               printk("create class rk291x_modem failed!\n");
+               goto err1;
+       }
+       
+       ret = class_create_file(rk29_modem_class, &class_attr_modem_status);
+       if(ret != 0){
+               printk("create rk291x_modem class file failed!\n");
+               goto err2;
+       }
+       
+       g_rk29_modem = rk29_modem;
+       
+       return 0;
+       
+err2:
+       class_destroy(rk29_modem_class);
+err1:
+       return ret;     
+}
+
+void rk29_modem_unregister(struct rk29_modem_t *rk29_modem){
+       /* disable 3G modem */          
+       if(rk29_modem->disable)
+               rk29_modem->disable();
+               
+       class_remove_file(rk29_modem_class, &class_attr_modem_status);
+       class_destroy(rk29_modem_class);
+       
+       rk29_modem_class = NULL;
+}
+
diff --git a/drivers/misc/rk29_modem/rk29_modem.h b/drivers/misc/rk29_modem/rk29_modem.h
new file mode 100755 (executable)
index 0000000..5e68129
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _rk29_MODEM_H
+#define _rk29_MODEM_H
+
+/* Modem states */
+#define MODEM_DISABLE       0
+#define MODEM_ENABLE        1
+#define MODEM_SLEEP         2
+#define MODEM_MAX_STATUS    3
+
+/*===================lintao@rock-chips====================*/
+#define G3_POWER_ON                                    RK29_PIN6_PB1//GPIOPortB_Pin0
+//#define G3_POWER_ON_IOMUX_NAME               GPIOB0_SPI0CSN1_MMC1PCA_NAME
+//#define G3_POWER_ON_IOMUX_MODE               IOMUXA_GPIO0_B0
+#define G3_POWER_ENABLE                                GPIO_HIGH
+#define G3_POWER_DISABLE                               GPIO_LOW
+/*===================================================*/
+//#define G3_RADIO_ON_OFF                                      GPIOPortG_Pin0
+//#define G3_RADIO_ON_OFF_IOMUX_NAME       GPIOG0_UART0_MMC1DET_NAME
+//#define G3_RADIO_ON_OFF_IOMUX_MODE   IOMUXA_GPIO1_C0
+//#define G3_RADIO_ENABLE                              GPIO_HIGH
+//#define G3_RADIO_DISABLE                             GPIO_LOW
+/*====================================================*/
+//#define G3_RESET                                             GPIOPortG_Pin1
+//#define G3_RESET_IOMUX_NAME                  GPIOG1_UART0_MMC1WPT_NAME
+//#define G3_RESET_IOMUX_MODE                  IOMUXA_GPIO1_C1
+//#define G3_RESET_ENABLE                              GPIO_LOW
+//#define G3_RESET_DISABLE                             GPIO_HIGH
+/*====================================================*/
+struct rk29_modem_t {
+       char *name;
+       int cur_mode;
+       int (*enable)(void);
+       int (*disable)(void);
+       int (*sleep)(void);
+       int (*init)(void);
+};
+
+int rk29_modem_register(struct rk29_modem_t *rk29_modem);
+void rk29_modem_unregister(struct rk29_modem_t *rk29_modem);
+
+#endif
index 774814d7a2c9ef72de4b15b2d91e9c0fa13df646..325750a3bf3886c8aff97d093d63251bc7c2cfd1 100644 (file)
@@ -866,6 +866,10 @@ static struct usb_device_id option_ids[] = {
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFED, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFFE, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFEB, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xF006, 0xff, 0xff, 0xff) },
        { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC100)},
        { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
        { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
@@ -905,6 +909,16 @@ static struct usb_device_id option_ids[] = {
        { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) },
        { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
        { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
+
+// cmy:
+       { USB_DEVICE(0x0685, 0x6000) },
+       { USB_DEVICE(0x1E89, 0x1E16) },
+       { USB_DEVICE(0x7693, 0x0001) },
+       { USB_DEVICE(0x1D09, 0x4308) },
+       { USB_DEVICE(0x1234, 0x0033) },
+       { USB_DEVICE(0xFEED, 0x0001) },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, 0x0017) },
+
        { } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, option_ids);