Commit de143a40 authored by Martin Blumenstingl's avatar Martin Blumenstingl Committed by Vinod Koul

phy: amlogic: meson8b-usb2: Use a MMIO regmap

Using a MMIO regmap and switch to regmap_update_bits() to simplify the
code in the driver. Also switch to devm_platform_ioremap_resource()
instead of open-coding it. No functional changes intended.
Signed-off-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Tested-by: default avatarThomas Graichen <thomas.graichen@gmail.com>
Link: https://lore.kernel.org/r/20200512222424.549351-4-martin.blumenstingl@googlemail.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 2c0dd844
...@@ -9,6 +9,7 @@ config PHY_MESON8B_USB2 ...@@ -9,6 +9,7 @@ config PHY_MESON8B_USB2
depends on USB_SUPPORT depends on USB_SUPPORT
select USB_COMMON select USB_COMMON
select GENERIC_PHY select GENERIC_PHY
select REGMAP_MMIO
help help
Enable this to support the Meson USB2 PHYs found in Meson8, Enable this to support the Meson USB2 PHYs found in Meson8,
Meson8b and GXBB SoCs. Meson8b and GXBB SoCs.
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/regmap.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/phy/phy.h> #include <linux/phy/phy.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -105,34 +106,24 @@ ...@@ -105,34 +106,24 @@
#define ACA_ENABLE_COMPLETE_TIME 50 #define ACA_ENABLE_COMPLETE_TIME 50
struct phy_meson8b_usb2_priv { struct phy_meson8b_usb2_priv {
void __iomem *regs; struct regmap *regmap;
enum usb_dr_mode dr_mode; enum usb_dr_mode dr_mode;
struct clk *clk_usb_general; struct clk *clk_usb_general;
struct clk *clk_usb; struct clk *clk_usb;
struct reset_control *reset; struct reset_control *reset;
}; };
static u32 phy_meson8b_usb2_read(struct phy_meson8b_usb2_priv *phy_priv, static const struct regmap_config phy_meson8b_usb2_regmap_conf = {
u32 reg) .reg_bits = 8,
{ .val_bits = 32,
return readl(phy_priv->regs + reg); .reg_stride = 4,
} .max_register = REG_TUNE,
};
static void phy_meson8b_usb2_mask_bits(struct phy_meson8b_usb2_priv *phy_priv,
u32 reg, u32 mask, u32 value)
{
u32 data;
data = phy_meson8b_usb2_read(phy_priv, reg);
data &= ~mask;
data |= (value & mask);
writel(data, phy_priv->regs + reg);
}
static int phy_meson8b_usb2_power_on(struct phy *phy) static int phy_meson8b_usb2_power_on(struct phy *phy)
{ {
struct phy_meson8b_usb2_priv *priv = phy_get_drvdata(phy); struct phy_meson8b_usb2_priv *priv = phy_get_drvdata(phy);
u32 reg;
int ret; int ret;
if (!IS_ERR_OR_NULL(priv->reset)) { if (!IS_ERR_OR_NULL(priv->reset)) {
...@@ -156,34 +147,34 @@ static int phy_meson8b_usb2_power_on(struct phy *phy) ...@@ -156,34 +147,34 @@ static int phy_meson8b_usb2_power_on(struct phy *phy)
return ret; return ret;
} }
phy_meson8b_usb2_mask_bits(priv, REG_CONFIG, REG_CONFIG_CLK_32k_ALTSEL, regmap_update_bits(priv->regmap, REG_CONFIG, REG_CONFIG_CLK_32k_ALTSEL,
REG_CONFIG_CLK_32k_ALTSEL); REG_CONFIG_CLK_32k_ALTSEL);
phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_REF_CLK_SEL_MASK, regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_REF_CLK_SEL_MASK,
0x2 << REG_CTRL_REF_CLK_SEL_SHIFT); 0x2 << REG_CTRL_REF_CLK_SEL_SHIFT);
phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_FSEL_MASK, regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_FSEL_MASK,
0x5 << REG_CTRL_FSEL_SHIFT); 0x5 << REG_CTRL_FSEL_SHIFT);
/* reset the PHY */ /* reset the PHY */
phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_POWER_ON_RESET, regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_POWER_ON_RESET,
REG_CTRL_POWER_ON_RESET); REG_CTRL_POWER_ON_RESET);
udelay(RESET_COMPLETE_TIME); udelay(RESET_COMPLETE_TIME);
phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_POWER_ON_RESET, 0); regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_POWER_ON_RESET, 0);
udelay(RESET_COMPLETE_TIME); udelay(RESET_COMPLETE_TIME);
phy_meson8b_usb2_mask_bits(priv, REG_CTRL, REG_CTRL_SOF_TOGGLE_OUT, regmap_update_bits(priv->regmap, REG_CTRL, REG_CTRL_SOF_TOGGLE_OUT,
REG_CTRL_SOF_TOGGLE_OUT); REG_CTRL_SOF_TOGGLE_OUT);
if (priv->dr_mode == USB_DR_MODE_HOST) { if (priv->dr_mode == USB_DR_MODE_HOST) {
phy_meson8b_usb2_mask_bits(priv, REG_ADP_BC, regmap_update_bits(priv->regmap, REG_ADP_BC,
REG_ADP_BC_ACA_ENABLE, REG_ADP_BC_ACA_ENABLE,
REG_ADP_BC_ACA_ENABLE); REG_ADP_BC_ACA_ENABLE);
udelay(ACA_ENABLE_COMPLETE_TIME); udelay(ACA_ENABLE_COMPLETE_TIME);
if (phy_meson8b_usb2_read(priv, REG_ADP_BC) & regmap_read(priv->regmap, REG_ADP_BC, &reg);
REG_ADP_BC_ACA_PIN_FLOAT) { if (reg & REG_ADP_BC_ACA_PIN_FLOAT) {
dev_warn(&phy->dev, "USB ID detect failed!\n"); dev_warn(&phy->dev, "USB ID detect failed!\n");
clk_disable_unprepare(priv->clk_usb); clk_disable_unprepare(priv->clk_usb);
clk_disable_unprepare(priv->clk_usb_general); clk_disable_unprepare(priv->clk_usb_general);
...@@ -213,18 +204,22 @@ static const struct phy_ops phy_meson8b_usb2_ops = { ...@@ -213,18 +204,22 @@ static const struct phy_ops phy_meson8b_usb2_ops = {
static int phy_meson8b_usb2_probe(struct platform_device *pdev) static int phy_meson8b_usb2_probe(struct platform_device *pdev)
{ {
struct phy_meson8b_usb2_priv *priv; struct phy_meson8b_usb2_priv *priv;
struct resource *res;
struct phy *phy; struct phy *phy;
struct phy_provider *phy_provider; struct phy_provider *phy_provider;
void __iomem *base;
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); base = devm_platform_ioremap_resource(pdev, 0);
priv->regs = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(base))
if (IS_ERR(priv->regs)) return PTR_ERR(base);
return PTR_ERR(priv->regs);
priv->regmap = devm_regmap_init_mmio(&pdev->dev, base,
&phy_meson8b_usb2_regmap_conf);
if (IS_ERR(priv->regmap))
return PTR_ERR(priv->regmap);
priv->clk_usb_general = devm_clk_get(&pdev->dev, "usb_general"); priv->clk_usb_general = devm_clk_get(&pdev->dev, "usb_general");
if (IS_ERR(priv->clk_usb_general)) if (IS_ERR(priv->clk_usb_general))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment