[linux-yocto] [PATCH] usb: mux: add module parameter to portmux-intel-drcfg

wan.ahmad.zainie.wan.mohamad at gmail.com wan.ahmad.zainie.wan.mohamad at gmail.com
Mon Jul 25 21:33:23 PDT 2016


From: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>

This patch add the following module parameter,
usb0_init_state to override default USB port 0 role set by ABL/BIOS, and
usb0_auto_role to set USB port 0 mux in automatic mode.

By default, this driver will set the initial mode based on DRD_MODE
bit in DUAL_ROLE_CFG_REG0 register, and enable mux switching via
software.

Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad at intel.com>
---
 drivers/usb/mux/portmux-intel-drcfg.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/mux/portmux-intel-drcfg.c b/drivers/usb/mux/portmux-intel-drcfg.c
index 0bb6b08..0b6de17 100644
--- a/drivers/usb/mux/portmux-intel-drcfg.c
+++ b/drivers/usb/mux/portmux-intel-drcfg.c
@@ -31,6 +31,14 @@ struct intel_mux_drcfg {
 	struct portmux_dev *pdev;
 };
 
+static int usb0_init_state = -1;
+module_param(usb0_init_state, int, S_IRUGO);
+MODULE_PARM_DESC(usb0_init_state, "APL USB port 0 init state 0:device, 1:host");
+
+static int usb0_auto_role = -1;
+module_param(usb0_auto_role, int, S_IRUGO);
+MODULE_PARM_DESC(usb0_auto_role, "APL USB port 0 automatic role switching");
+
 static inline int intel_mux_drcfg_switch(struct device *dev, bool host)
 {
 	u32 data;
@@ -38,11 +46,17 @@ static inline int intel_mux_drcfg_switch(struct device *dev, bool host)
 
 	mux = dev_get_drvdata(dev);
 
+	if (usb0_auto_role == 1) {
+		dev_info(dev, "USB port 0 mux is in automatic role mode.\n");
+		return 0;
+	}
+
 	/* Check and set mux to SW controlled mode */
 	data = readl(mux->regs + INTEL_MUX_CFG0);
 	if (!(data & CFG0_SW_IDPIN_EN)) {
 		data |= CFG0_SW_IDPIN_EN;
 		writel(data, mux->regs + INTEL_MUX_CFG0);
+		dev_dbg(dev, "Set SW_IDPIN_EN bit\n");
 	}
 
 	/*
@@ -106,11 +120,15 @@ static int intel_mux_drcfg_probe(struct platform_device *pdev)
 	mux->desc.dev = dev;
 	mux->desc.name = "intel-mux-drcfg";
 	mux->desc.ops = &drcfg_ops;
-	mux->desc.initial_state =
-			!!(readl(mux->regs + INTEL_MUX_CFG1) & CFG1_MODE);
+	mux->desc.initial_state = (usb0_init_state == -1) ?
+			!!(readl(mux->regs + INTEL_MUX_CFG1) & CFG1_MODE) :
+			(usb0_init_state ? 1 : 0);
 	dev_set_drvdata(dev, mux);
 	mux->pdev = portmux_register(&mux->desc);
 
+	if (usb0_auto_role == 1)
+		writel(0x800, mux->regs + INTEL_MUX_CFG0);
+
 	return PTR_ERR_OR_ZERO(mux->pdev);
 }
 
-- 
1.9.1



More information about the linux-yocto mailing list