Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

phy: usb: Improve port mode selection

Split port modes into two different variables. Supported port modes
is what the hardware supports. While port mode is how the hardware
is currently configured and can be dynamically changed through the
sysfs. We initialize all supported port modes on init even though
the port mode may not be selected because we cannot guarantee the
downstream interface from the phy will be active or not.

This also fixes an issue where port modes selected via sysfs were
not being saved through suspend/resume.

Signed-off-by: Justin Chen <justinpopo6@gmail.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/1665005418-15807-2-git-send-email-justinpopo6@gmail.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Justin Chen and committed by
Vinod Koul
32fb07f3 c0a6c252

+25 -21
+6 -6
drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
··· 195 195 if (USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE)) { 196 196 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 197 197 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE); 198 - reg |= params->mode; 198 + reg |= params->port_mode; 199 199 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 200 200 } 201 - switch (params->mode) { 201 + switch (params->supported_port_modes) { 202 202 case USB_CTLR_MODE_HOST: 203 203 USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB); 204 204 break; ··· 276 276 /* Set the PHY_MODE */ 277 277 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1); 278 278 reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK; 279 - reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT; 279 + reg |= params->supported_port_modes << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT; 280 280 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1); 281 281 282 282 usb_init_common(params); ··· 286 286 * the default "Read Transaction Size" of 6 (1024 bytes). 287 287 * Set it to 4 (256 bytes). 288 288 */ 289 - if ((params->mode != USB_CTLR_MODE_HOST) && bdc_ec) { 289 + if ((params->supported_port_modes != USB_CTLR_MODE_HOST) && bdc_ec) { 290 290 reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA); 291 291 reg &= ~BDC_EC_AXIRDA_RTS_MASK; 292 292 reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT); ··· 385 385 return reg; 386 386 } 387 387 388 - static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode) 388 + static void usb_set_dual_select(struct brcm_usb_init_params *params) 389 389 { 390 390 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 391 391 u32 reg; ··· 394 394 395 395 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 396 396 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE); 397 - reg |= mode; 397 + reg |= params->port_mode; 398 398 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 399 399 } 400 400
+5 -5
drivers/phy/broadcom/phy-brcm-usb-init.c
··· 876 876 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 877 877 reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, 878 878 PORT_MODE); 879 - reg |= params->mode; 879 + reg |= params->port_mode; 880 880 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 881 881 } 882 882 if (USB_CTRL_MASK_FAMILY(params, USB_PM, BDC_SOFT_RESETB)) { 883 - switch (params->mode) { 883 + switch (params->supported_port_modes) { 884 884 case USB_CTLR_MODE_HOST: 885 885 USB_CTRL_UNSET_FAMILY(params, USB_PM, BDC_SOFT_RESETB); 886 886 break; ··· 891 891 } 892 892 } 893 893 if (USB_CTRL_MASK_FAMILY(params, SETUP, CC_DRD_MODE_ENABLE)) { 894 - if (params->mode == USB_CTLR_MODE_TYPEC_PD) 894 + if (params->supported_port_modes == USB_CTLR_MODE_TYPEC_PD) 895 895 USB_CTRL_SET_FAMILY(params, SETUP, CC_DRD_MODE_ENABLE); 896 896 else 897 897 USB_CTRL_UNSET_FAMILY(params, SETUP, ··· 1000 1000 return reg; 1001 1001 } 1002 1002 1003 - static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode) 1003 + static void usb_set_dual_select(struct brcm_usb_init_params *params) 1004 1004 { 1005 1005 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 1006 1006 u32 reg; ··· 1011 1011 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 1012 1012 reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, 1013 1013 PORT_MODE); 1014 - reg |= mode; 1014 + reg |= params->port_mode; 1015 1015 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 1016 1016 } 1017 1017 }
+5 -5
drivers/phy/broadcom/phy-brcm-usb-init.h
··· 45 45 void (*uninit_eohci)(struct brcm_usb_init_params *params); 46 46 void (*uninit_xhci)(struct brcm_usb_init_params *params); 47 47 int (*get_dual_select)(struct brcm_usb_init_params *params); 48 - void (*set_dual_select)(struct brcm_usb_init_params *params, int mode); 48 + void (*set_dual_select)(struct brcm_usb_init_params *params); 49 49 }; 50 50 51 51 struct brcm_usb_init_params { 52 52 void __iomem *regs[BRCM_REGS_MAX]; 53 53 int ioc; 54 54 int ipp; 55 - int mode; 55 + int supported_port_modes; 56 + int port_mode; 56 57 u32 family_id; 57 58 u32 product_id; 58 59 int selected_family; ··· 154 153 return 0; 155 154 } 156 155 157 - static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini, 158 - int mode) 156 + static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini) 159 157 { 160 158 if (ini->ops->set_dual_select) 161 - ini->ops->set_dual_select(ini, mode); 159 + ini->ops->set_dual_select(ini); 162 160 } 163 161 164 162 #endif /* _USB_BRCM_COMMON_INIT_H */
+9 -5
drivers/phy/broadcom/phy-brcm-usb.c
··· 233 233 return sprintf(buf, "%s\n", 234 234 value_to_name(&brcm_dr_mode_to_name[0], 235 235 ARRAY_SIZE(brcm_dr_mode_to_name), 236 - priv->ini.mode)); 236 + priv->ini.supported_port_modes)); 237 237 } 238 238 static DEVICE_ATTR_RO(dr_mode); 239 239 ··· 249 249 res = name_to_value(&brcm_dual_mode_to_name[0], 250 250 ARRAY_SIZE(brcm_dual_mode_to_name), buf, &value); 251 251 if (!res) { 252 - brcm_usb_set_dual_select(&priv->ini, value); 252 + priv->ini.port_mode = value; 253 + brcm_usb_set_dual_select(&priv->ini); 253 254 res = len; 254 255 } 255 256 mutex_unlock(&sysfs_lock); ··· 496 495 of_property_read_u32(dn, "brcm,ipp", &priv->ini.ipp); 497 496 of_property_read_u32(dn, "brcm,ioc", &priv->ini.ioc); 498 497 499 - priv->ini.mode = USB_CTLR_MODE_HOST; 498 + priv->ini.supported_port_modes = USB_CTLR_MODE_HOST; 500 499 err = of_property_read_string(dn, "dr_mode", &mode); 501 500 if (err == 0) { 502 501 name_to_value(&brcm_dr_mode_to_name[0], 503 502 ARRAY_SIZE(brcm_dr_mode_to_name), 504 - mode, &priv->ini.mode); 503 + mode, &priv->ini.supported_port_modes); 505 504 } 505 + /* Default port_mode to supported port_modes */ 506 + priv->ini.port_mode = priv->ini.supported_port_modes; 507 + 506 508 if (of_property_read_bool(dn, "brcm,has-xhci")) 507 509 priv->has_xhci = true; 508 510 if (of_property_read_bool(dn, "brcm,has-eohci")) ··· 543 539 * Create sysfs entries for mode. 544 540 * Remove "dual_select" attribute if not in dual mode 545 541 */ 546 - if (priv->ini.mode != USB_CTLR_MODE_DRD) 542 + if (priv->ini.supported_port_modes != USB_CTLR_MODE_DRD) 547 543 brcm_usb_phy_attrs[1] = NULL; 548 544 err = sysfs_create_group(&dev->kobj, &brcm_usb_phy_group); 549 545 if (err)