Commit 04edf6d6 authored by Amelie Delaunay's avatar Amelie Delaunay Committed by Vinod Koul

phy: stm32: replace regulator_bulk* by multiple regulator_*

Due to async_schedule_domain call in regulator_bulk_enable,
scheduling while atomic bug can raise if regulator_bulk_enable is called
under atomic context.
To avoid this issue, this patch replaces all regulator_bulk* by regulator_
per regulators.
Signed-off-by: default avatarAmelie Delaunay <amelie.delaunay@foss.st.com>
Link: https://lore.kernel.org/r/20210105090525.23164-4-amelie.delaunay@foss.st.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 613a475f
...@@ -36,13 +36,6 @@ ...@@ -36,13 +36,6 @@
#define MINREV GENMASK(3, 0) #define MINREV GENMASK(3, 0)
#define MAJREV GENMASK(7, 4) #define MAJREV GENMASK(7, 4)
static const char * const supplies_names[] = {
"vdda1v1", /* 1V1 */
"vdda1v8", /* 1V8 */
};
#define NUM_SUPPLIES ARRAY_SIZE(supplies_names)
#define PLL_LOCK_TIME_US 100 #define PLL_LOCK_TIME_US 100
#define PLL_PWR_DOWN_TIME_US 5 #define PLL_PWR_DOWN_TIME_US 5
#define PLL_FVCO_MHZ 2880 #define PLL_FVCO_MHZ 2880
...@@ -69,7 +62,8 @@ struct stm32_usbphyc { ...@@ -69,7 +62,8 @@ struct stm32_usbphyc {
struct reset_control *rst; struct reset_control *rst;
struct stm32_usbphyc_phy **phys; struct stm32_usbphyc_phy **phys;
int nphys; int nphys;
struct regulator_bulk_data supplies[NUM_SUPPLIES]; struct regulator *vdda1v1;
struct regulator *vdda1v8;
int switch_setup; int switch_setup;
}; };
...@@ -83,6 +77,41 @@ static inline void stm32_usbphyc_clr_bits(void __iomem *reg, u32 bits) ...@@ -83,6 +77,41 @@ static inline void stm32_usbphyc_clr_bits(void __iomem *reg, u32 bits)
writel_relaxed(readl_relaxed(reg) & ~bits, reg); writel_relaxed(readl_relaxed(reg) & ~bits, reg);
} }
static int stm32_usbphyc_regulators_enable(struct stm32_usbphyc *usbphyc)
{
int ret;
ret = regulator_enable(usbphyc->vdda1v1);
if (ret)
return ret;
ret = regulator_enable(usbphyc->vdda1v8);
if (ret)
goto vdda1v1_disable;
return 0;
vdda1v1_disable:
regulator_disable(usbphyc->vdda1v1);
return ret;
}
static int stm32_usbphyc_regulators_disable(struct stm32_usbphyc *usbphyc)
{
int ret;
ret = regulator_disable(usbphyc->vdda1v8);
if (ret)
return ret;
ret = regulator_disable(usbphyc->vdda1v1);
if (ret)
return ret;
return 0;
}
static void stm32_usbphyc_get_pll_params(u32 clk_rate, static void stm32_usbphyc_get_pll_params(u32 clk_rate,
struct pll_params *pll_params) struct pll_params *pll_params)
{ {
...@@ -170,7 +199,7 @@ static int stm32_usbphyc_pll_disable(struct stm32_usbphyc *usbphyc) ...@@ -170,7 +199,7 @@ static int stm32_usbphyc_pll_disable(struct stm32_usbphyc *usbphyc)
return -EIO; return -EIO;
} }
return regulator_bulk_disable(NUM_SUPPLIES, usbphyc->supplies); return stm32_usbphyc_regulators_disable(usbphyc);
} }
static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc) static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc)
...@@ -189,7 +218,7 @@ static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc) ...@@ -189,7 +218,7 @@ static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc)
return ret; return ret;
} }
ret = regulator_bulk_enable(NUM_SUPPLIES, usbphyc->supplies); ret = stm32_usbphyc_regulators_enable(usbphyc);
if (ret) if (ret)
return ret; return ret;
...@@ -210,7 +239,7 @@ static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc) ...@@ -210,7 +239,7 @@ static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc)
return 0; return 0;
reg_disable: reg_disable:
regulator_bulk_disable(NUM_SUPPLIES, usbphyc->supplies); stm32_usbphyc_regulators_disable(usbphyc);
return ret; return ret;
} }
...@@ -306,7 +335,7 @@ static int stm32_usbphyc_probe(struct platform_device *pdev) ...@@ -306,7 +335,7 @@ static int stm32_usbphyc_probe(struct platform_device *pdev)
struct device_node *child, *np = dev->of_node; struct device_node *child, *np = dev->of_node;
struct phy_provider *phy_provider; struct phy_provider *phy_provider;
u32 version; u32 version;
int ret, i, port = 0; int ret, port = 0;
usbphyc = devm_kzalloc(dev, sizeof(*usbphyc), GFP_KERNEL); usbphyc = devm_kzalloc(dev, sizeof(*usbphyc), GFP_KERNEL);
if (!usbphyc) if (!usbphyc)
...@@ -348,13 +377,19 @@ static int stm32_usbphyc_probe(struct platform_device *pdev) ...@@ -348,13 +377,19 @@ static int stm32_usbphyc_probe(struct platform_device *pdev)
goto clk_disable; goto clk_disable;
} }
for (i = 0; i < NUM_SUPPLIES; i++) usbphyc->vdda1v1 = devm_regulator_get(dev, "vdda1v1");
usbphyc->supplies[i].supply = supplies_names[i]; if (IS_ERR(usbphyc->vdda1v1)) {
ret = PTR_ERR(usbphyc->vdda1v1);
if (ret != -EPROBE_DEFER)
dev_err(dev, "failed to get vdda1v1 supply: %d\n", ret);
goto clk_disable;
}
ret = devm_regulator_bulk_get(dev, NUM_SUPPLIES, usbphyc->supplies); usbphyc->vdda1v8 = devm_regulator_get(dev, "vdda1v8");
if (ret) { if (IS_ERR(usbphyc->vdda1v8)) {
ret = PTR_ERR(usbphyc->vdda1v8);
if (ret != -EPROBE_DEFER) if (ret != -EPROBE_DEFER)
dev_err(dev, "failed to get regulators: %d\n", ret); dev_err(dev, "failed to get vdda1v8 supply: %d\n", ret);
goto clk_disable; goto clk_disable;
} }
......
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