drm/ingenic: Fix support for JZ4780 HDMI output
authorPaul Boddie <paul@boddie.org.uk>
Sat, 12 Feb 2022 15:50:49 +0000 (16:50 +0100)
committerPaul Cercueil <paul@crapouillou.net>
Mon, 14 Feb 2022 12:27:01 +0000 (12:27 +0000)
We have to make sure that
- JZ_LCD_OSDC_ALPHAEN is set
- plane f0 is disabled as it's not working yet

Tested on MIPS Creator CI20 board.

Signed-off-by: Paul Boddie <paul@boddie.org.uk>
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
Fixes: ef2f5d0aa121 ("drm/ingenic: prepare ingenic drm for later addition of JZ4780")
Signed-off-by: Paul Cercueil <paul@crapouillou.net>
[pcercuei: add proper fixes commit, slightly reword commit description]
Link: https://patchwork.freedesktop.org/patch/msgid/9d3a2000d2bb014f1afb0613537bdc523202135d.1644681054.git.hns@goldelico.com
drivers/gpu/drm/ingenic/ingenic-drm-drv.c

index 7f10d6eed549dd19d545da83958de5dc0fb8316a..dcf44cb00821f649b3e7233f17d4fee0ee83386a 100644 (file)
@@ -65,8 +65,10 @@ struct ingenic_dma_hwdescs {
 struct jz_soc_info {
        bool needs_dev_clk;
        bool has_osd;
+       bool has_alpha;
        bool map_noncoherent;
        bool use_extended_hwdesc;
+       bool plane_f0_not_working;
        unsigned int max_width, max_height;
        const u32 *formats_f0, *formats_f1;
        unsigned int num_formats_f0, num_formats_f1;
@@ -453,7 +455,7 @@ static int ingenic_drm_plane_atomic_check(struct drm_plane *plane,
        if (!crtc)
                return 0;
 
-       if (plane == &priv->f0)
+       if (priv->soc_info->plane_f0_not_working && plane == &priv->f0)
                return -EINVAL;
 
        crtc_state = drm_atomic_get_existing_crtc_state(state,
@@ -1055,6 +1057,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
        long parent_rate;
        unsigned int i, clone_mask = 0;
        int ret, irq;
+       u32 osdc = 0;
 
        soc_info = of_device_get_match_data(dev);
        if (!soc_info) {
@@ -1312,7 +1315,10 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
 
        /* Enable OSD if available */
        if (soc_info->has_osd)
-               regmap_write(priv->map, JZ_REG_LCD_OSDC, JZ_LCD_OSDC_OSDEN);
+               osdc |= JZ_LCD_OSDC_OSDEN;
+       if (soc_info->has_alpha)
+               osdc |= JZ_LCD_OSDC_ALPHAEN;
+       regmap_write(priv->map, JZ_REG_LCD_OSDC, osdc);
 
        mutex_init(&priv->clk_mutex);
        priv->clock_nb.notifier_call = ingenic_drm_update_pixclk;
@@ -1511,7 +1517,9 @@ static const struct jz_soc_info jz4770_soc_info = {
 static const struct jz_soc_info jz4780_soc_info = {
        .needs_dev_clk = true,
        .has_osd = true,
+       .has_alpha = true,
        .use_extended_hwdesc = true,
+       .plane_f0_not_working = true,   /* REVISIT */
        .max_width = 4096,
        .max_height = 2048,
        .formats_f1 = jz4770_formats_f1,