Commit 1fac1c4d authored by Linus Walleij's avatar Linus Walleij Committed by Greg Kroah-Hartman
Browse files

usb: fotg210: Select subdriver by mode



Check which mode the hardware is in, and selecte the peripheral
driver if the hardware is in explicit peripheral mode, otherwise
select host mode.

This should solve the immediate problem that both subdrivers
can get probed.

Cc: Fabian Vogt <fabian@ritter-vogt.de>
Cc: Yuan-Hsin Chen <yhchen@faraday-tech.com>
Cc: Felipe Balbi <balbi@kernel.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20221023144708.3596563-3-linus.walleij@linaro.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent aeffd2c3
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -10,30 +10,37 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/usb.h>
#include <linux/usb/otg.h>

#include "fotg210.h"

static int fotg210_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	enum usb_dr_mode mode;
	int ret;

	if (IS_ENABLED(CONFIG_USB_FOTG210_HCD)) {
		ret = fotg210_hcd_probe(pdev);
		if (ret)
			return ret;
	}
	if (IS_ENABLED(CONFIG_USB_FOTG210_UDC))
	mode = usb_get_dr_mode(dev);

	if (mode == USB_DR_MODE_PERIPHERAL)
		ret = fotg210_udc_probe(pdev);
	else
		ret = fotg210_hcd_probe(pdev);

	return ret;
}

static int fotg210_remove(struct platform_device *pdev)
{
	if (IS_ENABLED(CONFIG_USB_FOTG210_HCD))
		fotg210_hcd_remove(pdev);
	if (IS_ENABLED(CONFIG_USB_FOTG210_UDC))
	struct device *dev = &pdev->dev;
	enum usb_dr_mode mode;

	mode = usb_get_dr_mode(dev);

	if (mode == USB_DR_MODE_PERIPHERAL)
		fotg210_udc_remove(pdev);
	else
		fotg210_hcd_remove(pdev);

	return 0;
}