Merge tag 'drm-next-2021-08-31-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / drivers / gpu / drm / panel / panel-simple.c
index 1b80290..9b6c4e6 100644 (file)
@@ -36,6 +36,8 @@
 
 #include <drm/drm_crtc.h>
 #include <drm/drm_device.h>
+#include <drm/drm_dp_aux_bus.h>
+#include <drm/drm_dp_helper.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_panel.h>
 
@@ -185,6 +187,7 @@ struct panel_simple {
 
        struct regulator *supply;
        struct i2c_adapter *ddc;
+       struct drm_dp_aux *aux;
 
        struct gpio_desc *enable_gpio;
        struct gpio_desc *hpd_gpio;
@@ -657,7 +660,8 @@ static void panel_simple_parse_panel_timing_node(struct device *dev,
                dev_err(dev, "Reject override mode: No display_timing found\n");
 }
 
-static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
+static int panel_simple_probe(struct device *dev, const struct panel_desc *desc,
+                             struct drm_dp_aux *aux)
 {
        struct panel_simple *panel;
        struct display_timing dt;
@@ -673,6 +677,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
        panel->enabled = false;
        panel->prepared_time = 0;
        panel->desc = desc;
+       panel->aux = aux;
 
        panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd");
        if (!panel->no_hpd) {
@@ -707,6 +712,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 
                if (!panel->ddc)
                        return -EPROBE_DEFER;
+       } else if (aux) {
+               panel->ddc = &aux->ddc;
        }
 
        if (desc == &panel_dpi) {
@@ -742,10 +749,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
                        desc->bpc != 8);
                break;
        case DRM_MODE_CONNECTOR_eDP:
-               if (desc->bus_format == 0)
-                       dev_warn(dev, "Specify missing bus_format\n");
-               if (desc->bpc != 6 && desc->bpc != 8)
-                       dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc);
+               if (desc->bpc != 6 && desc->bpc != 8 && desc->bpc != 10)
+                       dev_warn(dev, "Expected bpc in {6,8,10} but got: %u\n", desc->bpc);
                break;
        case DRM_MODE_CONNECTOR_DSI:
                if (desc->bpc != 6 && desc->bpc != 8)
@@ -793,6 +798,15 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
        if (err)
                goto disable_pm_runtime;
 
+       if (!panel->base.backlight && panel->aux) {
+               pm_runtime_get_sync(dev);
+               err = drm_panel_dp_aux_backlight(&panel->base, panel->aux);
+               pm_runtime_mark_last_busy(dev);
+               pm_runtime_put_autosuspend(dev);
+               if (err)
+                       goto disable_pm_runtime;
+       }
+
        drm_panel_add(&panel->base);
 
        return 0;
@@ -801,7 +815,7 @@ disable_pm_runtime:
        pm_runtime_dont_use_autosuspend(dev);
        pm_runtime_disable(dev);
 free_ddc:
-       if (panel->ddc)
+       if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc))
                put_device(&panel->ddc->dev);
 
        return err;
@@ -817,7 +831,7 @@ static int panel_simple_remove(struct device *dev)
 
        pm_runtime_dont_use_autosuspend(dev);
        pm_runtime_disable(dev);
-       if (panel->ddc)
+       if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc))
                put_device(&panel->ddc->dev);
 
        return 0;
@@ -1080,6 +1094,36 @@ static const struct panel_desc auo_b133xtn01 = {
        },
 };
 
+static const struct drm_display_mode auo_b133han05_mode = {
+       .clock = 142600,
+       .hdisplay = 1920,
+       .hsync_start = 1920 + 58,
+       .hsync_end = 1920 + 58 + 42,
+       .htotal = 1920 + 58 + 42 + 60,
+       .vdisplay = 1080,
+       .vsync_start = 1080 + 3,
+       .vsync_end = 1080 + 3 + 5,
+       .vtotal = 1080 + 3 + 5 + 54,
+};
+
+static const struct panel_desc auo_b133han05 = {
+       .modes = &auo_b133han05_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 293,
+               .height = 165,
+       },
+       .delay = {
+               .prepare = 100,
+               .enable = 20,
+               .unprepare = 50,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB,
+       .connector_type = DRM_MODE_CONNECTOR_eDP,
+};
+
 static const struct drm_display_mode auo_b133htn01_mode = {
        .clock = 150660,
        .hdisplay = 1920,
@@ -1107,6 +1151,36 @@ static const struct panel_desc auo_b133htn01 = {
        },
 };
 
+static const struct drm_display_mode auo_b140han06_mode = {
+       .clock = 141000,
+       .hdisplay = 1920,
+       .hsync_start = 1920 + 16,
+       .hsync_end = 1920 + 16 + 16,
+       .htotal = 1920 + 16 + 16 + 152,
+       .vdisplay = 1080,
+       .vsync_start = 1080 + 3,
+       .vsync_end = 1080 + 3 + 14,
+       .vtotal = 1080 + 3 + 14 + 19,
+};
+
+static const struct panel_desc auo_b140han06 = {
+       .modes = &auo_b140han06_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 309,
+               .height = 174,
+       },
+       .delay = {
+               .prepare = 100,
+               .enable = 20,
+               .unprepare = 50,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB,
+       .connector_type = DRM_MODE_CONNECTOR_eDP,
+};
+
 static const struct display_timing auo_g070vvn01_timings = {
        .pixelclock = { 33300000, 34209000, 45000000 },
        .hactive = { 800, 800, 800 },
@@ -1179,6 +1253,8 @@ static const struct panel_desc auo_g104sn02 = {
                .width = 211,
                .height = 158,
        },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+       .connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
 static const struct drm_display_mode auo_g121ean01_mode = {
@@ -1929,6 +2005,32 @@ static const struct panel_desc edt_et035012dm6 = {
        .bus_flags = DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
 };
 
+static const struct drm_display_mode edt_etm0350g0dh6_mode = {
+       .clock = 6520,
+       .hdisplay = 320,
+       .hsync_start = 320 + 20,
+       .hsync_end = 320 + 20 + 68,
+       .htotal = 320 + 20 + 68,
+       .vdisplay = 240,
+       .vsync_start = 240 + 4,
+       .vsync_end = 240 + 4 + 18,
+       .vtotal = 240 + 4 + 18,
+       .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+};
+
+static const struct panel_desc edt_etm0350g0dh6 = {
+       .modes = &edt_etm0350g0dh6_mode,
+       .num_modes = 1,
+       .bpc = 6,
+       .size = {
+               .width = 70,
+               .height = 53,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
 static const struct drm_display_mode edt_etm043080dh6gp_mode = {
        .clock = 10870,
        .hdisplay = 480,
@@ -1980,6 +2082,9 @@ static const struct panel_desc edt_etm0430g0dh6 = {
                .width = 95,
                .height = 54,
        },
+       .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
 };
 
 static const struct drm_display_mode edt_et057090dhu_mode = {
@@ -2044,6 +2149,60 @@ static const struct panel_desc edt_etm0700g0bdh6 = {
        },
        .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
        .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
+static const struct drm_display_mode edt_etmv570g2dhu_mode = {
+       .clock = 25175,
+       .hdisplay = 640,
+       .hsync_start = 640,
+       .hsync_end = 640 + 16,
+       .htotal = 640 + 16 + 30 + 114,
+       .vdisplay = 480,
+       .vsync_start = 480 + 10,
+       .vsync_end = 480 + 10 + 3,
+       .vtotal = 480 + 10 + 3 + 35,
+       .flags = DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_PHSYNC,
+};
+
+static const struct panel_desc edt_etmv570g2dhu = {
+       .modes = &edt_etmv570g2dhu_mode,
+       .num_modes = 1,
+       .bpc = 6,
+       .size = {
+               .width = 115,
+               .height = 86,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
+static const struct display_timing eink_vb3300_kca_timing = {
+       .pixelclock = { 40000000, 40000000, 40000000 },
+       .hactive = { 334, 334, 334 },
+       .hfront_porch = { 1, 1, 1 },
+       .hback_porch = { 1, 1, 1 },
+       .hsync_len = { 1, 1, 1 },
+       .vactive = { 1405, 1405, 1405 },
+       .vfront_porch = { 1, 1, 1 },
+       .vback_porch = { 1, 1, 1 },
+       .vsync_len = { 1, 1, 1 },
+       .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
+                DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
+};
+
+static const struct panel_desc eink_vb3300_kca = {
+       .timings = &eink_vb3300_kca_timing,
+       .num_timings = 1,
+       .bpc = 6,
+       .size = {
+               .width = 157,
+               .height = 209,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
 };
 
 static const struct display_timing evervision_vgg804821_timing = {
@@ -2967,6 +3126,38 @@ static const struct panel_desc logictechno_lt170410_2whc = {
        .connector_type = DRM_MODE_CONNECTOR_LVDS,
 };
 
+static const struct drm_display_mode logictechno_lttd800480070_l6wh_rt_mode = {
+       .clock = 33000,
+       .hdisplay = 800,
+       .hsync_start = 800 + 154,
+       .hsync_end = 800 + 154 + 3,
+       .htotal = 800 + 154 + 3 + 43,
+       .vdisplay = 480,
+       .vsync_start = 480 + 47,
+       .vsync_end = 480 + 47 + 3,
+       .vtotal = 480 + 47 + 3 + 20,
+       .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+};
+
+static const struct panel_desc logictechno_lttd800480070_l6wh_rt = {
+       .modes = &logictechno_lttd800480070_l6wh_rt_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 154,
+               .height = 86,
+       },
+       .delay = {
+               .prepare = 45,
+               .enable = 100,
+               .disable = 100,
+               .unprepare = 45
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
 static const struct drm_display_mode mitsubishi_aa070mc01_mode = {
        .clock = 30400,
        .hdisplay = 800,
@@ -3033,6 +3224,37 @@ static const struct panel_desc mitsubishi_aa070mc01 = {
        .bus_flags = DRM_BUS_FLAG_DE_HIGH,
 };
 
+static const struct display_timing multi_inno_mi1010ait_1cp_timing = {
+       .pixelclock = { 68900000, 70000000, 73400000 },
+       .hactive = { 1280, 1280, 1280 },
+       .hfront_porch = { 30, 60, 71 },
+       .hback_porch = { 30, 60, 71 },
+       .hsync_len = { 10, 10, 48 },
+       .vactive = { 800, 800, 800 },
+       .vfront_porch = { 5, 10, 10 },
+       .vback_porch = { 5, 10, 10 },
+       .vsync_len = { 5, 6, 13 },
+       .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
+                DISPLAY_FLAGS_DE_HIGH,
+};
+
+static const struct panel_desc multi_inno_mi1010ait_1cp = {
+       .timings = &multi_inno_mi1010ait_1cp_timing,
+       .num_timings = 1,
+       .bpc = 8,
+       .size = {
+               .width = 217,
+               .height = 136,
+       },
+       .delay = {
+               .enable = 50,
+               .disable = 50,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH,
+       .connector_type = DRM_MODE_CONNECTOR_LVDS,
+};
+
 static const struct display_timing nec_nl12880bc20_05_timing = {
        .pixelclock = { 67000000, 71000000, 75000000 },
        .hactive = { 1280, 1280, 1280 },
@@ -3463,6 +3685,46 @@ static const struct panel_desc qd43003c0_40 = {
        .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 };
 
+static const struct drm_display_mode qishenglong_gopher2b_lcd_modes[] = {
+       { /* 60 Hz */
+               .clock = 10800,
+               .hdisplay = 480,
+               .hsync_start = 480 + 77,
+               .hsync_end = 480 + 77 + 41,
+               .htotal = 480 + 77 + 41 + 2,
+               .vdisplay = 272,
+               .vsync_start = 272 + 16,
+               .vsync_end = 272 + 16 + 10,
+               .vtotal = 272 + 16 + 10 + 2,
+               .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+       },
+       { /* 50 Hz */
+               .clock = 10800,
+               .hdisplay = 480,
+               .hsync_start = 480 + 17,
+               .hsync_end = 480 + 17 + 41,
+               .htotal = 480 + 17 + 41 + 2,
+               .vdisplay = 272,
+               .vsync_start = 272 + 116,
+               .vsync_end = 272 + 116 + 10,
+               .vtotal = 272 + 116 + 10 + 2,
+               .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+       },
+};
+
+static const struct panel_desc qishenglong_gopher2b_lcd = {
+       .modes = qishenglong_gopher2b_lcd_modes,
+       .num_modes = ARRAY_SIZE(qishenglong_gopher2b_lcd_modes),
+       .bpc = 8,
+       .size = {
+               .width = 95,
+               .height = 54,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE,
+       .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
 static const struct display_timing rocktech_rk070er9427_timing = {
        .pixelclock = { 26400000, 33300000, 46800000 },
        .hactive = { 800, 800, 800 },
@@ -4233,9 +4495,15 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "auo,b116xw03",
                .data = &auo_b116xw03,
+       }, {
+               .compatible = "auo,b133han05",
+               .data = &auo_b133han05,
        }, {
                .compatible = "auo,b133htn01",
                .data = &auo_b133htn01,
+       }, {
+               .compatible = "auo,b140han06",
+               .data = &auo_b140han06,
        }, {
                .compatible = "auo,b133xtn01",
                .data = &auo_b133xtn01,
@@ -4329,6 +4597,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "edt,et035012dm6",
                .data = &edt_et035012dm6,
+       }, {
+               .compatible = "edt,etm0350g0dh6",
+               .data = &edt_etm0350g0dh6,
        }, {
                .compatible = "edt,etm043080dh6gp",
                .data = &edt_etm043080dh6gp,
@@ -4350,6 +4621,12 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "edt,etm0700g0edh6",
                .data = &edt_etm0700g0bdh6,
+       }, {
+               .compatible = "edt,etmv570g2dhu",
+               .data = &edt_etmv570g2dhu,
+       }, {
+               .compatible = "eink,vb3300-kca",
+               .data = &eink_vb3300_kca,
        }, {
                .compatible = "evervision,vgg804821",
                .data = &evervision_vgg804821,
@@ -4461,9 +4738,15 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "logictechno,lt170410-2whc",
                .data = &logictechno_lt170410_2whc,
+       }, {
+               .compatible = "logictechno,lttd800480070-l6wh-rt",
+               .data = &logictechno_lttd800480070_l6wh_rt,
        }, {
                .compatible = "mitsubishi,aa070mc01-ca1",
                .data = &mitsubishi_aa070mc01,
+       }, {
+               .compatible = "multi-inno,mi1010ait-1cp",
+               .data = &multi_inno_mi1010ait_1cp,
        }, {
                .compatible = "nec,nl12880bc20-05",
                .data = &nec_nl12880bc20_05,
@@ -4515,6 +4798,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "qiaodian,qd43003c0-40",
                .data = &qd43003c0_40,
+       }, {
+               .compatible = "qishenglong,gopher2b-lcd",
+               .data = &qishenglong_gopher2b_lcd,
        }, {
                .compatible = "rocktech,rk070er9427",
                .data = &rocktech_rk070er9427,
@@ -4632,7 +4918,7 @@ static int panel_simple_platform_probe(struct platform_device *pdev)
        if (!id)
                return -ENODEV;
 
-       return panel_simple_probe(&pdev->dev, id->data);
+       return panel_simple_probe(&pdev->dev, id->data, NULL);
 }
 
 static int panel_simple_platform_remove(struct platform_device *pdev)
@@ -4867,7 +5153,7 @@ static const struct panel_desc_dsi osd101t2045_53ts = {
        },
        .flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
                 MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
-                MIPI_DSI_MODE_EOT_PACKET,
+                MIPI_DSI_MODE_NO_EOT_PACKET,
        .format = MIPI_DSI_FMT_RGB888,
        .lanes = 4,
 };
@@ -4912,7 +5198,7 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
 
        desc = id->data;
 
-       err = panel_simple_probe(&dsi->dev, &desc->desc);
+       err = panel_simple_probe(&dsi->dev, &desc->desc, NULL);
        if (err < 0)
                return err;
 
@@ -4957,6 +5243,38 @@ static struct mipi_dsi_driver panel_simple_dsi_driver = {
        .shutdown = panel_simple_dsi_shutdown,
 };
 
+static int panel_simple_dp_aux_ep_probe(struct dp_aux_ep_device *aux_ep)
+{
+       const struct of_device_id *id;
+
+       id = of_match_node(platform_of_match, aux_ep->dev.of_node);
+       if (!id)
+               return -ENODEV;
+
+       return panel_simple_probe(&aux_ep->dev, id->data, aux_ep->aux);
+}
+
+static void panel_simple_dp_aux_ep_remove(struct dp_aux_ep_device *aux_ep)
+{
+       panel_simple_remove(&aux_ep->dev);
+}
+
+static void panel_simple_dp_aux_ep_shutdown(struct dp_aux_ep_device *aux_ep)
+{
+       panel_simple_shutdown(&aux_ep->dev);
+}
+
+static struct dp_aux_ep_driver panel_simple_dp_aux_ep_driver = {
+       .driver = {
+               .name = "panel-simple-dp-aux",
+               .of_match_table = platform_of_match,    /* Same as platform one! */
+               .pm = &panel_simple_pm_ops,
+       },
+       .probe = panel_simple_dp_aux_ep_probe,
+       .remove = panel_simple_dp_aux_ep_remove,
+       .shutdown = panel_simple_dp_aux_ep_shutdown,
+};
+
 static int __init panel_simple_init(void)
 {
        int err;
@@ -4965,15 +5283,25 @@ static int __init panel_simple_init(void)
        if (err < 0)
                return err;
 
+       err = dp_aux_dp_driver_register(&panel_simple_dp_aux_ep_driver);
+       if (err < 0)
+               goto err_did_platform_register;
+
        if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) {
                err = mipi_dsi_driver_register(&panel_simple_dsi_driver);
-               if (err < 0) {
-                       platform_driver_unregister(&panel_simple_platform_driver);
-                       return err;
-               }
+               if (err < 0)
+                       goto err_did_aux_ep_register;
        }
 
        return 0;
+
+err_did_aux_ep_register:
+       dp_aux_dp_driver_unregister(&panel_simple_dp_aux_ep_driver);
+
+err_did_platform_register:
+       platform_driver_unregister(&panel_simple_platform_driver);
+
+       return err;
 }
 module_init(panel_simple_init);
 
@@ -4982,6 +5310,7 @@ static void __exit panel_simple_exit(void)
        if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
                mipi_dsi_driver_unregister(&panel_simple_dsi_driver);
 
+       dp_aux_dp_driver_unregister(&panel_simple_dp_aux_ep_driver);
        platform_driver_unregister(&panel_simple_platform_driver);
 }
 module_exit(panel_simple_exit);