Skip to content

Commit 686b273

Browse files
Ryceancurryvinodkoul
authored andcommitted
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 <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent 0fbceff commit 686b273

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#define USB_CTRL_SETUP_tca_drv_sel_MASK BIT(24)
4444
#define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK BIT(25)
4545
#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)
4648
#define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK BIT(3)
4749
#define USB_CTRL_USB_PM_XHC_PME_EN_MASK BIT(4)
4850
#define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK BIT(22)
@@ -61,6 +63,13 @@
6163
#define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK BIT(18)
6264
#define USB_CTRL_P0_U2PHY_CFG1 0x68
6365
#define USB_CTRL_P0_U2PHY_CFG1_COMMONONN_MASK BIT(10)
66+
#define USB_CTRL_P0_U2PHY_CFG2 0x6c
67+
#define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK GENMASK(20, 17)
68+
#define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT 17
69+
#define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK GENMASK(24, 23)
70+
#define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT 23
71+
#define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK GENMASK(26, 25)
72+
#define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT 25
6473

6574
/* Register definitions for the USB_PHY block in 7211b0 */
6675
#define USB_PHY_PLL_CTL 0x00
@@ -369,6 +378,42 @@ static void usb_uninit_common_7216(struct brcm_usb_init_params *params)
369378
}
370379
}
371380

381+
static void usb_init_common_74110(struct brcm_usb_init_params *params)
382+
{
383+
void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
384+
u32 reg;
385+
386+
reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM));
387+
reg &= ~(USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) |
388+
USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN));
389+
brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM));
390+
391+
usb_init_common_7216(params);
392+
393+
reg = brcm_usb_readl(USB_CTRL_REG(ctrl, P0_U2PHY_CFG2));
394+
reg &= ~(USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK |
395+
USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK |
396+
USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK);
397+
reg |= (0x6 << USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT) |
398+
(0x3 << USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT) |
399+
(0x2 << USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT);
400+
brcm_usb_writel(reg, USB_CTRL_REG(ctrl, P0_U2PHY_CFG2));
401+
}
402+
403+
static void usb_uninit_common_74110(struct brcm_usb_init_params *params)
404+
{
405+
void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
406+
u32 reg;
407+
408+
if (params->wake_enabled) {
409+
reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM));
410+
reg |= (USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) |
411+
USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN));
412+
brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM));
413+
}
414+
usb_uninit_common_7216(params);
415+
}
416+
372417
static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params)
373418
{
374419
void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
@@ -426,6 +471,16 @@ static void usb_set_dual_select(struct brcm_usb_init_params *params)
426471
brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
427472
}
428473

474+
static const struct brcm_usb_init_ops bcm74110_ops = {
475+
.init_ipp = usb_init_ipp,
476+
.init_common = usb_init_common_74110,
477+
.init_xhci = usb_init_xhci,
478+
.uninit_common = usb_uninit_common_74110,
479+
.uninit_xhci = usb_uninit_xhci,
480+
.get_dual_select = usb_get_dual_select,
481+
.set_dual_select = usb_set_dual_select,
482+
};
483+
429484
static const struct brcm_usb_init_ops bcm7216_ops = {
430485
.init_ipp = usb_init_ipp,
431486
.init_common = usb_init_common_7216,
@@ -446,6 +501,12 @@ static const struct brcm_usb_init_ops bcm7211b0_ops = {
446501
.set_dual_select = usb_set_dual_select,
447502
};
448503

504+
void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params)
505+
{
506+
params->family_name = "74110";
507+
params->ops = &bcm74110_ops;
508+
}
509+
449510
void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
450511
{
451512

drivers/phy/broadcom/phy-brcm-usb-init.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct brcm_usb_init_params {
7272
bool wake_enabled;
7373
};
7474

75+
void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params);
7576
void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params);
7677
void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params);
7778
void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params);

drivers/phy/broadcom/phy-brcm-usb.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,16 @@ static const struct attribute_group brcm_usb_phy_group = {
283283
.attrs = brcm_usb_phy_attrs,
284284
};
285285

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+
286296
static const struct match_chip_info chip_info_4908 = {
287297
.init_func = &brcm_usb_dvr_init_4908,
288298
.required_regs = {
@@ -325,6 +335,10 @@ static const struct match_chip_info chip_info_7445 = {
325335
};
326336

327337
static const struct of_device_id brcm_usb_dt_ids[] = {
338+
{
339+
.compatible = "brcm,bcm74110-usb-phy",
340+
.data = &chip_info_74110,
341+
},
328342
{
329343
.compatible = "brcm,bcm4908-usb-phy",
330344
.data = &chip_info_4908,

0 commit comments

Comments
 (0)