From: Wan Ahmad Zainie <wan.ahmad.zainie.wan.moha...@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.moha...@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 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto