Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cccad6d4 authored by Felipe Balbi's avatar Felipe Balbi
Browse files

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
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ static int ab8500_usb_link_status_update(struct ab8500_usb *ab)
		break;
	}

	blocking_notifier_call_chain(&ab->otg.notifier, event, v);
	atomic_notifier_call_chain(&ab->otg.notifier, event, v);

	return 0;
}
@@ -281,7 +281,7 @@ static int ab8500_usb_set_power(struct otg_transceiver *otg, unsigned mA)
	ab->vbus_draw = mA;

	if (mA)
		blocking_notifier_call_chain(&ab->otg.notifier,
		atomic_notifier_call_chain(&ab->otg.notifier,
				USB_EVENT_ENUMERATED, ab->otg.gadget);
	return 0;
}
@@ -500,7 +500,7 @@ static int __devinit ab8500_usb_probe(struct platform_device *pdev)

	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.
	 * all: Updates form set_host and set_peripheral as they are atomic.
+1 −1
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ static int __devinit nop_usb_xceiv_probe(struct platform_device *pdev)

	platform_set_drvdata(pdev, nop);

	BLOCKING_INIT_NOTIFIER_HEAD(&nop->otg.notifier);
	ATOMIC_INIT_NOTIFIER_HEAD(&nop->otg.notifier);

	return 0;
exit:
+3 −3
Original line number Diff line number Diff line
@@ -512,7 +512,7 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
		else
			twl4030_phy_resume(twl);

		blocking_notifier_call_chain(&twl->otg.notifier, status,
		atomic_notifier_call_chain(&twl->otg.notifier, status,
				twl->otg.gadget);
	}
	sysfs_notify(&twl->dev->kobj, NULL, "vbus");
@@ -534,7 +534,7 @@ static void twl4030_usb_phy_init(struct twl4030_usb *twl)
			twl->asleep = 0;
		}

		blocking_notifier_call_chain(&twl->otg.notifier, status,
		atomic_notifier_call_chain(&twl->otg.notifier, status,
				twl->otg.gadget);
	}
	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))
		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
	 * to keep the transceiver disabled when nothing's connected.
+4 −4
Original line number Diff line number Diff line
@@ -263,13 +263,13 @@ static irqreturn_t twl6030_usb_irq(int irq, void *_twl)
			twl->otg.state = OTG_STATE_B_IDLE;
			twl->linkstat = status;
			twl->otg.last_event = status;
			blocking_notifier_call_chain(&twl->otg.notifier,
			atomic_notifier_call_chain(&twl->otg.notifier,
						status, twl->otg.gadget);
		} else {
			status = USB_EVENT_NONE;
			twl->linkstat = status;
			twl->otg.last_event = status;
			blocking_notifier_call_chain(&twl->otg.notifier,
			atomic_notifier_call_chain(&twl->otg.notifier,
						status, twl->otg.gadget);
			if (twl->asleep) {
				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->linkstat = 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);
	} else  {
		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))
		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;
	status = request_threaded_irq(twl->irq1, NULL, twl6030_usbotg_irq,
+3 −3
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ struct otg_transceiver {
	void __iomem			*io_priv;

	/* 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 */
	u16			port_status;
@@ -235,13 +235,13 @@ otg_start_srp(struct otg_transceiver *otg)
static inline int
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
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) */