Add writeback FIFO thresholds as extra_info parameters. Modify function
dss_ovl_fifo_setup() so that it can also also configure writeback pipeline
FIFOs. Extend the DISPC fifo functions to also configure the writeback
registers.

Signed-off-by: Archit Taneja <[email protected]>
---
 drivers/video/omap2/dss/apply.c |   70 +++++++++++++++++++++++++++++++++-----
 drivers/video/omap2/dss/dispc.c |    8 +++--
 2 files changed, 65 insertions(+), 13 deletions(-)

diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c
index 9f3c174..a17cc47 100644
--- a/drivers/video/omap2/dss/apply.c
+++ b/drivers/video/omap2/dss/apply.c
@@ -115,6 +115,7 @@ struct wb_priv_data {
        bool shadow_extra_info_dirty;
 
        enum dss_writeback_channel_in channel_in;
+       u32 fifo_low, fifo_high;
 
        /* If true, GO bit is up and shadow registers cannot be written.
         * Never true for writeback in memory to memory mode */
@@ -687,6 +688,7 @@ static void dss_wb_write_regs_extra(struct 
omap_dss_writeback *wb)
                return;
 
        dispc_wb_set_channel_in(wb->id, wp->channel_in);
+       dispc_ovl_set_fifo_threshold(wb->plane_id, wp->fifo_low, wp->fifo_high);
 
        wp->extra_info_dirty = false;
        wp->shadow_extra_info_dirty = true;
@@ -1102,21 +1104,59 @@ static void dss_apply_ovl_fifo_thresholds(struct 
omap_overlay *ovl,
        op->extra_info_dirty = true;
 }
 
-static void dss_ovl_setup_fifo(struct omap_overlay *ovl)
+static void dss_apply_wb_fifo_thresholds(struct omap_dss_writeback *wb,
+               u32 fifo_low, u32 fifo_high)
 {
-       struct ovl_priv_data *op = get_ovl_priv(ovl);
+       struct wb_priv_data *wp = get_wb_priv(wb);
+
+       if (wp->fifo_low == fifo_low && wp->fifo_high == fifo_high)
+               return;
+
+       wp->fifo_low = fifo_low;
+       wp->fifo_high = fifo_high;
+       wp->extra_info_dirty = true;
+}
+
+static void dss_plane_setup_fifo(struct omap_overlay *ovl,
+               struct omap_dss_writeback *wb)
+{
+       enum omap_plane plane;
+       struct omap_overlay_manager *mgr;
        struct omap_dss_device *dssdev;
+       bool enabled, enabling;
        u32 size, burst_size;
        u32 fifo_low, fifo_high;
 
-       if (!op->enabled && !op->enabling)
+       if (ovl) {
+               struct ovl_priv_data *op;
+
+               mgr = ovl->manager;
+               op = get_ovl_priv(ovl);
+
+               enabled = op->enabled;
+               enabling = op->enabling;
+
+               plane = ovl->id;
+       } else {
+               struct wb_priv_data *wp;
+
+               mgr = wb->dssdev->manager;
+               wp = get_wb_priv(wb);
+
+               enabled = wp->enabled;
+               enabling = false;
+
+               plane = wb->plane_id;
+       }
+
+       if (!enabled && !enabling)
                return;
 
-       dssdev = ovl->manager->get_output(ovl->manager);
+       dssdev = mgr->get_output(mgr);
 
-       size = dispc_ovl_get_fifo_size(ovl->id);
+       size = dispc_ovl_get_fifo_size(plane);
 
-       burst_size = dispc_ovl_get_burst_size(ovl->id);
+       burst_size = dispc_ovl_get_burst_size(plane);
 
        switch (dssdev->type) {
        case OMAP_DISPLAY_TYPE_DPI:
@@ -1124,12 +1164,12 @@ static void dss_ovl_setup_fifo(struct omap_overlay *ovl)
        case OMAP_DISPLAY_TYPE_SDI:
        case OMAP_DISPLAY_TYPE_VENC:
        case OMAP_DISPLAY_TYPE_HDMI:
-               default_get_overlay_fifo_thresholds(ovl->id, size,
+               default_get_overlay_fifo_thresholds(plane, size,
                                burst_size, &fifo_low, &fifo_high);
                break;
 #ifdef CONFIG_OMAP2_DSS_DSI
        case OMAP_DISPLAY_TYPE_DSI:
-               dsi_get_overlay_fifo_thresholds(ovl->id, size,
+               dsi_get_overlay_fifo_thresholds(plane, size,
                                burst_size, &fifo_low, &fifo_high);
                break;
 #endif
@@ -1137,13 +1177,17 @@ static void dss_ovl_setup_fifo(struct omap_overlay *ovl)
                BUG();
        }
 
-       dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high);
+       if (ovl)
+               dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high);
+       else
+               dss_apply_wb_fifo_thresholds(wb, fifo_low, fifo_high);
 }
 
 static void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr)
 {
        struct omap_overlay *ovl;
        struct mgr_priv_data *mp;
+       struct omap_dss_device *dssdev;
 
        mp = get_mgr_priv(mgr);
 
@@ -1151,7 +1195,13 @@ static void dss_mgr_setup_fifos(struct 
omap_overlay_manager *mgr)
                return;
 
        list_for_each_entry(ovl, &mgr->overlays, list)
-               dss_ovl_setup_fifo(ovl);
+               dss_plane_setup_fifo(ovl, NULL);
+
+       dssdev = mgr->get_writeback(mgr);
+       if (dssdev) {
+               struct omap_dss_writeback *wb = dssdev->wbdev;
+               dss_plane_setup_fifo(NULL, wb);
+       }
 }
 
 static void dss_setup_fifos(void)
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
index a4d5504..231369a 100644
--- a/drivers/video/omap2/dss/dispc.c
+++ b/drivers/video/omap2/dss/dispc.c
@@ -91,7 +91,7 @@ static struct {
        int irq;
        struct clk *dss_clk;
 
-       u32     fifo_size[MAX_DSS_OVERLAYS];
+       u32     fifo_size[MAX_DSS_OVERLAYS + MAX_DSS_WB];
 
        spinlock_t irq_lock;
        u32 irq_error_mask;
@@ -907,7 +907,7 @@ void dispc_wb_set_channel_in(int id, enum 
dss_writeback_channel_in ch_in)
 static void dispc_ovl_set_burst_size(enum omap_plane plane,
                enum omap_burst_size burst_size)
 {
-       static const unsigned shifts[] = { 6, 14, 14, 14, };
+       static const unsigned shifts[] = { 6, 14, 14, 14, 14, };
        int shift;
 
        shift = shifts[plane];
@@ -1021,12 +1021,14 @@ static void dispc_read_plane_fifo_sizes(void)
        int plane;
        u8 start, end;
        u32 unit;
+       int num_ovl = dss_feat_get_num_ovls();
+       int num_wb = dss_feat_get_num_wb();
 
        unit = dss_feat_get_buffer_size_unit();
 
        dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end);
 
-       for (plane = 0; plane < dss_feat_get_num_ovls(); ++plane) {
+       for (plane = 0; plane < num_ovl + num_wb; ++plane) {
                size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(plane), start, end);
                size *= unit;
                dispc.fifo_size[plane] = size;
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to