|
@@ -217,6 +217,51 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend,
|
|
|
}
|
|
|
EXPORT_SYMBOL(sun4i_backend_update_layer_buffer);
|
|
|
|
|
|
+static int sun4i_backend_init_sat(struct device *dev) {
|
|
|
+ struct sun4i_backend *backend = dev_get_drvdata(dev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ backend->sat_reset = devm_reset_control_get(dev, "sat");
|
|
|
+ if (IS_ERR(backend->sat_reset)) {
|
|
|
+ dev_err(dev, "Couldn't get the SAT reset line\n");
|
|
|
+ return PTR_ERR(backend->sat_reset);
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = reset_control_deassert(backend->sat_reset);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Couldn't deassert the SAT reset line\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ backend->sat_clk = devm_clk_get(dev, "sat");
|
|
|
+ if (IS_ERR(backend->sat_clk)) {
|
|
|
+ dev_err(dev, "Couldn't get our SAT clock\n");
|
|
|
+ ret = PTR_ERR(backend->sat_clk);
|
|
|
+ goto err_assert_reset;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = clk_prepare_enable(backend->sat_clk);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Couldn't enable the SAT clock\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+err_assert_reset:
|
|
|
+ reset_control_assert(backend->sat_reset);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int sun4i_backend_free_sat(struct device *dev) {
|
|
|
+ struct sun4i_backend *backend = dev_get_drvdata(dev);
|
|
|
+
|
|
|
+ clk_disable_unprepare(backend->sat_clk);
|
|
|
+ reset_control_assert(backend->sat_reset);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static struct regmap_config sun4i_backend_regmap_config = {
|
|
|
.reg_bits = 32,
|
|
|
.val_bits = 32,
|
|
@@ -291,6 +336,15 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,
|
|
|
}
|
|
|
clk_prepare_enable(backend->ram_clk);
|
|
|
|
|
|
+ if (of_device_is_compatible(dev->of_node,
|
|
|
+ "allwinner,sun8i-a33-display-backend")) {
|
|
|
+ ret = sun4i_backend_init_sat(dev);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Couldn't init SAT resources\n");
|
|
|
+ goto err_disable_ram_clk;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* Reset the registers */
|
|
|
for (i = 0x800; i < 0x1000; i += 4)
|
|
|
regmap_write(backend->regs, i, 0);
|
|
@@ -306,6 +360,8 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+err_disable_ram_clk:
|
|
|
+ clk_disable_unprepare(backend->ram_clk);
|
|
|
err_disable_mod_clk:
|
|
|
clk_disable_unprepare(backend->mod_clk);
|
|
|
err_disable_bus_clk:
|
|
@@ -320,6 +376,10 @@ static void sun4i_backend_unbind(struct device *dev, struct device *master,
|
|
|
{
|
|
|
struct sun4i_backend *backend = dev_get_drvdata(dev);
|
|
|
|
|
|
+ if (of_device_is_compatible(dev->of_node,
|
|
|
+ "allwinner,sun8i-a33-display-backend"))
|
|
|
+ sun4i_backend_free_sat(dev);
|
|
|
+
|
|
|
clk_disable_unprepare(backend->ram_clk);
|
|
|
clk_disable_unprepare(backend->mod_clk);
|
|
|
clk_disable_unprepare(backend->bus_clk);
|