Commit 7a475eb4 authored by Qiang Yu's avatar Qiang Yu

drm/lima: separate clk/regulator enable/disable function

For being used by both device init/fini and suspend/resume.
Tested-by: default avatarBhushan Shah <bshah@kde.org>
Reviewed-by: default avatarVasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: default avatarQiang Yu <yuq825@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200421133551.31481-9-yuq825@gmail.com
parent 3446d7e9
...@@ -81,6 +81,44 @@ const char *lima_ip_name(struct lima_ip *ip) ...@@ -81,6 +81,44 @@ const char *lima_ip_name(struct lima_ip *ip)
return lima_ip_desc[ip->id].name; return lima_ip_desc[ip->id].name;
} }
static int lima_clk_enable(struct lima_device *dev)
{
int err;
err = clk_prepare_enable(dev->clk_bus);
if (err)
return err;
err = clk_prepare_enable(dev->clk_gpu);
if (err)
goto error_out0;
if (dev->reset) {
err = reset_control_deassert(dev->reset);
if (err) {
dev_err(dev->dev,
"reset controller deassert failed %d\n", err);
goto error_out1;
}
}
return 0;
error_out1:
clk_disable_unprepare(dev->clk_gpu);
error_out0:
clk_disable_unprepare(dev->clk_bus);
return err;
}
static void lima_clk_disable(struct lima_device *dev)
{
if (dev->reset)
reset_control_assert(dev->reset);
clk_disable_unprepare(dev->clk_gpu);
clk_disable_unprepare(dev->clk_bus);
}
static int lima_clk_init(struct lima_device *dev) static int lima_clk_init(struct lima_device *dev)
{ {
int err; int err;
...@@ -90,6 +128,7 @@ static int lima_clk_init(struct lima_device *dev) ...@@ -90,6 +128,7 @@ static int lima_clk_init(struct lima_device *dev)
err = PTR_ERR(dev->clk_bus); err = PTR_ERR(dev->clk_bus);
if (err != -EPROBE_DEFER) if (err != -EPROBE_DEFER)
dev_err(dev->dev, "get bus clk failed %d\n", err); dev_err(dev->dev, "get bus clk failed %d\n", err);
dev->clk_bus = NULL;
return err; return err;
} }
...@@ -98,49 +137,48 @@ static int lima_clk_init(struct lima_device *dev) ...@@ -98,49 +137,48 @@ static int lima_clk_init(struct lima_device *dev)
err = PTR_ERR(dev->clk_gpu); err = PTR_ERR(dev->clk_gpu);
if (err != -EPROBE_DEFER) if (err != -EPROBE_DEFER)
dev_err(dev->dev, "get core clk failed %d\n", err); dev_err(dev->dev, "get core clk failed %d\n", err);
dev->clk_gpu = NULL;
return err; return err;
} }
err = clk_prepare_enable(dev->clk_bus);
if (err)
return err;
err = clk_prepare_enable(dev->clk_gpu);
if (err)
goto error_out0;
dev->reset = devm_reset_control_array_get_optional_shared(dev->dev); dev->reset = devm_reset_control_array_get_optional_shared(dev->dev);
if (IS_ERR(dev->reset)) { if (IS_ERR(dev->reset)) {
err = PTR_ERR(dev->reset); err = PTR_ERR(dev->reset);
if (err != -EPROBE_DEFER) if (err != -EPROBE_DEFER)
dev_err(dev->dev, "get reset controller failed %d\n", dev_err(dev->dev, "get reset controller failed %d\n",
err); err);
goto error_out1; dev->reset = NULL;
} else if (dev->reset != NULL) { return err;
err = reset_control_deassert(dev->reset);
if (err) {
dev_err(dev->dev,
"reset controller deassert failed %d\n", err);
goto error_out1;
}
} }
return lima_clk_enable(dev);
}
static void lima_clk_fini(struct lima_device *dev)
{
lima_clk_disable(dev);
}
static int lima_regulator_enable(struct lima_device *dev)
{
int ret;
if (!dev->regulator)
return 0; return 0;
error_out1: ret = regulator_enable(dev->regulator);
clk_disable_unprepare(dev->clk_gpu); if (ret < 0) {
error_out0: dev_err(dev->dev, "failed to enable regulator: %d\n", ret);
clk_disable_unprepare(dev->clk_bus); return ret;
return err; }
return 0;
} }
static void lima_clk_fini(struct lima_device *dev) static void lima_regulator_disable(struct lima_device *dev)
{ {
if (dev->reset != NULL) if (dev->regulator)
reset_control_assert(dev->reset); regulator_disable(dev->regulator);
clk_disable_unprepare(dev->clk_gpu);
clk_disable_unprepare(dev->clk_bus);
} }
static int lima_regulator_init(struct lima_device *dev) static int lima_regulator_init(struct lima_device *dev)
...@@ -158,19 +196,12 @@ static int lima_regulator_init(struct lima_device *dev) ...@@ -158,19 +196,12 @@ static int lima_regulator_init(struct lima_device *dev)
return ret; return ret;
} }
ret = regulator_enable(dev->regulator); return lima_regulator_enable(dev);
if (ret < 0) {
dev_err(dev->dev, "failed to enable regulator: %d\n", ret);
return ret;
}
return 0;
} }
static void lima_regulator_fini(struct lima_device *dev) static void lima_regulator_fini(struct lima_device *dev)
{ {
if (dev->regulator) lima_regulator_disable(dev);
regulator_disable(dev->regulator);
} }
static int lima_init_ip(struct lima_device *dev, int index) static int lima_init_ip(struct lima_device *dev, int index)
......
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