phonepad:modify usb1.1 host -71 error
author赵子初 <zzc@rock-chips.com>
Tue, 6 Mar 2012 08:51:21 +0000 (16:51 +0800)
committer赵子初 <zzc@rock-chips.com>
Tue, 6 Mar 2012 08:51:21 +0000 (16:51 +0800)
arch/arm/mach-rk29/board-rk29phonepadsdk.c
drivers/misc/mu509.c
drivers/usb/serial/option.c
include/linux/mu509.h

index 169cc5ba8bc2019e03f0ff5a3bc22d44946fd77b..128e483b3bc21dbeb5fcdb45ec313bfab569da3a 100755 (executable)
@@ -1831,6 +1831,7 @@ static int mu509_io_deinit(void)
 struct rk29_mu509_data rk29_mu509_info = {
        .io_init = mu509_io_init,
        .io_deinit = mu509_io_deinit,
+       .modem_power_en = RK29_PIN6_PC2,
        .bp_power = RK29_PIN6_PB1,//RK29_PIN0_PB4,
        .bp_power_active_low = 1,
        .bp_reset = RK29_PIN6_PC7,//RK29_PIN0_PB3,
index c56e098eaec036556005822b1f0c8cb9c5b12d9d..7391fa636e8a435ae193c1526baa0da44dcf2f67 100755 (executable)
@@ -21,6 +21,7 @@
 #include <linux/workqueue.h>
 #include <linux/mu509.h>
 #include <linux/slab.h>
+#include <linux/earlysuspend.h>
 
 MODULE_LICENSE("GPL");
 
@@ -44,7 +45,7 @@ struct class *modem_class = NULL;
 static int do_wakeup_irq = 0;
 static int modem_status;
 static int online = 0;
-
+int suspend_int =0;
 static void ap_wakeup_bp(struct platform_device *pdev, int wake)
 {
        struct rk29_mu509_data *pdata = pdev->dev.platform_data;
@@ -56,8 +57,12 @@ extern void rk28_send_wakeup_key(void);
 
 static void do_wakeup(struct work_struct *work)
 {
-//    MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);
-    //rk28_send_wakeup_key();
+      if(suspend_int)
+         {
+             gpio_set_value(gpdata->ap_wakeup_bp, 0);
+             suspend_int = 0;
+         }
+
 }
 
 static DECLARE_DELAYED_WORK(wakeup_work, do_wakeup);
@@ -68,7 +73,7 @@ static irqreturn_t detect_irq_handler(int irq, void *dev_id)
         do_wakeup_irq = 0;
   //      MODEMDBG("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);
         wake_lock_timeout(&modem_wakelock, 10 * HZ);
-        schedule_delayed_work(&wakeup_work, HZ / 10);
+        schedule_delayed_work(&wakeup_work, 2*HZ);
     }
     return IRQ_HANDLED;
 }
@@ -209,6 +214,26 @@ static ssize_t online_write(struct class *cls, const char *_buf, size_t _count)
     return _count; 
 }
 static CLASS_ATTR(online, 0777, online_read, online_write);
+static void rk29_early_suspend(struct early_suspend *h)
+{
+        printk("*********************509____suspend\n");
+                
+}
+static void rk29_early_resume(struct early_suspend *h)
+{
+        if(suspend_int)
+       {
+         printk("***************509____resume\n");
+        gpio_set_value(gpdata->ap_wakeup_bp, 0);
+        suspend_int = 0;
+       }
+}
+
+static struct early_suspend mu509_early_suspend = {
+                .suspend = rk29_early_suspend,
+                 .resume = rk29_early_resume,
+                 .level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1,
+         };
 static int mu509_probe(struct platform_device *pdev)
 {
        struct rk29_mu509_data *pdata = gpdata = pdev->dev.platform_data;
@@ -219,9 +244,12 @@ static int mu509_probe(struct platform_device *pdev)
        pdata->dev = &pdev->dev;
        if(pdata->io_init)
                pdata->io_init();
+       gpio_set_value(pdata->modem_power_en, GPIO_HIGH);
+       msleep(1000);
        modem_poweron_off(1);
        modem_status = 1;
        
+       register_early_suspend(&mu509_early_suspend);
        mu509_data = kzalloc(sizeof(struct modem_dev), GFP_KERNEL);
        if(mu509_data == NULL)
        {
@@ -274,6 +302,7 @@ err2:
 
 int mu509_suspend(struct platform_device *pdev, pm_message_t state)
 {
+       suspend_int = 1;
        do_wakeup_irq = 1;
        //MODEMDBG("-------------%s\n",__FUNCTION__);
        if(!online)
@@ -286,8 +315,12 @@ int mu509_suspend(struct platform_device *pdev, pm_message_t state)
 int mu509_resume(struct platform_device *pdev)
 {
        //MODEMDBG("-------------%s\n",__FUNCTION__);
-       ap_wakeup_bp(pdev, 0);
+       //ap_wakeup_bp(pdev, 0);
        rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_UART0_RTS_N);
+       if(gpio_get_value(gpdata->bp_wakeup_ap))
+       {
+               schedule_delayed_work(&wakeup_work, 2*HZ);
+       }
        return 0;
 }
 
@@ -302,6 +335,7 @@ void mu509_shutdown(struct platform_device *pdev)
        if(pdata->io_deinit)
                pdata->io_deinit();
        cancel_work_sync(&mu509_data->work);
+       gpio_free(pdata->modem_power_en);
        gpio_free(pdata->bp_power);
        gpio_free(pdata->bp_reset);
        gpio_free(pdata->ap_wakeup_bp);
index 2fbdf8f68ce5e89d6192f81d1b994c8138b29d8d..c077022fe7decb1dfdd766c0de952ea6ce59d52a 100644 (file)
@@ -1338,11 +1338,13 @@ static void option_instat_callback(struct urb *urb)
        int status = urb->status;
        struct usb_serial_port *port =  urb->context;
        struct option_port_private *portdata = usb_get_serial_port_data(port);
+       static int err_times = 0;
 
        dbg("%s", __func__);
        dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata);
 
        if (status == 0) {
+               err_times = 0;
                struct usb_ctrlrequest *req_pkt =
                                (struct usb_ctrlrequest *)urb->transfer_buffer;
 
@@ -1376,9 +1378,17 @@ static void option_instat_callback(struct urb *urb)
                        dbg("%s: type %x req %x", __func__,
                                req_pkt->bRequestType, req_pkt->bRequest);
                }
-       } else
-               err("%s: error %d", __func__, status);
-
+       }
+       else{
+               if(status == -EPROTO && err_times++ >10){
+                       err_times = 0;
+                       printk("%s,recieve -71 error more than 10 times,so reset usb\n",__FUNCTION__);
+                       usb_queue_reset_device(port->serial->interface);
+                       return;
+               }else           
+                       err("%s : error %d",__func__, status);
+       }
+       
        /* Resubmit urb so we continue receiving IRQ data */
        if (status != -ESHUTDOWN && status != -ENOENT) {
                err = usb_submit_urb(urb, GFP_ATOMIC);
index 0c69ff84e0f7910e3daa0a890871951169e2d5d3..431461037f968fea9b67467fb34b4b5b83a68c6c 100644 (file)
@@ -20,6 +20,7 @@ struct rk29_mu509_data {
        unsigned int bp_reset_active_low;
        unsigned int bp_wakeup_ap;
        unsigned int ap_wakeup_bp;
+       unsigned int modem_power_en;
 };
 
 #define MODEM_NAME "mu509"