add cmmb and commit code adapting raho board
authorroot <root@nzy.(none)>
Fri, 3 Sep 2010 14:16:14 +0000 (22:16 +0800)
committerroot <root@nzy.(none)>
Fri, 3 Sep 2010 14:16:14 +0000 (22:16 +0800)
13 files changed:
arch/arm/mach-rk2818/board-raho.c
drivers/cmmb/cmmb_memory.c
drivers/cmmb/siano/smscoreapi.c
drivers/cmmb/siano/smsspiphy_rk.c
drivers/fpga/spi_fpga_init.c
drivers/input/gsensor/mma7660.c
drivers/input/misc/capella_cm3602.c
drivers/input/touchscreen/ctp_it7250.c
drivers/input/touchscreen/xpt2046_ts_320X480.c
drivers/regulator/rk2818_lp8725.c
drivers/rtc/alarm.c [changed mode: 0644->0755]
drivers/rtc/rtc-s35392a.c
drivers/rtc/rtc-s35392a.h

index 146c15c7d5c07a7054f9d23c4710aecc34679c20..197e5c84b6e2ecd3977437f70e0c3631884a16c9 100644 (file)
@@ -768,6 +768,7 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = {
                .type                   = "rtc-s35392a",
                .addr           = 0x30,
                .flags                  = 0,
+               .irq            = RK2818_PIN_PE2,
        },
 #endif
 #if defined (CONFIG_FM_QN8006)
@@ -824,9 +825,8 @@ static struct i2c_board_info __initdata board_i2c3_devices[] = {
  * camera  devices
  * author: ddl@rock-chips.com
  *****************************************************************************************/ 
-#ifdef CONFIG_VIDEO_RK2818
 #define RK2818_CAM_POWER_PIN    FPGA_PIO1_05//SPI_GPIO_P1_05
-#define RK2818_CAM_RESET_PIN    FPGA_PIO1_14//SPI_GPIO_P1_14
+#define RK2818_CAM_RESET_PIN    FPGA_PIO1_14//SPI_GPIO_P1_14    
 
 static int rk28_sensor_io_init(void);
 static int rk28_sensor_io_deinit(void);
@@ -838,7 +838,6 @@ struct rk28camera_platform_data rk28_camera_platform_data = {
         {
             .gpio_reset = RK2818_CAM_RESET_PIN,
             .gpio_power = RK2818_CAM_POWER_PIN,
-            .gpio_flag = (RK28_CAM_POWERACTIVE_L|RK28_CAM_RESETACTIVE_L),
             .dev_name = "ov2655"
         }, {
             .gpio_reset = INVALID_GPIO,
@@ -852,42 +851,36 @@ static int rk28_sensor_io_init(void)
 {
     int ret = 0, i;
     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
-       unsigned int camera_ioflag;
-
-    //printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__);
 
-    for (i=0; i<2; i++) {
+    printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__);
+    
+    for (i=0; i<2; i++) { 
         camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
-        camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
-               camera_ioflag = rk28_camera_platform_data.gpio_res[i].gpio_flag;
-
-        if (camera_power != INVALID_GPIO) {
+        camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; 
+        
+        if (camera_power != INVALID_GPIO) {            
             ret = gpio_request(camera_power, "camera power");
             if (ret)
                 continue;
-
-            gpio_set_value(camera_reset, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-            gpio_direction_output(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-
-                       //printk("\n%s....%d  %x   ******** ddl *********\n",__FUNCTION__,__LINE__,(((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
+                
+            gpio_set_value(camera_reset, 1);
+            gpio_direction_output(camera_power, 0);   
         }
-
+        
         if (camera_reset != INVALID_GPIO) {
             ret = gpio_request(camera_reset, "camera reset");
             if (ret) {
-                if (camera_power != INVALID_GPIO)
-                    gpio_free(camera_power);
+                if (camera_power != INVALID_GPIO) 
+                    gpio_free(camera_power);    
 
                 continue;
             }
 
-            gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
-            gpio_direction_output(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
-
-                       //printk("\n%s....%d  %x   ******** ddl *********\n",__FUNCTION__,__LINE__,((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
+            gpio_set_value(camera_reset, 0);
+            gpio_direction_output(camera_reset, 0);            
         }
     }
-
+    
     return 0;
 }
 
@@ -896,20 +889,20 @@ static int rk28_sensor_io_deinit(void)
     unsigned int i;
     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
 
-    //printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__);
-
-    for (i=0; i<2; i++) {
+    printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__); 
+   
+    for (i=0; i<2; i++) { 
         camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
-        camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
-
+        camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; 
+        
         if (camera_power != INVALID_GPIO){
             gpio_direction_input(camera_power);
-            gpio_free(camera_power);
+            gpio_free(camera_power);    
         }
-
+        
         if (camera_reset != INVALID_GPIO)  {
             gpio_direction_input(camera_reset);
-            gpio_free(camera_reset);
+            gpio_free(camera_reset);    
         }
     }
 
@@ -920,37 +913,28 @@ static int rk28_sensor_io_deinit(void)
 static int rk28_sensor_power(struct device *dev, int on)
 {
     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
-       unsigned int camera_ioflag;
-
+    
     if(rk28_camera_platform_data.gpio_res[0].dev_name &&  (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {
         camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset;
         camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power;
-               camera_ioflag = rk28_camera_platform_data.gpio_res[0].gpio_flag;
     } else if (rk28_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) {
         camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset;
         camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power;
-               camera_ioflag = rk28_camera_platform_data.gpio_res[1].gpio_flag;
     }
 
     if (camera_reset != INVALID_GPIO) {
-        gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
-        //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
+        gpio_set_value(camera_reset, !on);
+        //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on);
     }
-    if (camera_power != INVALID_GPIO)  {
-               if (on) {
-               gpio_set_value(camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-                       //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-               } else {
-                       gpio_set_value(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-                       //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
-               }
-
+    if (camera_power != INVALID_GPIO)  {       
+        gpio_set_value(camera_power, !on);
+        printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on);
     }
     if (camera_reset != INVALID_GPIO) {
         msleep(3);          /* delay 3 ms */
-        gpio_set_value(camera_reset,(((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
-        //printk("\n%s..%s..ResetPin= %d..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, (((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
-    }
+        gpio_set_value(camera_reset,on);
+        printk("\n%s..%s..ResetPin= %d..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on);
+    }      
     return 0;
 }
 
@@ -973,7 +957,6 @@ struct soc_camera_link rk2818_iclink = {
        .module_name    = "ov2655",
 #endif 
 };
-#endif
 
 /*****************************************************************************************
  * battery  devices
@@ -1612,25 +1595,33 @@ struct platform_device rk28_device_headset = {
 #endif
 
 #ifdef CONFIG_INPUT_LPSENSOR_CM3602 
+static int capella_cm3602_power(int on);
+
+static struct capella_cm3602_platform_data capella_cm3602_pdata = {    
+       .power = capella_cm3602_power,
+       .irq_pin = FPGA_PIO0_04,
+       .pwd_out_pin = FPGA_PIO4_07,
+       .ps_shutdown_pin = FPGA_PIO5_00,
+       //.p_out = MAHIMAHI_GPIO_PROXIMITY_INT_N
+       };
+
 static int capella_cm3602_power(int on)
 {      /* TODO eolsen Add Voltage reg control */       
     if (on) {          
-    //         gpio_direction_output(MAHIMAHI_GPIO_PROXIMITY_EN, 0);
+        printk("[%s]:on---\n",__FUNCTION__);
+        gpio_direction_output(capella_cm3602_pdata.pwd_out_pin, SPI_GPIO_OUT);
+        gpio_set_value(capella_cm3602_pdata.pwd_out_pin, SPI_GPIO_LOW);     //CM3605_PWD output
+        gpio_direction_output(capella_cm3602_pdata.ps_shutdown_pin, SPI_GPIO_OUT);
+        gpio_set_value(capella_cm3602_pdata.ps_shutdown_pin, SPI_GPIO_LOW);     //CM3605_PS_SHUTDOWN
     }
-    else {             
-    //         gpio_direction_output(MAHIMAHI_GPIO_PROXIMITY_EN, 1);
+    else {
+           printk("[%s]:off---\n",__FUNCTION__);
+       gpio_set_value(capella_cm3602_pdata.pwd_out_pin, SPI_GPIO_HIGH);
+           gpio_set_value(capella_cm3602_pdata.ps_shutdown_pin, SPI_GPIO_HIGH);
     }  
     return 0;
 }
 
-static struct capella_cm3602_platform_data capella_cm3602_pdata = {    
-       .power = capella_cm3602_power,
-       .irq_pin = SPI_GPIO_P6_04,
-       .pwd_out_pin = SPI_GPIO_P4_07,
-       .ps_shutdown_pin = SPI_GPIO_P4_08,
-       //.p_out = MAHIMAHI_GPIO_PROXIMITY_INT_N
-       };
-
 struct platform_device rk2818_device_cm3605 = {        
            .name = CAPELLA_CM3602,
                .id = -1,
index f476877b877e0703d7705fa1d96de7964b2de638..8d77d2cc7d306dbaa7380ca02648dd209c58b122 100755 (executable)
@@ -398,7 +398,7 @@ static long cmmbmemo_ioctl(struct file *file, unsigned int cmd, unsigned long ar
         break;\r
         \r
         case CMMB_GET_AUDIO_TYPE:{\r
-            return cmmbmemo->videotype;\r
+            return cmmbmemo->audiotype;\r
         }\r
         break;\r
         \r
index 150cbc34bb7d1514a2adf9614adaa3f34e99f101..c26043c67cbbfd90b9e342a8ef9f99a88d9a1b03 100755 (executable)
@@ -50,8 +50,8 @@
 #endif
 
 // to enable log
-int sms_debug =7;
-//int sms_debug =0;   //hzb 0526
+//int sms_debug =7;
+int sms_debug =0;   //hzb 0526
 // for loopback
 char g_LbResBuf[256]={0};
 //
@@ -1173,8 +1173,8 @@ void smscore_onresponse(struct smscore_device_t *coredev,
                //sms_debug("client=0x %x\n", client);
                rc = client->onresponse_handler(client->context, cb);
        }       
-       sms_debug("onresponse_handler ret = 0x%x\n", rc);
-        sms_debug("phdr->msgType %d\n", phdr->msgType);
+       //sms_debug("onresponse_handler ret = 0x%x\n", rc);
+      //  sms_debug("phdr->msgType %d\n", phdr->msgType);
 
 
 
index b61128a2c718cf737ecdd425d2c1d19b34bdef11..15b20d8694f801857d0328ca890714aca7b41463 100755 (executable)
@@ -40,7 +40,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <mach/gpio.h>
 #include "smscoreapi.h"
 
-
+#include <mach/iomux.h>
 
 
 #define SSP_PORT 1
@@ -305,7 +305,7 @@ static irqreturn_t spibus_interrupt(int irq, void *context)
        u_irq_count ++;
     
 //     PDEBUG("INT counter = %d\n", u_irq_count);
-       printk("cmmb siano 1186 int\n");
+       //printk("cmmb siano 1186 int\n");
         sms_info("spibus_interrupt %d\n", u_irq_count);
     
        if (spiphy_dev->interruptHandler)
@@ -356,7 +356,7 @@ void smsspibus_xfer(void *context, unsigned char *txbuf,
 
     if(txbuf)
     {
-       sms_debug("tx_buf:%x,%x,%x,%x,%x,%x", txbuf[0], txbuf[1], txbuf[2], txbuf[3], txbuf[4],txbuf[5]);
+    //   sms_debug("tx_buf:%x,%x,%x,%x,%x,%x", txbuf[0], txbuf[1], txbuf[2], txbuf[3], txbuf[4],txbuf[5]);
 
        ret = spi_write(spiphy_dev->Smsdevice, txbuf, len);
 
@@ -370,7 +370,7 @@ void smsspibus_xfer(void *context, unsigned char *txbuf,
     if ((rxbuf)&&(len != 16))
         ret = spi_read(spiphy_dev->Smsdevice, rxbuf, len);
     
-      sms_debug("rxbuf 4, 5,6,7,8,9=%x,%x,%x,%x,%x,%x\n",rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],rxbuf[8],rxbuf[9]);
+   //   sms_debug("rxbuf 4, 5,6,7,8,9=%x,%x,%x,%x,%x,%x\n",rxbuf[4],rxbuf[5],rxbuf[6],rxbuf[7],rxbuf[8],rxbuf[9]);
       //sms_debug("sms spi read buf=0x%x\n",rxbuf[5]);
 
 }
@@ -398,7 +398,8 @@ void smsspibus_ssp_suspend(void* context )
     //ssp_disable(&(spiphy_dev->sspdev));
     //ssp_exit(&spiphy_dev->sspdev);
     free_irq(gpio_to_irq(CMMB_1186_SPIIRQ), spiphy_dev);
-
+//zyc
+       gpio_direction_output(CMMB_1186_SPIIRQ,0);
     /*  release DMA resources */
     //if (spiphy_dev->rx_dma_channel >= 0)
        //pxa_free_dma(spiphy_dev->rx_dma_channel);
@@ -429,7 +430,8 @@ static void chip_poweron()
 #endif
 
 //1186 cmmb power on
-
+//set the SPI CS mode , zyc
+       //rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,1);
 
        gpio_direction_output(CMMB_1186_POWER_RESET,0);
        gpio_direction_output(CMMB_1186_POWER_DOWN,0);
@@ -471,6 +473,10 @@ static void chip_powerdown()
 //1186 cmmb power down
 #if 1
        gpio_direction_output(CMMB_1186_POWER_ENABLE,0);
+//set the CS0 as gpio mode 
+
+//     rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,0);
+//     gpio_direction_output(GPIOB4_SPI0CS0_MMC0D4_NAME,0);
 
        printk("cmmb chip_powerdown !!!!\n");
 
@@ -494,7 +500,10 @@ int smsspibus_ssp_resume(void* context)
     chip_poweron();
     free_irq(gpio_to_irq(CMMB_1186_SPIIRQ), spiphy_dev);
     //printk("siano 1186 request irq\n");
-    gpio_pull_updown(CMMB_1186_SPIIRQ,GPIOPullDown);
+// spiirqgpio low , PULLUP , zyc
+       gpio_direction_output(CMMB_1186_SPIIRQ,0);
+   gpio_pull_updown(CMMB_1186_SPIIRQ,GPIOPullUp);
+
     //ret = request_gpio_irq(CMMB_1186_SPIIRQ, (pFunc)spibus_interrupt, GPIOEdgelRising, spiphy_dev);       
     request_irq(gpio_to_irq(CMMB_1186_SPIIRQ),spibus_interrupt,IRQF_TRIGGER_RISING,NULL,spiphy_dev);
     if(ret<0){
@@ -534,6 +543,8 @@ void *smsspiphy_init(void *context, void (*smsspi_interruptHandler)(void *),void
         spiphy_dev->Smsdevice = (struct spi_device*)context;
     
     //gpio_pull_updown(CMMB_1186_SPIIRQ, IRQT_FALLING);
+//set IRO GPIO as gpio mode ,zyc 
+       //rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME,0);
        error = gpio_request(CMMB_1186_SPIIRQ,"cmmb irq");
        if (error) {
                //dev_err(&pdev->dev, "failed to request play key gpio\n");
@@ -551,7 +562,11 @@ void *smsspiphy_init(void *context, void (*smsspi_interruptHandler)(void *),void
 #endif
 
     //ret = request_gpio_irq(CMMB_1186_SPIIRQ, spibus_interrupt, GPIOEdgelRising, spiphy_dev);//
+
+//zyc
+    gpio_direction_output(CMMB_1186_SPIIRQ,0);
     gpio_pull_updown(CMMB_1186_SPIIRQ,GPIOPullUp);
+
     //ret = request_gpio_irq(CMMB_1186_SPIIRQ, (pFunc)spibus_interrupt, GPIOEdgelRising, spiphy_dev);       
     request_irq(gpio_to_irq(CMMB_1186_SPIIRQ),spibus_interrupt,IRQF_TRIGGER_RISING,NULL,spiphy_dev);
 
index 71bc6c7fae7d92ba134fc16ecae6195843cbebbc..56cb280fc2df75bf09edf31cd7ee0d90d5a69fab 100755 (executable)
@@ -543,7 +543,7 @@ static int __devinit spi_fpga_probe(struct spi_device * spi)
        INIT_LIST_HEAD(&port->trans_queue);\r
 #endif\r
 \r
-       spi_fpga_rst();\r
+       //spi_fpga_rst();\r
        sprintf(b, "fpga_irq_workqueue");\r
        port->fpga_irq_workqueue = create_freezeable_workqueue(b);\r
        if (!port->fpga_irq_workqueue) {\r
index d475f4023be69ab4f240ecf2b850b1318422f2be..eb2cfb00db3ee1e5b86ed116d054de37114900b6 100755 (executable)
@@ -43,11 +43,12 @@ static int  mma7660_probe(struct i2c_client *client, const struct i2c_device_id
 #define MMA7660_SPEED          200 * 1000
 
 /* Addresses to scan -- protected by sense_data_mutex */
-static char sense_data[RBUFF_SIZE + 1];
+//static char sense_data[RBUFF_SIZE + 1];
 static struct i2c_client *this_client;
+static struct miscdevice mma7660_device;
 
 static DECLARE_WAIT_QUEUE_HEAD(data_ready_wq);
-static atomic_t data_ready;
+
 #ifdef CONFIG_ANDROID_POWER
 static android_early_suspend_t mma7660_early_suspend;
 #endif
@@ -96,23 +97,23 @@ err:
        return ret ;
 }
 
-static int mma7660_rx_data(char *rxData, int length)
+static int mma7660_rx_data(struct i2c_client *client, char *rxData, int length)
 {
        int ret = 0;
        char reg = rxData[0];
-       ret = i2c_master_reg8_recv(this_client, reg, rxData, length, MMA7660_SPEED);
+       ret = i2c_master_reg8_recv(client, reg, rxData, length, MMA7660_SPEED);
        return (ret > 0)? 0 : ret;
 }
 
-static int mma7660_tx_data(char *txData, int length)
+static int mma7660_tx_data(struct i2c_client *client, char *txData, int length)
 {
        int ret = 0;
        char reg = txData[0];
-       ret = i2c_master_reg8_send(this_client, reg, &txData[1], length-1, MMA7660_SPEED);
+       ret = i2c_master_reg8_send(client, reg, &txData[1], length-1, MMA7660_SPEED);
        return (ret > 0)? 0 : ret;
 }
 
-static int mma7660_set_rate(char rate)
+static int mma7660_set_rate(struct i2c_client *client, char rate)
 {
        char buffer[2];
        int ret = 0;
@@ -129,71 +130,75 @@ static int mma7660_set_rate(char rate)
        buffer[0] = MMA7660_REG_SR;
        buffer[1] = 0xf8 | (0x07 & (~i));
 
-       ret = mma7660_tx_data(&(buffer[0]), 2);
-       ret = mma7660_rx_data(&(buffer[0]), 1);
+       ret = mma7660_tx_data(client, &(buffer[0]), 2);
+       ret = mma7660_rx_data(client, &(buffer[0]), 1);
 
        return ret;
 }
 
-static int mma7660_start_dev(char rate)
+static int mma7660_start_dev(struct i2c_client *client, char rate)
 {
        char buffer[MMA7660_REG_LEN];
        int ret = 0;
 
        buffer[0] = MMA7660_REG_INTSU;
        buffer[1] = 0x10;       //0x10; modify by zhao
-       ret = mma7660_tx_data(&buffer[0], 2);
-       ret = mma7660_rx_data(&buffer[0], 1);
+       ret = mma7660_tx_data(client, &buffer[0], 2);
+       ret = mma7660_rx_data(client, &buffer[0], 1);
 
-       ret = mma7660_set_rate(rate);
+       ret = mma7660_set_rate(client, rate);
 
        buffer[0] = MMA7660_REG_MODE;
-       buffer[1] = 0x81;
-       ret = mma7660_tx_data(&buffer[0], 2);
-       ret = mma7660_rx_data(&buffer[0], 1);
+       buffer[1] = 0x01;
+       ret = mma7660_tx_data(client, &buffer[0], 2);
+       ret = mma7660_rx_data(client, &buffer[0], 1);
 
-       enable_irq(this_client->irq);
+       enable_irq(client->irq);
        rk28printk("\n----------------------------mma7660_start------------------------\n");
        
        return ret;
 }
 
-static int mma7660_start(char rate)
+static int mma7660_start(struct i2c_client *client, char rate)
 { 
-    struct mma7660_data *mma = (struct mma7660_data *)i2c_get_clientdata(this_client);
+    struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
     
-    if (mma->status == MMA7660_OPEN) {
+    if (mma7660->status == MMA7660_OPEN) {
         return 0;      
     }
-    mma->status = MMA7660_OPEN;
-    return mma7660_start_dev(rate);
+    mma7660->status = MMA7660_OPEN;
+    return mma7660_start_dev(client, rate);
 }
 
-static int mma7660_close_dev(void)
+static int mma7660_close_dev(struct i2c_client *client)
 {      
        char buffer[2];
-               
+
+       disable_irq_nosync(client->irq);
+
        buffer[0] = MMA7660_REG_MODE;
        buffer[1] = 0x00;
        
-       return mma7660_tx_data(buffer, 2);
+       return mma7660_tx_data(client, buffer, 2);
 }
 
-static int mma7660_close(void)
+static int mma7660_close(struct i2c_client *client)
 {
-    struct mma7660_data *mma = (struct mma7660_data *)i2c_get_clientdata(this_client);
+    struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
     
-    mma->status = MMA7660_CLOSE;
+    mma7660->status = MMA7660_CLOSE;
     
-    return mma7660_close_dev();
+    return mma7660_close_dev(client);
 }
 
-static int mma7660_reset_rate(char rate)
+static int mma7660_reset_rate(struct i2c_client *client, char rate)
 {
        int ret = 0;
        
-    ret = mma7660_close_dev();
-    ret = mma7660_start_dev(rate);
+       rk28printk("\n----------------------------mma7660_reset_rate------------------------\n");
+       
+    ret = mma7660_close_dev(client);
+    ret = mma7660_start_dev(client, rate);
     
        return ret ;
 }
@@ -211,37 +216,32 @@ static inline int mma7660_convert_to_int(char value)
     return result;
 }
 
-static void mma7660_report_value(short *rbuf)
+static void mma7660_report_value(struct i2c_client *client, struct mma7660_axis *axis)
 {
-       struct mma7660_data *data = i2c_get_clientdata(this_client);
-    struct mma7660_axis *axis = (struct mma7660_axis *)rbuf;
+       struct mma7660_data *mma7660 = i2c_get_clientdata(client);
+    //struct mma7660_axis *axis = (struct mma7660_axis *)rbuf;
 
        /* Report acceleration sensor information */
-    input_report_abs(data->input_dev, ABS_X, axis->x);
-    input_report_abs(data->input_dev, ABS_Y, axis->y);
-    input_report_abs(data->input_dev, ABS_Z, axis->z);
-    input_sync(data->input_dev);
+    input_report_abs(mma7660->input_dev, ABS_X, axis->x);
+    input_report_abs(mma7660->input_dev, ABS_Y, axis->y);
+    input_report_abs(mma7660->input_dev, ABS_Z, axis->z);
+    input_sync(mma7660->input_dev);
     rk28printk("Gsensor x==%d  y==%d z==%d\n",axis->x,axis->y,axis->z);
 }
 
-static int mma7660_get_data(void)
+static int mma7660_get_data(struct i2c_client *client)
 {
        char buffer[3];
        int ret;
     struct mma7660_axis axis;
 
-       memset(buffer, 0, 3);
-       buffer[0] = MMA7660_REG_X_OUT;
-    ret = mma7660_rx_data(&buffer[0], 3);
-       //while(mma7660_rx_data(&buffer[0], 3));
-       /*
-    if (!ret) {
-        rk28printk( "%s: -------------------------------------------gsensor device register = [0]:%d  [1]:%d  [2]:%d  [3]:0x%x  [4]:0x%x  [5]:0x%x  [6]:0x%x  [7]:0x%x-----------------------------------------------\n",
-               __func__, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]); 
-    } 
-    */
-       if (ret < 0)
-               return ret;
+    do {
+        memset(buffer, 0, 3);
+        buffer[0] = MMA7660_REG_X_OUT;
+        ret = mma7660_rx_data(client, &buffer[0], 3);
+        if (ret < 0)
+            return ret;
+    } while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40));
 
        axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
        axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
@@ -250,14 +250,15 @@ static int mma7660_get_data(void)
     //rk28printk( "%s: ------------------mma7660_GetData axis = %d  %d  %d--------------\n",
     //       __func__, axis.x, axis.y, axis.z); 
      
-    memcpy(sense_data, &axis, sizeof(axis));
-    mma7660_report_value(sense_data);
+    //memcpy(sense_data, &axis, sizeof(axis));
+    mma7660_report_value(client, &axis);
        //atomic_set(&data_ready, 0);
        //wake_up(&data_ready_wq);
 
        return 0;
 }
 
+/*
 static int mma7660_trans_buff(char *rbuf, int size)
 {
        //wait_event_interruptible_timeout(data_ready_wq,
@@ -270,10 +271,10 @@ static int mma7660_trans_buff(char *rbuf, int size)
 
        return 0;
 }
+*/
 
 static int mma7660_open(struct inode *inode, struct file *file)
 {
-       rk28printk("----------------------------mma7660_open------------------------\n");
        return 0;//nonseekable_open(inode, file);
 }
 
@@ -290,8 +291,7 @@ static int mma7660_ioctl(struct inode *inode, struct file *file, unsigned int cm
        char msg[RBUFF_SIZE + 1];
        int ret = -1;
        char rate;
-
-       rk28printk("----------------------------mma7660_ioctl------------------------cmd: %d\n", cmd);
+       struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);
 
        switch (cmd) {
        case ECS_IOCTL_APP_SET_RATE:
@@ -304,25 +304,27 @@ static int mma7660_ioctl(struct inode *inode, struct file *file, unsigned int cm
 
        switch (cmd) {
        case ECS_IOCTL_START:
-               ret = mma7660_start(MMA7660_RATE_32);
+               ret = mma7660_start(client, MMA7660_RATE_32);
                if (ret < 0)
                        return ret;
                break;
        case ECS_IOCTL_CLOSE:
-               ret = mma7660_close();
+               ret = mma7660_close(client);
                if (ret < 0)
                        return ret;
                break;
        case ECS_IOCTL_APP_SET_RATE:
-               ret = mma7660_reset_rate(rate);
+               ret = mma7660_reset_rate(client, rate);
                if (ret < 0)
                        return ret;
                break;
+    /*
        case ECS_IOCTL_GETDATA:
                ret = mma7660_trans_buff(msg, RBUFF_SIZE);
                if (ret < 0)
                        return ret;
                break;
+       */      
        default:
                return -ENOTTY;
        }
@@ -341,29 +343,33 @@ static int mma7660_ioctl(struct inode *inode, struct file *file, unsigned int cm
 
 static void mma7660_work_func(struct work_struct *work)
 {
-       if (mma7660_get_data() < 0) 
+       struct mma7660_data *mma7660 = container_of(work, struct mma7660_data, work);
+       struct i2c_client *client = mma7660->client;
+       
+       if (mma7660_get_data(client) < 0) 
                rk28printk(KERN_ERR "MMA7660 mma_work_func: Get data failed\n");
                
-       enable_irq(this_client->irq);           
-       rk28printk("---------------------------------------mma7660_work_func----------------------------------\n");
+       enable_irq(client->irq);                
 }
 
-static void  mma7660_delaywork_func(struct work_struct  *work)
+static void  mma7660_delaywork_func(struct work_struct *work)
 {
-       
-       if (mma7660_get_data() < 0) 
-               rk28printk(KERN_ERR "MMA7660 mma_work_func: Get data failed\n");
-       enable_irq(this_client->irq);           
-       //rk28printk("---------------------------------------mma7660_delaywork_func------------------------------\n");
+       struct delayed_work *delaywork = container_of(work, struct delayed_work, work);
+       struct mma7660_data *mma7660 = container_of(delaywork, struct mma7660_data, delaywork);
+       struct i2c_client *client = mma7660->client;
 
+       if (mma7660_get_data(client) < 0) 
+               rk28printk(KERN_ERR "MMA7660 mma_work_func: Get data failed\n");
+               
+       enable_irq(client->irq);                
 }
 
 static irqreturn_t mma7660_interrupt(int irq, void *dev_id)
 {
-       struct mma7660_data *data = dev_id;
-       disable_irq_nosync(this_client->irq);
-       schedule_delayed_work(&data->delaywork,msecs_to_jiffies(30));
-       //rk28printk("--------------------------------------mma7660_interrupt---------------------------------------\n");
+       struct mma7660_data *mma7660 = (struct mma7660_data *)dev_id;
+       
+       disable_irq_nosync(irq);
+       schedule_delayed_work(&mma7660->delaywork, msecs_to_jiffies(30));
        
        return IRQ_HANDLED;
 }
@@ -383,13 +389,13 @@ static struct miscdevice mma7660_device = {
 
 static int mma7660_remove(struct i2c_client *client)
 {
-       struct mma7660_data *mma = i2c_get_clientdata(client);
+       struct mma7660_data *mma7660 = i2c_get_clientdata(client);
        
     misc_deregister(&mma7660_device);
-    input_unregister_device(mma->input_dev);
-    input_free_device(mma->input_dev);
-    free_irq(client->irq, mma);
-    kfree(mma); 
+    input_unregister_device(mma7660->input_dev);
+    input_free_device(mma7660->input_dev);
+    free_irq(client->irq, mma7660);
+    kfree(mma7660); 
 #ifdef CONFIG_ANDROID_POWER
     android_unregister_early_suspend(&mma7660_early_suspend);
 #endif      
@@ -400,32 +406,30 @@ static int mma7660_remove(struct i2c_client *client)
 #ifdef CONFIG_ANDROID_POWER
 static int mma7660_suspend(android_early_suspend_t *h)
 {
+       struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);
        rk28printk("Gsensor mma7760 enter suspend\n");
-       return mma7660_close_dev();
+       return mma7660_close_dev(client);
 }
 
 static int mma7660_resume(android_early_suspend_t *h)
 {
-    struct mma7660_data *mma = (struct mma7660_data *)i2c_get_clientdata(this_client);
+       struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev);
+    struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
        rk28printk("Gsensor mma7760 resume!!\n");
-       return mma7660_start_dev(mma->curr_tate);
+       return mma7660_start_dev(mma7660->curr_tate);
 }
-/*
-static int suspend(struct i2c_client *client, pm_message_t mesg)
+#else
+static int mma7660_suspend(struct i2c_client *client, pm_message_t mesg)
 {
        rk28printk("Gsensor mma7760 enter 2 level  suspend\n");
-       return mma7660_close_dev();
+       return mma7660_close_dev(client);
 }
-static int resume(struct i2c_client *client)
+static int mma7660_resume(struct i2c_client *client)
 {
-       struct mma7660_data *mma = (struct mma7660_data *)i2c_get_clientdata(this_client);
+       struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client);
        rk28printk("Gsensor mma7760 2 level resume!!\n");
-       return mma7660_start_dev(mma->curr_tate);
+       return mma7660_start_dev(client, mma7660->curr_tate);
 }
-*/
-#else
-#define mma7660_suspend NULL
-#define mma7660_resume NULL
 #endif
 
 static const struct i2c_device_id mma7660_id[] = {
@@ -440,16 +444,18 @@ static struct i2c_driver mma7660_driver = {
        .id_table       = mma7660_id,
        .probe          = mma7660_probe,
        .remove         = __devexit_p(mma7660_remove),
-       //.suspend = &suspend,
-       //.resume = &resume,
+#ifndef CONFIG_ANDROID_POWER   
+       .suspend = &mma7660_suspend,
+       .resume = &mma7660_resume,
+#endif 
 };
 
 
 static int mma7660_init_client(struct i2c_client *client)
 {
-       struct mma7660_data *data;
+       struct mma7660_data *mma7660;
        int ret;
-       data = i2c_get_clientdata(client);
+       mma7660 = i2c_get_clientdata(client);
        rk28printk("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq));
        if ( !gpio_is_valid(client->irq)) {
                rk28printk("+++++++++++gpio_is_invalid\n");
@@ -460,8 +466,14 @@ static int mma7660_init_client(struct i2c_client *client)
                rk28printk( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq));
                return ret;
        }
+    ret = gpio_direction_input(client->irq);
+    if (ret) {
+        rk28printk("failed to set mma7990_trig GPIO gpio input\n");
+               return ret;
+    }
+       gpio_pull_updown(client->irq, GPIOPullUp);
        client->irq = gpio_to_irq(client->irq);
-       ret = request_irq(client->irq, mma7660_interrupt, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, client->dev.driver->name, data);
+       ret = request_irq(client->irq, mma7660_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, mma7660);
        rk28printk("request irq is %d,ret is  0x%x\n",client->irq,ret);
        if (ret ) {
                rk28printk(KERN_ERR "mma7660_init_client: request irq failed,ret is %d\n",ret);
@@ -475,21 +487,21 @@ static int mma7660_init_client(struct i2c_client *client)
 
 static int  mma7660_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
-       struct mma7660_data *mma;
+       struct mma7660_data *mma7660;
        int err;
 
-       mma = kzalloc(sizeof(struct mma7660_data), GFP_KERNEL);
-       if (!mma) {
+       mma7660 = kzalloc(sizeof(struct mma7660_data), GFP_KERNEL);
+       if (!mma7660) {
                rk28printk("[mma7660]:alloc data failed.\n");
                err = -ENOMEM;
                goto exit_alloc_data_failed;
        }
+    
+       INIT_WORK(&mma7660->work, mma7660_work_func);
+       INIT_DELAYED_WORK(&mma7660->delaywork, mma7660_delaywork_func);
 
-       INIT_WORK(&mma->work, mma7660_work_func);
-       INIT_DELAYED_WORK(&mma->delaywork, mma7660_delaywork_func);
-
-       mma->client = client;
-       i2c_set_clientdata(client, mma);
+       mma7660->client = client;
+       i2c_set_clientdata(client, mma7660);
 
        this_client = client;
 
@@ -500,33 +512,34 @@ static int  mma7660_probe(struct i2c_client *client, const struct i2c_device_id
                goto exit_request_gpio_irq_failed;
        }
                
-       mma->input_dev = input_allocate_device();
-       if (!mma->input_dev) {
+       mma7660->input_dev = input_allocate_device();
+       if (!mma7660->input_dev) {
                err = -ENOMEM;
                rk28printk(KERN_ERR
                       "mma7660_probe: Failed to allocate input device\n");
                goto exit_input_allocate_device_failed;
        }
 
-       set_bit(EV_ABS, mma->input_dev->evbit);
+       set_bit(EV_ABS, mma7660->input_dev->evbit);
 
        /* x-axis acceleration */
-       input_set_abs_params(mma->input_dev, ABS_X, -1500, 1500, 0, 0);
+       input_set_abs_params(mma7660->input_dev, ABS_X, -1500, 1500, 0, 0);
        /* y-axis acceleration */
-       input_set_abs_params(mma->input_dev, ABS_Y, -1500, 1500, 0, 0);
+       input_set_abs_params(mma7660->input_dev, ABS_Y, -1500, 1500, 0, 0);
        /* z-axis acceleration */
-       input_set_abs_params(mma->input_dev, ABS_Z, -1500, 1500, 0, 0);
+       input_set_abs_params(mma7660->input_dev, ABS_Z, -1500, 1500, 0, 0);
 
-       mma->input_dev->name = "compass";
+       mma7660->input_dev->name = "compass";
 
-       err = input_register_device(mma->input_dev);
+       err = input_register_device(mma7660->input_dev);
        if (err < 0) {
                rk28printk(KERN_ERR
                       "mma7660_probe: Unable to register input device: %s\n",
-                      mma->input_dev->name);
+                      mma7660->input_dev->name);
                goto exit_input_register_device_failed;
        }
 
+    mma7660_device.parent = &client->dev;
        err = misc_register(&mma7660_device);
        if (err < 0) {
                rk28printk(KERN_ERR
@@ -548,20 +561,22 @@ static int  mma7660_probe(struct i2c_client *client, const struct i2c_device_id
     android_register_early_suspend(&mma7660_early_suspend);
 #endif
        rk28printk(KERN_INFO "mma7660 probe ok\n");
-       mma->status = -1;
-       //mma7660_start(MMA7660_RATE_32);
+       mma7660->status = -1;
+#if 0  
+       mma7660_start(client, MMA7660_RATE_32);
+#endif
        return 0;
 
 exit_gsensor_sysfs_init_failed:
     misc_deregister(&mma7660_device);
 exit_misc_device_register_mma7660_device_failed:
-    input_unregister_device(mma->input_dev);
+    input_unregister_device(mma7660->input_dev);
 exit_input_register_device_failed:
-       input_free_device(mma->input_dev);
+       input_free_device(mma7660->input_dev);
 exit_input_allocate_device_failed:
-    free_irq(client->irq, mma);
+    free_irq(client->irq, mma7660);
 exit_request_gpio_irq_failed:
-       kfree(mma);     
+       kfree(mma7660); 
 exit_alloc_data_failed:
     ;
        return err;
index 7863d8df2d61593824a2754a487489722b818780..1788ba7de1f77a427178601e2baaa25bea056fbe 100755 (executable)
 #include <linux/interrupt.h>
 #include <mach/spi_fpga.h>
 
+#if 0
 #define D(x...) printk(x)
+#else
+#define D(x...)
+#endif
 
 static struct capella_cm3602_data {
        struct input_dev *input_dev;
@@ -42,7 +46,7 @@ static struct capella_cm3602_data {
 
 static int misc_opened;
 
-static bool time_enable = true;
+static bool time_enable = false;
 
 static int capella_cm3602_report(struct capella_cm3602_data *data)
 {
@@ -63,11 +67,12 @@ static int capella_cm3602_report(struct capella_cm3602_data *data)
 static irqreturn_t capella_cm3602_irq_handler(int irq, void *data)
 {
        struct capella_cm3602_data *ip = data;
-       printk("------------------capella_cm3602_irq_handler------------\n");
+       printk("---capella_cm3602_irq_handler----\n");
        //int val = capella_cm3602_report(ip);
        input_report_abs(ip->input_dev, ABS_DISTANCE, 0);
        input_sync(ip->input_dev);
-       add_timer(&ip->cm3602_timer);
+       //printk("input_report_abs=0\n");
+       //add_timer(&ip->cm3602_timer);
        time_enable = true;
        return IRQ_HANDLED;
 }
@@ -76,13 +81,16 @@ static int capella_cm3602_enable(struct capella_cm3602_data *data)
 {
        int rc;
        D("%s\n", __func__);
-       time_enable = true;
+       //time_enable = true;
        if (data->enabled) {
                D("%s: already enabled\n", __func__);
                return 0;
        }
-       gpio_set_value(data->pdata->pwd_out_pin, SPI_GPIO_LOW);         //CM3605_PWD output
-       gpio_set_value(data->pdata->ps_shutdown_pin, SPI_GPIO_LOW);             //CM3605_PS_SHUTDOWN
+/*     gpio_direction_output(pdata->pwd_out_pin, SPI_GPIO_OUT);
+       gpio_set_value(pdata->pwd_out_pin, SPI_GPIO_LOW);               //CM3605_PWD output
+       gpio_direction_output(pdata->ps_shutdown_pin, SPI_GPIO_OUT);
+       gpio_set_value(pdata->ps_shutdown_pin, SPI_GPIO_LOW);           //CM3605_PS_SHUTDOWN
+*/
        data->pdata->power(1);
        data->enabled = !rc;
        if (!rc)
@@ -99,8 +107,8 @@ static int capella_cm3602_disable(struct capella_cm3602_data *data)
                D("%s: already disabled\n", __func__);
                return 0;
        }
-       gpio_set_value(data->pdata->pwd_out_pin, GPIO_HIGH);            //CM3605_PWD output
-       gpio_set_value(data->pdata->ps_shutdown_pin, GPIO_HIGH);                //CM3605_PS_SHUTDOWN
+//     gpio_set_value(data->pdata->pwd_out_pin, GPIO_HIGH);            //CM3605_PWD output
+//     gpio_set_value(data->pdata->ps_shutdown_pin, GPIO_HIGH);                //CM3605_PS_SHUTDOWN
        data->pdata->power(0);
        data->enabled = 0;
        return rc;
@@ -117,6 +125,7 @@ void cm3602_work_handler(struct work_struct *work)
                time_enable = false;
                input_report_abs(pdata->input_dev, ABS_DISTANCE, val);
                input_sync(pdata->input_dev);
+               printk("input_report_abs=%d\n",val);
        }
        
 }
@@ -124,12 +133,12 @@ void cm3602_work_handler(struct work_struct *work)
 static void cm3602_timer(unsigned long data)
 {
        struct capella_cm3602_data *ip = data;
-       printk("------------------cm3602_timer,%d------------\n",time_enable);
-       
+       //printk("------------------cm3602_timer,%d------------\n",time_enable);
+       ip->cm3602_timer.expires = jiffies + HZ;
+       add_timer(&ip->cm3602_timer);
        if(time_enable)
        {
-               ip->cm3602_timer.expires = jiffies + HZ;
-               add_timer(&ip->cm3602_timer);
+               printk("------------------cm3602_timer,%d------------\n",time_enable);
                queue_work(ip->cm3602_workqueue, &ip->cm3602_work);
        }
 
@@ -141,23 +150,8 @@ static int capella_cm3602_setup(struct capella_cm3602_data *ip)
        struct capella_cm3602_platform_data *pdata = ip->pdata;
        //int irq = gpio_to_irq(pdata->p_out);
        char b[20];
-       
-       D("%s\n", __func__);
-/*
-       rc = gpio_request(pdata->p_out, "gpio_proximity_out");
-       if (rc < 0) {
-               pr_err("%s: gpio %d request failed (%d)\n",
-                       __func__, pdata->p_out, rc);
-               goto done;
-       }
 
-       rc = gpio_direction_input(pdata->p_out);
-       if (rc < 0) {
-               pr_err("%s: failed to set gpio %d as input (%d)\n",
-                       __func__, pdata->p_out, rc);
-               goto fail_free_p_out;
-       }
-*/
+       D("%s\n", __func__);
 
        rc = gpio_request(pdata->pwd_out_pin, "cm3602 out");
        if (rc) {
@@ -177,8 +171,8 @@ static int capella_cm3602_setup(struct capella_cm3602_data *ip)
                pr_err("%s: request gpio %d failed \n", __func__, pdata->irq_pin);
                return rc;
        }
-       rc = gpio_direction_input(pdata->irq_pin);
-       rc = request_irq(gpio_to_irq(pdata->irq_pin),capella_cm3602_irq_handler,SPI_GPIO_EDGE_FALLING,NULL, NULL);
+       //rc = gpio_direction_input(pdata->irq_pin);
+       rc = request_irq(gpio_to_irq(pdata->irq_pin),capella_cm3602_irq_handler,SPI_GPIO_EDGE_FALLING,NULL, ip);
        if (rc < 0) {
                pr_err("%s: request_irq failed for gpio %d (%d)\n",
                        __func__, 
@@ -186,9 +180,6 @@ static int capella_cm3602_setup(struct capella_cm3602_data *ip)
                goto fail_free_p_out;
        }
 
-       //spi_gpio_set_pindirection(SPI_GPIO_P6_04, SPI_GPIO_IN);
-       //spi_gpio_get_pinlevel(SPI_GPIO_P6_04);
-       
        sprintf(b,"cm3602_workqueue");
        ip->cm3602_workqueue = create_freezeable_workqueue(b);
        if(!ip->cm3602_workqueue)
@@ -199,7 +190,7 @@ static int capella_cm3602_setup(struct capella_cm3602_data *ip)
        INIT_WORK(&ip->cm3602_work, cm3602_work_handler);
        setup_timer(&ip->cm3602_timer,cm3602_timer,(unsigned long)ip);
        ip->cm3602_timer.expires = jiffies + HZ;
-       //add_timer(&ip->cm3602_timer);
+       add_timer(&ip->cm3602_timer);
 /*
        rc = set_irq_wake(irq, 1);
        if (rc < 0) {
@@ -278,7 +269,7 @@ static int capella_cm3602_probe(struct platform_device *pdev)
        struct capella_cm3602_platform_data *pdata;
 
        D("%s: probe\n", __func__);
-       printk("%s: probe]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\n", __func__);
+       //printk("%s: probe]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\n", __func__);
        pdata = pdev->dev.platform_data;
        if (!pdata) {
                pr_err("%s: missing pdata!\n", __func__);
index 5d1094454427de2cd61f175e2b74add61dce28b4..8f78ca76d33d2ae84faeba58b0de478a91aa87ba 100755 (executable)
@@ -37,6 +37,8 @@ struct Ctp_it7250_data {
 };\r
 static struct i2c_client *Ctp_it7250_client;\r
 \r
+#define Ctp_it7250_GPIO_INT     RK2818_PIN_PE1\r
+\r
 #if 0\r
 #define rk28printk(x...) printk(x)\r
 #else\r
@@ -71,21 +73,21 @@ static struct KeyInfo panel_key_info[]={
 static u8 gpucPointBuffer[14];\r
 static u32 gpdwSampleX[3],gpdwSampleY[3],gpdwPressure[1];\r
 \r
-static int Ctp_it7250_rx_data( u8 reg,u8* rxData, int length)\r
+static int Ctp_it7250_rx_data(struct i2c_client *client, u8 reg,u8* rxData, int length)\r
 {\r
 #if 0\r
    \r
   int ret;\r
     struct i2c_adapter *adap;int i;\r
     struct i2c_msg msgs[2];
-    if(!Ctp_it7250_client)\r
+    if(!client)\r
                return ret;    
-    adap = Ctp_it7250_client->adapter;\r
+    adap = client->adapter;\r
        \r
     //·¢ËͼĴæÆ÷µØÖ·
-    msgs[0].addr = Ctp_it7250_client->addr;\r
+    msgs[0].addr = client->addr;\r
     msgs[0].buf = &reg;\r
-    msgs[0].flags = Ctp_it7250_client->flags;\r
+    msgs[0].flags = client->flags;\r
     msgs[0].len =1;\r
     msgs[0].scl_rate = 400*1000;\r
     //½ÓÊÕÊý¾Ý
@@ -94,8 +96,8 @@ static int Ctp_it7250_rx_data( u8 reg,u8* rxData, int length)
  //   rk28printk("msgs[0].buf = 0x%x rxData=0x%x\n",*(msgs[0].buf),*rxData);\r
        \r
        msgs[1].buf = rxData;\r
-    msgs[1].addr = Ctp_it7250_client->addr;\r
-    msgs[1].flags = Ctp_it7250_client->flags | I2C_M_RD;\r
+    msgs[1].addr = client->addr;\r
+    msgs[1].flags = client->flags | I2C_M_RD;\r
     msgs[1].len = length;\r
     msgs[1].scl_rate = 400*1000;\r
 
@@ -109,18 +111,18 @@ static int Ctp_it7250_rx_data( u8 reg,u8* rxData, int length)
 \r
 #else\r
 //int i;\r
-return  i2c_master_reg8_recv(Ctp_it7250_client, reg, rxData, length, 400 * 1000);\r
+return  i2c_master_reg8_recv(client, reg, rxData, length, 400 * 1000);\r
 //for (i=0;i<length;i++)\r
 //     rk28printk("rxData[%d]=%d \r\n",i,rxData[i]);\r
 #endif\r
        \r
 }
 \r
-static int Ctp_it7250_tx_data(u8 reg,char *txData, int length)\r
+static int Ctp_it7250_tx_data(struct i2c_client *client, u8 reg,char *txData, int length)\r
 {
 #if 0\r
     int ret,i;\r
-       struct i2c_adapter *adap = Ctp_it7250_client->adapter;\r
+       struct i2c_adapter *adap = client->adapter;\r
        struct i2c_msg msg;\r
        \r
        u8 buf[128];//128\r
@@ -133,17 +135,17 @@ static int Ctp_it7250_tx_data(u8 reg,char *txData, int length)
                }\r
        rk28printk("\r\n");\r
 //     rk28printk("buf[0]=0x%x buf[1]=0x%x",buf[0],buf[1]);\r
-       msg.addr = Ctp_it7250_client->addr;\r
+       msg.addr = client->addr;\r
 //rk28printk("i2c addr=0x%x",msg.addr);\r
        msg.buf =&buf[0];\r
        msg.len = length+1;//+1 means add the reg length;by roberts\r
-       msg.flags = Ctp_it7250_client->flags;\r
+       msg.flags = client->flags;\r
        msg.scl_rate = 400*1000;\r
     
        ret = i2c_transfer(adap, &msg, 1);
 return ret;\r
 #else\r
- return i2c_master_reg8_send(Ctp_it7250_client, reg, txData, length, 400 * 1000);\r
+ return i2c_master_reg8_send(client, reg, txData, length, 400 * 1000);\r
 #endif\r
 \r
 \r
@@ -153,35 +155,35 @@ return ret;
 \r
 \r
 \r
-bool  ReadQueryBuffer(u8* pucData)\r
+bool  ReadQueryBuffer(struct i2c_client *client, u8* pucData)\r
 {\r
-       return Ctp_it7250_rx_data( QUERY_BUFFER_INDEX, pucData, 1);\r
+       return Ctp_it7250_rx_data(client, QUERY_BUFFER_INDEX, pucData, 1);\r
 }\r
 \r
-bool ReadCommandResponseBuffer(u8* pucData, unsigned int unDataLength)\r
+bool ReadCommandResponseBuffer(struct i2c_client *client, u8* pucData, unsigned int unDataLength)\r
 {\r
-       return Ctp_it7250_rx_data( COMMAND_RESPONSE_BUFFER_INDEX, pucData, unDataLength);\r
+       return Ctp_it7250_rx_data(client, COMMAND_RESPONSE_BUFFER_INDEX, pucData, unDataLength);\r
 }\r
 \r
-bool ReadPointBuffer(u8* pucData)\r
+bool ReadPointBuffer(struct i2c_client *client, u8* pucData)\r
 {\r
-       return Ctp_it7250_rx_data( POINT_BUFFER_INDEX, pucData, 14);\r
+       return Ctp_it7250_rx_data(client, POINT_BUFFER_INDEX, pucData, 14);\r
 }\r
 \r
-bool WriteCommandBuffer(u8* pucData, unsigned int unDataLength)\r
+bool WriteCommandBuffer(struct i2c_client *client, u8* pucData, unsigned int unDataLength)\r
 {\r
-       return Ctp_it7250_tx_data(COMMAND_BUFFER_INDEX, pucData, unDataLength);\r
+       return Ctp_it7250_tx_data(client, COMMAND_BUFFER_INDEX, pucData, unDataLength);\r
 }\r
 \r
 static int Ctp_it7250_touch_open(struct input_dev *idev)\r
 {\r
        \r
-struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(Ctp_it7250_client);\r
+//struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(client);\r
 \r
 \r
 //BTN_TOUCH =0 means no touch ;by robert\r
-       input_report_key(Ctp_it7250->input_dev,BTN_TOUCH, 0);\r
-       input_sync(Ctp_it7250->input_dev);\r
+       input_report_key(idev,BTN_TOUCH, 0);\r
+       input_sync(idev);\r
 \r
        return 0;\r
 }\r
@@ -282,7 +284,7 @@ static int Ctp_it7250_init_irq(struct i2c_client *client)
        }
        ret = gpio_request(client->irq, "Ctp_it7250_int");\r
        if (ret) {
-               rk28printk( "failed to request Ctp_it7250_init_irq GPIO%d\n",gpio_to_irq(client->irq));\r
+               rk28printk( "failed to request Ctp_it7250_init_irq GPIO%d\n",client->irq);\r
                return ret;
        }\r
 #if 1\r
@@ -293,13 +295,10 @@ ret = gpio_direction_input(client->irq);
        }\r
        gpio_pull_updown(client->irq,GPIOPullUp);\r
 #endif\r
-\r
-       rk28printk("%s gpio_to_irq(%d) is %d\n",__FUNCTION__,client->irq,gpio_to_irq(client->irq));\r
                \r
-       client->irq = gpio_to_irq(client->irq);\r
+       Ctp_it7250->irq = gpio_to_irq(client->irq);\r
        #endif\r
-       ret = request_irq(client->irq, Ctp_it7250_touch_irq, IRQF_TRIGGER_LOW, client->dev.driver->name, Ctp_it7250);\r
-       Ctp_it7250->irq=client->irq;\r
+       ret = request_irq(Ctp_it7250->irq, Ctp_it7250_touch_irq, IRQF_TRIGGER_LOW, client->dev.driver->name, Ctp_it7250);\r
        rk28printk("%s request irq is %d,irq1 is %d,ret is  0x%x\n",__FUNCTION__,client->irq,Ctp_it7250->irq,ret);\r
        if (ret ) {
                rk28printk(KERN_ERR "Ctp_it7250_init_irq: request irq failed,ret is %d\n",ret);\r
@@ -315,7 +314,7 @@ ret = gpio_direction_input(client->irq);
 // Input --- NULL\r
 //Output --- return true if the command execute successfully, otherwuse return false.\r
 // ================================================================================\r
-bool GetFirmwareInformation()\r
+bool GetFirmwareInformation(struct i2c_client *client)\r
 {\r
        u8 ucWriteLength, ucReadLength;\r
        u8 pucData[128];\r
@@ -329,14 +328,14 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
        }while(ucQuery & QUERY_BUSY);\r
 \r
        // Write Command\r
-       if(!WriteCommandBuffer(pucData, ucWriteLength))\r
+       if(!WriteCommandBuffer(client, pucData, ucWriteLength))\r
        {\r
                return false;\r
        }\r
@@ -344,7 +343,7 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
@@ -354,7 +353,7 @@ int i;
         pucData[7] == 0 ;\r
         pucData[8] == 0;\r
        // Read Command Response\r
-       if(!ReadCommandResponseBuffer(pucData, ucReadLength))\r
+       if(!ReadCommandResponseBuffer(client, pucData, ucReadLength))\r
        {\r
                return false;\r
        }\r
@@ -384,7 +383,7 @@ for (i =0;i<ucReadLength;i++)
 //     ucType- the interrupt type\r
 //Output --- return true if the command execute successfully, otherwuse return false.\r
 // ================================================================================\r
-bool SetInterruptNotification(u8 ucStatus, u8 ucType)\r
+bool SetInterruptNotification(struct i2c_client *client, u8 ucStatus, u8 ucType)\r
 {\r
        u8 ucWriteLength, ucReadLength;\r
        u8 pucData[128];\r
@@ -400,14 +399,14 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
        }while(ucQuery & QUERY_BUSY);\r
 \r
        // Write Command\r
-       if(!WriteCommandBuffer(pucData, ucWriteLength))\r
+       if(!WriteCommandBuffer(client, pucData, ucWriteLength))\r
        {\r
                return false;\r
        }\r
@@ -415,14 +414,14 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
        }while(ucQuery & QUERY_BUSY);\r
 \r
        // Read Command Response\r
-       if(!ReadCommandResponseBuffer(pucData, ucReadLength))\r
+       if(!ReadCommandResponseBuffer(client, pucData, ucReadLength))\r
        {\r
                return false;\r
        }\r
@@ -443,7 +442,7 @@ for (i =0;i<ucReadLength;i++)
 // Input --- NULL\r
 //Output --- return true if the command execute successfully, otherwuse return false.\r
 // ================================================================================\r
-bool IdentifyCapSensor()\r
+bool IdentifyCapSensor(struct i2c_client *client)\r
 {\r
        u8 ucWriteLength, ucReadLength;\r
        u8 pucData[128];\r
@@ -456,19 +455,25 @@ rk28printk("%s\r\n",__FUNCTION__);
        // Query\r
        do\r
        {//printk("first wait 111\r\n");\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
+               \r
                        rk28printk("first wait \r\n");\r
+                       //means we use resister touchscreen\r
+                       goto error_out;\r
                        ucQuery = QUERY_BUSY;\r
                }\r
-               rk28printk("%s ucQuery=0x%x \r\n",__FUNCTION__,ucQuery);\r
+               rk28printk("%s ucQuery!!!!=0x%x \r\n",__FUNCTION__,ucQuery);\r
+               if (0xff == ucQuery)\r
+                       goto error_out;\r
                mdelay(500);\r
        }while(ucQuery & QUERY_BUSY);\r
 \r
+\r
        // Write Command\r
        //rk28printk("%s11\r\n",__FUNCTION__);\r
        pucData[0] = 0x00;ucWriteLength = 1;\r
-       if(!WriteCommandBuffer(pucData, ucWriteLength))\r
+       if(!WriteCommandBuffer(client, pucData, ucWriteLength))\r
        {\r
                rk28printk("WriteCommandBuffer false \r\n");\r
        //      return false;\r
@@ -477,7 +482,7 @@ rk28printk("%s\r\n",__FUNCTION__);
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        rk28printk("second wait \r\n");\r
                        ucQuery = QUERY_BUSY;\r
@@ -489,7 +494,7 @@ rk28printk("%s\r\n",__FUNCTION__);
                {pucData[i]=0x0;\r
                rk28printk("pucData[%d]=%d \r\n",i,pucData[i]);\r
                }\r
-       if(!ReadCommandResponseBuffer(pucData, ucReadLength))\r
+       if(!ReadCommandResponseBuffer(client, pucData, ucReadLength))\r
        {\r
                rk28printk("ReadCommandResponseBuffer false \r\n");\r
        //      return false;\r
@@ -500,6 +505,10 @@ for (i=0;i<ucReadLength;i++)
        rk28printk("pucData=%c %c %c %c %c %c %c \r\n",pucData[1],pucData[2],pucData[3],pucData[4],pucData[5],pucData[6],pucData[7]);\r
 \r
        return true;\r
+\r
+\r
+error_out:\r
+       return false;\r
 }\r
 \r
 // ================================================================================\r
@@ -511,7 +520,7 @@ for (i=0;i<ucReadLength;i++)
 //     pucStep - the step\r
 //Output --- return true if the command execute successfully, otherwuse return false.\r
 // ================================================================================\r
-bool Get2DResolutions(u32 *pwXResolution, u32*pwYResolution, u8 *pucStep)\r
+bool Get2DResolutions(struct i2c_client *client, u32 *pwXResolution, u32*pwYResolution, u8 *pucStep)\r
 {\r
        u8 ucWriteLength, ucReadLength;\r
        u8 pucData[128];\r
@@ -527,7 +536,7 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
@@ -535,7 +544,7 @@ int i;
 \r
        // Write Command\r
        rk28printk("%s WriteCommandBuffer\r\n",__FUNCTION__);\r
-       if(!WriteCommandBuffer(pucData, ucWriteLength))\r
+       if(!WriteCommandBuffer(client, pucData, ucWriteLength))\r
        {\r
                return false;\r
        }\r
@@ -543,14 +552,14 @@ int i;
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
        }while(ucQuery & QUERY_BUSY);\r
 rk28printk("%s ReadCommandResponseBuffer\r\n",__FUNCTION__);\r
        // Read Command Response\r
-       if(!ReadCommandResponseBuffer(pucData, ucReadLength))\r
+       if(!ReadCommandResponseBuffer(client, pucData, ucReadLength))\r
        {\r
                return false;\r
        }\r
@@ -584,14 +593,14 @@ rk28printk("%s ReadCommandResponseBuffer EDN\r\n",__FUNCTION__);
 // Return value: \r
 //   return zero if success, otherwise return non zero value\r
 // *******************************************************************************************\r
-int CaptouchMode(u8 dwMode)\r
+int CaptouchMode(struct i2c_client *client, u8 dwMode)\r
 {\r
        u8 ucQueryResponse;\r
        u8 pucCommandBuffer[128];\r
 \r
        do\r
        {\r
-               ReadQueryBuffer(&ucQueryResponse);\r
+               ReadQueryBuffer(client, &ucQueryResponse);\r
        }\r
        while(ucQueryResponse & QUERY_BUSY);\r
 \r
@@ -612,7 +621,7 @@ int CaptouchMode(u8 dwMode)
                        return -1;\r
        }\r
 \r
-       if(!WriteCommandBuffer( pucCommandBuffer,3))\r
+       if(!WriteCommandBuffer(client, pucCommandBuffer,3))\r
        {\r
                return -1;\r
        }\r
@@ -628,19 +637,19 @@ int CaptouchMode(u8 dwMode)
 // Return value: \r
 //   return TRUE if success, otherwise return FALSE\r
 // *******************************************************************************************\r
-int CaptouchReset()\r
+int CaptouchReset(struct i2c_client *client)\r
 {\r
        u8 ucQueryResponse;\r
        u8 pucCommandBuffer[128];\r
 \r
        do\r
        {\r
-               ReadQueryBuffer(&ucQueryResponse);\r
+               ReadQueryBuffer(client, &ucQueryResponse);\r
        }\r
        while(ucQueryResponse & QUERY_BUSY);\r
 \r
        pucCommandBuffer[0] = 0x6F;\r
-       if(!WriteCommandBuffer(pucCommandBuffer,1))\r
+       if(!WriteCommandBuffer(client, pucCommandBuffer,1))\r
        {\r
                return -1;\r
        }\r
@@ -649,12 +658,12 @@ int CaptouchReset()
 \r
        do\r
        {\r
-               ReadQueryBuffer(&ucQueryResponse);\r
+               ReadQueryBuffer(client, &ucQueryResponse);\r
        }\r
        while(ucQueryResponse & QUERY_BUSY);\r
 \r
 \r
-       if(!ReadCommandResponseBuffer(pucCommandBuffer,2))\r
+       if(!ReadCommandResponseBuffer(client, pucCommandBuffer,2))\r
        {\r
                return -1;\r
        }\r
@@ -677,23 +686,24 @@ int CaptouchReset()
 // Return value: \r
 //   return zero if success, otherwise return non zero value\r
 // *******************************************************************************************\r
-int CaptouchHWInitial()\r
+int CaptouchHWInitial(struct i2c_client *client)\r
 {\r
        u32 wXResolution=0,wYResolution=0;\r
        u8 ucStep=0;\r
-       if (!IdentifyCapSensor())\r
+       if (!IdentifyCapSensor(client))\r
        {\r
                rk28printk("%s IdentifyCapSensor error \r\n",__FUNCTION__);\r
-       //      goto resetagin;\r
+               return false;\r
+               //goto resetagin;\r
 }\r
        #if 1\r
-if (!GetFirmwareInformation ())\r
+if (!GetFirmwareInformation (client))\r
        {\r
        rk28printk("%s GetFirmwareInformation error \r\n",__FUNCTION__);\r
        //      goto resetagin;\r
 }\r
 \r
-       if (!Get2DResolutions(&wXResolution, &wYResolution, &ucStep))\r
+       if (!Get2DResolutions(client, &wXResolution, &wYResolution, &ucStep))\r
        {\r
        rk28printk("%s Get2DResolutions error \r\n",__FUNCTION__);\r
        //      goto resetagin;\r
@@ -701,7 +711,7 @@ if (!GetFirmwareInformation ())
 \r
 //no need to set interrupt mode because firmware has done that;note by robert\r
        #if 0\r
-       if (!SetInterruptNotification(0x01, 0x00))\r
+       if (!SetInterruptNotification(client, 0x01, 0x00))\r
        {\r
        rk28printk("%s SetInterruptNotification error \r\n",__FUNCTION__);\r
        goto resetagin;\r
@@ -709,13 +719,13 @@ if (!GetFirmwareInformation ())
        #endif\r
        //note end\r
 #endif\r
-       return 0;\r
+       return true;\r
 \r
 resetagin:\r
-       if (!CaptouchReset())\r
+       if (!CaptouchReset(client))\r
                rk28printk("CaptouchReset success \r\n");\r
        mdelay(100);\r
-//     if (!CaptouchMode(0x00))\r
+//     if (!CaptouchMode(client, 0x00))\r
        //      rk28printk("CaptouchMode success \r\n");\r
 }\r
 \r
@@ -798,18 +808,22 @@ static void  Ctp_it7250_delaywork_func(struct work_struct  *work)
        
        u8 ucQueryResponse;\r
        u32 dwTouchEvent;\r
-       struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdata(Ctp_it7250_client);\r
+       struct delayed_work *delaywork = container_of(work, struct delayed_work, work);\r
+       struct Ctp_it7250_data *Ctp_it7250 = container_of(delaywork, struct Ctp_it7250_data, delaywork);        \r
+       struct i2c_client *client = Ctp_it7250->client;\r
+       \r
        int PE1status = 0;\r
 \r
 //     rk28printk("%s++++ %d \r\n",__FUNCTION__,__LINE__);\r
 \r
 \r
-       PE1status =  gpio_get_value(Ctp_it7250->client->irq);\r
+       //PE1status =  gpio_get_value(Ctp_it7250_GPIO_INT);\r
+       PE1status =  gpio_get_value(client->irq);\r
        //  PE1status ÎªµÍ£¬±íʾµÍµçƽÖжÏÓÐЧ \r
        if (!PE1status)\r
                {\r
        //      rk28printk("%s PE1status low!!  \r\n",__FUNCTION__);\r
-       if(!ReadQueryBuffer(&ucQueryResponse))\r
+       if(!ReadQueryBuffer(client, &ucQueryResponse))\r
        {rk28printk("%s++++ %d  ucQueryResponse=0x%x \r\n",__FUNCTION__,__LINE__,ucQueryResponse);\r
                return false;\r
        }\r
@@ -817,7 +831,7 @@ static void  Ctp_it7250_delaywork_func(struct work_struct  *work)
        // Touch Event\r
        if(ucQueryResponse & QUERY_POINT)\r
        {//rk28printk("%s++++ %d  \r\n",__FUNCTION__,__LINE__);\r
-               if(!ReadPointBuffer(gpucPointBuffer))\r
+               if(!ReadPointBuffer(client, gpucPointBuffer))\r
                {rk28printk("%s++++ %d  \r\n",__FUNCTION__,__LINE__);\r
                        return false;\r
                }\r
@@ -825,8 +839,7 @@ static void  Ctp_it7250_delaywork_func(struct work_struct  *work)
                switch(gpucPointBuffer[0] & 0xF0)\r
                {\r
                        case 0x00:\r
-                               dwTouchEvent = CaptouchGetSampleValue(gpdwSampleX, gpdwSampleY, \r
-gpdwPressure);\r
+                               dwTouchEvent = CaptouchGetSampleValue(gpdwSampleX, gpdwSampleY, gpdwPressure);\r
                                if(dwTouchEvent == 0)\r
                                {\r
                                        //SynchroSystemEvent(SYSTEM_TOUCH_EVENT_FINGER_RELEASE);\r
@@ -841,7 +854,8 @@ gpdwPressure);
                                        input_report_abs(Ctp_it7250->input_dev, ABS_X, gpdwSampleX[0]);// & 0xfff\r
                                        input_report_abs(Ctp_it7250->input_dev, ABS_Y, gpdwSampleY[0]); //& 0xfff\r
                                        input_report_key(Ctp_it7250->input_dev,BTN_TOUCH, 1);\r
-                                       input_sync(Ctp_it7250->input_dev);rk28printk("x=%d  y=%d \r\n",gpdwSampleX[0],gpdwSampleY[0]);\r
+                                       input_sync(Ctp_it7250->input_dev);\r
+                                       rk28printk("x=%d  y=%d \r\n",gpdwSampleX[0],gpdwSampleY[0]);\r
                                }\r
                                else\r
                                {\r
@@ -910,10 +924,10 @@ gpdwPressure);
        }\r
        else if (ucQueryResponse & QUERY_ERROR)\r
                {\r
-               if (!CaptouchReset())\r
+               if (!CaptouchReset(client))\r
                rk28printk("!! CaptouchReset success \r\n");\r
                mdelay(100);\r
-       //if (!CaptouchMode(0x00))\r
+       //if (!CaptouchMode(client, 0x00))\r
                //rk28printk("!! CaptouchMode success \r\n");\r
                }\r
        }\r
@@ -948,7 +962,9 @@ gpdwPressure);
        i2c_set_clientdata(client, Ctp_it7250);\r
 \r
        \r
-       \r
+if (!CaptouchHWInitial(client))\r
+       goto  err_free_mem;\r
+Ctp_it7250_init_irq(client);   \r
        ts_input_init(client);\r
 //     CTS_configure_pin(client);\r
 \r
@@ -964,8 +980,7 @@ mdelay(5);
 #endif\r
 \r
 }\r
-CaptouchHWInitial();\r
-Ctp_it7250_init_irq(client);\r
+\r
        \r
        \r
 //²»ÊDzéѯģʽ£¬²»ÐèÒªÂÖѯ\r
@@ -974,6 +989,9 @@ Ctp_it7250_init_irq(client);
 \r
        rk28printk("+++++++     %s+++++++\n", __FUNCTION__);\r
        return 0;\r
+err_free_mem:\r
+ kfree(Ctp_it7250);\r
+ return false;\r
 \r
 }\r
 \r
@@ -1006,7 +1024,7 @@ struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdat
        // Query\r
        do\r
        {\r
-               if(!ReadQueryBuffer(&ucQuery))\r
+               if(!ReadQueryBuffer(client, &ucQuery))\r
                {\r
                        ucQuery = QUERY_BUSY;\r
                }\r
@@ -1014,7 +1032,7 @@ struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdat
 \r
        // Write Command\r
        rk28printk("%s WriteCommandBuffer\r\n",__FUNCTION__);\r
-       if(!WriteCommandBuffer(pucData, ucWriteLength))\r
+       if(!WriteCommandBuffer(client, pucData, ucWriteLength))\r
        {\r
                return false;\r
        }\r
@@ -1032,7 +1050,7 @@ struct Ctp_it7250_data *Ctp_it7250 = (struct Ctp_it7250_data *)i2c_get_clientdat
 //read command to wakeup ctp\r
 #if 1\r
 u8 ucQuery;\r
-ReadQueryBuffer(&ucQuery);\r
+ReadQueryBuffer(client, &ucQuery);\r
 #endif\r
 //wakeup end\r
        enable_irq(Ctp_it7250->irq);\r
index 18992368edd870662eb2c5fffbae3e21507fbd64..20079368df057d94e1a25f9a8c1f3b82da5230dc 100755 (executable)
@@ -1010,7 +1010,7 @@ static int __init xpt2046_init(void)
 {
        return spi_register_driver(&xpt2046_driver);
 }
-module_init(xpt2046_init);
+late_initcall_sync(xpt2046_init);
 
 static void __exit xpt2046_exit(void)
 {
index ba29580aa38ef0f2c265114413d31a290ea4726d..807d8bc8731d0efb949491ede161fc7d8d68b01f 100644 (file)
@@ -31,6 +31,15 @@ REVISION 0.01
 #include <linux/kernel.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/rk2818_lp8725.h>
+#include <mach/gpio.h>
+#include <linux/delay.h>
+
+//add by robert for reboot notifier
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+
+//end add
+
 
 
 #if 0
@@ -670,6 +679,90 @@ static int lp8725_set_bits(struct lp8725 *lp8725, u8 reg, u16 mask, u16 val)
 }
 
 
+//add by robert for power on bp
+#define AP_TD_UNDEFINED_GBIN5 FPGA_PIO2_02
+#define AP_RESET_TD FPGA_PIO2_04
+#define AP_SHUTDOWN_TD_PMU FPGA_PIO2_05
+#define AP_PW_EN_TD FPGA_PIO2_03
+
+static int bp_power_on(void)
+{
+       int ret=0;
+       
+       ret = gpio_request(AP_TD_UNDEFINED_GBIN5, NULL);
+       if (ret) {
+               printk("%s:failed to request fpga s %d\n",__FUNCTION__,__LINE__);
+               goto err;
+       }
+       ret = gpio_request(AP_RESET_TD, NULL);
+       if (ret) {
+               printk("%s:failed to request fpga s %d\n",__FUNCTION__,__LINE__);
+               goto err0;
+       }
+       
+
+       ret = gpio_request(AP_SHUTDOWN_TD_PMU, NULL);
+       if (ret) {
+               printk("%s:failed to request fpga %d\n",__FUNCTION__,__LINE__);
+               goto err1;
+       }
+
+       ret = gpio_request(AP_PW_EN_TD, NULL);
+       if (ret) {
+               printk("%s:failed to request fpga  %d\n",__FUNCTION__,__LINE__);
+               goto err2;
+       }
+
+       gpio_set_value(AP_TD_UNDEFINED_GBIN5, 1);
+       gpio_direction_output(AP_TD_UNDEFINED_GBIN5, 1);   
+       gpio_direction_input(AP_RESET_TD);
+
+        gpio_set_value(AP_SHUTDOWN_TD_PMU, 0);
+        gpio_direction_output(AP_SHUTDOWN_TD_PMU, 0);  
+
+       gpio_set_value(AP_PW_EN_TD, 0);
+       gpio_direction_output(AP_PW_EN_TD, 0);  
+       mdelay(1);
+       gpio_set_value(AP_PW_EN_TD, 1);
+       mdelay(1200);
+       gpio_set_value(AP_PW_EN_TD, 0);
+
+       return true;
+err2:
+       gpio_free(AP_SHUTDOWN_TD_PMU);
+err1:
+       gpio_free(AP_RESET_TD);
+err0:
+       gpio_free(AP_TD_UNDEFINED_GBIN5);
+err:   
+       return false;
+}
+
+
+
+static int bp_power_off(struct notifier_block *this,
+                                       unsigned long code, void *unused)
+{
+       printk("+++--++++++%s_________%d \r\n",__FUNCTION__,code);
+
+        gpio_set_value(AP_TD_UNDEFINED_GBIN5, 0);
+       
+       gpio_set_value(AP_PW_EN_TD, 0);
+       //gpio_direction_output(AP_PW_EN_TD, 0);  
+       mdelay(1);
+       gpio_set_value(AP_PW_EN_TD, 1);
+       mdelay(1200);
+       gpio_set_value(AP_PW_EN_TD, 0);
+
+       mdelay(5000);
+        gpio_set_value(AP_SHUTDOWN_TD_PMU, 1);
+       mdelay(1200);
+       // gpio_free(AP_PW_EN_TD);
+printk("++++--+++++%s   ok_________\r\n",__FUNCTION__);
+        return NOTIFY_DONE;
+}
+//add end
+
 static int lp8725_set_init(void)
 {
        int tmp = 0;
@@ -749,6 +842,11 @@ static int lp8725_set_init(void)
        tmp = regulator_get_voltage(buck2);
        DBG_INFO("***regulator_set_init: buck2 vcc =%d\n",tmp);
 
+       
+//add by robert for power on bp
+       bp_power_on();
+//end add
+
        return(0);
 }
 
@@ -822,6 +920,7 @@ static int __devexit lp8725_i2c_remove(struct i2c_client *i2c)
 {
        struct lp8725 *lp8725 = i2c_get_clientdata(i2c);
        int i;
+
        for (i = 0; i < lp8725->num_regulators; i++)
                if (lp8725->rdev[i])
                        regulator_unregister(lp8725->rdev[i]);
@@ -849,6 +948,15 @@ static struct i2c_driver lp8725_i2c_driver = {
        .id_table = lp8725_i2c_id,
 };
 
+
+//add by robert for bp powerdown register
+static struct notifier_block BP_powerdown_notifier = {
+       .notifier_call =        bp_power_off,
+};
+//end add
+
+
+
 static int __init lp8725_module_init(void)
 {
        int ret;
@@ -857,12 +965,25 @@ static int __init lp8725_module_init(void)
        if (ret != 0)
                pr_err("Failed to register I2C driver: %d\n", ret);
 
+       //add by robert for bp powerdown register
+       ret = register_reboot_notifier(&BP_powerdown_notifier);
+       if (ret != 0) 
+               {
+               printk("cannot register reboot notifier (err=%d), %s\n", ret,__FUNCTION__);
+               }
+       //end add
+
+
        return ret;
 }
 module_init(lp8725_module_init);
 
 static void __exit lp8725_module_exit(void)
 {
+//add by robert for bp power down
+       unregister_reboot_notifier(&BP_powerdown_notifier);
+//end add
+
        i2c_del_driver(&lp8725_i2c_driver);
 }
 module_exit(lp8725_module_exit);
old mode 100644 (file)
new mode 100755 (executable)
index 7232a53..e1ca7f1
@@ -234,6 +234,23 @@ int alarm_cancel(struct alarm *alarm)
                cpu_relax();
        }
 }
+int rtc_change_time(struct timespec new_time)
+{
+       int i;
+       int ret;
+       unsigned long flags;
+       struct rtc_time rtc_new_rtc_time;
+       struct timespec tmp_time;
+
+       rtc_time_to_tm(new_time.tv_sec, &rtc_new_rtc_time);
+
+       printk("set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
+               new_time.tv_sec, new_time.tv_nsec,
+               rtc_new_rtc_time.tm_hour, rtc_new_rtc_time.tm_min,
+               rtc_new_rtc_time.tm_sec, rtc_new_rtc_time.tm_mon + 1,
+               rtc_new_rtc_time.tm_mday,
+               rtc_new_rtc_time.tm_year + 1900);
+}
 
 /**
  * alarm_set_rtc - set the kernel and rtc walltime
@@ -249,7 +266,7 @@ int alarm_set_rtc(struct timespec new_time)
 
        rtc_time_to_tm(new_time.tv_sec, &rtc_new_rtc_time);
 
-       pr_alarm(TSET, "set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
+       printk("set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
                new_time.tv_sec, new_time.tv_nsec,
                rtc_new_rtc_time.tm_hour, rtc_new_rtc_time.tm_min,
                rtc_new_rtc_time.tm_sec, rtc_new_rtc_time.tm_mon + 1,
@@ -320,20 +337,20 @@ static enum hrtimer_restart alarm_timer_triggered(struct hrtimer *timer)
        struct alarm *alarm;
        unsigned long flags;
        ktime_t now;
-
+       printk("alarm_timer_triggered\n");
        spin_lock_irqsave(&alarm_slock, flags);
 
        base = container_of(timer, struct alarm_queue, timer);
        now = base->stopped ? base->stopped_time : hrtimer_cb_get_time(timer);
        now = ktime_sub(now, base->delta);
 
-       pr_alarm(INT, "alarm_timer_triggered type %d at %lld\n",
+       printk( "alarm_timer_triggered type %d at %lld\n",
                base - alarms, ktime_to_ns(now));
 
        while (base->first) {
                alarm = container_of(base->first, struct alarm, node);
                if (alarm->softexpires.tv64 > now.tv64) {
-                       pr_alarm(FLOW, "don't call alarm, %pF, %lld (s %lld)\n",
+                       printk( "don't call alarm, %pF, %lld (s %lld)\n",
                                alarm->function, ktime_to_ns(alarm->expires),
                                ktime_to_ns(alarm->softexpires));
                        break;
@@ -341,7 +358,7 @@ static enum hrtimer_restart alarm_timer_triggered(struct hrtimer *timer)
                base->first = rb_next(&alarm->node);
                rb_erase(&alarm->node, &base->alarms);
                RB_CLEAR_NODE(&alarm->node);
-               pr_alarm(CALL, "call alarm, type %d, func %pF, %lld (s %lld)\n",
+               printk("call alarm, type %d, func %pF, %lld (s %lld)\n",
                        alarm->type, alarm->function,
                        ktime_to_ns(alarm->expires),
                        ktime_to_ns(alarm->softexpires));
@@ -350,9 +367,10 @@ static enum hrtimer_restart alarm_timer_triggered(struct hrtimer *timer)
                spin_lock_irqsave(&alarm_slock, flags);
        }
        if (!base->first)
-               pr_alarm(FLOW, "no more alarms of type %d\n", base - alarms);
+               printk( "no more alarms of type %d\n", base - alarms);
        update_timer_locked(base, true);
        spin_unlock_irqrestore(&alarm_slock, flags);
+       printk("---alarm_timer_triggered---\n");
        return HRTIMER_NORESTART;
 }
 
@@ -378,7 +396,7 @@ static int alarm_suspend(struct platform_device *pdev, pm_message_t state)
        struct alarm_queue *wakeup_queue = NULL;
        struct alarm_queue *tmp_queue = NULL;
 
-       pr_alarm(SUSPEND, "alarm_suspend(%p, %d)\n", pdev, state.event);
+       printk( "alarm_suspend(%p, %d)\n", pdev, state.event);
 
        spin_lock_irqsave(&alarm_slock, flags);
        suspended = true;
@@ -409,10 +427,11 @@ static int alarm_suspend(struct platform_device *pdev, pm_message_t state)
 
                rtc_time_to_tm(rtc_alarm_time, &rtc_alarm.time);
                rtc_alarm.enabled = 1;
+               //rtc_alarm.time.tm_min +=4;
                rtc_set_alarm(alarm_rtc_dev, &rtc_alarm);
                rtc_read_time(alarm_rtc_dev, &rtc_current_rtc_time);
                rtc_tm_to_time(&rtc_current_rtc_time, &rtc_current_time);
-               pr_alarm(SUSPEND,
+               printk(
                        "rtc alarm set at %ld, now %ld, rtc delta %ld.%09ld\n",
                        rtc_alarm_time, rtc_current_time,
                        rtc_delta.tv_sec, rtc_delta.tv_nsec);
@@ -433,15 +452,87 @@ static int alarm_suspend(struct platform_device *pdev, pm_message_t state)
                        spin_unlock_irqrestore(&alarm_slock, flags);
                }
        }
+       printk( "alarm_suspend over\n");
        return err;
 }
 
+static int alarm_shutdown(struct platform_device *pdev, pm_message_t state)
+{
+       int                 err = 0;
+       unsigned long       flags;
+       struct rtc_wkalrm   rtc_alarm;
+       struct rtc_time     rtc_current_rtc_time;
+       unsigned long       rtc_current_time;
+       unsigned long       rtc_alarm_time;
+       struct timespec     rtc_current_timespec;
+       struct timespec     rtc_delta;
+       struct alarm_queue *wakeup_queue = NULL;
+       struct alarm_queue *tmp_queue = NULL;
+
+       printk( "alarm_suspend(%p, %d)\n", pdev, state.event);
+
+       spin_lock_irqsave(&alarm_slock, flags);
+       suspended = true;
+       spin_unlock_irqrestore(&alarm_slock, flags);
+
+       hrtimer_cancel(&alarms[ANDROID_ALARM_RTC_WAKEUP].timer);
+       hrtimer_cancel(&alarms[
+                       ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK].timer);
+
+       tmp_queue = &alarms[ANDROID_ALARM_RTC_WAKEUP];
+       if (tmp_queue->first)
+               wakeup_queue = tmp_queue;
+       tmp_queue = &alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP];
+       if (tmp_queue->first && (!wakeup_queue ||
+                               hrtimer_get_expires(&tmp_queue->timer).tv64 <
+                               hrtimer_get_expires(&wakeup_queue->timer).tv64))
+               wakeup_queue = tmp_queue;
+       if (wakeup_queue) {
+               rtc_read_time(alarm_rtc_dev, &rtc_current_rtc_time);
+               rtc_current_timespec.tv_nsec = 0;
+               rtc_tm_to_time(&rtc_current_rtc_time,
+                              &rtc_current_timespec.tv_sec);
+               save_time_delta(&rtc_delta, &rtc_current_timespec);
+
+               rtc_alarm_time = timespec_sub(ktime_to_timespec(
+                       hrtimer_get_expires(&wakeup_queue->timer)),
+                       rtc_delta).tv_sec;
+
+               rtc_time_to_tm(rtc_alarm_time, &rtc_alarm.time);
+               rtc_alarm.enabled = 1;
+               rtc_set_alarm(alarm_rtc_dev, &rtc_alarm);
+               rtc_read_time(alarm_rtc_dev, &rtc_current_rtc_time);
+               rtc_tm_to_time(&rtc_current_rtc_time, &rtc_current_time);
+               printk(
+                       "rtc alarm set at %ld, now %ld, rtc delta %ld.%09ld\n",
+                       rtc_alarm_time, rtc_current_time,
+                       rtc_delta.tv_sec, rtc_delta.tv_nsec);
+               if (rtc_current_time + 1 >= rtc_alarm_time) {
+                       pr_alarm(SUSPEND, "alarm about to go off\n");
+                       memset(&rtc_alarm, 0, sizeof(rtc_alarm));
+                       rtc_alarm.enabled = 0;
+                       rtc_set_alarm(alarm_rtc_dev, &rtc_alarm);
+
+                       spin_lock_irqsave(&alarm_slock, flags);
+                       suspended = false;
+                       wake_lock_timeout(&alarm_rtc_wake_lock, 2 * HZ);
+                       update_timer_locked(&alarms[ANDROID_ALARM_RTC_WAKEUP],
+                                                                       false);
+                       update_timer_locked(&alarms[
+                               ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP], false);
+                       err = -EBUSY;
+                       spin_unlock_irqrestore(&alarm_slock, flags);
+               }
+       }
+       printk( "alarm_suspend over\n");
+       return err;
+}
 static int alarm_resume(struct platform_device *pdev)
 {
        struct rtc_wkalrm alarm;
        unsigned long       flags;
 
-       pr_alarm(SUSPEND, "alarm_resume(%p)\n", pdev);
+       printk( "alarm_resume(%p)\n", pdev);
 
        memset(&alarm, 0, sizeof(alarm));
        alarm.enabled = 0;
@@ -516,6 +607,7 @@ static struct class_interface rtc_alarm_interface = {
 static struct platform_driver alarm_driver = {
        .suspend = alarm_suspend,
        .resume = alarm_resume,
+       .shutdown = alarm_shutdown,
        .driver = {
                .name = "alarm"
        }
@@ -525,7 +617,7 @@ static int __init alarm_late_init(void)
 {
        unsigned long   flags;
        struct timespec tmp_time, system_time;
-
+       printk("alarm_late_init\n");
        /* this needs to run after the rtc is read at boot */
        spin_lock_irqsave(&alarm_slock, flags);
        /* We read the current rtc and system time so we can later calulate
@@ -539,6 +631,7 @@ static int __init alarm_late_init(void)
                        timespec_to_ktime(timespec_sub(tmp_time, system_time));
 
        spin_unlock_irqrestore(&alarm_slock, flags);
+       printk("---alarm_late_init----\n");
        return 0;
 }
 
@@ -546,7 +639,7 @@ static int __init alarm_driver_init(void)
 {
        int err;
        int i;
-
+       printk("alarm_driver_init\n");
        for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++) {
                hrtimer_init(&alarms[i].timer,
                                CLOCK_REALTIME, HRTIMER_MODE_ABS);
@@ -563,7 +656,7 @@ static int __init alarm_driver_init(void)
        err = class_interface_register(&rtc_alarm_interface);
        if (err < 0)
                goto err2;
-
+       printk("---alarm_driver_init---\n");
        return 0;
 
 err2:
index ff1dbe809fe6dce1019eae62ed7f5378b1cb231b..05ceb9d8b556f8fc980ab463d148acb51b36b5af 100755 (executable)
 #include <linux/bcd.h>\r
 #include <linux/slab.h>\r
 #include <linux/delay.h>\r
+#include <mach/gpio.h>\r
 #include "rtc-s35392a.h"\r
 \r
-\r
+#define RTC_S35392A_INT        RK2818_PIN_PE2  //\r
 #define RTC_RATE       100 * 1000\r
-#define S35392_TEST 1\r
+#define S35392_TEST 0\r
+\r
+#if 1\r
+#define DBG(x...)   printk(x)\r
+#else\r
+#define DBG(x...)\r
+#endif\r
 \r
 struct s35392a {\r
        struct i2c_client *client;\r
        struct rtc_device *rtc;\r
        int twentyfourhour;\r
+       struct work_struct work;\r
 };\r
 \r
+\r
+\r
 static int s35392a_set_reg(struct s35392a *s35392a, const char reg, char *buf, int len)\r
 {\r
        struct i2c_client *client = s35392a->client;\r
        struct i2c_msg msg;\r
        int ret;\r
-       \r
+       int i;\r
        char *buff = buf;\r
        msg.addr = client->addr | reg;\r
        msg.flags = client->flags;\r
@@ -45,6 +55,8 @@ static int s35392a_set_reg(struct s35392a *s35392a, const char reg, char *buf, i
        msg.scl_rate = RTC_RATE;\r
        \r
        ret = i2c_transfer(client->adapter,&msg,1);\r
+       for(i=0;i<len;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
        return ret;     \r
        \r
 }\r
@@ -130,10 +142,10 @@ static int s35392a_init(struct s35392a *s35392a)
 \r
        s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, buf, sizeof(buf));        \r
        s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, buf, sizeof(buf));        \r
-       s35392a_get_reg(s35392a, 4, buf, sizeof(buf));\r
-       s35392a_get_reg(s35392a, 5, buf, sizeof(buf));\r
-       s35392a_get_reg(s35392a, 6, buf, sizeof(buf));\r
-       s35392a_get_reg(s35392a, 7, buf, sizeof(buf));\r
+       s35392a_get_reg(s35392a, S35392A_CMD_INT1, buf, sizeof(buf));\r
+       s35392a_get_reg(s35392a, S35392A_CMD_INT2, buf, sizeof(buf));\r
+       s35392a_get_reg(s35392a, S35392A_CMD_CHECK, buf, sizeof(buf));\r
+       s35392a_get_reg(s35392a, S35392A_CMD_FREE, buf, sizeof(buf));\r
        \r
        buf[0] |= (S35392A_FLAG_RESET | S35392A_FLAG_24H);\r
        buf[0] &= 0xf0;\r
@@ -141,34 +153,6 @@ static int s35392a_init(struct s35392a *s35392a)
 \r
 }\r
 \r
-static int s35392a_reset(struct s35392a *s35392a)\r
-{\r
-       char buf[1];\r
-\r
-       if (s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, buf, sizeof(buf)) < 0)\r
-               return -EIO;    \r
-       if (!(buf[0] & (S35392A_FLAG_POC | S35392A_FLAG_BLD)))\r
-               return 0;\r
-\r
-       buf[0] |= (S35392A_FLAG_RESET | S35392A_FLAG_24H);\r
-       buf[0] &= 0xf0;\r
-       return s35392a_set_reg(s35392a, S35392A_CMD_STATUS1, buf, sizeof(buf));\r
-}\r
-\r
-\r
-static int s35392a_disable_test_mode(struct s35392a *s35392a)\r
-{\r
-       char buf[1];\r
-\r
-       if (s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, buf, sizeof(buf)) < 0)\r
-               return -EIO;\r
-\r
-       if (!(buf[0] & S35392A_FLAG_TEST))\r
-               return 0;\r
-\r
-       buf[0] &= ~S35392A_FLAG_TEST;\r
-       return s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, buf, sizeof(buf));\r
-}\r
 \r
 static char s35392a_hr2reg(struct s35392a *s35392a, int hour)\r
 {\r
@@ -195,13 +179,32 @@ static int s35392a_reg2hr(struct s35392a *s35392a, char reg)
        return hour;\r
 }\r
 \r
+static char s35392a_hour2reg(struct s35392a *s35392a, int hour)\r
+{\r
+       if (s35392a->twentyfourhour)\r
+       {\r
+               if(hour<12)\r
+                       return 0x80 | bin2bcd(hour) ;\r
+               else\r
+                       return 0xc0| bin2bcd(hour) ;\r
+       }               \r
+       else\r
+       {\r
+               if(hour<12)\r
+                       return 0x80 | bin2bcd(hour) ;\r
+               else\r
+                       return 0xc0 | bin2bcd(hour - 12);\r
+       }\r
+               \r
+}\r
+\r
 static int s35392a_set_datetime(struct i2c_client *client, struct rtc_time *tm)\r
 {\r
        struct s35392a  *s35392a = i2c_get_clientdata(client);\r
        int i, err;\r
        char buf[7];\r
 \r
-       printk("%s: tm is secs=%d, mins=%d, hours=%d mday=%d, "\r
+       DBG("%s: tm is secs=%d, mins=%d, hours=%d mday=%d, "\r
                "mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec,\r
                tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year,\r
                tm->tm_wday);\r
@@ -215,9 +218,12 @@ static int s35392a_set_datetime(struct i2c_client *client, struct rtc_time *tm)
        buf[S35392A_BYTE_SECS] = bin2bcd(tm->tm_sec);\r
 \r
        /* This chip expects the bits of each byte to be in reverse order */\r
+       for(i=0;i<7;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
        for (i = 0; i < 7; ++i)\r
                buf[i] = bitrev8(buf[i]);\r
-\r
+       for(i=0;i<7;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
        err = s35392a_set_reg(s35392a, S35392A_CMD_TIME1, buf, sizeof(buf));\r
 \r
        return err;\r
@@ -232,11 +238,13 @@ static int s35392a_get_datetime(struct i2c_client *client, struct rtc_time *tm)
        err = s35392a_get_reg(s35392a, S35392A_CMD_TIME1, buf, sizeof(buf));\r
        if (err < 0)\r
                return err;\r
-\r
+       for(i=0;i<7;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
        /* This chip returns the bits of each byte in reverse order */\r
        for (i = 0; i < 7; ++i)\r
                buf[i] = bitrev8(buf[i]);\r
-\r
+       for(i=0;i<7;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
        tm->tm_sec = bcd2bin(buf[S35392A_BYTE_SECS]);\r
        tm->tm_min = bcd2bin(buf[S35392A_BYTE_MINS]);\r
        tm->tm_hour = s35392a_reg2hr(s35392a, buf[S35392A_BYTE_HOURS]);\r
@@ -246,22 +254,352 @@ static int s35392a_get_datetime(struct i2c_client *client, struct rtc_time *tm)
        tm->tm_year = bcd2bin(buf[S35392A_BYTE_YEAR]) + 100;\r
        //tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year);    \r
 \r
-       printk( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
+       DBG( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
                "mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec,\r
                tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year,\r
                tm->tm_wday);\r
 \r
        return rtc_valid_tm(tm);\r
 }\r
-static int s35392a_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm const *tm)\r
+static int s35392a_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm  *tm)\r
 {\r
-       struct s35392a *s35392a = i2c_get_clientdata(client);\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       char buf[3];\r
+       int i,err;\r
+       char data;\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);   \r
+       err = s35392a_get_reg(s35392a, S35392A_CMD_INT2, buf, sizeof(buf));\r
+       if(err < 0)\r
+               return err;\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        for(i = 0;i < 3;++i)\r
+                buf[i] = bitrev8(buf[i]);\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+       tm->time.tm_wday = -1;   \r
+       tm->time.tm_hour = -1;\r
+       tm->time.tm_min = -1;           \r
+\r
+       if(buf[S35392A_ALARM_WDAYS] & S35392A_ALARM_ENABLE )\r
+               tm->time.tm_wday = bcd2bin(buf[S35392A_ALARM_WDAYS] & S35392A_ALARM_DISABLE) ;\r
        \r
+       if(buf[S35392A_ALARM_HOURS] & S35392A_ALARM_ENABLE)\r
+               tm->time.tm_hour = s35392a_reg2hr(s35392a, buf[S35392A_ALARM_HOURS]);\r
+       \r
+       if(buf[S35392A_ALARM_MINS] & S35392A_ALARM_ENABLE)\r
+               tm->time.tm_min =  bcd2bin(buf[S35392A_ALARM_MINS] & S35392A_ALARM_DISABLE) ;\r
+       \r
+\r
+       tm->time.tm_year = -1;\r
+       tm->time.tm_mon = -1;\r
+       tm->time.tm_mday = -1;\r
+       tm->time.tm_yday = -1;\r
+       tm->time.tm_sec = -1;\r
+       \r
+       DBG( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
+               "mon=%d, year=%d, wday=%d\n", __func__, tm->time.tm_sec,\r
+               tm->time.tm_min, tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_mon, tm->time.tm_year,\r
+               tm->time.tm_wday);\r
+       s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+       tm->enabled = ((data & S35392A_MASK_INT2) == S35392A_INT2_ENABLE);\r
+       s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+       tm->pending = !!(data & S35392A_FLAG_INT2); \r
+       \r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);\r
+       return data;\r
 }\r
-static int s35392a_i2c_set_alarm(struct i2c_client *client, struct rtc_wkalrm const *tm)\r
+\r
+static int s35392a_i2c_set_alarm(struct i2c_client *client, struct rtc_wkalrm  *tm)\r
 {\r
-       struct s35392a *s35392a = i2c_get_clientdata(client);\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       char buf[3];\r
+       char data;\r
+       int i,err;\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);\r
+       DBG( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
+               "mon=%d, year=%d, wday=%d\n", __func__, tm->time.tm_sec,\r
+               tm->time.tm_min, tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_mon, tm->time.tm_year,\r
+               tm->time.tm_wday);\r
+       \r
+       buf[S35392A_ALARM_WDAYS] = tm->time.tm_wday>= 0 ? \r
+               (bin2bcd(tm->time.tm_wday) |S35392A_ALARM_ENABLE) : 0;  \r
+       buf[S35392A_ALARM_WDAYS]=0;\r
+       buf[S35392A_ALARM_HOURS] =  tm->time.tm_hour >=0 ?\r
+               s35392a_hour2reg(s35392a, tm->time.tm_hour) : 0;\r
+       buf[S35392A_ALARM_MINS] = tm->time.tm_min >= 0?\r
+               bin2bcd(tm->time.tm_min) | S35392A_ALARM_ENABLE:0;      \r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        for(i = 0;i < 3;++i)\r
+                buf[i] = bitrev8(buf[i]);\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        if(tm->enabled)\r
+        {\r
+               data = 0x00;\r
+                s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);       \r
+               s35392a_set_reg(s35392a, S35392A_CMD_INT2, &data, 1);\r
+\r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               //data =  (data |S35392A_FLAG_INT2AE) & 0x2;\r
+               data = 0x02;\r
+               s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);                \r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               printk("data = 0x%x\n",data);\r
+               err = s35392a_set_reg(s35392a, S35392A_CMD_INT2, buf, sizeof(buf));\r
+               return err;\r
+        }\r
+        else\r
+        {\r
+               //s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               //data &=  ~S35392A_FLAG_INT1AE;\r
+               //s35392a_set_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+        }\r
+        return -1;     \r
+       \r
+}\r
+static int s35392a_i2c_read_alarm0(struct i2c_client *client, struct rtc_wkalrm  *tm)\r
+{\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       char buf[3];\r
+       int i,err;\r
+       char data;\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);   \r
+       err = s35392a_get_reg(s35392a, S35392A_CMD_INT1, buf, sizeof(buf));\r
+       if(err < 0)\r
+               return err;\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        for(i = 0;i < 3;++i)\r
+                buf[i] = bitrev8(buf[i]);\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+       tm->time.tm_wday = -1;   \r
+       tm->time.tm_hour = -1;\r
+       tm->time.tm_min = -1;           \r
+\r
+       if(buf[S35392A_ALARM_WDAYS] & S35392A_ALARM_ENABLE )\r
+               tm->time.tm_wday = bcd2bin(buf[S35392A_ALARM_WDAYS] & S35392A_ALARM_DISABLE) ;\r
+       \r
+       if(buf[S35392A_ALARM_HOURS] & S35392A_ALARM_ENABLE)\r
+               tm->time.tm_hour = s35392a_reg2hr(s35392a, buf[S35392A_ALARM_HOURS]);\r
+       \r
+       if(buf[S35392A_ALARM_MINS] & S35392A_ALARM_ENABLE)\r
+               tm->time.tm_min =  bcd2bin(buf[S35392A_ALARM_MINS] & S35392A_ALARM_DISABLE) ;\r
+       \r
+\r
+       tm->time.tm_year = -1;\r
+       tm->time.tm_mon = -1;\r
+       tm->time.tm_mday = -1;\r
+       tm->time.tm_yday = -1;\r
+       tm->time.tm_sec = -1;\r
+       \r
+       DBG( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
+               "mon=%d, year=%d, wday=%d\n", __func__, tm->time.tm_sec,\r
+               tm->time.tm_min, tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_mon, tm->time.tm_year,\r
+               tm->time.tm_wday);\r
+       s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+       tm->enabled = ((data & S35392A_MASK_INT1) == S35392A_INT1_ENABLE);\r
+       s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+       tm->pending = !!(data & S35392A_FLAG_INT1); \r
+       \r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);\r
+       return data;\r
+}\r
+\r
+static int s35392a_i2c_set_alarm0(struct i2c_client *client, struct rtc_wkalrm  *tm)\r
+{\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       char buf[3];\r
+       char data;\r
+       int i,err;\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);\r
+       DBG( "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, "\r
+               "mon=%d, year=%d, wday=%d\n", __func__, tm->time.tm_sec,\r
+               tm->time.tm_min, tm->time.tm_hour, tm->time.tm_mday, tm->time.tm_mon, tm->time.tm_year,\r
+               tm->time.tm_wday);\r
+       \r
+       //buf[S35392A_ALARM_WDAYS] = tm->time.tm_wday>= 0 ? \r
+       //      (bin2bcd(tm->time.tm_wday) |S35392A_ALARM_ENABLE) : 0;  \r
+       buf[S35392A_ALARM_WDAYS]=0;\r
+       buf[S35392A_ALARM_HOURS] =  tm->time.tm_hour >=0 ?\r
+               s35392a_hour2reg(s35392a, tm->time.tm_hour) : 0;\r
+       buf[S35392A_ALARM_MINS] = tm->time.tm_min >= 0?\r
+               bin2bcd(tm->time.tm_min) | S35392A_ALARM_ENABLE:0;      \r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        for(i = 0;i < 3;++i)\r
+                buf[i] = bitrev8(buf[i]);\r
+       for(i=0;i<3;i++)\r
+               printk("buf[%d]=0x%x\n",i,buf[i]);\r
+        if(tm->enabled)\r
+        {\r
+               data = 0x00;\r
+                s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);       \r
+               s35392a_set_reg(s35392a, S35392A_CMD_INT2, &data, 1);\r
+\r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               //ta =  (data |S35392A_FLAG_INT1AE) & 0x20;\r
+               data = 0x02;\r
+               s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);                \r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               printk("data = 0x%x\n",data);\r
+               err = s35392a_set_reg(s35392a, S35392A_CMD_INT1, buf, sizeof(buf));\r
+               return err;\r
+        }\r
+        else\r
+        {\r
+               //s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               //data &=  ~S35392A_FLAG_INT1AE;\r
+               //s35392a_set_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+        }\r
+        return -1;     \r
+       \r
+}\r
+static void s35392a_alarm_test(struct i2c_client *client ,struct rtc_time rtc_alarm_rtc_time)\r
+{\r
+       struct rtc_wkalrm rtc_alarm,tm; \r
+       char data;\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);   \r
+       \r
+       rtc_alarm.time.tm_sec = rtc_alarm_rtc_time.tm_sec;\r
+       rtc_alarm.time.tm_min = (rtc_alarm_rtc_time.tm_min + 1) % 60;\r
+       if((rtc_alarm.time.tm_min + 2)/60 > 0)\r
+               rtc_alarm.time.tm_hour = rtc_alarm_rtc_time.tm_hour+1;\r
+       else    \r
+               rtc_alarm.time.tm_hour = rtc_alarm_rtc_time.tm_hour;\r
+       if(rtc_alarm.time.tm_hour >24)\r
+       rtc_alarm.time.tm_hour =24;\r
+       rtc_alarm.time.tm_mday = rtc_alarm_rtc_time.tm_mday;\r
+       rtc_alarm.time.tm_mon = rtc_alarm_rtc_time.tm_mon;\r
+       rtc_alarm.time.tm_year = rtc_alarm_rtc_time.tm_year;\r
+       rtc_alarm.time.tm_wday = rtc_alarm_rtc_time.tm_wday;\r
+       rtc_alarm.time.tm_yday = rtc_alarm_rtc_time.tm_yday;\r
+       rtc_alarm.enabled = 1;  \r
+       DBG("set alarm  - rtc %02d:%02d:%02d %02d/%02d/%04d week=%02d\n",\r
+                               rtc_alarm.time.tm_hour, rtc_alarm.time.tm_min,\r
+                               rtc_alarm.time.tm_sec, rtc_alarm.time.tm_mon + 1,\r
+                               rtc_alarm.time.tm_mday, rtc_alarm.time.tm_year + 1900,rtc_alarm.time.tm_wday);\r
+       s35392a_i2c_set_alarm(client,&rtc_alarm);       \r
+       data = s35392a_i2c_read_alarm(client,&tm);\r
+       DBG("set alarm  - rtc %02d:%02d:%02d %02d/%02d/%04d week=%02d\n",\r
+                               tm.time.tm_hour, tm.time.tm_min,\r
+                               tm.time.tm_sec, tm.time.tm_mon + 1,\r
+                               tm.time.tm_mday, tm.time.tm_year + 1900,tm.time.tm_wday);\r
+       \r
+       DBG("------------------first-------------------------0x%0x, 0x%0x\n",data, data&S35392A_FLAG_INT2);\r
+       do\r
+       {         \r
+               msleep(10000);\r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               DBG("-----------------------------------------------0x%0x\n",data); \r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+               DBG("-----------------------------------------------0x%0x\n",data);\r
+    }while((data & S35392A_FLAG_INT2) == 0);\r
+       \r
+    msleep(20000);\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+    DBG("--------------------last-------------------------0x%0x\n",data);\r
+    data=0x00;\r
+    s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+}\r
+\r
+static void s35392a_alarm_test0(struct i2c_client *client ,struct rtc_time rtc_alarm_rtc_time)\r
+{\r
+       struct rtc_wkalrm rtc_alarm,tm; \r
+       char data;\r
+       struct s35392a  *s35392a = i2c_get_clientdata(client);\r
+       DBG("%s:%d\n",__FUNCTION__,__LINE__);   \r
+       \r
+       rtc_alarm.time.tm_sec = rtc_alarm_rtc_time.tm_sec;\r
+       rtc_alarm.time.tm_min = (rtc_alarm_rtc_time.tm_min + 3) % 60;\r
+       if((rtc_alarm.time.tm_min + 3)/60 > 0)\r
+               rtc_alarm.time.tm_hour = rtc_alarm_rtc_time.tm_hour+1;                  \r
+       else    \r
+               rtc_alarm.time.tm_hour = rtc_alarm_rtc_time.tm_hour;\r
+       if(rtc_alarm.time.tm_hour >24)\r
+       rtc_alarm.time.tm_hour =24;\r
+       rtc_alarm.time.tm_mday = rtc_alarm_rtc_time.tm_mday;\r
+       rtc_alarm.time.tm_mon = rtc_alarm_rtc_time.tm_mon;\r
+       rtc_alarm.time.tm_year = rtc_alarm_rtc_time.tm_year;\r
+       rtc_alarm.time.tm_wday = rtc_alarm_rtc_time.tm_wday;\r
+       rtc_alarm.time.tm_yday = rtc_alarm_rtc_time.tm_yday;\r
+       rtc_alarm.enabled = 1;  \r
+       DBG("set alarm  - rtc %02d:%02d:%02d %02d/%02d/%04d week=%02d\n",\r
+                               rtc_alarm.time.tm_hour, rtc_alarm.time.tm_min,\r
+                               rtc_alarm.time.tm_sec, rtc_alarm.time.tm_mon + 1,\r
+                               rtc_alarm.time.tm_mday, rtc_alarm.time.tm_year + 1900,rtc_alarm.time.tm_wday);\r
+       s35392a_i2c_set_alarm0(client,&rtc_alarm);      \r
+       data = s35392a_i2c_read_alarm0(client,&tm);\r
+       DBG("set alarm  - rtc %02d:%02d:%02d %02d/%02d/%04d week=%02d\n",\r
+                               tm.time.tm_hour, tm.time.tm_min,\r
+                               tm.time.tm_sec, tm.time.tm_mon + 1,\r
+                               tm.time.tm_mday, tm.time.tm_year + 1900,tm.time.tm_wday);\r
+       \r
+       DBG("------------------first-------------------------0x%0x, 0x%0x\n",data, data&S35392A_FLAG_INT1);\r
+       do\r
+       {         \r
+               msleep(10000);\r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+               DBG("-----------------------------------------------0x%0x\n",data); \r
+               s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+               DBG("-----------------------------------------------0x%0x\n",data);\r
+               \r
+    }while((data & S35392A_FLAG_INT1) == 0);\r
+     msleep(10000);\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+    DBG("--------------------last-------------------------0x%0x\n",data);\r
+    data=0x00;\r
+    s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, &data, 1);\r
+  \r
+}\r
+\r
+static int s35392a_set_init_time(struct s35392a *s35392a)\r
+{      \r
+       struct rtc_time *tm;\r
+       struct i2c_client *client = s35392a->client;\r
+       tm->tm_year = 110;\r
+       tm->tm_mon      = 8;\r
+       tm->tm_mday = 8;\r
+       tm->tm_wday      = 0;\r
+       tm->tm_hour = 8;\r
+       tm->tm_min = 8;\r
+       tm->tm_sec = 8; \r
+       s35392a_set_datetime(client, tm);\r
+       return 0;\r
+}\r
+static int s35392a_reset(struct s35392a *s35392a)\r
+{\r
+       char buf[1];\r
        \r
+       if (s35392a_get_reg(s35392a, S35392A_CMD_STATUS1, buf, sizeof(buf)) < 0)\r
+               return -EIO;    \r
+       if (!(buf[0] & (S35392A_FLAG_POC | S35392A_FLAG_BLD)))\r
+               return 0;\r
+\r
+       buf[0] |= (S35392A_FLAG_RESET | S35392A_FLAG_24H);\r
+       buf[0] &= 0xf0;\r
+       s35392a_set_reg(s35392a, S35392A_CMD_STATUS1, buf, sizeof(buf));\r
+       //s35392a_set_init_time( s35392a);      \r
+       return 0;               \r
+}\r
+\r
+static int s35392a_disable_test_mode(struct s35392a *s35392a)\r
+{\r
+       char buf[1];\r
+\r
+       if (s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, buf, sizeof(buf)) < 0)\r
+               return -EIO;\r
+\r
+       if (!(buf[0] & S35392A_FLAG_TEST))\r
+               return 0;\r
+\r
+       buf[0] &= ~S35392A_FLAG_TEST;\r
+       return s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, buf, sizeof(buf));\r
 }\r
 static int s35392a_rtc_read_time(struct device *dev, struct rtc_time *tm)\r
 {\r
@@ -285,29 +623,29 @@ static int s35392a_i2c_open_alarm(struct i2c_client *client )
 {\r
        u8 data;\r
        struct s35392a *s35392a = i2c_get_clientdata(client);\r
-       \r
+       DBG("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        s35392a_get_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
-       data = (data |S35392A_FLAG_INT1AE) & 0x3F;\r
+       data = (data |S35392A_FLAG_INT2AE) & 0x02;\r
        s35392a_set_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
-\r
+       DBG("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        return 0;\r
 }\r
 static int s35392a_i2c_close_alarm(struct i2c_client *client )\r
 {\r
        u8 data;\r
        struct s35392a *s35392a = i2c_get_clientdata(client);\r
-       \r
+       DBG("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        s35392a_get_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
-       data &=  ~S35392A_FLAG_INT1AE;\r
+       data &=  ~S35392A_FLAG_INT2AE;\r
        s35392a_set_reg( s35392a, S35392A_CMD_STATUS2, &data, 1);\r
-\r
+       DBG("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        return 0;\r
 }\r
 \r
 static int s35392a_rtc_ioctl(struct device *dev,unsigned int cmd,unsigned long arg)\r
 {\r
        struct i2c_client *client = to_i2c_client(dev);\r
-       \r
+       DBG("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        switch(cmd)\r
        {\r
                case RTC_AIE_OFF:\r
@@ -325,7 +663,7 @@ static int s35392a_rtc_ioctl(struct device *dev,unsigned int cmd,unsigned long a
 err:\r
        return -EIO;\r
 }\r
-static int  s35392_rtc_proc(struct device *dev, unsigned int cmd, unsigned long arg)\r
+static int  s35392a_rtc_proc(struct device *dev, unsigned int cmd, unsigned long arg)\r
 {\r
        return 0;\r
 }\r
@@ -336,11 +674,91 @@ static const struct rtc_class_ops s35392a_rtc_ops = {
        .read_alarm    = s35392a_rtc_read_alarm,\r
        .set_alarm      = s35392a_rtc_set_alarm,\r
        .ioctl               = s35392a_rtc_ioctl,\r
-       .proc               = s35392_rtc_proc\r
+       .proc               = s35392a_rtc_proc\r
+};\r
+\r
+\r
+\r
+#if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)\r
+static ssize_t  s35392a_sysfs_show_flags(struct device *dev,\r
+                               struct device_attribute *attr, char *buf)\r
+{\r
+       DBG("\n@@@@@@@@@@@s35392a_sysfs_show_flags@@@@@@@@@@@@@\n");\r
+       \r
+               return -EIO;\r
+\r
+}\r
+static DEVICE_ATTR(flags, S_IRUGO,  s35392a_sysfs_show_flags, NULL);\r
+\r
+static ssize_t  s35392a_sysfs_show_sqwfreq(struct device *dev,\r
+                               struct device_attribute *attr, char *buf)\r
+{\r
+       DBG("\n@@@@@@@@@@@ s35392a_sysfs_show_sqwfreq@@@@@@@@@@@@@\n");\r
+       struct i2c_client *client = to_i2c_client(dev);\r
+       return 0;\r
+}\r
+static ssize_t s35392a_sysfs_set_sqwfreq(struct device *dev,\r
+                               struct device_attribute *attr,\r
+                               const char *buf, size_t count)\r
+{\r
+       DBG("\n@@@@@@@@@@@s35392a_sysfs_set_sqwfreq@@@@@@@@@@@@@\n");\r
+       \r
+       return count;\r
+}\r
+static DEVICE_ATTR(sqwfreq, S_IRUGO | S_IWUSR,\r
+                  s35392a_sysfs_show_sqwfreq, s35392a_sysfs_set_sqwfreq);\r
+\r
+static struct attribute *attrs[] = {\r
+       &dev_attr_flags.attr,\r
+       &dev_attr_sqwfreq.attr,\r
+       NULL,\r
+};\r
+static struct attribute_group attr_group = {\r
+       .attrs = attrs,\r
 };\r
+static int  s35392a_sysfs_register(struct device *dev)\r
+{\r
+       DBG("\n@@@@@@@@@@@s35392a_sysfs_register@@@@@@@@@@@@@\n");\r
+       return sysfs_create_group(&dev->kobj, &attr_group);\r
+       \r
+}\r
+#else\r
+static int  s35392a_sysfs_register(struct device *dev)\r
+{\r
+       DBG("\n@@@@@@@@@@@s35392a_sysfs_register@@@@@@@@@@@@@\n");\r
+       return 0;\r
+       \r
+}\r
+#endif \r
 \r
 static struct i2c_driver s35392a_driver;\r
 \r
+static void s35392a_work_func(struct work_struct *work)\r
+{\r
+       struct s35392a *s35392a = container_of(work, struct s35392a, work);\r
+       struct i2c_client *client = s35392a->client;\r
+    \r
+       printk("\n@@@@@@@@@@@rtc_wakeup_irq@@@@@@@@@@@@@\n");\r
+       \r
+       char data = 0x00;\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+    data = 0x00;\r
+    s35392a_set_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+    s35392a_get_reg(s35392a, S35392A_CMD_STATUS2, &data, 1);\r
+    \r
+       printk("\n@@@@@@@@@@@rtc_wakeup_irq@@@@@@@@@@@@@\n");   \r
+               \r
+       enable_irq(client->irq);                \r
+}\r
+\r
+static void s35392a_wakeup_irq(int irq, void *dev_id)\r
+{       \r
+       struct s35392a *s35392a = (struct s35392a *)dev_id;\r
+\r
+    disable_irq_nosync(irq);\r
+    schedule_work(&s35392a->work);\r
+}\r
+\r
 static int s35392a_probe(struct i2c_client *client,\r
                         const struct i2c_device_id *id)\r
 {\r
@@ -349,6 +767,7 @@ static int s35392a_probe(struct i2c_client *client,
        struct s35392a *s35392a;\r
        struct rtc_time tm;\r
        char buf[1];\r
+       \r
        printk("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {\r
                err = -ENODEV;\r
@@ -389,14 +808,48 @@ static int s35392a_probe(struct i2c_client *client,
 \r
        if (s35392a_get_datetime(client, &tm) < 0)\r
                dev_warn(&client->dev, "clock needs to be set\n");\r
-\r
+               \r
        s35392a->rtc = rtc_device_register(s35392a_driver.driver.name,\r
                                &client->dev, &s35392a_rtc_ops, THIS_MODULE);\r
-\r
+       \r
        if (IS_ERR(s35392a->rtc)) {\r
                err = PTR_ERR(s35392a->rtc);\r
                goto exit_dummy;\r
        }\r
+       err = s35392a_sysfs_register(&client->dev);\r
+       if(err)\r
+       {\r
+               dev_err(&client->dev, "error sysfs register\n");\r
+               goto exit_dummy;\r
+       }\r
+       \r
+       if(err = gpio_request(RTC_S35392A_INT, "rtc gpio"))\r
+       {\r
+               dev_err(&client->dev, "gpio request fail\n");\r
+               gpio_free(RTC_S35392A_INT);\r
+               goto exit_dummy;\r
+       }\r
+\r
+       gpio_pull_updown(RTC_S35392A_INT,GPIOPullDown);\r
+       \r
+       if(err = request_irq(gpio_to_irq(RTC_S35392A_INT),s35392a_wakeup_irq,IRQF_TRIGGER_HIGH,NULL,s35392a) <0)        \r
+       {\r
+               printk("unable to request rtc irq\n");\r
+               goto exit_dummy;\r
+       }       \r
+       \r
+       INIT_WORK(&s35392a->work, s35392a_work_func);\r
+       \r
+#if 0 //S35392_TEST\r
+       //i=2;\r
+       while(1)\r
+       {\r
+               s35392a_get_datetime(client, &tm);\r
+               s35392a_alarm_test(client, tm);\r
+               //sleep(200);\r
+       }\r
+#endif\r
+       \r
        printk("@@@@@%s:%d@@@@@\n",__FUNCTION__,__LINE__);\r
        return 0;\r
 \r
index 079df16313d98220cdb53b95b2192b8e54bf1206..4d57e1cc7ea7aed0cc5f6edd31564de1669122cf 100755 (executable)
 #define S35392A_BYTE_MINS              5\r
 #define S35392A_BYTE_SECS              6\r
 \r
+#define S35392A_ALARM_WDAYS    0\r
+#define S35392A_ALARM_HOURS    1\r
+#define S35392A_ALARM_MINS     2\r
+\r
 #define S35392A_FLAG_POC               0x01\r
 #define S35392A_FLAG_BLD               0x02\r
-#define S35392A_FLAG_INT2      0x04\r
-#define S35392A_FLAG_INT1      0x08\r
+#define S35392A_FLAG_INT2              0x04\r
+#define S35392A_FLAG_INT1              0x08\r
 #define S35392A_FLAG_24H               0x40\r
 \r
 #define S35392A_FLAG_TEST              0x01\r
 #define S35392A_FLAG_INT1AE      0x20\r
 #define S35392A_FLAG_RESET             0x80\r
+#define S35392A_FLAG_INT2AE      0x2\r
 \r
-\r
+#define S35392A_ALARM_ENABLE   0X80\r
+#define S35392A_ALARM_DISABLE  0X7F\r
+#define S35392A_MASK_INT1         0XE0\r
+#define S35392A_INT1_ENABLE      0X20\r
+#define S35392A_MASK_INT2         0X0E\r
+#define S35392A_INT2_ENABLE      0X02\r
 \r
 //#define S35392_STATUS_INT1       (~(0x3<<5))\r
 //#define S35392_STATUS_INT2       (~(0x3<<1))\r