aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phy/phy-qcom-ufs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/phy/phy-qcom-ufs.c')
-rw-r--r--drivers/phy/phy-qcom-ufs.c37
1 files changed, 10 insertions, 27 deletions
diff --git a/drivers/phy/phy-qcom-ufs.c b/drivers/phy/phy-qcom-ufs.c
index c69568b8543d..43865ef340e2 100644
--- a/drivers/phy/phy-qcom-ufs.c
+++ b/drivers/phy/phy-qcom-ufs.c
@@ -189,12 +189,12 @@ int ufs_qcom_phy_init_clks(struct ufs_qcom_phy *phy_common)
189 if (err) 189 if (err)
190 goto out; 190 goto out;
191 191
192skip_txrx_clk:
192 err = ufs_qcom_phy_clk_get(phy_common->dev, "ref_clk_src", 193 err = ufs_qcom_phy_clk_get(phy_common->dev, "ref_clk_src",
193 &phy_common->ref_clk_src); 194 &phy_common->ref_clk_src);
194 if (err) 195 if (err)
195 goto out; 196 goto out;
196 197
197skip_txrx_clk:
198 /* 198 /*
199 * "ref_clk_parent" is optional hence don't abort init if it's not 199 * "ref_clk_parent" is optional hence don't abort init if it's not
200 * found. 200 * found.
@@ -210,25 +210,19 @@ out:
210} 210}
211EXPORT_SYMBOL_GPL(ufs_qcom_phy_init_clks); 211EXPORT_SYMBOL_GPL(ufs_qcom_phy_init_clks);
212 212
213static int __ufs_qcom_phy_init_vreg(struct device *dev, 213static int ufs_qcom_phy_init_vreg(struct device *dev,
214 struct ufs_qcom_phy_vreg *vreg, const char *name, bool optional) 214 struct ufs_qcom_phy_vreg *vreg,
215 const char *name)
215{ 216{
216 int err = 0; 217 int err = 0;
217 218
218 char prop_name[MAX_PROP_NAME]; 219 char prop_name[MAX_PROP_NAME];
219 220
220 vreg->name = devm_kstrdup(dev, name, GFP_KERNEL); 221 vreg->name = name;
221 if (!vreg->name) {
222 err = -ENOMEM;
223 goto out;
224 }
225
226 vreg->reg = devm_regulator_get(dev, name); 222 vreg->reg = devm_regulator_get(dev, name);
227 if (IS_ERR(vreg->reg)) { 223 if (IS_ERR(vreg->reg)) {
228 err = PTR_ERR(vreg->reg); 224 err = PTR_ERR(vreg->reg);
229 vreg->reg = NULL; 225 dev_err(dev, "failed to get %s, %d\n", name, err);
230 if (!optional)
231 dev_err(dev, "failed to get %s, %d\n", name, err);
232 goto out; 226 goto out;
233 } 227 }
234 228
@@ -248,9 +242,6 @@ static int __ufs_qcom_phy_init_vreg(struct device *dev,
248 } 242 }
249 err = 0; 243 err = 0;
250 } 244 }
251 snprintf(prop_name, MAX_PROP_NAME, "%s-always-on", name);
252 vreg->is_always_on = of_property_read_bool(dev->of_node,
253 prop_name);
254 } 245 }
255 246
256 if (!strcmp(name, "vdda-pll")) { 247 if (!strcmp(name, "vdda-pll")) {
@@ -265,17 +256,9 @@ static int __ufs_qcom_phy_init_vreg(struct device *dev,
265 } 256 }
266 257
267out: 258out:
268 if (err)
269 kfree(vreg->name);
270 return err; 259 return err;
271} 260}
272 261
273static int ufs_qcom_phy_init_vreg(struct device *dev,
274 struct ufs_qcom_phy_vreg *vreg, const char *name)
275{
276 return __ufs_qcom_phy_init_vreg(dev, vreg, name, false);
277}
278
279int ufs_qcom_phy_init_vregulators(struct ufs_qcom_phy *phy_common) 262int ufs_qcom_phy_init_vregulators(struct ufs_qcom_phy *phy_common)
280{ 263{
281 int err; 264 int err;
@@ -291,9 +274,9 @@ int ufs_qcom_phy_init_vregulators(struct ufs_qcom_phy *phy_common)
291 if (err) 274 if (err)
292 goto out; 275 goto out;
293 276
294 /* vddp-ref-clk-* properties are optional */ 277 err = ufs_qcom_phy_init_vreg(phy_common->dev, &phy_common->vddp_ref_clk,
295 __ufs_qcom_phy_init_vreg(phy_common->dev, &phy_common->vddp_ref_clk, 278 "vddp-ref-clk");
296 "vddp-ref-clk", true); 279
297out: 280out:
298 return err; 281 return err;
299} 282}
@@ -416,7 +399,7 @@ static int ufs_qcom_phy_disable_vreg(struct device *dev,
416{ 399{
417 int ret = 0; 400 int ret = 0;
418 401
419 if (!vreg || !vreg->enabled || vreg->is_always_on) 402 if (!vreg || !vreg->enabled)
420 goto out; 403 goto out;
421 404
422 ret = regulator_disable(vreg->reg); 405 ret = regulator_disable(vreg->reg);