From: lw@rock-chips.com <lw@rock-chips.com>
Date: Sun, 1 Apr 2012 03:24:04 +0000 (+0800)
Subject: rk30_phone:add 3G modem and cmmb support
X-Git-Tag: firefly_0821_release~9516^2
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c8c2a049899b37b7514085d8a7a52ac6a10fdf0d;p=firefly-linux-kernel-4.4.55.git

rk30_phone:add 3G modem and cmmb support
---

diff --git a/arch/arm/configs/rk30_phone_defconfig b/arch/arm/configs/rk30_phone_defconfig
index 6fd6891a4ed1..9170808a9770 100755
--- a/arch/arm/configs/rk30_phone_defconfig
+++ b/arch/arm/configs/rk30_phone_defconfig
@@ -189,6 +189,8 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_MISC_DEVICES=y
 CONFIG_UID_STAT=y
 CONFIG_APANIC=y
+CONFIG_RK29_SC8800=y
+CONFIG_TDSC8800=y
 CONFIG_MPU_SENSORS_TIMERIRQ=y
 CONFIG_INV_SENSORS=y
 CONFIG_MPU_SENSORS_MMA845X=y
@@ -277,6 +279,7 @@ CONFIG_SOC_CAMERA=y
 CONFIG_SOC_CAMERA_OV2659=y
 CONFIG_SOC_CAMERA_OV5642=y
 CONFIG_VIDEO_RK29=y
+CONFIG_SMS_SIANO_MDTV=y
 CONFIG_ION=y
 CONFIG_ION_ROCKCHIP=y
 CONFIG_FB=y
diff --git a/arch/arm/mach-rk29/board-rk29-td8801_v2.c b/arch/arm/mach-rk29/board-rk29-td8801_v2.c
index 40119938be72..ccf4658563d4 100755
--- a/arch/arm/mach-rk29/board-rk29-td8801_v2.c
+++ b/arch/arm/mach-rk29/board-rk29-td8801_v2.c
@@ -3596,12 +3596,27 @@ static struct xpt2046_platform_data xpt2046_info = {
 #endif
 
 #if defined(CONFIG_RK29_SC8800)
+static int sc8800_io_init(void)
+{
+	rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_GPIO1C1);
+	rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_GPIO1C0);
+	return 0;
+}
+
+static int sc8800_io_deinit(void)
+{
+
+	return 0;
+}
+
 static struct plat_sc8800 sc8800_plat_data = {
 	.slav_rts_pin = RK29_PIN1_PC1,
 	.slav_rdy_pin = RK29_PIN0_PA3,
 	.master_rts_pin = RK29_PIN1_PC0,
 	.master_rdy_pin = RK29_PIN0_PA2,
 	//.poll_time = 100,
+	.io_init = sc8800_io_init,
+    .io_deinit = sc8800_io_deinit,
 };
 #endif
 /*
diff --git a/arch/arm/mach-rk30/board-rk30-phone.c b/arch/arm/mach-rk30/board-rk30-phone.c
index 6f1c4dbba20c..2d0bf0e1deca 100755
--- a/arch/arm/mach-rk30/board-rk30-phone.c
+++ b/arch/arm/mach-rk30/board-rk30-phone.c
@@ -49,6 +49,15 @@
 #if defined(CONFIG_BACKLIGHT_AW9364)
 #include "../../../drivers/video/backlight/aw9364_bl.h"
 #endif
+#if defined(CONFIG_RK29_SC8800)
+#include "../../../drivers/tty/serial/sc8800.h"
+#endif
+#if defined(CONFIG_TDSC8800)
+#include <linux/mtk23d.h>
+#endif
+#if defined(CONFIG_SMS_SPI_ROCKCHIP)
+#include "../../../drivers/cmmb/siano/smsspiphy.h"
+#endif
 
 
 #define RK30_FB0_MEM_SIZE 8*SZ_1M
@@ -379,7 +388,148 @@ struct goodix_platform_data goodix_info = {
 };
 #endif
 
+#if defined(CONFIG_RK29_SC8800)
+static int sc8800_io_init(void)
+{
+	rk30_mux_api_set(GPIO2B5_LCDC1DATA13_SMCADDR17_HSADCDATA8_NAME, GPIO2B_GPIO2B5);
+	rk30_mux_api_set(GPIO2A2_LCDCDATA2_SMCADDR6_NAME, GPIO2A_GPIO2A2);
+	return 0;
+}
+
+static int sc8800_io_deinit(void)
+{
+
+	return 0;
+}
+
+
+static struct plat_sc8800 sc8800_plat_data = {
+	.slav_rts_pin = RK30_PIN6_PA0,
+	.slav_rdy_pin = RK30_PIN2_PB5,
+	.master_rts_pin = RK30_PIN6_PA1,
+	.master_rdy_pin = RK30_PIN2_PA2,
+	//.poll_time = 100,
+	.io_init = sc8800_io_init,
+    .io_deinit = sc8800_io_deinit,
+};
+
+static struct rk29xx_spi_chip sc8800_spi_chip = {
+	//.poll_mode = 1,
+	.enable_dma = 1,
+};
+
+#endif
+#if defined(CONFIG_SMS_SPI_ROCKCHIP)
+#define CMMB_1186_SPIIRQ RK30_PIN4_PB7
+#define CMMB_1186_RESET RK30_PIN0_PD5
+
+void cmmb_io_init_mux(void)
+{
+//	rk30_mux_api_set(GPIO1A4_UART1SIN_SPI0CSN0_NAME,GPIO1A_GPIO1A4);
+
+}
+void cmmb_io_set_for_pm(void)
+{
+	printk("entering cmmb_io_set_for_pm\n");
+	rk30_mux_api_set(GPIO0D5_I2S22CHSDO_SMCADDR1_NAME,GPIO0D_GPIO0D5);
+	gpio_request(CMMB_1186_RESET, NULL);//cmmb reset pin
+	gpio_direction_output(CMMB_1186_RESET,0);
+	rk30_mux_api_set(GPIO1A4_UART1SIN_SPI0CSN0_NAME,GPIO1A_GPIO1A4);
+	gpio_request(RK30_PIN1_PA4, NULL);//cmmb cs pin
+	gpio_direction_input(RK30_PIN1_PA4);
+	gpio_pull_updown(RK30_PIN1_PA4, 0);
+}
+
+void cmmb_power_on_by_wm831x(void)
+{
+	struct regulator *ldo;
+#if 0
+	printk("entering cmmb_power_on_by_wm831x\n");
+
+	rk29_mux_api_set(GPIO1A3_EMMCDETECTN_SPI1CS1_NAME,GPIO1L_SPI0_CSN1);
+	gpio_request(RK29_PIN6_PD2, NULL);
+	gpio_direction_output(RK29_PIN6_PD2,0);
+	mdelay(200);
+
+	ldo = regulator_get(NULL, "ldo8");		//cmmb
+	regulator_set_voltage(ldo,1200000,1200000);
+	regulator_set_suspend_voltage(ldo,1200000);
+	regulator_enable(ldo);
+	printk("%s set ldo8=%dmV end\n", __FUNCTION__, regulator_get_voltage(ldo));
+	regulator_put(ldo);
+
+	ldo = regulator_get(NULL, "ldo9");		//cmmb
+	regulator_set_voltage(ldo,3000000,3000000);
+	regulator_set_suspend_voltage(ldo,3000000);
+	regulator_enable(ldo);
+	printk("%s set ldo9=%dmV end\n", __FUNCTION__, regulator_get_voltage(ldo));
+	regulator_put(ldo);
+
+	mdelay(200);
+	gpio_direction_output(RK29_PIN6_PD2,1);
+#endif
+}
+
+void cmmb_power_down_by_wm831x(void)
+{
+	struct regulator* ldo;
+#if 0
+	printk("entering cmmb_power_down_by_wm831x\n");
+
+	ldo = regulator_get(NULL, "ldo8");
+	regulator_set_voltage(ldo,0,0);
+	regulator_disable(ldo);
+	regulator_put(ldo);
+
+	ldo = regulator_get(NULL, "ldo9");
+	regulator_set_voltage(ldo,0,0);
+	regulator_disable(ldo);
+	regulator_put(ldo);
+#endif
+}
+
+static struct cmmb_io_def_s cmmb_io = {
+	.cmmb_pw_en = INVALID_GPIO,
+	.cmmb_pw_dwn = INVALID_GPIO,
+	.cmmb_pw_rst = CMMB_1186_RESET,
+	.cmmb_irq = CMMB_1186_SPIIRQ,
+	.io_init_mux = cmmb_io_init_mux,
+	.cmmb_io_pm = cmmb_io_set_for_pm,
+	.cmmb_power_on = cmmb_power_on_by_wm831x,
+	.cmmb_power_down = cmmb_power_down_by_wm831x
+};
+
+static struct rk29xx_spi_chip cmb_spi_chip = {
+	//.poll_mode = 1,
+	.enable_dma = 1,
+};
+
+#endif
+
 static struct spi_board_info board_spi_devices[] = {
+#if defined(CONFIG_RK29_SC8800)
+		{
+			.modalias  = "sc8800",
+			.bus_num = 1,
+			.platform_data = &sc8800_plat_data,
+			.max_speed_hz  = 12*1000*1000,
+			.chip_select   = 0,		
+			.controller_data = &sc8800_spi_chip,
+		},
+#endif
+	
+#if defined(CONFIG_SMS_SPI_ROCKCHIP)
+		{
+			.modalias	= "siano1186",
+			.chip_select	= 0,
+			.max_speed_hz	= 12*1000*1000,
+			.bus_num	= 0,
+			.irq		=CMMB_1186_SPIIRQ,
+			.platform_data = &cmmb_io,	
+			.controller_data = &cmb_spi_chip,
+		},
+#endif
+
 };
 
 /***********************************************************
@@ -1121,6 +1271,39 @@ static struct platform_device rk29sdk_rfkill = {
  * the end of setting for SDMMC devices
 **************************************************************************************************/
 
+/*************td modem sc8800 power control*************/
+
+#if defined(CONFIG_TDSC8800)
+#define BP_VOL_PIN			RK30_PIN6_PB2
+
+static int tdsc8800_io_init(void)
+{
+	
+	return 0;
+}
+
+static int tdsc8800_io_deinit(void)
+{
+
+	return 0;
+}
+
+struct rk2818_23d_data rk29_tdsc8800_info = {
+	.io_init = tdsc8800_io_init,
+    .io_deinit = tdsc8800_io_deinit,
+	.bp_power = BP_VOL_PIN,
+	.bp_power_active_low = 1,
+};
+struct platform_device rk29_device_tdsc8800 = {
+    .name = "tdsc8800",
+	.id = -1,
+	.dev		= {
+		.platform_data = &rk29_tdsc8800_info,
+	}
+    };
+#endif
+
+
 static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_BACKLIGHT_RK29_BL
 	&rk29_device_backlight,
@@ -1149,6 +1332,10 @@ static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_BT
     &rk29sdk_rfkill,
 #endif
+#ifdef CONFIG_TDSC8800
+	&rk29_device_tdsc8800
+#endif
+
 };
 
 // i2c
diff --git a/drivers/misc/sc8800.c b/drivers/misc/sc8800.c
index c8d26fed579d..0a13bb432c6a 100755
--- a/drivers/misc/sc8800.c
+++ b/drivers/misc/sc8800.c
@@ -41,6 +41,8 @@ struct plat_sc8800 {
 	int master_rts_pin;
 	int master_rdy_pin;
 	int poll_time;
+	int (*io_init)(void);
+	int (*io_deinit)(void);
 };
 struct bp_head{
 	u16 tag;        //0x7e7f
@@ -571,15 +573,16 @@ static int __devinit sc8800_probe(struct spi_device *spi)
 		dev_err(sc8800->dev, "ERR: fail to setup spi\n");
 		goto err_spi_setup;
 	}
+
+	if(pdata && pdata->io_init)
+		pdata->io_init();
+	
 	sc8800->irq = gpio_to_irq(pdata->slav_rts_pin);
 	sc8800->slav_rts = pdata->slav_rts_pin;
 	sc8800->slav_rdy = pdata->slav_rdy_pin;
 	sc8800->master_rts = pdata->master_rts_pin;
 	sc8800->master_rdy = pdata->master_rdy_pin;
 
-        rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_GPIO1C1);
-        rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_GPIO1C0);
-
 	ret = gpio_request(sc8800->slav_rts, "salv_rts");
 	if(ret < 0){
 		dev_err(sc8800->dev, "ERR: gpio request slav_rts[%d]\n", sc8800->slav_rts);
diff --git a/drivers/tty/serial/sc8800.h b/drivers/tty/serial/sc8800.h
index b425cb47c13c..9b97b0ecabe5 100755
--- a/drivers/tty/serial/sc8800.h
+++ b/drivers/tty/serial/sc8800.h
@@ -17,6 +17,8 @@ struct plat_sc8800 {
 	int master_rts_pin;
 	int master_rdy_pin;
 	int poll_time;
+	int (*io_init)(void);
+	int (*io_deinit)(void);
 };
 
 #endif