phy: samsung: Add support for the Exynos5420 variant of the USB2 PHY
Exynos5420 differs a bit from Exynos5250 in USB2 PHY related registers in the PMU region. Add a variant for the Exynos5420 case. Till now, USB2 PHY worked only because the bootloader enabled the PHY, but then driver messed USB 3.0 DRD related registers during the suspend/resume cycle. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Acked-by: Krzysztof Kozlowski <krzk@kernel.org> Link: https://lore.kernel.org/r/20201120085637.7299-2-m.szyprowski@samsung.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
53e7c92c7f
commit
81b534f7e9
@ -47,6 +47,7 @@ Required properties:
|
|||||||
- "samsung,exynos4210-usb2-phy"
|
- "samsung,exynos4210-usb2-phy"
|
||||||
- "samsung,exynos4x12-usb2-phy"
|
- "samsung,exynos4x12-usb2-phy"
|
||||||
- "samsung,exynos5250-usb2-phy"
|
- "samsung,exynos5250-usb2-phy"
|
||||||
|
- "samsung,exynos5420-usb2-phy"
|
||||||
- "samsung,s5pv210-usb2-phy"
|
- "samsung,s5pv210-usb2-phy"
|
||||||
- reg : a list of registers used by phy driver
|
- reg : a list of registers used by phy driver
|
||||||
- first and obligatory is the location of phy modules registers
|
- first and obligatory is the location of phy modules registers
|
||||||
|
@ -64,7 +64,12 @@ config PHY_EXYNOS4X12_USB2
|
|||||||
config PHY_EXYNOS5250_USB2
|
config PHY_EXYNOS5250_USB2
|
||||||
bool
|
bool
|
||||||
depends on PHY_SAMSUNG_USB2
|
depends on PHY_SAMSUNG_USB2
|
||||||
default SOC_EXYNOS5250 || SOC_EXYNOS5420
|
default SOC_EXYNOS5250
|
||||||
|
|
||||||
|
config PHY_EXYNOS5420_USB2
|
||||||
|
bool
|
||||||
|
depends on PHY_SAMSUNG_USB2
|
||||||
|
default SOC_EXYNOS5420
|
||||||
|
|
||||||
config PHY_S5PV210_USB2
|
config PHY_S5PV210_USB2
|
||||||
bool "Support for S5PV210"
|
bool "Support for S5PV210"
|
||||||
|
@ -117,9 +117,9 @@
|
|||||||
|
|
||||||
/* Isolation, configured in the power management unit */
|
/* Isolation, configured in the power management unit */
|
||||||
#define EXYNOS_5250_USB_ISOL_OTG_OFFSET 0x704
|
#define EXYNOS_5250_USB_ISOL_OTG_OFFSET 0x704
|
||||||
#define EXYNOS_5250_USB_ISOL_OTG BIT(0)
|
|
||||||
#define EXYNOS_5250_USB_ISOL_HOST_OFFSET 0x708
|
#define EXYNOS_5250_USB_ISOL_HOST_OFFSET 0x708
|
||||||
#define EXYNOS_5250_USB_ISOL_HOST BIT(0)
|
#define EXYNOS_5420_USB_ISOL_HOST_OFFSET 0x70C
|
||||||
|
#define EXYNOS_5250_USB_ISOL_ENABLE BIT(0)
|
||||||
|
|
||||||
/* Mode swtich register */
|
/* Mode swtich register */
|
||||||
#define EXYNOS_5250_MODE_SWITCH_OFFSET 0x230
|
#define EXYNOS_5250_MODE_SWITCH_OFFSET 0x230
|
||||||
@ -132,7 +132,6 @@ enum exynos4x12_phy_id {
|
|||||||
EXYNOS5250_HOST,
|
EXYNOS5250_HOST,
|
||||||
EXYNOS5250_HSIC0,
|
EXYNOS5250_HSIC0,
|
||||||
EXYNOS5250_HSIC1,
|
EXYNOS5250_HSIC1,
|
||||||
EXYNOS5250_NUM_PHYS,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -176,20 +175,19 @@ static void exynos5250_isol(struct samsung_usb2_phy_instance *inst, bool on)
|
|||||||
{
|
{
|
||||||
struct samsung_usb2_phy_driver *drv = inst->drv;
|
struct samsung_usb2_phy_driver *drv = inst->drv;
|
||||||
u32 offset;
|
u32 offset;
|
||||||
u32 mask;
|
u32 mask = EXYNOS_5250_USB_ISOL_ENABLE;
|
||||||
|
|
||||||
switch (inst->cfg->id) {
|
if (drv->cfg == &exynos5250_usb2_phy_config &&
|
||||||
case EXYNOS5250_DEVICE:
|
inst->cfg->id == EXYNOS5250_DEVICE)
|
||||||
offset = EXYNOS_5250_USB_ISOL_OTG_OFFSET;
|
offset = EXYNOS_5250_USB_ISOL_OTG_OFFSET;
|
||||||
mask = EXYNOS_5250_USB_ISOL_OTG;
|
else if (drv->cfg == &exynos5250_usb2_phy_config &&
|
||||||
break;
|
inst->cfg->id == EXYNOS5250_HOST)
|
||||||
case EXYNOS5250_HOST:
|
|
||||||
offset = EXYNOS_5250_USB_ISOL_HOST_OFFSET;
|
offset = EXYNOS_5250_USB_ISOL_HOST_OFFSET;
|
||||||
mask = EXYNOS_5250_USB_ISOL_HOST;
|
else if (drv->cfg == &exynos5420_usb2_phy_config &&
|
||||||
break;
|
inst->cfg->id == EXYNOS5250_HOST)
|
||||||
default:
|
offset = EXYNOS_5420_USB_ISOL_HOST_OFFSET;
|
||||||
|
else
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
regmap_update_bits(drv->reg_pmu, offset, mask, on ? 0 : mask);
|
regmap_update_bits(drv->reg_pmu, offset, mask, on ? 0 : mask);
|
||||||
}
|
}
|
||||||
@ -390,9 +388,31 @@ static const struct samsung_usb2_common_phy exynos5250_phys[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct samsung_usb2_common_phy exynos5420_phys[] = {
|
||||||
|
{
|
||||||
|
.label = "host",
|
||||||
|
.id = EXYNOS5250_HOST,
|
||||||
|
.power_on = exynos5250_power_on,
|
||||||
|
.power_off = exynos5250_power_off,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.label = "hsic",
|
||||||
|
.id = EXYNOS5250_HSIC0,
|
||||||
|
.power_on = exynos5250_power_on,
|
||||||
|
.power_off = exynos5250_power_off,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const struct samsung_usb2_phy_config exynos5250_usb2_phy_config = {
|
const struct samsung_usb2_phy_config exynos5250_usb2_phy_config = {
|
||||||
.has_mode_switch = 1,
|
.has_mode_switch = 1,
|
||||||
.num_phys = EXYNOS5250_NUM_PHYS,
|
.num_phys = ARRAY_SIZE(exynos5250_phys),
|
||||||
.phys = exynos5250_phys,
|
.phys = exynos5250_phys,
|
||||||
.rate_to_clk = exynos5250_rate_to_clk,
|
.rate_to_clk = exynos5250_rate_to_clk,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const struct samsung_usb2_phy_config exynos5420_usb2_phy_config = {
|
||||||
|
.has_mode_switch = 1,
|
||||||
|
.num_phys = ARRAY_SIZE(exynos5420_phys),
|
||||||
|
.phys = exynos5420_phys,
|
||||||
|
.rate_to_clk = exynos5250_rate_to_clk,
|
||||||
|
};
|
||||||
|
@ -128,6 +128,12 @@ static const struct of_device_id samsung_usb2_phy_of_match[] = {
|
|||||||
.data = &exynos5250_usb2_phy_config,
|
.data = &exynos5250_usb2_phy_config,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_PHY_EXYNOS5420_USB2
|
||||||
|
{
|
||||||
|
.compatible = "samsung,exynos5420-usb2-phy",
|
||||||
|
.data = &exynos5420_usb2_phy_config,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_PHY_S5PV210_USB2
|
#ifdef CONFIG_PHY_S5PV210_USB2
|
||||||
{
|
{
|
||||||
.compatible = "samsung,s5pv210-usb2-phy",
|
.compatible = "samsung,s5pv210-usb2-phy",
|
||||||
|
@ -66,5 +66,6 @@ extern const struct samsung_usb2_phy_config exynos3250_usb2_phy_config;
|
|||||||
extern const struct samsung_usb2_phy_config exynos4210_usb2_phy_config;
|
extern const struct samsung_usb2_phy_config exynos4210_usb2_phy_config;
|
||||||
extern const struct samsung_usb2_phy_config exynos4x12_usb2_phy_config;
|
extern const struct samsung_usb2_phy_config exynos4x12_usb2_phy_config;
|
||||||
extern const struct samsung_usb2_phy_config exynos5250_usb2_phy_config;
|
extern const struct samsung_usb2_phy_config exynos5250_usb2_phy_config;
|
||||||
|
extern const struct samsung_usb2_phy_config exynos5420_usb2_phy_config;
|
||||||
extern const struct samsung_usb2_phy_config s5pv210_usb2_phy_config;
|
extern const struct samsung_usb2_phy_config s5pv210_usb2_phy_config;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user