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

Commit a45c82b8 authored by Ruchika Kharwar's avatar Ruchika Kharwar Committed by Felipe Balbi
Browse files

usb: dwc3: adapt to use dr_mode device tree helper



This patch adapts the dwc3 to use the device tree helper
"of_usb_get_dr_mode" for the mode of operation of the dwc3 instance
being probed.

[ balbi@ti.com : make of_usb_get_dr_mode() conditional on
	dev->of_node and let pdata pass dr_mode too ]

Reviewed-by: default avatarRoger Quadros <rogerq@ti.com>
Signed-off-by: default avatarRuchika Kharwar <ruchika@ti.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 51e563e3
Loading
Loading
Loading
Loading
+37 −36
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/of.h>
#include <linux/usb/otg.h>

#include "platform_data.h"
#include "core.h"
@@ -359,8 +360,6 @@ static int dwc3_probe(struct platform_device *pdev)
	void __iomem		*regs;
	void			*mem;

	u8			mode;

	mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
	if (!mem) {
		dev_err(dev, "not enough memory\n");
@@ -415,6 +414,7 @@ static int dwc3_probe(struct platform_device *pdev)
		dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 1);

		dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize");
		dwc->dr_mode = of_usb_get_dr_mode(node);
	} else {
		dwc->maximum_speed = pdata->maximum_speed;

@@ -422,6 +422,7 @@ static int dwc3_probe(struct platform_device *pdev)
		dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);

		dwc->needs_fifo_resize = pdata->tx_fifo_resize;
		dwc->dr_mode = pdata->dr_mode;
	}

	/* default to superspeed if no maximum_speed passed */
@@ -498,14 +499,15 @@ static int dwc3_probe(struct platform_device *pdev)
	}

	if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
		mode = DWC3_MODE_HOST;
		dwc->dr_mode = USB_DR_MODE_HOST;
	else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET))
		mode = DWC3_MODE_DEVICE;
	else
		mode = DWC3_MODE_DRD;
		dwc->dr_mode = USB_DR_MODE_PERIPHERAL;

	if (dwc->dr_mode == USB_DR_MODE_UNKNOWN)
		dwc->dr_mode = USB_DR_MODE_OTG;

	switch (mode) {
	case DWC3_MODE_DEVICE:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
		ret = dwc3_gadget_init(dwc);
		if (ret) {
@@ -513,7 +515,7 @@ static int dwc3_probe(struct platform_device *pdev)
			goto err2;
		}
		break;
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
		ret = dwc3_host_init(dwc);
		if (ret) {
@@ -521,7 +523,7 @@ static int dwc3_probe(struct platform_device *pdev)
			goto err2;
		}
		break;
	case DWC3_MODE_DRD:
	case USB_DR_MODE_OTG:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
		ret = dwc3_host_init(dwc);
		if (ret) {
@@ -536,10 +538,9 @@ static int dwc3_probe(struct platform_device *pdev)
		}
		break;
	default:
		dev_err(dev, "Unsupported mode of operation %d\n", mode);
		dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
		goto err2;
	}
	dwc->mode = mode;

	ret = dwc3_debugfs_init(dwc);
	if (ret) {
@@ -552,14 +553,14 @@ static int dwc3_probe(struct platform_device *pdev)
	return 0;

err3:
	switch (mode) {
	case DWC3_MODE_DEVICE:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
		dwc3_gadget_exit(dwc);
		break;
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
		dwc3_host_exit(dwc);
		break;
	case DWC3_MODE_DRD:
	case USB_DR_MODE_OTG:
		dwc3_host_exit(dwc);
		dwc3_gadget_exit(dwc);
		break;
@@ -592,14 +593,14 @@ static int dwc3_remove(struct platform_device *pdev)

	dwc3_debugfs_exit(dwc);

	switch (dwc->mode) {
	case DWC3_MODE_DEVICE:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
		dwc3_gadget_exit(dwc);
		break;
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
		dwc3_host_exit(dwc);
		break;
	case DWC3_MODE_DRD:
	case USB_DR_MODE_OTG:
		dwc3_host_exit(dwc);
		dwc3_gadget_exit(dwc);
		break;
@@ -623,12 +624,12 @@ static int dwc3_prepare(struct device *dev)

	spin_lock_irqsave(&dwc->lock, flags);

	switch (dwc->mode) {
	case DWC3_MODE_DEVICE:
	case DWC3_MODE_DRD:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
		dwc3_gadget_prepare(dwc);
		/* FALLTHROUGH */
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
	default:
		dwc3_event_buffers_cleanup(dwc);
		break;
@@ -646,12 +647,12 @@ static void dwc3_complete(struct device *dev)

	spin_lock_irqsave(&dwc->lock, flags);

	switch (dwc->mode) {
	case DWC3_MODE_DEVICE:
	case DWC3_MODE_DRD:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
		dwc3_gadget_complete(dwc);
		/* FALLTHROUGH */
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
	default:
		dwc3_event_buffers_setup(dwc);
		break;
@@ -667,12 +668,12 @@ static int dwc3_suspend(struct device *dev)

	spin_lock_irqsave(&dwc->lock, flags);

	switch (dwc->mode) {
	case DWC3_MODE_DEVICE:
	case DWC3_MODE_DRD:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
		dwc3_gadget_suspend(dwc);
		/* FALLTHROUGH */
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
	default:
		/* do nothing */
		break;
@@ -700,12 +701,12 @@ static int dwc3_resume(struct device *dev)

	dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);

	switch (dwc->mode) {
	case DWC3_MODE_DEVICE:
	case DWC3_MODE_DRD:
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
		dwc3_gadget_resume(dwc);
		/* FALLTHROUGH */
	case DWC3_MODE_HOST:
	case USB_DR_MODE_HOST:
	default:
		/* do nothing */
		break;
+4 −7
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@

#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/otg.h>

/* Global constants */
#define DWC3_EP0_BOUNCE_SIZE	512
@@ -545,11 +546,6 @@ struct dwc3_hwparams {
/* HWPARAMS0 */
#define DWC3_MODE(n)		((n) & 0x7)

#define DWC3_MODE_DEVICE	0
#define DWC3_MODE_HOST		1
#define DWC3_MODE_DRD		2
#define DWC3_MODE_HUB		3

#define DWC3_MDWIDTH(n)		(((n) & 0xff00) >> 8)

/* HWPARAMS1 */
@@ -611,7 +607,7 @@ struct dwc3_scratchpad_array {
 * @u1u2: only used on revisions <1.83a for workaround
 * @maximum_speed: maximum speed requested (mainly for testing purposes)
 * @revision: revision register contents
 * @mode: mode of operation
 * @dr_mode: requested mode of operation
 * @usb2_phy: pointer to USB2 PHY
 * @usb3_phy: pointer to USB3 PHY
 * @dcfg: saved contents of DCFG register
@@ -669,6 +665,8 @@ struct dwc3 {
	void __iomem		*regs;
	size_t			regs_size;

	enum usb_dr_mode	dr_mode;

	/* used for suspend/resume */
	u32			dcfg;
	u32			gctl;
@@ -677,7 +675,6 @@ struct dwc3 {
	u32			u1u2;
	u32			maximum_speed;
	u32			revision;
	u32			mode;

#define DWC3_REVISION_173A	0x5533173a
#define DWC3_REVISION_175A	0x5533175a
+2 −0
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@
 */

#include <linux/usb/ch9.h>
#include <linux/usb/otg.h>

struct dwc3_platform_data {
	enum usb_device_speed maximum_speed;
	enum usb_dr_mode dr_mode;
	bool tx_fifo_resize;
};