Message ID | 1577704195-2535-10-git-send-email-nkristam@nvidia.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Tegra XUSB OTG support | expand |
On Mon, Dec 30, 2019 at 04:39:46PM +0530, Nagarjuna Kristam wrote: > Padctl driver will act as a central driver to receive USB role changes via > usb-role-switch. This is updated to corresponding host, device drivers. > Hence remove usb-role-switch from XUDC driver. > > Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com> > --- > V2-V3: > - No changes in this version > --- > drivers/usb/gadget/udc/tegra-xudc.c | 65 ++++++++++--------------------------- > 1 file changed, 17 insertions(+), 48 deletions(-) > > diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/tegra-xudc.c > index 634c2c1..6ddb974 100644 > --- a/drivers/usb/gadget/udc/tegra-xudc.c > +++ b/drivers/usb/gadget/udc/tegra-xudc.c > @@ -477,8 +477,8 @@ struct tegra_xudc { > > struct clk_bulk_data *clks; > > - enum usb_role device_mode; > - struct usb_role_switch *usb_role_sw; > + enum usb_role role; > + bool device_mode; > struct work_struct usb_role_sw_work; > > struct phy *usb3_phy; > @@ -596,6 +596,8 @@ static void tegra_xudc_device_mode_on(struct tegra_xudc *xudc) > { > int err; > > + if (xudc->device_mode) > + return; Could use an extra blank line after the block. > pm_runtime_get_sync(xudc->dev); > > err = phy_power_on(xudc->utmi_phy); > @@ -610,7 +612,8 @@ static void tegra_xudc_device_mode_on(struct tegra_xudc *xudc) > > tegra_xusb_padctl_set_vbus_override(xudc->padctl, true); > > - xudc->device_mode = USB_ROLE_DEVICE; > + xudc->device_mode = true; > + But this blank line is gratuituous. > } > > static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) > @@ -619,6 +622,9 @@ static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) > u32 pls, val; > int err; > > + if (!xudc->device_mode) > + return; > + > dev_dbg(xudc->dev, "device mode off\n"); > > connected = !!(xudc_readl(xudc, PORTSC) & PORTSC_CCS); > @@ -643,7 +649,7 @@ static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) > xudc_writel(xudc, val, PORTSC); > } > > - xudc->device_mode = USB_ROLE_NONE; > + xudc->device_mode = false; > > /* Wait for disconnect event. */ > if (connected) > @@ -668,31 +674,13 @@ static void tegra_xudc_usb_role_sw_work(struct work_struct *work) > struct tegra_xudc *xudc = container_of(work, struct tegra_xudc, > usb_role_sw_work); > > - if (!xudc->usb_role_sw || > - usb_role_switch_get_role(xudc->usb_role_sw) == USB_ROLE_DEVICE) > + if (xudc->role == USB_ROLE_DEVICE) > tegra_xudc_device_mode_on(xudc); > else > tegra_xudc_device_mode_off(xudc); > > } > > -static int tegra_xudc_usb_role_sw_set(struct device *dev, enum usb_role role) > -{ > - struct tegra_xudc *xudc = dev_get_drvdata(dev); > - unsigned long flags; > - > - dev_dbg(dev, "%s role is %d\n", __func__, role); > - > - spin_lock_irqsave(&xudc->lock, flags); > - > - if (!xudc->suspended) > - schedule_work(&xudc->usb_role_sw_work); > - > - spin_unlock_irqrestore(&xudc->lock, flags); > - > - return 0; > -} > - > static void tegra_xudc_plc_reset_work(struct work_struct *work) > { > struct delayed_work *dwork = to_delayed_work(work); > @@ -729,8 +717,7 @@ static void tegra_xudc_port_reset_war_work(struct work_struct *work) > > spin_lock_irqsave(&xudc->lock, flags); > > - if ((xudc->device_mode == USB_ROLE_DEVICE) > - && xudc->wait_for_sec_prc) { > + if (xudc->device_mode && xudc->wait_for_sec_prc) { > pls = (xudc_readl(xudc, PORTSC) & PORTSC_PLS_MASK) >> > PORTSC_PLS_SHIFT; > dev_dbg(xudc->dev, "pls = %x\n", pls); > @@ -3457,7 +3444,6 @@ static int tegra_xudc_probe(struct platform_device *pdev) > { > struct tegra_xudc *xudc; > struct resource *res; > - struct usb_role_switch_desc role_sx_desc = { 0 }; > unsigned int i; > int err; > > @@ -3587,23 +3573,10 @@ static int tegra_xudc_probe(struct platform_device *pdev) > INIT_DELAYED_WORK(&xudc->port_reset_war_work, > tegra_xudc_port_reset_war_work); > > - if (of_property_read_bool(xudc->dev->of_node, "usb-role-switch")) { > - role_sx_desc.set = tegra_xudc_usb_role_sw_set; > - role_sx_desc.fwnode = dev_fwnode(xudc->dev); > - > - xudc->usb_role_sw = usb_role_switch_register(xudc->dev, > - &role_sx_desc); > - if (IS_ERR(xudc->usb_role_sw)) { > - err = PTR_ERR(xudc->usb_role_sw); > - dev_err(xudc->dev, "Failed to register USB role SW: %d", > - err); > - goto free_eps; > - } > - } else { > - /* Set the mode as device mode and this keeps phy always ON */ > - dev_info(xudc->dev, "Set usb role to device mode always"); > - schedule_work(&xudc->usb_role_sw_work); > - } > + /* Set the mode as device mode and this keeps phy always ON */ > + dev_info(xudc->dev, "Set usb role to device mode always"); This doesn't seem useful. This is going to be always printed, but it's not a special case or anything. If it's normal behaviour, no need to explicitly mention it. Thierry > + xudc->role = USB_ROLE_DEVICE; > + schedule_work(&xudc->usb_role_sw_work); > > pm_runtime_enable(&pdev->dev); > > @@ -3643,11 +3616,7 @@ static int tegra_xudc_remove(struct platform_device *pdev) > pm_runtime_get_sync(xudc->dev); > > cancel_delayed_work(&xudc->plc_reset_work); > - > - if (xudc->usb_role_sw) { > - usb_role_switch_unregister(xudc->usb_role_sw); > - cancel_work_sync(&xudc->usb_role_sw_work); > - } > + cancel_work_sync(&xudc->usb_role_sw_work); > > usb_del_gadget_udc(&xudc->gadget); > > -- > 2.7.4 >
diff --git a/drivers/usb/gadget/udc/tegra-xudc.c b/drivers/usb/gadget/udc/tegra-xudc.c index 634c2c1..6ddb974 100644 --- a/drivers/usb/gadget/udc/tegra-xudc.c +++ b/drivers/usb/gadget/udc/tegra-xudc.c @@ -477,8 +477,8 @@ struct tegra_xudc { struct clk_bulk_data *clks; - enum usb_role device_mode; - struct usb_role_switch *usb_role_sw; + enum usb_role role; + bool device_mode; struct work_struct usb_role_sw_work; struct phy *usb3_phy; @@ -596,6 +596,8 @@ static void tegra_xudc_device_mode_on(struct tegra_xudc *xudc) { int err; + if (xudc->device_mode) + return; pm_runtime_get_sync(xudc->dev); err = phy_power_on(xudc->utmi_phy); @@ -610,7 +612,8 @@ static void tegra_xudc_device_mode_on(struct tegra_xudc *xudc) tegra_xusb_padctl_set_vbus_override(xudc->padctl, true); - xudc->device_mode = USB_ROLE_DEVICE; + xudc->device_mode = true; + } static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) @@ -619,6 +622,9 @@ static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) u32 pls, val; int err; + if (!xudc->device_mode) + return; + dev_dbg(xudc->dev, "device mode off\n"); connected = !!(xudc_readl(xudc, PORTSC) & PORTSC_CCS); @@ -643,7 +649,7 @@ static void tegra_xudc_device_mode_off(struct tegra_xudc *xudc) xudc_writel(xudc, val, PORTSC); } - xudc->device_mode = USB_ROLE_NONE; + xudc->device_mode = false; /* Wait for disconnect event. */ if (connected) @@ -668,31 +674,13 @@ static void tegra_xudc_usb_role_sw_work(struct work_struct *work) struct tegra_xudc *xudc = container_of(work, struct tegra_xudc, usb_role_sw_work); - if (!xudc->usb_role_sw || - usb_role_switch_get_role(xudc->usb_role_sw) == USB_ROLE_DEVICE) + if (xudc->role == USB_ROLE_DEVICE) tegra_xudc_device_mode_on(xudc); else tegra_xudc_device_mode_off(xudc); } -static int tegra_xudc_usb_role_sw_set(struct device *dev, enum usb_role role) -{ - struct tegra_xudc *xudc = dev_get_drvdata(dev); - unsigned long flags; - - dev_dbg(dev, "%s role is %d\n", __func__, role); - - spin_lock_irqsave(&xudc->lock, flags); - - if (!xudc->suspended) - schedule_work(&xudc->usb_role_sw_work); - - spin_unlock_irqrestore(&xudc->lock, flags); - - return 0; -} - static void tegra_xudc_plc_reset_work(struct work_struct *work) { struct delayed_work *dwork = to_delayed_work(work); @@ -729,8 +717,7 @@ static void tegra_xudc_port_reset_war_work(struct work_struct *work) spin_lock_irqsave(&xudc->lock, flags); - if ((xudc->device_mode == USB_ROLE_DEVICE) - && xudc->wait_for_sec_prc) { + if (xudc->device_mode && xudc->wait_for_sec_prc) { pls = (xudc_readl(xudc, PORTSC) & PORTSC_PLS_MASK) >> PORTSC_PLS_SHIFT; dev_dbg(xudc->dev, "pls = %x\n", pls); @@ -3457,7 +3444,6 @@ static int tegra_xudc_probe(struct platform_device *pdev) { struct tegra_xudc *xudc; struct resource *res; - struct usb_role_switch_desc role_sx_desc = { 0 }; unsigned int i; int err; @@ -3587,23 +3573,10 @@ static int tegra_xudc_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&xudc->port_reset_war_work, tegra_xudc_port_reset_war_work); - if (of_property_read_bool(xudc->dev->of_node, "usb-role-switch")) { - role_sx_desc.set = tegra_xudc_usb_role_sw_set; - role_sx_desc.fwnode = dev_fwnode(xudc->dev); - - xudc->usb_role_sw = usb_role_switch_register(xudc->dev, - &role_sx_desc); - if (IS_ERR(xudc->usb_role_sw)) { - err = PTR_ERR(xudc->usb_role_sw); - dev_err(xudc->dev, "Failed to register USB role SW: %d", - err); - goto free_eps; - } - } else { - /* Set the mode as device mode and this keeps phy always ON */ - dev_info(xudc->dev, "Set usb role to device mode always"); - schedule_work(&xudc->usb_role_sw_work); - } + /* Set the mode as device mode and this keeps phy always ON */ + dev_info(xudc->dev, "Set usb role to device mode always"); + xudc->role = USB_ROLE_DEVICE; + schedule_work(&xudc->usb_role_sw_work); pm_runtime_enable(&pdev->dev); @@ -3643,11 +3616,7 @@ static int tegra_xudc_remove(struct platform_device *pdev) pm_runtime_get_sync(xudc->dev); cancel_delayed_work(&xudc->plc_reset_work); - - if (xudc->usb_role_sw) { - usb_role_switch_unregister(xudc->usb_role_sw); - cancel_work_sync(&xudc->usb_role_sw_work); - } + cancel_work_sync(&xudc->usb_role_sw_work); usb_del_gadget_udc(&xudc->gadget);
Padctl driver will act as a central driver to receive USB role changes via usb-role-switch. This is updated to corresponding host, device drivers. Hence remove usb-role-switch from XUDC driver. Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com> --- V2-V3: - No changes in this version --- drivers/usb/gadget/udc/tegra-xudc.c | 65 ++++++++++--------------------------- 1 file changed, 17 insertions(+), 48 deletions(-)