|
@@ -84,6 +84,7 @@ static void sun4i_tcon_channel_set_status(struct sun4i_tcon *tcon, int channel,
|
|
|
|
|
|
switch (channel) {
|
|
|
case 0:
|
|
|
+ WARN_ON(!tcon->quirks->has_channel_0);
|
|
|
regmap_update_bits(tcon->regs, SUN4I_TCON0_CTL_REG,
|
|
|
SUN4I_TCON0_CTL_TCON_ENABLE,
|
|
|
enabled ? SUN4I_TCON0_CTL_TCON_ENABLE : 0);
|
|
@@ -276,6 +277,8 @@ static void sun4i_tcon0_mode_set_lvds(struct sun4i_tcon *tcon,
|
|
|
u8 clk_delay;
|
|
|
u32 reg, val = 0;
|
|
|
|
|
|
+ WARN_ON(!tcon->quirks->has_channel_0);
|
|
|
+
|
|
|
tcon->dclk_min_div = 7;
|
|
|
tcon->dclk_max_div = 7;
|
|
|
sun4i_tcon0_mode_set_common(tcon, mode);
|
|
@@ -344,6 +347,8 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
|
|
|
u8 clk_delay;
|
|
|
u32 val = 0;
|
|
|
|
|
|
+ WARN_ON(!tcon->quirks->has_channel_0);
|
|
|
+
|
|
|
tcon->dclk_min_div = 6;
|
|
|
tcon->dclk_max_div = 127;
|
|
|
sun4i_tcon0_mode_set_common(tcon, mode);
|
|
@@ -574,10 +579,12 @@ static int sun4i_tcon_init_clocks(struct device *dev,
|
|
|
}
|
|
|
clk_prepare_enable(tcon->clk);
|
|
|
|
|
|
- tcon->sclk0 = devm_clk_get(dev, "tcon-ch0");
|
|
|
- if (IS_ERR(tcon->sclk0)) {
|
|
|
- dev_err(dev, "Couldn't get the TCON channel 0 clock\n");
|
|
|
- return PTR_ERR(tcon->sclk0);
|
|
|
+ if (tcon->quirks->has_channel_0) {
|
|
|
+ tcon->sclk0 = devm_clk_get(dev, "tcon-ch0");
|
|
|
+ if (IS_ERR(tcon->sclk0)) {
|
|
|
+ dev_err(dev, "Couldn't get the TCON channel 0 clock\n");
|
|
|
+ return PTR_ERR(tcon->sclk0);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (tcon->quirks->has_channel_1) {
|
|
@@ -934,10 +941,12 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,
|
|
|
goto err_free_clocks;
|
|
|
}
|
|
|
|
|
|
- ret = sun4i_dclk_create(dev, tcon);
|
|
|
- if (ret) {
|
|
|
- dev_err(dev, "Couldn't create our TCON dot clock\n");
|
|
|
- goto err_free_clocks;
|
|
|
+ if (tcon->quirks->has_channel_0) {
|
|
|
+ ret = sun4i_dclk_create(dev, tcon);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Couldn't create our TCON dot clock\n");
|
|
|
+ goto err_free_clocks;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ret = sun4i_tcon_init_irq(dev, tcon);
|
|
@@ -995,7 +1004,8 @@ static int sun4i_tcon_bind(struct device *dev, struct device *master,
|
|
|
return 0;
|
|
|
|
|
|
err_free_dotclock:
|
|
|
- sun4i_dclk_free(tcon);
|
|
|
+ if (tcon->quirks->has_channel_0)
|
|
|
+ sun4i_dclk_free(tcon);
|
|
|
err_free_clocks:
|
|
|
sun4i_tcon_free_clocks(tcon);
|
|
|
err_assert_reset:
|
|
@@ -1009,7 +1019,8 @@ static void sun4i_tcon_unbind(struct device *dev, struct device *master,
|
|
|
struct sun4i_tcon *tcon = dev_get_drvdata(dev);
|
|
|
|
|
|
list_del(&tcon->list);
|
|
|
- sun4i_dclk_free(tcon);
|
|
|
+ if (tcon->quirks->has_channel_0)
|
|
|
+ sun4i_dclk_free(tcon);
|
|
|
sun4i_tcon_free_clocks(tcon);
|
|
|
}
|
|
|
|
|
@@ -1106,16 +1117,19 @@ static int sun6i_tcon_set_mux(struct sun4i_tcon *tcon,
|
|
|
}
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun4i_a10_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_channel_1 = true,
|
|
|
.set_mux = sun4i_a10_tcon_set_mux,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun5i_a13_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_channel_1 = true,
|
|
|
.set_mux = sun5i_a13_tcon_set_mux,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun6i_a31_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_channel_1 = true,
|
|
|
.has_lvds_alt = true,
|
|
|
.needs_de_be_mux = true,
|
|
@@ -1123,26 +1137,29 @@ static const struct sun4i_tcon_quirks sun6i_a31_quirks = {
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun6i_a31s_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_channel_1 = true,
|
|
|
.needs_de_be_mux = true,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun7i_a20_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_channel_1 = true,
|
|
|
/* Same display pipeline structure as A10 */
|
|
|
.set_mux = sun4i_a10_tcon_set_mux,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun8i_a33_quirks = {
|
|
|
+ .has_channel_0 = true,
|
|
|
.has_lvds_alt = true,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun8i_a83t_lcd_quirks = {
|
|
|
- /* nothing is supported */
|
|
|
+ .has_channel_0 = true,
|
|
|
};
|
|
|
|
|
|
static const struct sun4i_tcon_quirks sun8i_v3s_quirks = {
|
|
|
- /* nothing is supported */
|
|
|
+ .has_channel_0 = true,
|
|
|
};
|
|
|
|
|
|
/* sun4i_drv uses this list to check if a device node is a TCON */
|