Hi, Marek
2014년 07월 04일 21:13, Marek Szyprowski 쓴 글:
> This patch adds support for Exynos3250 SoC to Exynos2USB PHY driver.
> Although Exynos3250 has only one device phy interface, the register
> layout and all operations that are required to get it enabled are almost
> same as on Exynos4x12. The only different is one more register
> (REFCLKSEL) which need to be set.
>
> Signed-off-by: Marek Szyprowski <[email protected]>
> ---
> drivers/phy/Kconfig | 12 ++++++------
> drivers/phy/phy-exynos4x12-usb2.c | 18 ++++++++++++++++++
> drivers/phy/phy-samsung-usb2.c | 6 ++++++
> drivers/phy/phy-samsung-usb2.h | 2 ++
> 4 files changed, 32 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index 16a2f067c242..58737b9eaa6e 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -141,14 +141,14 @@ config PHY_EXYNOS4210_USB2
> phys are available - device, host, HSIC0 and HSIC1.
>
> config PHY_EXYNOS4X12_USB2
> - bool "Support for Exynos 4x12"
> + bool "Support for Exynos 3250/4x12"
> depends on PHY_SAMSUNG_USB2
> - depends on (SOC_EXYNOS4212 || SOC_EXYNOS4412)
> + depends on (SOC_EXYNOS3250 || SOC_EXYNOS4212 || SOC_EXYNOS4412)
> help
> - Enable USB PHY support for Exynos 4x12. This option requires that
> - Samsung USB 2.0 PHY driver is enabled and means that support for this
> - particular SoC is compiled in the driver. In case of Exynos 4x12 four
> - phys are available - device, host, HSIC0 and HSIC1.
> + Enable USB PHY support for Exynos 3250/4x12. This option requires
> + that Samsung USB 2.0 PHY driver is enabled and means that support for
> + this particular SoC is compiled in the driver. In case of Exynos 4x12
> + four phys are available - device, host, HSIC0 and HSIC1.
>
> config PHY_EXYNOS5250_USB2
> bool "Support for Exynos 5250"
> diff --git a/drivers/phy/phy-exynos4x12-usb2.c
> b/drivers/phy/phy-exynos4x12-usb2.c
> index 59d8dd3ff390..b29bbfacd4b5 100644
> --- a/drivers/phy/phy-exynos4x12-usb2.c
> +++ b/drivers/phy/phy-exynos4x12-usb2.c
> @@ -67,6 +67,12 @@
> #define EXYNOS_4x12_UPHYCLK_PHYFSEL_24MHZ (0x5 << 0)
> #define EXYNOS_4x12_UPHYCLK_PHYFSEL_50MHZ (0x7 << 0)
>
> +#define EXYNOS_4212_UPHYCLK_PHY0_ID_PULLUP (0x1 << 3)
> +#define EXYNOS_4212_UPHYCLK_PHY0_COMMON_ON (0x1 << 4)
> +#define EXYNOS_4212_UPHYCLK_PHY1_COMMON_ON (0x1 << 7)
> +
> +#define EXYNOS_3250_UPHYCLK_REFCLKSEL (0x2 << 8)
> +
> #define EXYNOS_4x12_UPHYCLK_PHY0_ID_PULLUP BIT(3)
> #define EXYNOS_4x12_UPHYCLK_PHY0_COMMON_ON BIT(4)
> #define EXYNOS_4x12_UPHYCLK_PHY1_COMMON_ON BIT(7)
> @@ -197,6 +203,10 @@ static void exynos4x12_setup_clk(struct
> samsung_usb2_phy_instance *inst)
>
> clk = readl(drv->reg_phy + EXYNOS_4x12_UPHYCLK);
> clk &= ~EXYNOS_4x12_UPHYCLK_PHYFSEL_MASK;
> +
> + if (drv->cfg->has_refclk_sel)
> + clk = EXYNOS_3250_UPHYCLK_REFCLKSEL;
> +
> clk |= drv->ref_reg_val << EXYNOS_4x12_UPHYCLK_PHYFSEL_OFFSET;
> clk |= EXYNOS_4x12_UPHYCLK_PHY1_COMMON_ON;
> writel(clk, drv->reg_phy + EXYNOS_4x12_UPHYCLK);
> @@ -358,6 +368,14 @@ static const struct samsung_usb2_common_phy
> exynos4x12_phys[] = {
> {},
> };
>
> +const struct samsung_usb2_phy_config exynos3250_usb2_phy_config = {
> + .has_mode_switch = 1,
> + .has_refclk_sel = 1,
> + .num_phys = 1,
> + .phys = exynos4x12_phys,
> + .rate_to_clk = exynos4x12_rate_to_clk,
> +};
> +
As you were told, exynos3250 has only one device phy interface.
so, has_mode_switch should be 0.
And related change like switch_mode in exynos4x12_phy_pwr should be changed.
> const struct samsung_usb2_phy_config exynos4x12_usb2_phy_config = {
> .has_mode_switch = 1,
> .num_phys = EXYNOS4x12_NUM_PHYS,
> diff --git a/drivers/phy/phy-samsung-usb2.c b/drivers/phy/phy-samsung-usb2.c
> index 8a8c6bc8709a..36db8eb8c5f4 100644
> --- a/drivers/phy/phy-samsung-usb2.c
> +++ b/drivers/phy/phy-samsung-usb2.c
> @@ -87,6 +87,12 @@ static struct phy *samsung_usb2_phy_xlate(struct device
> *dev,
> }
>
> static const struct of_device_id samsung_usb2_phy_of_match[] = {
> +#ifdef CONFIG_PHY_EXYNOS4X12_USB2
> + {
> + .compatible = "samsung,exynos3250-usb2-phy",
> + .data = &exynos3250_usb2_phy_config,
> + },
> +#endif
> #ifdef CONFIG_PHY_EXYNOS4210_USB2
> {
> .compatible = "samsung,exynos4210-usb2-phy",
> diff --git a/drivers/phy/phy-samsung-usb2.h b/drivers/phy/phy-samsung-usb2.h
> index 918847843a95..b03da0ef39ac 100644
> --- a/drivers/phy/phy-samsung-usb2.h
> +++ b/drivers/phy/phy-samsung-usb2.h
> @@ -60,8 +60,10 @@ struct samsung_usb2_phy_config {
> int (*rate_to_clk)(unsigned long, u32 *);
> unsigned int num_phys;
> bool has_mode_switch;
> + bool has_refclk_sel;
> };
>
> +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 exynos4x12_usb2_phy_config;
> extern const struct samsung_usb2_phy_config exynos5250_usb2_phy_config;
It works fine in rinato 3250 boards.
but, some property is not right, in my thought.
thanks,
Jaewon Kim.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html