usb: dwc3: add hsphy_interface property
Platforms that have configured DWC_USB3_HSPHY_INTERFACE with value 3, i.e. UTMI+ and ULPI, need to inform the driver of the actual HSPHY interface type with the property. "utmi" if the interface is UTMI+ or "ulpi" if the interface is ULPI. Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Acked-by: David Cohen <david.a.cohen@linux.intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
Родитель
45bb7de213
Коммит
3e10a2ce98
|
@ -38,6 +38,8 @@ Optional properties:
|
||||||
- snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
|
- snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
|
||||||
utmi_l1_suspend_n, false when asserts utmi_sleep_n
|
utmi_l1_suspend_n, false when asserts utmi_sleep_n
|
||||||
- snps,hird-threshold: HIRD threshold
|
- snps,hird-threshold: HIRD threshold
|
||||||
|
- snps,hsphy_interface: High-Speed PHY interface selection between "utmi" for
|
||||||
|
UTMI+ and "ulpi" for ULPI when the DWC_USB3_HSPHY_INTERFACE has value 3.
|
||||||
|
|
||||||
This is usually a subnode to DWC3 glue to which it is connected.
|
This is usually a subnode to DWC3 glue to which it is connected.
|
||||||
|
|
||||||
|
|
|
@ -438,6 +438,22 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
|
||||||
|
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
|
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
|
||||||
|
|
||||||
|
/* Select the HS PHY interface */
|
||||||
|
switch (DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3)) {
|
||||||
|
case DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI:
|
||||||
|
if (!strncmp(dwc->hsphy_interface, "utmi", 4)) {
|
||||||
|
reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI;
|
||||||
|
} else if (!strncmp(dwc->hsphy_interface, "ulpi", 4)) {
|
||||||
|
reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI;
|
||||||
|
} else {
|
||||||
|
dev_warn(dwc->dev, "HSPHY Interface not defined\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Above 1.94a, it is recommended to set DWC3_GUSB2PHYCFG_SUSPHY to
|
* Above 1.94a, it is recommended to set DWC3_GUSB2PHYCFG_SUSPHY to
|
||||||
* '0' during coreConsultant configuration. So default value will
|
* '0' during coreConsultant configuration. So default value will
|
||||||
|
@ -844,6 +860,8 @@ static int dwc3_probe(struct platform_device *pdev)
|
||||||
"snps,tx_de_emphasis_quirk");
|
"snps,tx_de_emphasis_quirk");
|
||||||
of_property_read_u8(node, "snps,tx_de_emphasis",
|
of_property_read_u8(node, "snps,tx_de_emphasis",
|
||||||
&tx_de_emphasis);
|
&tx_de_emphasis);
|
||||||
|
of_property_read_string(node, "snps,hsphy_interface",
|
||||||
|
&dwc->hsphy_interface);
|
||||||
} else if (pdata) {
|
} else if (pdata) {
|
||||||
dwc->maximum_speed = pdata->maximum_speed;
|
dwc->maximum_speed = pdata->maximum_speed;
|
||||||
dwc->has_lpm_erratum = pdata->has_lpm_erratum;
|
dwc->has_lpm_erratum = pdata->has_lpm_erratum;
|
||||||
|
@ -871,6 +889,8 @@ static int dwc3_probe(struct platform_device *pdev)
|
||||||
dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk;
|
dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk;
|
||||||
if (pdata->tx_de_emphasis)
|
if (pdata->tx_de_emphasis)
|
||||||
tx_de_emphasis = pdata->tx_de_emphasis;
|
tx_de_emphasis = pdata->tx_de_emphasis;
|
||||||
|
|
||||||
|
dwc->hsphy_interface = pdata->hsphy_interface;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default to superspeed if no maximum_speed passed */
|
/* default to superspeed if no maximum_speed passed */
|
||||||
|
|
|
@ -682,6 +682,7 @@ struct dwc3_scratchpad_array {
|
||||||
* @test_mode_nr: test feature selector
|
* @test_mode_nr: test feature selector
|
||||||
* @lpm_nyet_threshold: LPM NYET response threshold
|
* @lpm_nyet_threshold: LPM NYET response threshold
|
||||||
* @hird_threshold: HIRD threshold
|
* @hird_threshold: HIRD threshold
|
||||||
|
* @hsphy_interface: "utmi" or "ulpi"
|
||||||
* @delayed_status: true when gadget driver asks for delayed status
|
* @delayed_status: true when gadget driver asks for delayed status
|
||||||
* @ep0_bounced: true when we used bounce buffer
|
* @ep0_bounced: true when we used bounce buffer
|
||||||
* @ep0_expect_in: true when we expect a DATA IN transfer
|
* @ep0_expect_in: true when we expect a DATA IN transfer
|
||||||
|
@ -809,6 +810,8 @@ struct dwc3 {
|
||||||
u8 lpm_nyet_threshold;
|
u8 lpm_nyet_threshold;
|
||||||
u8 hird_threshold;
|
u8 hird_threshold;
|
||||||
|
|
||||||
|
const char *hsphy_interface;
|
||||||
|
|
||||||
unsigned delayed_status:1;
|
unsigned delayed_status:1;
|
||||||
unsigned ep0_bounced:1;
|
unsigned ep0_bounced:1;
|
||||||
unsigned ep0_expect_in:1;
|
unsigned ep0_expect_in:1;
|
||||||
|
|
|
@ -45,4 +45,6 @@ struct dwc3_platform_data {
|
||||||
|
|
||||||
unsigned tx_de_emphasis_quirk:1;
|
unsigned tx_de_emphasis_quirk:1;
|
||||||
unsigned tx_de_emphasis:2;
|
unsigned tx_de_emphasis:2;
|
||||||
|
|
||||||
|
const char *hsphy_interface;
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче