Commit cccad6d4 authored by Felipe Balbi's avatar Felipe Balbi

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: default avatarFelipe Balbi <balbi@ti.com>
parent 002eda13
...@@ -212,7 +212,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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) ...@@ -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) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment