usb: otg: notifier: switch to atomic notifier
most of our notifications, will be called from IRQ context, so an atomic notifier suits the job better. Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
002eda1348
commit
cccad6d4b1
@ -212,7 +212,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
blocking_notifier_call_chain(&ab->otg.notifier, event, v);
|
atomic_notifier_call_chain(&ab->otg.notifier, event, v);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -281,7 +281,7 @@ static int ab8500_usb_set_power(struct otg_transceiver *otg, unsigned mA)
|
|||||||
ab->vbus_draw = mA;
|
ab->vbus_draw = mA;
|
||||||
|
|
||||||
if (mA)
|
if (mA)
|
||||||
blocking_notifier_call_chain(&ab->otg.notifier,
|
atomic_notifier_call_chain(&ab->otg.notifier,
|
||||||
USB_EVENT_ENUMERATED, ab->otg.gadget);
|
USB_EVENT_ENUMERATED, ab->otg.gadget);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -500,7 +500,7 @@ static int __devinit ab8500_usb_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
platform_set_drvdata(pdev, ab);
|
platform_set_drvdata(pdev, ab);
|
||||||
|
|
||||||
BLOCKING_INIT_NOTIFIER_HEAD(&ab->otg.notifier);
|
ATOMIC_INIT_NOTIFIER_HEAD(&ab->otg.notifier);
|
||||||
|
|
||||||
/* v1: Wait for link status to become stable.
|
/* v1: Wait for link status to become stable.
|
||||||
* all: Updates form set_host and set_peripheral as they are atomic.
|
* all: Updates form set_host and set_peripheral as they are atomic.
|
||||||
|
@ -132,7 +132,7 @@ static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
platform_set_drvdata(pdev, nop);
|
platform_set_drvdata(pdev, nop);
|
||||||
|
|
||||||
BLOCKING_INIT_NOTIFIER_HEAD(&nop->otg.notifier);
|
ATOMIC_INIT_NOTIFIER_HEAD(&nop->otg.notifier);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
exit:
|
exit:
|
||||||
|
@ -512,7 +512,7 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
|
|||||||
else
|
else
|
||||||
twl4030_phy_resume(twl);
|
twl4030_phy_resume(twl);
|
||||||
|
|
||||||
blocking_notifier_call_chain(&twl->otg.notifier, status,
|
atomic_notifier_call_chain(&twl->otg.notifier, status,
|
||||||
twl->otg.gadget);
|
twl->otg.gadget);
|
||||||
}
|
}
|
||||||
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
||||||
@ -534,7 +534,7 @@ static void twl4030_usb_phy_init(struct twl4030_usb *twl)
|
|||||||
twl->asleep = 0;
|
twl->asleep = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
blocking_notifier_call_chain(&twl->otg.notifier, status,
|
atomic_notifier_call_chain(&twl->otg.notifier, status,
|
||||||
twl->otg.gadget);
|
twl->otg.gadget);
|
||||||
}
|
}
|
||||||
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
||||||
@ -623,7 +623,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
|
|||||||
if (device_create_file(&pdev->dev, &dev_attr_vbus))
|
if (device_create_file(&pdev->dev, &dev_attr_vbus))
|
||||||
dev_warn(&pdev->dev, "could not create sysfs file\n");
|
dev_warn(&pdev->dev, "could not create sysfs file\n");
|
||||||
|
|
||||||
BLOCKING_INIT_NOTIFIER_HEAD(&twl->otg.notifier);
|
ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier);
|
||||||
|
|
||||||
/* Our job is to use irqs and status from the power module
|
/* Our job is to use irqs and status from the power module
|
||||||
* to keep the transceiver disabled when nothing's connected.
|
* to keep the transceiver disabled when nothing's connected.
|
||||||
|
@ -263,13 +263,13 @@ static irqreturn_t twl6030_usb_irq(int irq, void *_twl)
|
|||||||
twl->otg.state = OTG_STATE_B_IDLE;
|
twl->otg.state = OTG_STATE_B_IDLE;
|
||||||
twl->linkstat = status;
|
twl->linkstat = status;
|
||||||
twl->otg.last_event = status;
|
twl->otg.last_event = status;
|
||||||
blocking_notifier_call_chain(&twl->otg.notifier,
|
atomic_notifier_call_chain(&twl->otg.notifier,
|
||||||
status, twl->otg.gadget);
|
status, twl->otg.gadget);
|
||||||
} else {
|
} else {
|
||||||
status = USB_EVENT_NONE;
|
status = USB_EVENT_NONE;
|
||||||
twl->linkstat = status;
|
twl->linkstat = status;
|
||||||
twl->otg.last_event = status;
|
twl->otg.last_event = status;
|
||||||
blocking_notifier_call_chain(&twl->otg.notifier,
|
atomic_notifier_call_chain(&twl->otg.notifier,
|
||||||
status, twl->otg.gadget);
|
status, twl->otg.gadget);
|
||||||
if (twl->asleep) {
|
if (twl->asleep) {
|
||||||
regulator_disable(twl->usb3v3);
|
regulator_disable(twl->usb3v3);
|
||||||
@ -302,7 +302,7 @@ static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl)
|
|||||||
twl->otg.state = OTG_STATE_A_IDLE;
|
twl->otg.state = OTG_STATE_A_IDLE;
|
||||||
twl->linkstat = status;
|
twl->linkstat = status;
|
||||||
twl->otg.last_event = status;
|
twl->otg.last_event = status;
|
||||||
blocking_notifier_call_chain(&twl->otg.notifier, status,
|
atomic_notifier_call_chain(&twl->otg.notifier, status,
|
||||||
twl->otg.gadget);
|
twl->otg.gadget);
|
||||||
} else {
|
} else {
|
||||||
twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR,
|
twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR,
|
||||||
@ -419,7 +419,7 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev)
|
|||||||
if (device_create_file(&pdev->dev, &dev_attr_vbus))
|
if (device_create_file(&pdev->dev, &dev_attr_vbus))
|
||||||
dev_warn(&pdev->dev, "could not create sysfs file\n");
|
dev_warn(&pdev->dev, "could not create sysfs file\n");
|
||||||
|
|
||||||
BLOCKING_INIT_NOTIFIER_HEAD(&twl->otg.notifier);
|
ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier);
|
||||||
|
|
||||||
twl->irq_enabled = true;
|
twl->irq_enabled = true;
|
||||||
status = request_threaded_irq(twl->irq1, NULL, twl6030_usbotg_irq,
|
status = request_threaded_irq(twl->irq1, NULL, twl6030_usbotg_irq,
|
||||||
|
@ -75,7 +75,7 @@ struct otg_transceiver {
|
|||||||
void __iomem *io_priv;
|
void __iomem *io_priv;
|
||||||
|
|
||||||
/* for notification of usb_xceiv_events */
|
/* for notification of usb_xceiv_events */
|
||||||
struct blocking_notifier_head notifier;
|
struct atomic_notifier_head notifier;
|
||||||
|
|
||||||
/* to pass extra port status to the root hub */
|
/* to pass extra port status to the root hub */
|
||||||
u16 port_status;
|
u16 port_status;
|
||||||
@ -235,13 +235,13 @@ otg_start_srp(struct otg_transceiver *otg)
|
|||||||
static inline int
|
static inline int
|
||||||
otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
|
otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
|
||||||
{
|
{
|
||||||
return blocking_notifier_chain_register(&otg->notifier, nb);
|
return atomic_notifier_chain_register(&otg->notifier, nb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
|
otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
|
||||||
{
|
{
|
||||||
blocking_notifier_chain_unregister(&otg->notifier, nb);
|
atomic_notifier_chain_unregister(&otg->notifier, nb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for OTG controller drivers (and maybe other stuff) */
|
/* for OTG controller drivers (and maybe other stuff) */
|
||||||
|
Loading…
Reference in New Issue
Block a user