lyx add switch between spim and gpio to fix spi data error when suspend or resume
authorroot <root@lw.(none)>
Tue, 31 May 2011 01:43:27 +0000 (09:43 +0800)
committerroot <root@lw.(none)>
Tue, 31 May 2011 01:43:27 +0000 (09:43 +0800)
arch/arm/configs/rk29_a22_defconfig
arch/arm/configs/rk29_phonesdk_defconfig [changed mode: 0755->0644]
drivers/spi/Kconfig
drivers/spi/rk29_spim.c
drivers/video/display/screen/lcd_ili9803_cpt4_3.c
drivers/video/display/screen/lcd_ls035y8dx02a.c [changed mode: 0644->0755]
drivers/video/display/screen/lcd_nt35510.c

index 68936ecc787ecad13698c54629133669dc8d6ac0..bf46a3290e3ac0322537f3ae3ffe80cf3ce2a920 100644 (file)
@@ -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
old mode 100755 (executable)
new mode 100644 (file)
index 5801d69..6d6337b
@@ -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
index a5375907655cf488284c2390be2f64d66bcbc9d7..d3dffa7d16dd031c2cb50279843e33673273ea0a 100755 (executable)
@@ -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
index 874dffb15d02a4e7b5f578a6ff0b77e075e65b84..7438d6193b844a2040f95a44de0766c7c924e41d 100755 (executable)
 #include <linux/clk.h>\r
 #include <linux/cpufreq.h>\r
 #include <mach/gpio.h>\r
+#include <mach/irqs.h>\r
 #include <linux/dma-mapping.h>\r
 #include <asm/dma.h>\r
-\r
+#include <linux/preempt.h>\r
 #include "rk29_spim.h"\r
 #include <linux/spi/spi.h>\r
 #include <mach/board.h>\r
@@ -88,6 +89,34 @@ struct chip_data {
 #define RXBUSY    (1<<2)\r
 #define TXBUSY    (1<<3)\r
 \r
+//\r
+#ifdef CONFIG_LCD_USE_SPIM_CONTROL\r
+void rk29_lcd_spim_spin_lock(void)\r
+{\r
+       disable_irq(IRQ_SPI0);\r
+       disable_irq(IRQ_SPI1);\r
+       preempt_disable();\r
+}\r
+\r
+void rk29_lcd_spim_spin_unlock(void)\r
+{\r
+       enable_irq(IRQ_SPI0);\r
+       enable_irq(IRQ_SPI1);\r
+       preempt_enable();\r
+}\r
+#else\r
+void rk29_lcd_spim_spin_lock(void)\r
+{\r
+     return;\r
+}\r
+\r
+void rk29_lcd_spim_spin_unlock(void)\r
+{\r
+     return;\r
+}\r
+#endif\r
+\r
+\r
 static void spi_dump_regs(struct rk29xx_spi *dws) {\r
        DBG("MRST SPI0 registers:\n");\r
        DBG("=================================\n");\r
index 7b281a318af0001805501e9d177f04977aa19886..aba60562dbc34ab803e42fad442535284d29ff50 100755 (executable)
@@ -308,9 +308,12 @@ int lcd_init(void)
     return 0;\r
 }\r
 \r
+extern void rk29_lcd_spim_spin_lock(void);\r
+extern void rk29_lcd_spim_spin_unlock(void);\r
 int lcd_standby(u8 enable)\r
 {\r
-    if(gLcd_info)\r
+       rk29_lcd_spim_spin_lock();\r
+       if(gLcd_info)\r
         gLcd_info->io_init();\r
 \r
        if(enable) {\r
@@ -325,6 +328,7 @@ int lcd_standby(u8 enable)
 \r
     if(gLcd_info)\r
         gLcd_info->io_deinit();\r
+       rk29_lcd_spim_spin_unlock();\r
 \r
     return 0;\r
 }\r
old mode 100644 (file)
new mode 100755 (executable)
index 0116fb2..4c7c16f
@@ -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;
 }
 
index c905911e7200723c6e4efea3991beb1f66f0e324..c116afd045ca52246fbf226bbe256dc5bd016130 100755 (executable)
@@ -31,6 +31,7 @@
 #define SWAP_RB                        0\r
 \r
 static struct rk29lcd_info *gLcd_info = NULL;\r
+\r
 int init(void);\r
 int standby(u8 enable);\r
 \r
@@ -1571,10 +1572,12 @@ int init(void)
 \r
     return 0;\r
 }\r
-\r
+extern void rk29_lcd_spim_spin_lock(void);\r
+extern void rk29_lcd_spim_spin_unlock(void);\r
 int standby(u8 enable) //***enable =1 means suspend, 0 means resume \r
 {\r
-    if(gLcd_info)\r
+       rk29_lcd_spim_spin_lock();\r
+       if(gLcd_info)\r
         gLcd_info->io_init();\r
 \r
        if(enable) {\r
@@ -1594,6 +1597,8 @@ int standby(u8 enable)    //***enable =1 means suspend, 0 means resume
     if(gLcd_info)\r
         gLcd_info->io_deinit();\r
 \r
+       rk29_lcd_spim_spin_unlock();\r
+\r
     return 0;\r
 }\r
 \r