OMAPDSS: Remove passive matrix LCD support (part 2)
[firefly-linux-kernel-4.4.55.git] / drivers / video / omap2 / dss / dpi.c
index 7dd7f9d25906c67e21f531520b6f5754c5d35a08..e6904b2b9fecac29f0a2c3567c767b94928b93c4 100644 (file)
@@ -64,7 +64,7 @@ static bool dpi_use_dsi_pll(struct omap_dss_device *dssdev)
                return false;
 }
 
-static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
+static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
                unsigned long pck_req, unsigned long *fck, int *lck_div,
                int *pck_div)
 {
@@ -72,8 +72,8 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
        struct dispc_clock_info dispc_cinfo;
        int r;
 
-       r = dsi_pll_calc_clock_div_pck(dpi.dsidev, is_tft, pck_req,
-                       &dsi_cinfo, &dispc_cinfo);
+       r = dsi_pll_calc_clock_div_pck(dpi.dsidev, pck_req, &dsi_cinfo,
+                       &dispc_cinfo);
        if (r)
                return r;
 
@@ -96,7 +96,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
        return 0;
 }
 
-static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
+static int dpi_set_dispc_clk(struct omap_dss_device *dssdev,
                unsigned long pck_req, unsigned long *fck, int *lck_div,
                int *pck_div)
 {
@@ -104,7 +104,7 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
        struct dispc_clock_info dispc_cinfo;
        int r;
 
-       r = dss_calc_clock_div(is_tft, pck_req, &dss_cinfo, &dispc_cinfo);
+       r = dss_calc_clock_div(pck_req, &dss_cinfo, &dispc_cinfo);
        if (r)
                return r;
 
@@ -129,20 +129,17 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
        int lck_div = 0, pck_div = 0;
        unsigned long fck = 0;
        unsigned long pck;
-       bool is_tft;
        int r = 0;
 
        dispc_mgr_set_pol_freq(dssdev->manager->id, dssdev->panel.config,
                        dssdev->panel.acbi, dssdev->panel.acb);
 
-       is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
-
        if (dpi_use_dsi_pll(dssdev))
-               r = dpi_set_dsi_clk(dssdev, is_tft, t->pixel_clock * 1000,
-                               &fck, &lck_div, &pck_div);
+               r = dpi_set_dsi_clk(dssdev, t->pixel_clock * 1000, &fck,
+                               &lck_div, &pck_div);
        else
-               r = dpi_set_dispc_clk(dssdev, is_tft, t->pixel_clock * 1000,
-                               &fck, &lck_div, &pck_div);
+               r = dpi_set_dispc_clk(dssdev, t->pixel_clock * 1000, &fck,
+                               &lck_div, &pck_div);
        if (r)
                return r;
 
@@ -156,22 +153,18 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
                t->pixel_clock = pck;
        }
 
-       dispc_mgr_set_timings(dssdev->manager->id, t);
+       dss_mgr_set_timings(dssdev->manager, t);
 
        return 0;
 }
 
 static void dpi_basic_init(struct omap_dss_device *dssdev)
 {
-       bool is_tft;
-
-       is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
-
        dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_BYPASS);
        dispc_mgr_enable_stallmode(dssdev->manager->id, false);
 
-       dispc_mgr_set_lcd_display_type(dssdev->manager->id, is_tft ?
-                       OMAP_DSS_LCD_DISPLAY_TFT : OMAP_DSS_LCD_DISPLAY_STN);
+       dispc_mgr_set_lcd_display_type(dssdev->manager->id,
+                       OMAP_DSS_LCD_DISPLAY_TFT);
        dispc_mgr_set_tft_data_lines(dssdev->manager->id,
                        dssdev->phy.dpi.data_lines);
 }
@@ -202,10 +195,6 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
                        goto err_reg_enable;
        }
 
-       r = dss_runtime_get();
-       if (r)
-               goto err_get_dss;
-
        r = dispc_runtime_get();
        if (r)
                goto err_get_dispc;
@@ -244,8 +233,6 @@ err_dsi_pll_init:
 err_get_dsi:
        dispc_runtime_put();
 err_get_dispc:
-       dss_runtime_put();
-err_get_dss:
        if (cpu_is_omap34xx())
                regulator_disable(dpi.vdds_dsi_reg);
 err_reg_enable:
@@ -266,7 +253,6 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev)
        }
 
        dispc_runtime_put();
-       dss_runtime_put();
 
        if (cpu_is_omap34xx())
                regulator_disable(dpi.vdds_dsi_reg);
@@ -283,21 +269,15 @@ void dpi_set_timings(struct omap_dss_device *dssdev,
        DSSDBG("dpi_set_timings\n");
        dssdev->panel.timings = *timings;
        if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
-               r = dss_runtime_get();
-               if (r)
-                       return;
-
                r = dispc_runtime_get();
-               if (r) {
-                       dss_runtime_put();
+               if (r)
                        return;
-               }
 
                dpi_set_mode(dssdev);
-               dispc_mgr_go(dssdev->manager->id);
 
                dispc_runtime_put();
-               dss_runtime_put();
+       } else {
+               dss_mgr_set_timings(dssdev->manager, timings);
        }
 }
 EXPORT_SYMBOL(dpi_set_timings);
@@ -305,24 +285,21 @@ EXPORT_SYMBOL(dpi_set_timings);
 int dpi_check_timings(struct omap_dss_device *dssdev,
                        struct omap_video_timings *timings)
 {
-       bool is_tft;
        int r;
        int lck_div, pck_div;
        unsigned long fck;
        unsigned long pck;
        struct dispc_clock_info dispc_cinfo;
 
-       if (!dispc_lcd_timings_ok(timings))
+       if (dss_mgr_check_timings(dssdev->manager, timings))
                return -EINVAL;
 
        if (timings->pixel_clock == 0)
                return -EINVAL;
 
-       is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
-
        if (dpi_use_dsi_pll(dssdev)) {
                struct dsi_clock_info dsi_cinfo;
-               r = dsi_pll_calc_clock_div_pck(dpi.dsidev, is_tft,
+               r = dsi_pll_calc_clock_div_pck(dpi.dsidev,
                                timings->pixel_clock * 1000,
                                &dsi_cinfo, &dispc_cinfo);
 
@@ -332,7 +309,7 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
                fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk;
        } else {
                struct dss_clock_info dss_cinfo;
-               r = dss_calc_clock_div(is_tft, timings->pixel_clock * 1000,
+               r = dss_calc_clock_div(timings->pixel_clock * 1000,
                                &dss_cinfo, &dispc_cinfo);
 
                if (r)
@@ -352,7 +329,7 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
 }
 EXPORT_SYMBOL(dpi_check_timings);
 
-int dpi_init_display(struct omap_dss_device *dssdev)
+static int __init dpi_init_display(struct omap_dss_device *dssdev)
 {
        DSSDBG("init_display\n");
 
@@ -378,12 +355,58 @@ int dpi_init_display(struct omap_dss_device *dssdev)
        return 0;
 }
 
-int dpi_init(void)
+static void __init dpi_probe_pdata(struct platform_device *pdev)
 {
+       struct omap_dss_board_info *pdata = pdev->dev.platform_data;
+       int i, r;
+
+       for (i = 0; i < pdata->num_devices; ++i) {
+               struct omap_dss_device *dssdev = pdata->devices[i];
+
+               if (dssdev->type != OMAP_DISPLAY_TYPE_DPI)
+                       continue;
+
+               r = dpi_init_display(dssdev);
+               if (r) {
+                       DSSERR("device %s init failed: %d\n", dssdev->name, r);
+                       continue;
+               }
+
+               r = omap_dss_register_device(dssdev, &pdev->dev, i);
+               if (r)
+                       DSSERR("device %s register failed: %d\n",
+                                       dssdev->name, r);
+       }
+}
+
+static int __init omap_dpi_probe(struct platform_device *pdev)
+{
+       dpi_probe_pdata(pdev);
+
        return 0;
 }
 
-void dpi_exit(void)
+static int __exit omap_dpi_remove(struct platform_device *pdev)
 {
+       omap_dss_unregister_child_devices(&pdev->dev);
+
+       return 0;
+}
+
+static struct platform_driver omap_dpi_driver = {
+       .remove         = __exit_p(omap_dpi_remove),
+       .driver         = {
+               .name   = "omapdss_dpi",
+               .owner  = THIS_MODULE,
+       },
+};
+
+int __init dpi_init_platform_driver(void)
+{
+       return platform_driver_probe(&omap_dpi_driver, omap_dpi_probe);
 }
 
+void __exit dpi_uninit_platform_driver(void)
+{
+       platform_driver_unregister(&omap_dpi_driver);
+}