Преглед изворни кода

修复切换usb模式小概率不成功的问题

huangliang пре 7 месеци
родитељ
комит
91f4b07c24
1 измењених фајлова са 13 додато и 0 уклоњено
  1. 13 0
      linux/drivers/usb/musb/musb_ark.c

+ 13 - 0
linux/drivers/usb/musb/musb_ark.c

@@ -422,6 +422,12 @@ static int ark_musb_set_mode(struct musb *musb, u8 mode)
 			
 			regval = musb_readb(musb->mregs, MUSB_INTRUSBE); 
 			musb_writeb(musb->mregs, MUSB_INTRUSBE, regval | MUSB_INTR_SUSPEND);
+			if (musb->is_runtime_suspended) {
+				printk("%s:%d suspend save\n", __func__, __LINE__);
+				musb->context.power = musb_readb(musb->mregs, MUSB_POWER);
+				musb->context.intrusbe = musb_readb(musb->mregs, MUSB_INTRUSBE);
+				musb->context.devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
+			}
 			break;
 		case MUSB_OTG:
 			dev_info(musb->controller, "+++Switch OTG %d  %d===+++ \n", gpio_id, gpio_pwr);
@@ -451,6 +457,13 @@ static int ark_musb_set_mode(struct musb *musb, u8 mode)
 				mdelay(10);
 				gpio_set_value(gpio_pwr, 1);
 			}
+
+			if (musb->is_runtime_suspended) {
+				printk("%s:%d suspend save\n", __func__, __LINE__);
+				musb->context.power = musb_readb(musb->mregs, MUSB_POWER);
+				musb->context.intrusbe = musb_readb(musb->mregs, MUSB_INTRUSBE);
+				musb->context.devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
+			}
 			break;
 		default:
 			dev_err(glue->dev, "unsupported mode %d\n", mode);