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: add support for bcm74110

bcm74110 adds a freerun utmi/ref clock that saves further power during
suspend states. A tune is also necessary to pass USB compliance test.

Signed-off-by: Justin Chen <justin.chen@broadcom.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/20250402185159.2976920-3-justin.chen@broadcom.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Justin Chen and committed by
Vinod Koul
686b2730 0fbceff4

+76
+61
drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
··· 43 43 #define USB_CTRL_SETUP_tca_drv_sel_MASK BIT(24) 44 44 #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK BIT(25) 45 45 #define USB_CTRL_USB_PM 0x04 46 + #define USB_CTRL_USB_PM_REF_S2_CLK_SWITCH_EN_MASK BIT(1) 47 + #define USB_CTRL_USB_PM_UTMI_S2_CLK_SWITCH_EN_MASK BIT(2) 46 48 #define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK BIT(3) 47 49 #define USB_CTRL_USB_PM_XHC_PME_EN_MASK BIT(4) 48 50 #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK BIT(22) ··· 63 61 #define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK BIT(18) 64 62 #define USB_CTRL_P0_U2PHY_CFG1 0x68 65 63 #define USB_CTRL_P0_U2PHY_CFG1_COMMONONN_MASK BIT(10) 64 + #define USB_CTRL_P0_U2PHY_CFG2 0x6c 65 + #define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK GENMASK(20, 17) 66 + #define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT 17 67 + #define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK GENMASK(24, 23) 68 + #define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT 23 69 + #define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK GENMASK(26, 25) 70 + #define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT 25 66 71 67 72 /* Register definitions for the USB_PHY block in 7211b0 */ 68 73 #define USB_PHY_PLL_CTL 0x00 ··· 378 369 } 379 370 } 380 371 372 + static void usb_init_common_74110(struct brcm_usb_init_params *params) 373 + { 374 + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 375 + u32 reg; 376 + 377 + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM)); 378 + reg &= ~(USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) | 379 + USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN)); 380 + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM)); 381 + 382 + usb_init_common_7216(params); 383 + 384 + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, P0_U2PHY_CFG2)); 385 + reg &= ~(USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK | 386 + USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK | 387 + USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK); 388 + reg |= (0x6 << USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT) | 389 + (0x3 << USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT) | 390 + (0x2 << USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT); 391 + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, P0_U2PHY_CFG2)); 392 + } 393 + 394 + static void usb_uninit_common_74110(struct brcm_usb_init_params *params) 395 + { 396 + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; 397 + u32 reg; 398 + 399 + if (params->wake_enabled) { 400 + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM)); 401 + reg |= (USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) | 402 + USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN)); 403 + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM)); 404 + } 405 + usb_uninit_common_7216(params); 406 + } 407 + 381 408 static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params) 382 409 { 383 410 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; ··· 471 426 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); 472 427 } 473 428 429 + static const struct brcm_usb_init_ops bcm74110_ops = { 430 + .init_ipp = usb_init_ipp, 431 + .init_common = usb_init_common_74110, 432 + .init_xhci = usb_init_xhci, 433 + .uninit_common = usb_uninit_common_74110, 434 + .uninit_xhci = usb_uninit_xhci, 435 + .get_dual_select = usb_get_dual_select, 436 + .set_dual_select = usb_set_dual_select, 437 + }; 438 + 474 439 static const struct brcm_usb_init_ops bcm7216_ops = { 475 440 .init_ipp = usb_init_ipp, 476 441 .init_common = usb_init_common_7216, ··· 500 445 .get_dual_select = usb_get_dual_select, 501 446 .set_dual_select = usb_set_dual_select, 502 447 }; 448 + 449 + void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params) 450 + { 451 + params->family_name = "74110"; 452 + params->ops = &bcm74110_ops; 453 + } 503 454 504 455 void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params) 505 456 {
+1
drivers/phy/broadcom/phy-brcm-usb-init.h
··· 72 72 bool wake_enabled; 73 73 }; 74 74 75 + void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params); 75 76 void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params); 76 77 void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params); 77 78 void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params);
+14
drivers/phy/broadcom/phy-brcm-usb.c
··· 283 283 .attrs = brcm_usb_phy_attrs, 284 284 }; 285 285 286 + static const struct match_chip_info chip_info_74110 = { 287 + .init_func = &brcm_usb_dvr_init_74110, 288 + .required_regs = { 289 + BRCM_REGS_CTRL, 290 + BRCM_REGS_XHCI_EC, 291 + BRCM_REGS_XHCI_GBL, 292 + -1, 293 + }, 294 + }; 295 + 286 296 static const struct match_chip_info chip_info_4908 = { 287 297 .init_func = &brcm_usb_dvr_init_4908, 288 298 .required_regs = { ··· 335 325 }; 336 326 337 327 static const struct of_device_id brcm_usb_dt_ids[] = { 328 + { 329 + .compatible = "brcm,bcm74110-usb-phy", 330 + .data = &chip_info_74110, 331 + }, 338 332 { 339 333 .compatible = "brcm,bcm4908-usb-phy", 340 334 .data = &chip_info_4908,