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

Commit 662c738d authored by Heiko Stübner's avatar Heiko Stübner Committed by Felipe Balbi
Browse files

usb: otg: gpio_vbus: Add otg transceiver events and notifiers



Commit 9ad63986 (pda_power: Add support for using otg transceiver events)
converted the pda-power driver to use otg events to determine the status
of the power supply.

As gpio-vbus didn't use otg events until now, this change breaks setups
of pda-power with a gpio-vbus transceiver.

This patch adds the necessary otg events and notifiers to gpio-vbus.

Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Reviewed-by: default avatarDima Zavin <dima@android.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 92b0abf8
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ static void gpio_vbus_work(struct work_struct *work)
	struct gpio_vbus_data *gpio_vbus =
		container_of(work, struct gpio_vbus_data, work);
	struct gpio_vbus_mach_info *pdata = gpio_vbus->dev->platform_data;
	int gpio;
	int gpio, status;

	if (!gpio_vbus->phy.otg->gadget)
		return;
@@ -108,7 +108,9 @@ static void gpio_vbus_work(struct work_struct *work)
	 */
	gpio = pdata->gpio_pullup;
	if (is_vbus_powered(pdata)) {
		status = USB_EVENT_VBUS;
		gpio_vbus->phy.state = OTG_STATE_B_PERIPHERAL;
		gpio_vbus->phy.last_event = status;
		usb_gadget_vbus_connect(gpio_vbus->phy.otg->gadget);

		/* drawing a "unit load" is *always* OK, except for OTG */
@@ -117,6 +119,9 @@ static void gpio_vbus_work(struct work_struct *work)
		/* optionally enable D+ pullup */
		if (gpio_is_valid(gpio))
			gpio_set_value(gpio, !pdata->gpio_pullup_inverted);

		atomic_notifier_call_chain(&gpio_vbus->phy.notifier,
					   status, gpio_vbus->phy.otg->gadget);
	} else {
		/* optionally disable D+ pullup */
		if (gpio_is_valid(gpio))
@@ -125,7 +130,12 @@ static void gpio_vbus_work(struct work_struct *work)
		set_vbus_draw(gpio_vbus, 0);

		usb_gadget_vbus_disconnect(gpio_vbus->phy.otg->gadget);
		status = USB_EVENT_NONE;
		gpio_vbus->phy.state = OTG_STATE_B_IDLE;
		gpio_vbus->phy.last_event = status;

		atomic_notifier_call_chain(&gpio_vbus->phy.notifier,
					   status, gpio_vbus->phy.otg->gadget);
	}
}

@@ -287,6 +297,9 @@ static int __init gpio_vbus_probe(struct platform_device *pdev)
			irq, err);
		goto err_irq;
	}

	ATOMIC_INIT_NOTIFIER_HEAD(&gpio_vbus->phy.notifier);

	INIT_WORK(&gpio_vbus->work, gpio_vbus_work);

	gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw");