add ac detec and gps power control function
author蔡枫 <cf@rock-chips.com>
Mon, 4 Jul 2011 12:27:38 +0000 (20:27 +0800)
committer蔡枫 <cf@rock-chips.com>
Mon, 4 Jul 2011 12:27:38 +0000 (20:27 +0800)
arch/arm/mach-rk29/board-rk29-newton.c
drivers/misc/newton.c

index 190070164d7ad289e2b42e1d7d0e7e2828fbd35a..cfc0a314d53bda707c968cb66a7eb904a9fb66bf 100755 (executable)
@@ -516,25 +516,6 @@ static struct mma8452_platform_data mma8452_info = {
 };
 #endif
 
-#if defined (CONFIG_BATTERY_BQ27510)
-#define        DC_CHECK_PIN    RK29_PIN4_PA1
-#define        LI_LION_BAT_NUM 2
-static int bq27510_init_dc_check_pin(void){    
-       if(gpio_request(DC_CHECK_PIN,"dc_check") != 0){      
-               gpio_free(DC_CHECK_PIN);      
-               printk("bq27510 init dc check pin request error\n");      
-               return -EIO;    
-       }       
-       gpio_direction_input(DC_CHECK_PIN);     
-       return 0;
-}
-
-struct bq27510_platform_data bq27510_info = {  
-       .init_dc_check_pin = bq27510_init_dc_check_pin, 
-       .dc_check_pin =  DC_CHECK_PIN,          
-       .bat_num = LI_LION_BAT_NUM,
-};
-#endif
 
 
 /*****************************************************************************************
@@ -723,14 +704,6 @@ static struct i2c_board_info __initdata board_i2c0_devices[] = {
                .flags                  = 0,
        },
 #endif
-#if defined (CONFIG_BATTERY_BQ27510)
-       {
-               .type                   = "bq27510",
-               .addr           = 0x55,
-               .flags                  = 0,
-               .platform_data  = &bq27510_info,
-       },
-#endif
 #if defined (CONFIG_RTC_HYM8563)
        {
                .type                   = "rtc_hym8563",
index c8853bbcb64d10a4f0fa13c7acaa5b6e009040c7..a04288d7173c88cab43817c08930cf855e62b5c6 100755 (executable)
 \r
 \r
 \r
-\r
+#define NEWTON_DEV              "newton:"\r
 #if 1\r
-#define DBG(x...)      printk(KERN_INFO x)\r
+#define DBG(x...)      printk(KERN_INFO NEWTON_DEV x)\r
 #else\r
 #define DBG(x...)\r
 #endif\r
 \r
 \r
-#define NEWTON_GPIO_R     RK29_PIN4_PB0\r
-#define NEWTON_GPIO_G     RK29_PIN4_PB1\r
-#define NEWTON_GPIO_B     RK29_PIN4_PB2\r
-#define NEWTON_GET_UID    0x6001\r
+#define NEWTON_GPIO_R            RK29_PIN4_PB0\r
+#define NEWTON_GPIO_G            RK29_PIN4_PB1\r
+#define NEWTON_GPIO_B            RK29_PIN4_PB2\r
+#define NEWTON_GPIO_AC_DETEC     RK29_PIN4_PA1\r
+#define NEWTON_GPIO_GPS_PWR      RK29_PIN6_PB2\r
+#define NEWTON_GET_UID           0x6001\r
+#define NEWTON_AC_DETEC          0x6002\r
+#define NEWTON_GPS_CTRL          0x6003\r
 typedef struct{\r
 uint16_t SN_Size;              //0-1\r
 char SN[30];                   //2-31\r
@@ -42,7 +46,7 @@ char BlueTooth[6];            //499-504
 char Mac_Size;                 //505\r
 char Mac_Data[6];              //506-511\r
 }IdbSector3;\r
-static int led_state = 0;\r
+int gps_power = 0;\r
 char GetSNSectorInfo(char * pbuf);\r
 \r
 int newton_print_buf(char *buf,int size)\r
@@ -68,8 +72,30 @@ int newton_print_buf(char *buf,int size)
                printk("0x%02x ",*pbuf);\r
                pbuf++;\r
        }\r
+       return 0;\r
+}\r
+\r
+\r
+int rk29_newton_get_ac_status()\r
+{\r
+       int ac_status = 0;      \r
+\r
+       gpio_direction_input(NEWTON_GPIO_AC_DETEC);\r
+       ac_status = gpio_get_value(NEWTON_GPIO_AC_DETEC);\r
+       DBG("%s:NEWTON_GPIO_AC_DETEC = %d\n",__FUNCTION__,ac_status);\r
+       return ac_status;\r
+}\r
+\r
+\r
+int rk29_newton_set_gps_power(int value)\r
+{\r
+    DBG("%s:value = %d\n",__FUNCTION__,value);\r
+    gpio_direction_output(NEWTON_GPIO_GPS_PWR, 0);\r
+       gpio_set_value(NEWTON_GPIO_GPS_PWR,value);\r
+       return 0;\r
 }\r
 \r
+\r
 int rk29_newton_open(struct inode *inode, struct file *filp)\r
 {\r
     DBG("%s\n",__FUNCTION__);\r
@@ -84,26 +110,48 @@ ssize_t rk29_newton_read(struct file *filp, char __user *ptr, size_t size, loff_
 \r
 ssize_t rk29_newton_write(struct file *filp, char __user *ptr, size_t size, loff_t *pos)\r
 {\r
+    DBG("%s\n",__FUNCTION__);\r
     return sizeof(int);\r
 }\r
 \r
 int rk29_newton_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)\r
 {\r
-       int ret = 0;\r
     void __user *argp = (void __user *)arg;\r
-    DBG("%s\n",__FUNCTION__);\r
+    //DBG("%s\n",__FUNCTION__);\r
        \r
     switch(cmd)\r
     {\r
     case NEWTON_GET_UID:\r
                {\r
                        IdbSector3 sn;\r
+                       DBG("%s:NEWTON_GET_UID\n",__FUNCTION__);\r
                        memset(&sn,0,sizeof(IdbSector3));\r
-                       GetSNSectorInfo(&sn);\r
+                       GetSNSectorInfo((char*)&sn);\r
                        //newton_print_buf(&sn.UID_Data, sizeof(sn.UID_Data));\r
             if(copy_to_user(argp, &sn.UID_Data, sizeof(sn.UID_Data)))  return -EFAULT;\r
        }\r
                break;\r
+       case NEWTON_AC_DETEC:\r
+               {\r
+                       int ac_status = rk29_newton_get_ac_status();\r
+                       if(copy_to_user(argp, &ac_status, 4))  return -EFAULT;\r
+               }\r
+               break;\r
+       case NEWTON_GPS_CTRL:\r
+               {\r
+                       int value = 0;\r
+                       if(copy_from_user(&value, (void*)arg, 4)){\r
+                               DBG("%s:NEWTON_GPS_CTRL,copy_from_user error\n",__FUNCTION__);\r
+                           return -EFAULT;\r
+                       }\r
+                       if((value != 0) && (value != 1)){\r
+                               DBG("%s:NEWTON_GPS_CTRL,parameter error,value = %d\n",__FUNCTION__,value);\r
+                           return -EFAULT;\r
+                       }\r
+                       gps_power = value;\r
+                       rk29_newton_set_gps_power(value);\r
+               }\r
+               break;\r
        default:\r
                break;\r
        }\r
@@ -149,34 +197,18 @@ static int rk29_newton_probe(struct platform_device *pdev)
                printk("rk29 newton register err!\n");\r
                return ret;\r
        }\r
-#if 0\r
-    if(gpio_request(NEWTON_GPIO_R,NULL) != 0){\r
-      gpio_free(NEWTON_GPIO_R);\r
-      printk("rk29_newton_probe gpio_request NEWTON_GPIO_R error\n");\r
-      return -EIO;\r
-    }\r
-       \r
-    if(gpio_request(NEWTON_GPIO_G,NULL) != 0){\r
-      gpio_free(NEWTON_GPIO_G);\r
-      printk("rk29_newton_probe gpio_request NEWTON_GPIO_G error\n");\r
-      return -EIO;\r
-    }\r
-       \r
-    if(gpio_request(NEWTON_GPIO_B,NULL) != 0){\r
-      gpio_free(NEWTON_GPIO_B);\r
-      printk("rk29_newton_probe gpio_request NEWTON_GPIO_B error\n");\r
-      return -EIO;\r
-    }\r
-       \r
-    gpio_direction_output(NEWTON_GPIO_R, 0);\r
-       gpio_set_value(NEWTON_GPIO_R,GPIO_LOW);\r
-       gpio_direction_output(NEWTON_GPIO_G, 0);\r
-       gpio_set_value(NEWTON_GPIO_G,GPIO_LOW);\r
-       gpio_direction_output(NEWTON_GPIO_B, 0);\r
-       gpio_set_value(NEWTON_GPIO_B,GPIO_LOW);\r
-#endif\r
+       if(gpio_request(NEWTON_GPIO_GPS_PWR,NULL) != 0){\r
+         gpio_free(NEWTON_GPIO_GPS_PWR);\r
+         printk("gpio_request NEWTON_GPIO_GPS_PWR error\n");\r
+         return -EIO;\r
+       }\r
+       if(gpio_request(NEWTON_GPIO_AC_DETEC,NULL) != 0){\r
+         gpio_free(NEWTON_GPIO_AC_DETEC);\r
+         printk("gpio_request NEWTON_GPIO_AC_DETEC error\n");\r
+         return -EIO;\r
+       }\r
+       rk29_newton_set_gps_power(GPIO_LOW);\r
        DBG("%s:rk29 newton initialized\n",__FUNCTION__);\r
-\r
        return ret;\r
 }\r
 \r
@@ -189,11 +221,15 @@ static int rk29_newton_remove(struct platform_device *pdev)
 \r
 int rk29_newton_suspend(struct platform_device *pdev,  pm_message_t state)\r
 {\r
+       if(gps_power==GPIO_HIGH)\r
+               rk29_newton_set_gps_power(GPIO_LOW);\r
        return 0;       \r
 }\r
 \r
 int rk29_newton_resume(struct platform_device *pdev)\r
 {\r
+       if(gps_power==GPIO_HIGH)\r
+               rk29_newton_set_gps_power(gps_power);\r
        return 0;\r
 }\r
 \r