From 25e8b2ea253cd341ec69d265cdf6184ca7399229 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Fri, 8 Oct 2010 04:26:31 -0700 Subject: [PATCH] =?utf8?q?=E5=9C=A8spi=E9=A9=B1=E5=8A=A8=E4=BC=91=E7=9C=A0?= =?utf8?q?=E5=92=8C=E5=94=A4=E9=86=92=E7=9A=84=E5=87=BD=E6=95=B0=E4=B8=AD?= =?utf8?q?=E5=8A=A0=E4=BA=86=E8=A7=A3=E5=86=B3spi=5Fcs0=E6=BC=8F=E7=94=B5?= =?utf8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=A7=A6?= =?utf8?q?=E6=91=B8=E9=9D=A2=E6=9D=BF=E7=9A=84=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- arch/arm/mach-rk2818/board-raho-0928.c | 14 +++ arch/arm/mach-rk2818/board-raho.c | 14 +++ arch/arm/mach-rk2818/include/mach/board.h | 2 + drivers/input/touchscreen/ctp_it7250.c | 103 ++++++++-------------- drivers/spi/rk2818_spim.c | 11 ++- 5 files changed, 79 insertions(+), 65 deletions(-) diff --git a/arch/arm/mach-rk2818/board-raho-0928.c b/arch/arm/mach-rk2818/board-raho-0928.c index 29a41c61b9d6..8672ce4b93ba 100755 --- a/arch/arm/mach-rk2818/board-raho-0928.c +++ b/arch/arm/mach-rk2818/board-raho-0928.c @@ -1311,11 +1311,25 @@ static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num) return 0; } +static int spi_io_fix_leakage_bug(void) +{ + gpio_direction_output(RK2818_PIN_PB4,GPIO_LOW); + return 0; +} + +static int spi_io_resume_leakage_bug(void) +{ + gpio_direction_output(RK2818_PIN_PB4,GPIO_HIGH); + return 0; +} + struct rk2818_spi_platform_data rk2818_spi_platdata = { .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj .chipselect_gpios = rk2818_spi_cs_gpios, .io_init = spi_io_init, .io_deinit = spi_io_deinit, + .io_fix_leakage_bug=spi_io_fix_leakage_bug, + .io_resume_leakage_bug=spi_io_resume_leakage_bug, }; diff --git a/arch/arm/mach-rk2818/board-raho.c b/arch/arm/mach-rk2818/board-raho.c index d9d09c78c401..950a3355b889 100755 --- a/arch/arm/mach-rk2818/board-raho.c +++ b/arch/arm/mach-rk2818/board-raho.c @@ -1311,11 +1311,25 @@ static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num) return 0; } +static int spi_io_fix_leakage_bug(void) +{ + gpio_direction_output(RK2818_PIN_PB4,GPIO_LOW); + return 0; +} + +static int spi_io_resume_leakage_bug(void) +{ + gpio_direction_output(RK2818_PIN_PB4,GPIO_HIGH); + return 0; +} + struct rk2818_spi_platform_data rk2818_spi_platdata = { .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj .chipselect_gpios = rk2818_spi_cs_gpios, .io_init = spi_io_init, .io_deinit = spi_io_deinit, + .io_fix_leakage_bug=spi_io_fix_leakage_bug, + .io_resume_leakage_bug=spi_io_resume_leakage_bug, }; diff --git a/arch/arm/mach-rk2818/include/mach/board.h b/arch/arm/mach-rk2818/include/mach/board.h index fb400ca25f4e..6f9f9c4315f6 100755 --- a/arch/arm/mach-rk2818/include/mach/board.h +++ b/arch/arm/mach-rk2818/include/mach/board.h @@ -210,6 +210,8 @@ struct spi_cs_gpio { struct rk2818_spi_platform_data { int (*io_init)(struct spi_cs_gpio*, int); int (*io_deinit)(struct spi_cs_gpio*, int); + int (*io_fix_leakage_bug)(void); + int (*io_resume_leakage_bug)(void); struct spi_cs_gpio *chipselect_gpios; u16 num_chipselect; }; diff --git a/drivers/input/touchscreen/ctp_it7250.c b/drivers/input/touchscreen/ctp_it7250.c index 5c7f3833227e..c4b832eaa50b 100755 --- a/drivers/input/touchscreen/ctp_it7250.c +++ b/drivers/input/touchscreen/ctp_it7250.c @@ -198,7 +198,7 @@ return ; static irqreturn_t Ctp_it7250_touch_irq(int irq, void *dev_id) { struct Ctp_it7250_data *Ctp_it7250 = dev_id; - + //printk("%s++++ %d \r\n",__FUNCTION__,__LINE__); //rk28printk("%s++++ %d \r\n",__FUNCTION__,__LINE__); disable_irq_nosync(irq); //rk28printk("%s++++ %d irq=%d\r\n",__FUNCTION__,__LINE__,irq); @@ -313,7 +313,6 @@ ret = gpio_direction_input(client->irq); return true; } - // ================================================================================ // Function Name --- GetFirmwareInformation // Description --- Get firmware information @@ -457,7 +456,7 @@ bool IdentifyCapSensor(struct i2c_client *client) ucWriteLength = 1; ucReadLength = 0x0A; pucData[0] = 0x00; -rk28printk("%s\r\n",__FUNCTION__); + rk28printk("%s\r\n",__FUNCTION__); // Query do {//printk("first wait 111\r\n"); @@ -699,6 +698,7 @@ int CaptouchHWInitial(struct i2c_client *client) if (!IdentifyCapSensor(client)) { rk28printk("%s IdentifyCapSensor error \r\n",__FUNCTION__); + printk("%s IdentifyCapSensor error \r\n",__FUNCTION__); return false; //goto resetagin; } @@ -706,12 +706,14 @@ int CaptouchHWInitial(struct i2c_client *client) if (!GetFirmwareInformation (client)) { rk28printk("%s GetFirmwareInformation error \r\n",__FUNCTION__); + printk("%s GetFirmwareInformation error \r\n",__FUNCTION__); // goto resetagin; } if (!Get2DResolutions(client, &wXResolution, &wYResolution, &ucStep)) { rk28printk("%s Get2DResolutions error \r\n",__FUNCTION__); + printk("%s Get2DResolutions error \r\n",__FUNCTION__); // goto resetagin; } @@ -956,9 +958,7 @@ static void Ctp_it7250_delaywork_func(struct work_struct *work) static int Ctp_it7250_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct Ctp_it7250_data *Ctp_it7250; -// u16 TempReg=0x0; -// u16 val=0x0; - + Ctp_it7250_client = client; rk28printk("+++++++ %s+++++++\n", __FUNCTION__); Ctp_it7250 = kzalloc(sizeof(struct Ctp_it7250_data), GFP_KERNEL); @@ -971,41 +971,34 @@ static void Ctp_it7250_delaywork_func(struct work_struct *work) // INIT_WORK(&Ctp_it7250->irq_work, Ctp_it7250_irq_worker); INIT_DELAYED_WORK(&Ctp_it7250->delaywork, Ctp_it7250_delaywork_func); - Ctp_it7250->client = client; i2c_set_clientdata(client, Ctp_it7250); - -if (!CaptouchHWInitial(client)) - goto err_free_mem; -Ctp_it7250_init_irq(client); + if (!CaptouchHWInitial(client)) + goto err_free_mem; + Ctp_it7250_init_irq(client); ts_input_init(client); // CTS_configure_pin(client); -{ #if 0 -lp8725_lilo_en(2,0); -mdelay(100); + lp8725_lilo_en(2,0); + mdelay(100); -lp8725_lilo_en(2,1); -mdelay(100); -lp8725_set_lilo_vol(2,300); -mdelay(5); + lp8725_lilo_en(2,1); + mdelay(100); + lp8725_set_lilo_vol(2,300); + mdelay(5); #endif -} - - - //²»ÊDzéѯģʽ£¬²»ÐèÒªÂÖѯ //schedule_delayed_work(&Ctp_it7250->delaywork,msecs_to_jiffies(50)); rk28printk("+++++++ %s+++++++\n", __FUNCTION__); return 0; -err_free_mem: - kfree(Ctp_it7250); - return false; + err_free_mem: + kfree(Ctp_it7250); + return false; } @@ -1022,37 +1015,11 @@ static int Ctp_it7250_remove(struct i2c_client *client) #ifdef CONFIG_PM static int Ctp_it7250_suspend(struct i2c_client *client, pm_message_t state) {//pr_emerg("\n irq1=%d \n",irq1); -struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(client); - -//send command to make ctp into sleep mode -#if 1 - u8 ucWriteLength; - u8 pucData[128]; - u8 ucQuery; - - ucWriteLength = 3; - pucData[0] = 0x04; - pucData[1] = 0x00; - pucData[2] = 0x02; - - // Query - do - { - if(!ReadQueryBuffer(client, &ucQuery)) - { - ucQuery = QUERY_BUSY; - } - }while(ucQuery & QUERY_BUSY); + struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(client); - // Write Command - rk28printk("%s WriteCommandBuffer\r\n",__FUNCTION__); - if(!WriteCommandBuffer(client, pucData, ucWriteLength)) - { - return false; - } - #endif -//send sleep command end + rk28printk("%s\n",__func__); + CaptouchMode(client, 2); disable_irq(Ctp_it7250->irq); return 0; @@ -1060,14 +1027,21 @@ struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdat static int Ctp_it7250_resume(struct i2c_client *client) { -struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(client); -//read command to wakeup ctp -#if 1 -u8 ucQuery; -ReadQueryBuffer(client, &ucQuery); -#endif -//wakeup end + struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(client); + + u8 ucQuery; + rk28printk("%s\n",__func__); + + if(gpio_direction_output(client->irq,GPIO_LOW)) + printk("%s:set pin output error\n",__func__); + msleep(20); + ReadQueryBuffer(client, &ucQuery); + if (gpio_direction_input(client->irq)) + printk("%s:failed to set CTS_configure_pin gpio input\n",__func__); + gpio_pull_updown(client->irq,GPIOPullUp); + msleep(20); enable_irq(Ctp_it7250->irq); + return 0; } #else @@ -1086,9 +1060,9 @@ static struct i2c_driver Ctp_it7250_driver = { }, .id_table = Ctp_it7250_id, .probe = Ctp_it7250_probe, - .remove = Ctp_it7250_remove, - .suspend = Ctp_it7250_suspend, - .resume = Ctp_it7250_resume, + .remove = Ctp_it7250_remove, + .suspend = Ctp_it7250_suspend, + .resume = Ctp_it7250_resume, }; static int __init Ctp_it7250_init(void) @@ -1113,3 +1087,4 @@ module_exit(Ctp_it7250_exit); MODULE_AUTHOR("Robert_mu"); + diff --git a/drivers/spi/rk2818_spim.c b/drivers/spi/rk2818_spim.c index 2136feca7994..543262ae0098 100755 --- a/drivers/spi/rk2818_spim.c +++ b/drivers/spi/rk2818_spim.c @@ -1451,13 +1451,17 @@ static int rk2818_spim_suspend(struct platform_device *pdev, pm_message_t mesg) { struct spi_master *master = platform_get_drvdata(pdev); struct rk2818_spi *dws = spi_master_get_devdata(master); + struct rk2818_spi_platform_data *pdata = pdev->dev.platform_data; int status; status = stop_queue(dws); if (status != 0) return status; clk_disable(dws->clock_spim); - + if (pdata && pdata->io_fix_leakage_bug) + { + pdata->io_fix_leakage_bug( ); + } return 0; } @@ -1465,6 +1469,7 @@ static int rk2818_spim_resume(struct platform_device *pdev) { struct spi_master *master = platform_get_drvdata(pdev); struct rk2818_spi *dws = spi_master_get_devdata(master); + struct rk2818_spi_platform_data *pdata = pdev->dev.platform_data; int ret; clk_enable(dws->clock_spim); @@ -1472,6 +1477,10 @@ static int rk2818_spim_resume(struct platform_device *pdev) ret = start_queue(dws); if (ret) dev_err(&dws->master->dev, "fail to start queue (%d)\n", ret); + if (pdata && pdata->io_resume_leakage_bug) + { + pdata->io_resume_leakage_bug( ); + } return ret; } -- 2.34.1