source "drivers/misc/c2port/Kconfig"
source "drivers/misc/eeprom/Kconfig"
source "drivers/misc/cb710/Kconfig"
+source "drivers/misc/rk29_modem/Kconfig"
endif # MISC_DEVICES
obj-$(CONFIG_WL127X_RFKILL) += wl127x-rfkill.o
obj-$(CONFIG_APANIC) += apanic.o
obj-$(CONFIG_STE) += ste.o
+obj-$(CONFIG_RK29_SUPPORT_MODEM) += rk29_modem/
--- /dev/null
+#
+# 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
+
--- /dev/null
+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
+
+
--- /dev/null
+#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
--- /dev/null
+#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;
+}
+
--- /dev/null
+#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
{ 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) },
{ 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);