|
@@ -27,6 +27,7 @@
|
|
|
#include <linux/usb/usb_phy_generic.h>
|
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_platform.h>
|
|
|
+#include <linux/regulator/consumer.h>
|
|
|
|
|
|
struct dwc3_exynos {
|
|
|
struct platform_device *usb2_phy;
|
|
@@ -34,6 +35,8 @@ struct dwc3_exynos {
|
|
|
struct device *dev;
|
|
|
|
|
|
struct clk *clk;
|
|
|
+ struct regulator *vdd33;
|
|
|
+ struct regulator *vdd10;
|
|
|
};
|
|
|
|
|
|
static int dwc3_exynos_register_phys(struct dwc3_exynos *exynos)
|
|
@@ -144,20 +147,46 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
|
|
|
|
|
|
clk_prepare_enable(exynos->clk);
|
|
|
|
|
|
+ exynos->vdd33 = devm_regulator_get(dev, "vdd33");
|
|
|
+ if (IS_ERR(exynos->vdd33)) {
|
|
|
+ ret = PTR_ERR(exynos->vdd33);
|
|
|
+ goto err2;
|
|
|
+ }
|
|
|
+ ret = regulator_enable(exynos->vdd33);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Failed to enable VDD33 supply\n");
|
|
|
+ goto err2;
|
|
|
+ }
|
|
|
+
|
|
|
+ exynos->vdd10 = devm_regulator_get(dev, "vdd10");
|
|
|
+ if (IS_ERR(exynos->vdd10)) {
|
|
|
+ ret = PTR_ERR(exynos->vdd10);
|
|
|
+ goto err3;
|
|
|
+ }
|
|
|
+ ret = regulator_enable(exynos->vdd10);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Failed to enable VDD10 supply\n");
|
|
|
+ goto err3;
|
|
|
+ }
|
|
|
+
|
|
|
if (node) {
|
|
|
ret = of_platform_populate(node, NULL, NULL, dev);
|
|
|
if (ret) {
|
|
|
dev_err(dev, "failed to add dwc3 core\n");
|
|
|
- goto err2;
|
|
|
+ goto err4;
|
|
|
}
|
|
|
} else {
|
|
|
dev_err(dev, "no device node, failed to add dwc3 core\n");
|
|
|
ret = -ENODEV;
|
|
|
- goto err2;
|
|
|
+ goto err4;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+err4:
|
|
|
+ regulator_disable(exynos->vdd10);
|
|
|
+err3:
|
|
|
+ regulator_disable(exynos->vdd33);
|
|
|
err2:
|
|
|
clk_disable_unprepare(clk);
|
|
|
err1:
|
|
@@ -174,6 +203,9 @@ static int dwc3_exynos_remove(struct platform_device *pdev)
|
|
|
|
|
|
clk_disable_unprepare(exynos->clk);
|
|
|
|
|
|
+ regulator_disable(exynos->vdd33);
|
|
|
+ regulator_disable(exynos->vdd10);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -192,12 +224,27 @@ static int dwc3_exynos_suspend(struct device *dev)
|
|
|
|
|
|
clk_disable(exynos->clk);
|
|
|
|
|
|
+ regulator_disable(exynos->vdd33);
|
|
|
+ regulator_disable(exynos->vdd10);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int dwc3_exynos_resume(struct device *dev)
|
|
|
{
|
|
|
struct dwc3_exynos *exynos = dev_get_drvdata(dev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = regulator_enable(exynos->vdd33);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Failed to enable VDD33 supply\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ ret = regulator_enable(exynos->vdd10);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Failed to enable VDD10 supply\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
clk_enable(exynos->clk);
|
|
|
|