[linux-yocto] [PATCH] usb: mux: add module parameter to portmux-intel-drcfg
wan.ahmad.zainie.wan.mohamad at intel.com
wan.ahmad.zainie.wan.mohamad at intel.com
Mon Jul 25 22:47:47 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