From 620fa29aaa5cbdf9b3c90ac70b8d2dfde7c0acc0 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 31 May 2011 09:43:27 +0800 Subject: [PATCH] lyx add switch between spim and gpio to fix spi data error when suspend or resume --- arch/arm/configs/rk29_a22_defconfig | 1 + arch/arm/configs/rk29_phonesdk_defconfig | 1 + drivers/spi/Kconfig | 8 ++++- drivers/spi/rk29_spim.c | 31 ++++++++++++++++++- .../video/display/screen/lcd_ili9803_cpt4_3.c | 6 +++- .../video/display/screen/lcd_ls035y8dx02a.c | 7 +++-- drivers/video/display/screen/lcd_nt35510.c | 9 ++++-- 7 files changed, 56 insertions(+), 7 deletions(-) mode change 100755 => 100644 arch/arm/configs/rk29_phonesdk_defconfig mode change 100644 => 100755 drivers/video/display/screen/lcd_ls035y8dx02a.c diff --git a/arch/arm/configs/rk29_a22_defconfig b/arch/arm/configs/rk29_a22_defconfig index 68936ecc787e..bf46a3290e3a 100644 --- a/arch/arm/configs/rk29_a22_defconfig +++ b/arch/arm/configs/rk29_a22_defconfig @@ -970,6 +970,7 @@ CONFIG_SPI_MASTER=y CONFIG_SPIM_RK29=y CONFIG_SPIM0_RK29=y CONFIG_SPIM1_RK29=y +CONFIG_LCD_USE_SPIM_CONTROL=y # # SPI Protocol Masters diff --git a/arch/arm/configs/rk29_phonesdk_defconfig b/arch/arm/configs/rk29_phonesdk_defconfig old mode 100755 new mode 100644 index 5801d6946265..6d6337bd0820 --- a/arch/arm/configs/rk29_phonesdk_defconfig +++ b/arch/arm/configs/rk29_phonesdk_defconfig @@ -982,6 +982,7 @@ CONFIG_SPI_MASTER=y CONFIG_SPIM_RK29=y CONFIG_SPIM0_RK29=y CONFIG_SPIM1_RK29=y +CONFIG_LCD_USE_SPIM_CONTROL=y # # SPI Protocol Masters diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index a5375907655c..d3dffa7d16dd 100755 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -270,7 +270,13 @@ config SPIM1_RK29 bool "RK29 SPI1 master controller" depends on SPIM_RK29 help - enable SPI1 master controller for RK29 + enable SPI1 master controller for RK29 + +config LCD_USE_SPIM_CONTROL + bool "switch gpio to spim with spin lock" + depends on SPIM_RK29 + help + switch gpio that used for lcd to spim with spin lock. # # There are lots of SPI device types, with sensors and memory diff --git a/drivers/spi/rk29_spim.c b/drivers/spi/rk29_spim.c index 874dffb15d02..7438d6193b84 100755 --- a/drivers/spi/rk29_spim.c +++ b/drivers/spi/rk29_spim.c @@ -21,9 +21,10 @@ #include #include #include +#include #include #include - +#include #include "rk29_spim.h" #include #include @@ -88,6 +89,34 @@ struct chip_data { #define RXBUSY (1<<2) #define TXBUSY (1<<3) +// +#ifdef CONFIG_LCD_USE_SPIM_CONTROL +void rk29_lcd_spim_spin_lock(void) +{ + disable_irq(IRQ_SPI0); + disable_irq(IRQ_SPI1); + preempt_disable(); +} + +void rk29_lcd_spim_spin_unlock(void) +{ + enable_irq(IRQ_SPI0); + enable_irq(IRQ_SPI1); + preempt_enable(); +} +#else +void rk29_lcd_spim_spin_lock(void) +{ + return; +} + +void rk29_lcd_spim_spin_unlock(void) +{ + return; +} +#endif + + static void spi_dump_regs(struct rk29xx_spi *dws) { DBG("MRST SPI0 registers:\n"); DBG("=================================\n"); diff --git a/drivers/video/display/screen/lcd_ili9803_cpt4_3.c b/drivers/video/display/screen/lcd_ili9803_cpt4_3.c index 7b281a318af0..aba60562dbc3 100755 --- a/drivers/video/display/screen/lcd_ili9803_cpt4_3.c +++ b/drivers/video/display/screen/lcd_ili9803_cpt4_3.c @@ -308,9 +308,12 @@ int lcd_init(void) return 0; } +extern void rk29_lcd_spim_spin_lock(void); +extern void rk29_lcd_spim_spin_unlock(void); int lcd_standby(u8 enable) { - if(gLcd_info) + rk29_lcd_spim_spin_lock(); + if(gLcd_info) gLcd_info->io_init(); if(enable) { @@ -325,6 +328,7 @@ int lcd_standby(u8 enable) if(gLcd_info) gLcd_info->io_deinit(); + rk29_lcd_spim_spin_unlock(); return 0; } diff --git a/drivers/video/display/screen/lcd_ls035y8dx02a.c b/drivers/video/display/screen/lcd_ls035y8dx02a.c old mode 100644 new mode 100755 index 0116fb2ef47a..4c7c16f656f0 --- a/drivers/video/display/screen/lcd_ls035y8dx02a.c +++ b/drivers/video/display/screen/lcd_ls035y8dx02a.c @@ -319,10 +319,12 @@ int lcd_init(void) return 0; } +extern void rk29_lcd_spim_spin_lock(void); +extern void rk29_lcd_spim_spin_unlock(void); int lcd_standby(u8 enable) //***enable =1 means suspend, 0 means resume { - - if(gLcd_info) + rk29_lcd_spim_spin_lock(); + if(gLcd_info) gLcd_info->io_init(); printk("lcd standby\n"); if(enable) { @@ -339,6 +341,7 @@ int lcd_standby(u8 enable) //***enable =1 means suspend, 0 means resume if(gLcd_info) gLcd_info->io_deinit(); + rk29_lcd_spim_spin_unlock(); return 0; } diff --git a/drivers/video/display/screen/lcd_nt35510.c b/drivers/video/display/screen/lcd_nt35510.c index c905911e7200..c116afd045ca 100755 --- a/drivers/video/display/screen/lcd_nt35510.c +++ b/drivers/video/display/screen/lcd_nt35510.c @@ -31,6 +31,7 @@ #define SWAP_RB 0 static struct rk29lcd_info *gLcd_info = NULL; + int init(void); int standby(u8 enable); @@ -1571,10 +1572,12 @@ int init(void) return 0; } - +extern void rk29_lcd_spim_spin_lock(void); +extern void rk29_lcd_spim_spin_unlock(void); int standby(u8 enable) //***enable =1 means suspend, 0 means resume { - if(gLcd_info) + rk29_lcd_spim_spin_lock(); + if(gLcd_info) gLcd_info->io_init(); if(enable) { @@ -1594,6 +1597,8 @@ int standby(u8 enable) //***enable =1 means suspend, 0 means resume if(gLcd_info) gLcd_info->io_deinit(); + rk29_lcd_spim_spin_unlock(); + return 0; } -- 2.34.1