diff options
Diffstat (limited to 'drivers/usb/chipidea/core.c')
| -rw-r--r-- | drivers/usb/chipidea/core.c | 23 | 
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 2b18f5088ae4..a56f06368d14 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -514,7 +514,7 @@ int hw_device_reset(struct ci_hdrc *ci)  	return 0;  } -static irqreturn_t ci_irq(int irq, void *data) +static irqreturn_t ci_irq_handler(int irq, void *data)  {  	struct ci_hdrc *ci = data;  	irqreturn_t ret = IRQ_NONE; @@ -567,6 +567,15 @@ static irqreturn_t ci_irq(int irq, void *data)  	return ret;  } +static void ci_irq(struct ci_hdrc *ci) +{ +	unsigned long flags; + +	local_irq_save(flags); +	ci_irq_handler(ci->irq, ci); +	local_irq_restore(flags); +} +  static int ci_cable_notifier(struct notifier_block *nb, unsigned long event,  			     void *ptr)  { @@ -576,7 +585,7 @@ static int ci_cable_notifier(struct notifier_block *nb, unsigned long event,  	cbl->connected = event;  	cbl->changed = true; -	ci_irq(ci->irq, ci); +	ci_irq(ci);  	return NOTIFY_DONE;  } @@ -617,7 +626,7 @@ static int ci_usb_role_switch_set(struct usb_role_switch *sw,  	if (cable) {  		cable->changed = true;  		cable->connected = false; -		ci_irq(ci->irq, ci); +		ci_irq(ci);  		spin_unlock_irqrestore(&ci->lock, flags);  		if (ci->wq && role != USB_ROLE_NONE)  			flush_workqueue(ci->wq); @@ -635,7 +644,7 @@ static int ci_usb_role_switch_set(struct usb_role_switch *sw,  	if (cable) {  		cable->changed = true;  		cable->connected = true; -		ci_irq(ci->irq, ci); +		ci_irq(ci);  	}  	spin_unlock_irqrestore(&ci->lock, flags);  	pm_runtime_put_sync(ci->dev); @@ -1174,7 +1183,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)  		}  	} -	ret = devm_request_irq(dev, ci->irq, ci_irq, IRQF_SHARED, +	ret = devm_request_irq(dev, ci->irq, ci_irq_handler, IRQF_SHARED,  			ci->platdata->name, ci);  	if (ret)  		goto stop; @@ -1295,11 +1304,11 @@ static void ci_extcon_wakeup_int(struct ci_hdrc *ci)  	if (!IS_ERR(cable_id->edev) && ci->is_otg &&  		(otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) -		ci_irq(ci->irq, ci); +		ci_irq(ci);  	if (!IS_ERR(cable_vbus->edev) && ci->is_otg &&  		(otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) -		ci_irq(ci->irq, ci); +		ci_irq(ci);  }  static int ci_controller_resume(struct device *dev)  |