All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features
@ 2010-09-08 11:17 Archit Taneja
  2010-09-08 11:17 ` [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files Archit Taneja
  2010-09-08 11:17 ` [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code Archit Taneja
  0 siblings, 2 replies; 8+ messages in thread
From: Archit Taneja @ 2010-09-08 11:17 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

This is a simple approach to prevent scattered cpu_is_omapxxxx checks
in DSS2 by bringing all omap version specific DSS features/values to one
single place, initialize them and expose a set of functions to DSS2 driver
files which return the value/existance of a feature.

This method provides the following:
  -A set of functions which give the value of a feature.
  -Functions which add and return the start and end bits of a register field
   which varies across omaps.
  -A function which checks if a DSS2 feature exists or not on the present
   omap (omap_dss_has_feature)

Whenever a new DSS feature is introduced, its value/existance is specified
for all omaps in omap_dss_feature_init().

This patch also fills up a minimal list of features in omap_dss_features_init().
The second patch in the series makes use of dss_features to remove some of the
existing omapxxxx checks.

Archit Taneja (2):
  OMAP: DSS2: Introduce dss_features files
  OMAP: DSS2: Use dss_features framework on DSS2 code

 arch/arm/plat-omap/include/plat/display.h |   31 -----
 drivers/video/omap2/dss/Makefile          |    2 +-
 drivers/video/omap2/dss/core.c            |    3 +
 drivers/video/omap2/dss/dispc.c           |   56 +++++----
 drivers/video/omap2/dss/dss_features.c    |  171 +++++++++++++++++++++++++++++
 drivers/video/omap2/dss/dss_features.h    |   51 +++++++++
 drivers/video/omap2/dss/manager.c         |   33 +++---
 drivers/video/omap2/dss/overlay.c         |   24 ++---
 8 files changed, 283 insertions(+), 88 deletions(-)
 create mode 100644 drivers/video/omap2/dss/dss_features.c
 create mode 100644 drivers/video/omap2/dss/dss_features.h
--
Version 2:
 - Features are initialized statically as opposed to runtime before,
   function naming for dss_features files has changed.
Version 1:
https://patchwork.kernel.org/patch/134431/
 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-08 11:17 [PATCH v2 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Archit Taneja
@ 2010-09-08 11:17 ` Archit Taneja
  2010-09-09 10:25   ` Tomi Valkeinen
  2010-09-08 11:17 ` [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code Archit Taneja
  1 sibling, 1 reply; 8+ messages in thread
From: Archit Taneja @ 2010-09-08 11:17 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

Add dss_features.c and dss_features.h for the dss_features framework

Signed-off-by: Archit Taneja <archit@ti.com>
---
 drivers/video/omap2/dss/dss_features.c |  171 ++++++++++++++++++++++++++++++++
 drivers/video/omap2/dss/dss_features.h |   51 ++++++++++
 2 files changed, 222 insertions(+), 0 deletions(-)
 create mode 100644 drivers/video/omap2/dss/dss_features.c
 create mode 100644 drivers/video/omap2/dss/dss_features.h

diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
new file mode 100644
index 0000000..e87816f
--- /dev/null
+++ b/drivers/video/omap2/dss/dss_features.c
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <archit@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+
+#include <plat/display.h>
+#include <plat/cpu.h>
+
+#include "dss_features.h"
+
+/* Defines a generic omap register field */
+struct dss_reg_field {
+	enum dss_feat_reg_field id;
+	u8 start, end;
+};
+
+struct omap_dss_features {
+	struct dss_reg_field reg_fields[MAX_DSS_REG_FIELDS];
+	u32 has_feature;
+
+	int num_mgrs;
+	int num_ovls;
+	enum omap_display_type supported_displays[MAX_DSS_MANAGERS];
+	enum omap_color_mode supported_color_modes[MAX_DSS_OVERLAYS];
+};
+
+/* This struct is assigned to one of the below during initialization */
+static struct omap_dss_features omap_current_dss_features;
+
+/* OMAP2 DSS Features */
+static struct omap_dss_features omap2_dss_features = {
+	.reg_fields = {
+		{FIRHINC, 11, 0},
+		{FIRVINC, 27, 16},
+		{FIFOLOWTHRESHOLD, 8, 0},
+		{FIFOHIGHTHRESHOLD, 24, 16},
+		{FIFOSIZE, 8, 0},
+	},
+
+	.num_mgrs = 2,
+	.num_ovls = 3,
+	.supported_displays = {
+		/* OMAP_DSS_CHANNEL_LCD */
+		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
+		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
+
+		/* OMAP_DSS_CHANNEL_DIGIT */
+		OMAP_DISPLAY_TYPE_VENC,
+	},
+	.supported_color_modes = {
+		/* OMAP_DSS_GFX */
+		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
+		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
+		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
+		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
+
+		/* OMAP_DSS_VIDEO1 */
+		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
+		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
+		OMAP_DSS_COLOR_UYVY,
+
+		/* OMAP_DSS_VIDEO2 */
+		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
+		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
+		OMAP_DSS_COLOR_UYVY,
+	},
+};
+
+/* OMAP3 DSS Features */
+static struct omap_dss_features omap3_dss_features = {
+	.reg_fields = {
+		{FIRHINC, 12, 0},
+		{FIRVINC, 28, 16},
+		{FIFOLOWTHRESHOLD, 11, 0},
+		{FIFOHIGHTHRESHOLD, 27, 16},
+		{FIFOSIZE, 10, 0},
+	},
+	.has_feature	= FEAT_GLOBAL_ALPHA,
+
+	.num_mgrs = 2,
+	.num_ovls = 3,
+	.supported_displays = {
+		/* OMAP_DSS_CHANNEL_LCD */
+		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
+		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
+
+		/* OMAP_DSS_CHANNEL_DIGIT */
+		OMAP_DISPLAY_TYPE_VENC,
+	},
+	.supported_color_modes = {
+		/* OMAP_DSS_GFX */
+		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
+		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
+		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
+		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
+		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
+		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
+
+		/* OMAP_DSS_VIDEO1 */
+		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
+		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
+		OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
+
+		/* OMAP_DSS_VIDEO2 */
+		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
+		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
+		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
+		OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
+		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
+	},
+};
+
+/* Functions returning values related to a DSS feature */
+int dss_feat_get_num_mgrs(void)
+{
+	return omap_current_dss_features.num_mgrs;
+}
+
+int dss_feat_get_num_ovls(void)
+{
+	return omap_current_dss_features.num_ovls;
+}
+
+enum omap_display_type dss_feat_get_supported_displays(int id)
+{
+	return omap_current_dss_features.supported_displays[id];
+}
+
+enum omap_color_mode dss_feat_get_supported_color_modes(int id)
+{
+	return omap_current_dss_features.supported_color_modes[id];
+}
+
+/* DSS has_feature check */
+bool dss_has_feature(enum dss_feat_id id)
+{
+	return omap_current_dss_features.has_feature & id;
+}
+
+void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end)
+{
+	*start = omap_current_dss_features.reg_fields[id].start;
+	*end = omap_current_dss_features.reg_fields[id].end;
+}
+
+void dss_features_init(void)
+{
+	if (cpu_is_omap24xx())
+		omap_current_dss_features = omap2_dss_features;
+	else
+		omap_current_dss_features = omap3_dss_features;
+}
diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h
new file mode 100644
index 0000000..f1a7e17
--- /dev/null
+++ b/drivers/video/omap2/dss/dss_features.h
@@ -0,0 +1,51 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.h
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <archit@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __OMAP2_DSS_FEATURES_H
+#define __OMAP2_DSS_FEATURES_H
+
+#define MAX_DSS_MANAGERS	2
+#define MAX_DSS_OVERLAYS	3
+#define MAX_DSS_REG_FIELDS	10
+
+/* DSS has feature id */
+enum dss_feat_id {
+	FEAT_GLOBAL_ALPHA	= 1 << 0,
+	FEAT_GLOBAL_ALPHA_VID1	= 1 << 1,
+};
+
+/* DSS register field id */
+enum dss_feat_reg_field {
+	FIRHINC,
+	FIRVINC,
+	FIFOHIGHTHRESHOLD,
+	FIFOLOWTHRESHOLD,
+	FIFOSIZE,
+};
+
+/* DSS Feature Functions */
+int dss_feat_get_num_mgrs(void);
+int dss_feat_get_num_ovls(void);
+enum omap_display_type dss_feat_get_supported_displays(int id);
+enum omap_color_mode dss_feat_get_supported_color_modes(int id);
+
+bool dss_has_feature(enum dss_feat_id id);
+void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end);
+void dss_features_init(void);
+#endif
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code
  2010-09-08 11:17 [PATCH v2 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Archit Taneja
  2010-09-08 11:17 ` [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files Archit Taneja
@ 2010-09-08 11:17 ` Archit Taneja
  2010-09-09 10:29   ` Tomi Valkeinen
  1 sibling, 1 reply; 8+ messages in thread
From: Archit Taneja @ 2010-09-08 11:17 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

calls init functions of dss_features during dss_probe, and the following
features are made omapxxxx independent:
  - number of managers, overlays
  - supported color modes for each overlay
  - supported displays for each manager
  - global aplha, and restriction of global alpha for video1 pipeline
  - The register field ranges : FIRHINC, FIRVINC, FIFOHIGHTHRESHOLD
    FIFOLOWTHRESHOLD and FIFOSIZE

Signed-off-by: Archit Taneja <archit@ti.com>
---
 arch/arm/plat-omap/include/plat/display.h |   31 ----------------
 drivers/video/omap2/dss/Makefile          |    2 +-
 drivers/video/omap2/dss/core.c            |    3 ++
 drivers/video/omap2/dss/dispc.c           |   56 ++++++++++++++++-------------
 drivers/video/omap2/dss/manager.c         |   33 ++++++++---------
 drivers/video/omap2/dss/overlay.c         |   24 +++++-------
 6 files changed, 61 insertions(+), 88 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h
index 8bd15bd..c915a66
--- a/arch/arm/plat-omap/include/plat/display.h
+++ b/arch/arm/plat-omap/include/plat/display.h
@@ -81,37 +81,6 @@ enum omap_color_mode {
 	OMAP_DSS_COLOR_ARGB32	= 1 << 11, /* ARGB32 */
 	OMAP_DSS_COLOR_RGBA32	= 1 << 12, /* RGBA32 */
 	OMAP_DSS_COLOR_RGBX32	= 1 << 13, /* RGBx32 */
-
-	OMAP_DSS_COLOR_GFX_OMAP2 =
-		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
-		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
-		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
-		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
-
-	OMAP_DSS_COLOR_VID_OMAP2 =
-		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
-		OMAP_DSS_COLOR_UYVY,
-
-	OMAP_DSS_COLOR_GFX_OMAP3 =
-		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
-		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
-		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
-		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
-		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
-
-	OMAP_DSS_COLOR_VID1_OMAP3 =
-		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
-		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
-		OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
-
-	OMAP_DSS_COLOR_VID2_OMAP3 =
-		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
-		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
-		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
-		OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
-		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
 };
 
 enum omap_lcd_display_type {
diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile
index d71b5d9..7db17b5
--- a/drivers/video/omap2/dss/Makefile
+++ b/drivers/video/omap2/dss/Makefile
@@ -1,5 +1,5 @@
 obj-$(CONFIG_OMAP2_DSS) += omapdss.o
-omapdss-y := core.o dss.o dispc.o display.o manager.o overlay.o
+omapdss-y := core.o dss.o dss_features.o dispc.o display.o manager.o overlay.o
 omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o
 omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o
 omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
index b3a498f..8e89f60
--- a/drivers/video/omap2/dss/core.c
+++ b/drivers/video/omap2/dss/core.c
@@ -37,6 +37,7 @@
 #include <plat/clock.h>
 
 #include "dss.h"
+#include "dss_features.h"
 
 static struct {
 	struct platform_device *pdev;
@@ -502,6 +503,8 @@ static int omap_dss_probe(struct platform_device *pdev)
 
 	core.pdev = pdev;
 
+	dss_features_init();
+
 	dss_init_overlay_managers(pdev);
 	dss_init_overlays(pdev);
 
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
index 90eb110..dda497c
--- a/drivers/video/omap2/dss/dispc.c
+++ b/drivers/video/omap2/dss/dispc.c
@@ -39,6 +39,7 @@
 #include <plat/display.h>
 
 #include "dss.h"
+#include "dss_features.h"
 
 /* DISPC */
 #define DISPC_BASE			0x48050400
@@ -774,12 +775,12 @@ static void _dispc_set_vid_size(enum omap_plane plane, int width, int height)
 
 static void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
 {
-
-	BUG_ON(plane == OMAP_DSS_VIDEO1);
-
-	if (cpu_is_omap24xx())
+	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
 		return;
 
+	BUG_ON(!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
+			plane == OMAP_DSS_VIDEO1);
+
 	if (plane == OMAP_DSS_GFX)
 		REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 7, 0);
 	else if (plane == OMAP_DSS_VIDEO2)
@@ -949,17 +950,14 @@ static void dispc_read_plane_fifo_sizes(void)
 				      DISPC_VID_FIFO_SIZE_STATUS(1) };
 	u32 size;
 	int plane;
+	u8 size1, size2;
 
 	enable_clocks(1);
 
-	for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) {
-		if (cpu_is_omap24xx())
-			size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0);
-		else if (cpu_is_omap34xx())
-			size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0);
-		else
-			BUG();
+	dss_feat_get_reg_field(FIFOSIZE, &size1, &size2);
 
+	for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) {
+		size = FLD_GET(dispc_read_reg(fsz_reg[plane]), size1, size2);
 		dispc.fifo_size[plane] = size;
 	}
 
@@ -976,6 +974,8 @@ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high)
 	const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD,
 				       DISPC_VID_FIFO_THRESHOLD(0),
 				       DISPC_VID_FIFO_THRESHOLD(1) };
+	u8 high1, high2, low1, low2;
+
 	enable_clocks(1);
 
 	DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n",
@@ -984,12 +984,12 @@ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high)
 			REG_GET(ftrs_reg[plane], 27, 16),
 			low, high);
 
-	if (cpu_is_omap24xx())
-		dispc_write_reg(ftrs_reg[plane],
-				FLD_VAL(high, 24, 16) | FLD_VAL(low, 8, 0));
-	else
-		dispc_write_reg(ftrs_reg[plane],
-				FLD_VAL(high, 27, 16) | FLD_VAL(low, 11, 0));
+	dss_feat_get_reg_field(FIFOHIGHTHRESHOLD, &high1, &high2);
+	dss_feat_get_reg_field(FIFOLOWTHRESHOLD, &low1, &low2);
+
+	dispc_write_reg(ftrs_reg[plane],
+			FLD_VAL(high, high1, high2) |
+			FLD_VAL(low, low1, low2));
 
 	enable_clocks(0);
 }
@@ -1009,13 +1009,16 @@ static void _dispc_set_fir(enum omap_plane plane, int hinc, int vinc)
 	u32 val;
 	const struct dispc_reg fir_reg[] = { DISPC_VID_FIR(0),
 				      DISPC_VID_FIR(1) };
+	u8 hinc1, hinc2, vinc1, vinc2;
 
 	BUG_ON(plane == OMAP_DSS_GFX);
 
-	if (cpu_is_omap24xx())
-		val = FLD_VAL(vinc, 27, 16) | FLD_VAL(hinc, 11, 0);
-	else
-		val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0);
+	dss_feat_get_reg_field(FIRHINC, &hinc1, &hinc2);
+	dss_feat_get_reg_field(FIRVINC, &vinc1, &vinc2);
+
+	val = FLD_VAL(vinc, vinc1, vinc2) |
+			FLD_VAL(hinc, hinc1, hinc2);
+
 	dispc_write_reg(fir_reg[plane-1], val);
 }
 
@@ -1541,6 +1544,8 @@ static int _dispc_setup_plane(enum omap_plane plane,
 		case OMAP_DSS_COLOR_ARGB16:
 		case OMAP_DSS_COLOR_ARGB32:
 		case OMAP_DSS_COLOR_RGBA32:
+			if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
+				return -EINVAL;
 		case OMAP_DSS_COLOR_RGBX32:
 			if (cpu_is_omap24xx())
 				return -EINVAL;
@@ -1581,9 +1586,10 @@ static int _dispc_setup_plane(enum omap_plane plane,
 		case OMAP_DSS_COLOR_ARGB16:
 		case OMAP_DSS_COLOR_ARGB32:
 		case OMAP_DSS_COLOR_RGBA32:
-			if (cpu_is_omap24xx())
+			if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
 				return -EINVAL;
-			if (plane == OMAP_DSS_VIDEO1)
+			if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
+					plane == OMAP_DSS_VIDEO1)
 				return -EINVAL;
 			break;
 
@@ -1976,7 +1982,7 @@ void dispc_enable_trans_key(enum omap_channel ch, bool enable)
 }
 void dispc_enable_alpha_blending(enum omap_channel ch, bool enable)
 {
-	if (cpu_is_omap24xx())
+	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
 		return;
 
 	enable_clocks(1);
@@ -1990,7 +1996,7 @@ bool dispc_alpha_blending_enabled(enum omap_channel ch)
 {
 	bool enabled;
 
-	if (cpu_is_omap24xx())
+	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
 		return false;
 
 	enable_clocks(1);
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
index 6a649ab..545e9b9
--- a/drivers/video/omap2/dss/manager.c
+++ b/drivers/video/omap2/dss/manager.c
@@ -33,6 +33,7 @@
 #include <plat/cpu.h>
 
 #include "dss.h"
+#include "dss_features.h"
 
 static int num_managers;
 static struct list_head manager_list;
@@ -448,8 +449,8 @@ struct manager_cache_data {
 
 static struct {
 	spinlock_t lock;
-	struct overlay_cache_data overlay_cache[3];
-	struct manager_cache_data manager_cache[2];
+	struct overlay_cache_data overlay_cache[MAX_DSS_OVERLAYS];
+	struct manager_cache_data manager_cache[MAX_DSS_MANAGERS];
 
 	bool irq_enabled;
 } dss_cache;
@@ -882,12 +883,12 @@ static int configure_dispc(void)
 {
 	struct overlay_cache_data *oc;
 	struct manager_cache_data *mc;
-	const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
-	const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
+	const int num_ovls = dss_feat_get_num_ovls();
+	const int num_mgrs = dss_feat_get_num_mgrs();
 	int i;
 	int r;
-	bool mgr_busy[2];
-	bool mgr_go[2];
+	bool mgr_busy[MAX_DSS_MANAGERS];
+	bool mgr_go[MAX_DSS_MANAGERS];
 	bool busy;
 
 	r = 0;
@@ -989,7 +990,7 @@ void dss_setup_partial_planes(struct omap_dss_device *dssdev,
 {
 	struct overlay_cache_data *oc;
 	struct manager_cache_data *mc;
-	const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
+	const int num_ovls = dss_feat_get_num_ovls();
 	struct omap_overlay_manager *mgr;
 	int i;
 	u16 x, y, w, h;
@@ -1121,8 +1122,8 @@ void dss_start_update(struct omap_dss_device *dssdev)
 {
 	struct manager_cache_data *mc;
 	struct overlay_cache_data *oc;
-	const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
-	const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
+	const int num_ovls = dss_feat_get_num_ovls();
+	const int num_mgrs = dss_feat_get_num_mgrs();
 	struct omap_overlay_manager *mgr;
 	int i;
 
@@ -1151,10 +1152,10 @@ static void dss_apply_irq_handler(void *data, u32 mask)
 {
 	struct manager_cache_data *mc;
 	struct overlay_cache_data *oc;
-	const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache);
-	const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache);
+	const int num_ovls = dss_feat_get_num_ovls();
+	const int num_mgrs = dss_feat_get_num_mgrs();
 	int i, r;
-	bool mgr_busy[2];
+	bool mgr_busy[MAX_DSS_MANAGERS];
 
 	mgr_busy[0] = dispc_go_busy(0);
 	mgr_busy[1] = dispc_go_busy(1);
@@ -1461,7 +1462,7 @@ int dss_init_overlay_managers(struct platform_device *pdev)
 
 	num_managers = 0;
 
-	for (i = 0; i < 2; ++i) {
+	for (i = 0; i < dss_feat_get_num_mgrs(); ++i) {
 		struct omap_overlay_manager *mgr;
 		mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
 
@@ -1471,14 +1472,10 @@ int dss_init_overlay_managers(struct platform_device *pdev)
 		case 0:
 			mgr->name = "lcd";
 			mgr->id = OMAP_DSS_CHANNEL_LCD;
-			mgr->supported_displays =
-				OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
-				OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI;
 			break;
 		case 1:
 			mgr->name = "tv";
 			mgr->id = OMAP_DSS_CHANNEL_DIGIT;
-			mgr->supported_displays = OMAP_DISPLAY_TYPE_VENC;
 			break;
 		}
 
@@ -1494,6 +1491,8 @@ int dss_init_overlay_managers(struct platform_device *pdev)
 		mgr->disable = &dss_mgr_disable;
 
 		mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC;
+		mgr->supported_displays =
+			dss_feat_get_supported_displays(mgr->id);
 
 		dss_overlay_setup_dispc_manager(mgr);
 
diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c
index 244dca8..75642c2
--- a/drivers/video/omap2/dss/overlay.c
+++ b/drivers/video/omap2/dss/overlay.c
@@ -35,6 +35,7 @@
 #include <plat/cpu.h>
 
 #include "dss.h"
+#include "dss_features.h"
 
 static int num_overlays;
 static struct list_head overlay_list;
@@ -237,7 +238,8 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
 	/* Video1 plane does not support global alpha
 	 * to always make it 255 completely opaque
 	 */
-	if (ovl->id == OMAP_DSS_VIDEO1)
+	if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
+			ovl->id == OMAP_DSS_VIDEO1)
 		info.global_alpha = 255;
 	else
 		info.global_alpha = simple_strtoul(buf, NULL, 10);
@@ -510,11 +512,11 @@ static void omap_dss_add_overlay(struct omap_overlay *overlay)
 	list_add_tail(&overlay->list, &overlay_list);
 }
 
-static struct omap_overlay *dispc_overlays[3];
+static struct omap_overlay *dispc_overlays[MAX_DSS_OVERLAYS];
 
 void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr)
 {
-	mgr->num_overlays = 3;
+	mgr->num_overlays = dss_feat_get_num_ovls();
 	mgr->overlays = dispc_overlays;
 }
 
@@ -535,7 +537,7 @@ void dss_init_overlays(struct platform_device *pdev)
 
 	num_overlays = 0;
 
-	for (i = 0; i < 3; ++i) {
+	for (i = 0; i < dss_feat_get_num_ovls(); ++i) {
 		struct omap_overlay *ovl;
 		ovl = kzalloc(sizeof(*ovl), GFP_KERNEL);
 
@@ -545,18 +547,12 @@ void dss_init_overlays(struct platform_device *pdev)
 		case 0:
 			ovl->name = "gfx";
 			ovl->id = OMAP_DSS_GFX;
-			ovl->supported_modes = cpu_is_omap34xx() ?
-				OMAP_DSS_COLOR_GFX_OMAP3 :
-				OMAP_DSS_COLOR_GFX_OMAP2;
 			ovl->caps = OMAP_DSS_OVL_CAP_DISPC;
 			ovl->info.global_alpha = 255;
 			break;
 		case 1:
 			ovl->name = "vid1";
 			ovl->id = OMAP_DSS_VIDEO1;
-			ovl->supported_modes = cpu_is_omap34xx() ?
-				OMAP_DSS_COLOR_VID1_OMAP3 :
-				OMAP_DSS_COLOR_VID_OMAP2;
 			ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
 				OMAP_DSS_OVL_CAP_DISPC;
 			ovl->info.global_alpha = 255;
@@ -564,9 +560,6 @@ void dss_init_overlays(struct platform_device *pdev)
 		case 2:
 			ovl->name = "vid2";
 			ovl->id = OMAP_DSS_VIDEO2;
-			ovl->supported_modes = cpu_is_omap34xx() ?
-				OMAP_DSS_COLOR_VID2_OMAP3 :
-				OMAP_DSS_COLOR_VID_OMAP2;
 			ovl->caps = OMAP_DSS_OVL_CAP_SCALE |
 				OMAP_DSS_OVL_CAP_DISPC;
 			ovl->info.global_alpha = 255;
@@ -579,6 +572,9 @@ void dss_init_overlays(struct platform_device *pdev)
 		ovl->get_overlay_info = &dss_ovl_get_overlay_info;
 		ovl->wait_for_go = &dss_ovl_wait_for_go;
 
+		ovl->supported_modes =
+			dss_feat_get_supported_color_modes(ovl->id);
+
 		omap_dss_add_overlay(ovl);
 
 		r = kobject_init_and_add(&ovl->kobj, &overlay_ktype,
@@ -651,7 +647,7 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force)
 	}
 
 	if (mgr) {
-		for (i = 0; i < 3; i++) {
+		for (i = 0; i < dss_feat_get_num_ovls(); i++) {
 			struct omap_overlay *ovl;
 			ovl = omap_dss_get_overlay(i);
 			if (!ovl->manager || force) {
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-08 11:17 ` [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files Archit Taneja
@ 2010-09-09 10:25   ` Tomi Valkeinen
  2010-09-09 10:53     ` Taneja, Archit
  0 siblings, 1 reply; 8+ messages in thread
From: Tomi Valkeinen @ 2010-09-09 10:25 UTC (permalink / raw)
  To: ext Archit Taneja; +Cc: linux-omap

Hi,

On Wed, 2010-09-08 at 13:17 +0200, ext Archit Taneja wrote:
> Add dss_features.c and dss_features.h for the dss_features framework
> 
> Signed-off-by: Archit Taneja <archit@ti.com>
> ---
>  drivers/video/omap2/dss/dss_features.c |  171 ++++++++++++++++++++++++++++++++
>  drivers/video/omap2/dss/dss_features.h |   51 ++++++++++
>  2 files changed, 222 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/video/omap2/dss/dss_features.c
>  create mode 100644 drivers/video/omap2/dss/dss_features.h
> 
> diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
> new file mode 100644
> index 0000000..e87816f
> --- /dev/null
> +++ b/drivers/video/omap2/dss/dss_features.c
> @@ -0,0 +1,171 @@
> +/*
> + * linux/drivers/video/omap2/dss/dss_features.c
> + *
> + * Copyright (C) 2010 Texas Instruments
> + * Author: Archit Taneja <archit@ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/types.h>
> +#include <linux/err.h>
> +#include <linux/slab.h>
> +
> +#include <plat/display.h>
> +#include <plat/cpu.h>
> +
> +#include "dss_features.h"
> +
> +/* Defines a generic omap register field */
> +struct dss_reg_field {
> +	enum dss_feat_reg_field id;
> +	u8 start, end;
> +};
> +
> +struct omap_dss_features {
> +	struct dss_reg_field reg_fields[MAX_DSS_REG_FIELDS];

Perhaps this should be a pointer to a list, and add a separate field for
num_reg_fields. That way you don't need a MAX_DSS_REG_FIELDS definition.

> +	u32 has_feature;
> +
> +	int num_mgrs;
> +	int num_ovls;
> +	enum omap_display_type supported_displays[MAX_DSS_MANAGERS];
> +	enum omap_color_mode supported_color_modes[MAX_DSS_OVERLAYS];

Perhaps same could be done here.

> +};
> +
> +/* This struct is assigned to one of the below during initialization */
> +static struct omap_dss_features omap_current_dss_features;
> +
> +/* OMAP2 DSS Features */
> +static struct omap_dss_features omap2_dss_features = {
> +	.reg_fields = {
> +		{FIRHINC, 11, 0},
> +		{FIRVINC, 27, 16},
> +		{FIFOLOWTHRESHOLD, 8, 0},
> +		{FIFOHIGHTHRESHOLD, 24, 16},
> +		{FIFOSIZE, 8, 0},

You should have space after { and before }.

> +	},
> +
> +	.num_mgrs = 2,
> +	.num_ovls = 3,
> +	.supported_displays = {
> +		/* OMAP_DSS_CHANNEL_LCD */
> +		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
> +		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
> +
> +		/* OMAP_DSS_CHANNEL_DIGIT */
> +		OMAP_DISPLAY_TYPE_VENC,
> +	},
> +	.supported_color_modes = {
> +		/* OMAP_DSS_GFX */
> +		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
> +		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
> +		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
> +
> +		/* OMAP_DSS_VIDEO1 */
> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
> +		OMAP_DSS_COLOR_UYVY,
> +
> +		/* OMAP_DSS_VIDEO2 */
> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
> +		OMAP_DSS_COLOR_UYVY,
> +	},
> +};
> +
> +/* OMAP3 DSS Features */
> +static struct omap_dss_features omap3_dss_features = {
> +	.reg_fields = {
> +		{FIRHINC, 12, 0},
> +		{FIRVINC, 28, 16},
> +		{FIFOLOWTHRESHOLD, 11, 0},
> +		{FIFOHIGHTHRESHOLD, 27, 16},
> +		{FIFOSIZE, 10, 0},
> +	},
> +	.has_feature	= FEAT_GLOBAL_ALPHA,
> +
> +	.num_mgrs = 2,
> +	.num_ovls = 3,
> +	.supported_displays = {
> +		/* OMAP_DSS_CHANNEL_LCD */
> +		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
> +		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
> +
> +		/* OMAP_DSS_CHANNEL_DIGIT */
> +		OMAP_DISPLAY_TYPE_VENC,
> +	},
> +	.supported_color_modes = {
> +		/* OMAP_DSS_GFX */
> +		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
> +		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
> +		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
> +
> +		/* OMAP_DSS_VIDEO1 */
> +		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
> +		OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
> +
> +		/* OMAP_DSS_VIDEO2 */
> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
> +		OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
> +		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
> +	},
> +};
> +
> +/* Functions returning values related to a DSS feature */
> +int dss_feat_get_num_mgrs(void)
> +{
> +	return omap_current_dss_features.num_mgrs;
> +}
> +
> +int dss_feat_get_num_ovls(void)
> +{
> +	return omap_current_dss_features.num_ovls;
> +}
> +
> +enum omap_display_type dss_feat_get_supported_displays(int id)
> +{
> +	return omap_current_dss_features.supported_displays[id];
> +}
> +
> +enum omap_color_mode dss_feat_get_supported_color_modes(int id)
> +{
> +	return omap_current_dss_features.supported_color_modes[id];
> +}
> +
> +/* DSS has_feature check */
> +bool dss_has_feature(enum dss_feat_id id)
> +{
> +	return omap_current_dss_features.has_feature & id;
> +}
> +
> +void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end)
> +{
> +	*start = omap_current_dss_features.reg_fields[id].start;
> +	*end = omap_current_dss_features.reg_fields[id].end;
> +}
> +
> +void dss_features_init(void)
> +{
> +	if (cpu_is_omap24xx())
> +		omap_current_dss_features = omap2_dss_features;
> +	else
> +		omap_current_dss_features = omap3_dss_features;
> +}
> diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h
> new file mode 100644
> index 0000000..f1a7e17
> --- /dev/null
> +++ b/drivers/video/omap2/dss/dss_features.h
> @@ -0,0 +1,51 @@
> +/*
> + * linux/drivers/video/omap2/dss/dss_features.h
> + *
> + * Copyright (C) 2010 Texas Instruments
> + * Author: Archit Taneja <archit@ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __OMAP2_DSS_FEATURES_H
> +#define __OMAP2_DSS_FEATURES_H
> +
> +#define MAX_DSS_MANAGERS	2
> +#define MAX_DSS_OVERLAYS	3
> +#define MAX_DSS_REG_FIELDS	10
> +
> +/* DSS has feature id */
> +enum dss_feat_id {
> +	FEAT_GLOBAL_ALPHA	= 1 << 0,
> +	FEAT_GLOBAL_ALPHA_VID1	= 1 << 1,
> +};
> +
> +/* DSS register field id */
> +enum dss_feat_reg_field {
> +	FIRHINC,
> +	FIRVINC,
> +	FIFOHIGHTHRESHOLD,
> +	FIFOLOWTHRESHOLD,
> +	FIFOSIZE,
> +};

These enums should also have some prefix. FEAT_REG?

> +
> +/* DSS Feature Functions */
> +int dss_feat_get_num_mgrs(void);
> +int dss_feat_get_num_ovls(void);
> +enum omap_display_type dss_feat_get_supported_displays(int id);
> +enum omap_color_mode dss_feat_get_supported_color_modes(int id);

These functions are a bit confusing. I know they are similar to what
already exists in DSS driver for overlays and managers, but...

Using get_num_mgrs() and then looping through then would suggest that
the parameter to get_supported_displays() would be an index to an array
(which it is), but at the same time the parameter is an overlay ID.
Perhaps enum omap_plane and enum omap_channel from display.h could be
used here?

Which reminds me that the names of those enums in display.h should be
also reviewed... A global "omap_channel" is not very descriptive =).
Should perhaps be omap_dss_channel or manager".

 Tomi



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code
  2010-09-08 11:17 ` [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code Archit Taneja
@ 2010-09-09 10:29   ` Tomi Valkeinen
  0 siblings, 0 replies; 8+ messages in thread
From: Tomi Valkeinen @ 2010-09-09 10:29 UTC (permalink / raw)
  To: ext Archit Taneja; +Cc: linux-omap

On Wed, 2010-09-08 at 13:17 +0200, ext Archit Taneja wrote:
> calls init functions of dss_features during dss_probe, and the following
> features are made omapxxxx independent:
>   - number of managers, overlays
>   - supported color modes for each overlay
>   - supported displays for each manager
>   - global aplha, and restriction of global alpha for video1 pipeline
>   - The register field ranges : FIRHINC, FIRVINC, FIFOHIGHTHRESHOLD
>     FIFOLOWTHRESHOLD and FIFOSIZE
> 
> Signed-off-by: Archit Taneja <archit@ti.com>


> diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile
> index d71b5d9..7db17b5
> --- a/drivers/video/omap2/dss/Makefile
> +++ b/drivers/video/omap2/dss/Makefile
> @@ -1,5 +1,5 @@
>  obj-$(CONFIG_OMAP2_DSS) += omapdss.o
> -omapdss-y := core.o dss.o dispc.o display.o manager.o overlay.o
> +omapdss-y := core.o dss.o dss_features.o dispc.o display.o manager.o overlay.o

I think this change should be in the previous patch.

 Tomi



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-09 10:25   ` Tomi Valkeinen
@ 2010-09-09 10:53     ` Taneja, Archit
  2010-09-09 10:59       ` Tomi Valkeinen
  0 siblings, 1 reply; 8+ messages in thread
From: Taneja, Archit @ 2010-09-09 10:53 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: linux-omap

Hi,

Tomi Valkeinen wrote:
> Hi,
> 
> On Wed, 2010-09-08 at 13:17 +0200, ext Archit Taneja wrote:
>> Add dss_features.c and dss_features.h for the dss_features framework
>> 
>> Signed-off-by: Archit Taneja <archit@ti.com>
>> ---
>>  drivers/video/omap2/dss/dss_features.c |  171
> ++++++++++++++++++++++++++++++++
>>  drivers/video/omap2/dss/dss_features.h |   51 ++++++++++
>>  2 files changed, 222 insertions(+), 0 deletions(-)  create mode
>> 100644 drivers/video/omap2/dss/dss_features.c
>>  create mode 100644 drivers/video/omap2/dss/dss_features.h
>> 
>> diff --git a/drivers/video/omap2/dss/dss_features.c
>> b/drivers/video/omap2/dss/dss_features.c
>> new file mode 100644
>> index 0000000..e87816f
>> --- /dev/null
>> +++ b/drivers/video/omap2/dss/dss_features.c
>> @@ -0,0 +1,171 @@
>> +/*
>> + * linux/drivers/video/omap2/dss/dss_features.c
>> + *
>> + * Copyright (C) 2010 Texas Instruments
>> + * Author: Archit Taneja <archit@ti.com>
>> + *
>> + * This program is free software; you can redistribute it and/or +modify it
>> + * under the terms of the GNU General Public License version 2 as
>> +published by + * the Free Software Foundation.
>> + *
>> + * This program is distributed in the hope that it will be useful, +but
>> WITHOUT + * ANY WARRANTY; without even the implied warranty of
>> MERCHANTABILITY +or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> General Public +License for + * more details.
>> + *
>> + * You should have received a copy of the GNU General Public License +along
>> with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/types.h>
>> +#include <linux/err.h>
>> +#include <linux/slab.h>
>> +
>> +#include <plat/display.h>
>> +#include <plat/cpu.h>
>> +
>> +#include "dss_features.h"
>> +
>> +/* Defines a generic omap register field */ struct dss_reg_field { +	enum
>> dss_feat_reg_field id; +	u8 start, end;
>> +};
>> +
>> +struct omap_dss_features {
>> +	struct dss_reg_field reg_fields[MAX_DSS_REG_FIELDS];
> 
> Perhaps this should be a pointer to a list, and add a
> separate field for num_reg_fields. That way you don't need a
> MAX_DSS_REG_FIELDS definition.

If it is a pointer to a list then we can't initialize things statically, won't
we need functions at runtime to add to the list of reg_fields etc, this is what
I did in v1?

> 
>> +	u32 has_feature;
>> +
>> +	int num_mgrs;
>> +	int num_ovls;
>> +	enum omap_display_type supported_displays[MAX_DSS_MANAGERS];
>> +	enum omap_color_mode supported_color_modes[MAX_DSS_OVERLAYS];
> 
> Perhaps same could be done here.
> 
>> +};
>> +
>> +/* This struct is assigned to one of the below during initialization
>> +*/ static struct omap_dss_features omap_current_dss_features; +
>> +/* OMAP2 DSS Features */
>> +static struct omap_dss_features omap2_dss_features = { +	.reg_fields = {
>> +		{FIRHINC, 11, 0},
>> +		{FIRVINC, 27, 16},
>> +		{FIFOLOWTHRESHOLD, 8, 0},
>> +		{FIFOHIGHTHRESHOLD, 24, 16},
>> +		{FIFOSIZE, 8, 0},
> 
> You should have space after { and before }.

I will correct this.

> 
>> +	},
>> +
>> +	.num_mgrs = 2,
>> +	.num_ovls = 3,
>> +	.supported_displays = {
>> +		/* OMAP_DSS_CHANNEL_LCD */
>> +		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
>> +		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
>> +
>> +		/* OMAP_DSS_CHANNEL_DIGIT */
>> +		OMAP_DISPLAY_TYPE_VENC,
>> +	},
>> +	.supported_color_modes = {
>> +		/* OMAP_DSS_GFX */
>> +		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
>> +		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
>> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
>> +		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,
>> +
>> +		/* OMAP_DSS_VIDEO1 */
>> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
>> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
>> +		OMAP_DSS_COLOR_UYVY,
>> +
>> +		/* OMAP_DSS_VIDEO2 */
>> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
>> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
>> +		OMAP_DSS_COLOR_UYVY,
>> +	},
>> +};
>> +
>> +/* OMAP3 DSS Features */
>> +static struct omap_dss_features omap3_dss_features = { +	.reg_fields = {
>> +		{FIRHINC, 12, 0},
>> +		{FIRVINC, 28, 16},
>> +		{FIFOLOWTHRESHOLD, 11, 0},
>> +		{FIFOHIGHTHRESHOLD, 27, 16},
>> +		{FIFOSIZE, 10, 0},
>> +	},
>> +	.has_feature	= FEAT_GLOBAL_ALPHA,
>> +
>> +	.num_mgrs = 2,
>> +	.num_ovls = 3,
>> +	.supported_displays = {
>> +		/* OMAP_DSS_CHANNEL_LCD */
>> +		OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
>> +		OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,
>> +
>> +		/* OMAP_DSS_CHANNEL_DIGIT */
>> +		OMAP_DISPLAY_TYPE_VENC,
>> +	},
>> +	.supported_color_modes = {
>> +		/* OMAP_DSS_GFX */
>> +		OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
>> +		OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |
>> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
>> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
>> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |
>> +		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
>> +
>> +		/* OMAP_DSS_VIDEO1 */
>> +		OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |
>> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |
>> +		OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,
>> +
>> +		/* OMAP_DSS_VIDEO2 */
>> +		OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |
>> +		OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |
>> +		OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |
>> +		OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |
>> +		OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,
>> +	},
>> +};
>> +
>> +/* Functions returning values related to a DSS feature */ int
>> +dss_feat_get_num_mgrs(void) {
>> +	return omap_current_dss_features.num_mgrs;
>> +}
>> +
>> +int dss_feat_get_num_ovls(void)
>> +{
>> +	return omap_current_dss_features.num_ovls;
>> +}
>> +
>> +enum omap_display_type dss_feat_get_supported_displays(int id) {
>> +	return omap_current_dss_features.supported_displays[id]; +}
>> +
>> +enum omap_color_mode dss_feat_get_supported_color_modes(int id) {
>> +	return omap_current_dss_features.supported_color_modes[id]; +}
>> +
>> +/* DSS has_feature check */
>> +bool dss_has_feature(enum dss_feat_id id) {
>> +	return omap_current_dss_features.has_feature & id; } +
>> +void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8
>> +*end) { +	*start = omap_current_dss_features.reg_fields[id].start;
>> +	*end = omap_current_dss_features.reg_fields[id].end; +}
>> +
>> +void dss_features_init(void)
>> +{
>> +	if (cpu_is_omap24xx())
>> +		omap_current_dss_features = omap2_dss_features;
>> +	else
>> +		omap_current_dss_features = omap3_dss_features; }
>> diff --git a/drivers/video/omap2/dss/dss_features.h
>> b/drivers/video/omap2/dss/dss_features.h
>> new file mode 100644
>> index 0000000..f1a7e17
>> --- /dev/null
>> +++ b/drivers/video/omap2/dss/dss_features.h
>> @@ -0,0 +1,51 @@
>> +/*
>> + * linux/drivers/video/omap2/dss/dss_features.h
>> + *
>> + * Copyright (C) 2010 Texas Instruments
>> + * Author: Archit Taneja <archit@ti.com>
>> + *
>> + * This program is free software; you can redistribute it and/or +modify it
>> + * under the terms of the GNU General Public License version 2 as
>> +published by + * the Free Software Foundation.
>> + *
>> + * This program is distributed in the hope that it will be useful, +but
>> WITHOUT + * ANY WARRANTY; without even the implied warranty of
>> MERCHANTABILITY +or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> General Public +License for + * more details.
>> + *
>> + * You should have received a copy of the GNU General Public License +along
>> with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */
>> +
>> +#ifndef __OMAP2_DSS_FEATURES_H
>> +#define __OMAP2_DSS_FEATURES_H
>> +
>> +#define MAX_DSS_MANAGERS	2
>> +#define MAX_DSS_OVERLAYS	3
>> +#define MAX_DSS_REG_FIELDS	10
>> +
>> +/* DSS has feature id */
>> +enum dss_feat_id {
>> +	FEAT_GLOBAL_ALPHA	= 1 << 0,
>> +	FEAT_GLOBAL_ALPHA_VID1	= 1 << 1,
>> +};
>> +
>> +/* DSS register field id */
>> +enum dss_feat_reg_field {
>> +	FIRHINC,
>> +	FIRVINC,
>> +	FIFOHIGHTHRESHOLD,
>> +	FIFOLOWTHRESHOLD,
>> +	FIFOSIZE,
>> +};
> 
> These enums should also have some prefix. FEAT_REG?
> 
>> +
>> +/* DSS Feature Functions */
>> +int dss_feat_get_num_mgrs(void);
>> +int dss_feat_get_num_ovls(void);
>> +enum omap_display_type dss_feat_get_supported_displays(int id); enum
>> +omap_color_mode dss_feat_get_supported_color_modes(int id);
> 
> These functions are a bit confusing. I know they are similar
> to what already exists in DSS driver for overlays and managers, but...
> 
> Using get_num_mgrs() and then looping through then would
> suggest that the parameter to get_supported_displays() would
> be an index to an array (which it is), but at the same time
> the parameter is an overlay ID.
> Perhaps enum omap_plane and enum omap_channel from display.h
> could be used here?

Yes we can do that, we should change dss_init_overlays() and init_managers()
to loop around the enums then, and have case labels as "OMAP_DSS_GFX" and
"OMAP_DSS_VIDEO1".. instead of "0" "1" etc.

In the same way, the structs "omap_overlay" and "omap_overlay_manager"
should have an enum instead of "int id" as the member.

> 
> Which reminds me that the names of those enums in display.h
> should be also reviewed... A global "omap_channel" is not
> very descriptive =).
> Should perhaps be omap_dss_channel or manager".

I guess so, since its in the plat-omap folder..

Archit

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-09 10:53     ` Taneja, Archit
@ 2010-09-09 10:59       ` Tomi Valkeinen
  2010-09-09 11:09         ` Taneja, Archit
  0 siblings, 1 reply; 8+ messages in thread
From: Tomi Valkeinen @ 2010-09-09 10:59 UTC (permalink / raw)
  To: ext Taneja, Archit; +Cc: linux-omap

On Thu, 2010-09-09 at 12:53 +0200, ext Taneja, Archit wrote:
> Hi,
> 
> Tomi Valkeinen wrote:
> > Hi,
> > 
> > On Wed, 2010-09-08 at 13:17 +0200, ext Archit Taneja wrote:
> >> Add dss_features.c and dss_features.h for the dss_features framework
> >> 
> >> Signed-off-by: Archit Taneja <archit@ti.com>
> >> ---
> >>  drivers/video/omap2/dss/dss_features.c |  171
> > ++++++++++++++++++++++++++++++++
> >>  drivers/video/omap2/dss/dss_features.h |   51 ++++++++++
> >>  2 files changed, 222 insertions(+), 0 deletions(-)  create mode
> >> 100644 drivers/video/omap2/dss/dss_features.c
> >>  create mode 100644 drivers/video/omap2/dss/dss_features.h
> >> 
> >> diff --git a/drivers/video/omap2/dss/dss_features.c
> >> b/drivers/video/omap2/dss/dss_features.c
> >> new file mode 100644
> >> index 0000000..e87816f
> >> --- /dev/null
> >> +++ b/drivers/video/omap2/dss/dss_features.c
> >> @@ -0,0 +1,171 @@
> >> +/*
> >> + * linux/drivers/video/omap2/dss/dss_features.c
> >> + *
> >> + * Copyright (C) 2010 Texas Instruments
> >> + * Author: Archit Taneja <archit@ti.com>
> >> + *
> >> + * This program is free software; you can redistribute it and/or +modify it
> >> + * under the terms of the GNU General Public License version 2 as
> >> +published by + * the Free Software Foundation.
> >> + *
> >> + * This program is distributed in the hope that it will be useful, +but
> >> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> >> MERCHANTABILITY +or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >> General Public +License for + * more details.
> >> + *
> >> + * You should have received a copy of the GNU General Public License +along
> >> with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */
> >> +
> >> +#include <linux/kernel.h>
> >> +#include <linux/types.h>
> >> +#include <linux/err.h>
> >> +#include <linux/slab.h>
> >> +
> >> +#include <plat/display.h>
> >> +#include <plat/cpu.h>
> >> +
> >> +#include "dss_features.h"
> >> +
> >> +/* Defines a generic omap register field */ struct dss_reg_field { +	enum
> >> dss_feat_reg_field id; +	u8 start, end;
> >> +};
> >> +
> >> +struct omap_dss_features {
> >> +	struct dss_reg_field reg_fields[MAX_DSS_REG_FIELDS];
> > 
> > Perhaps this should be a pointer to a list, and add a
> > separate field for num_reg_fields. That way you don't need a
> > MAX_DSS_REG_FIELDS definition.
> 
> If it is a pointer to a list then we can't initialize things statically, won't
> we need functions at runtime to add to the list of reg_fields etc, this is what
> I did in v1?

Something like:

static struct dss_reg_field omap2_dss_reg_fields[] =
{
      {FIRHINC, 11, 0},
      {FIRVINC, 27, 16},
      {FIFOLOWTHRESHOLD, 8, 0},
      {FIFOHIGHTHRESHOLD, 24, 16},
      {FIFOSIZE, 8, 0},
};

static struct omap_dss_features omap2_dss_features = {
       .num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
       .reg_fields = omap2_dss_reg_fields,

...

 Tomi
	



^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-09 10:59       ` Tomi Valkeinen
@ 2010-09-09 11:09         ` Taneja, Archit
  0 siblings, 0 replies; 8+ messages in thread
From: Taneja, Archit @ 2010-09-09 11:09 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: linux-omap

Tomi Valkeinen wrote:
> On Thu, 2010-09-09 at 12:53 +0200, ext Taneja, Archit wrote:
>> Hi,
>> 
>> Tomi Valkeinen wrote:
>>> Hi,
>>> 
>>> On Wed, 2010-09-08 at 13:17 +0200, ext Archit Taneja wrote:
>>>> Add dss_features.c and dss_features.h for the dss_features framework
>>>> 
>>>> Signed-off-by: Archit Taneja <archit@ti.com>
>>>> ---
>>>>  drivers/video/omap2/dss/dss_features.c |  171
>>> ++++++++++++++++++++++++++++++++
>>>>  drivers/video/omap2/dss/dss_features.h |   51 ++++++++++
>>>>  2 files changed, 222 insertions(+), 0 deletions(-)  create mode
>>>> 100644 drivers/video/omap2/dss/dss_features.c
>>>>  create mode 100644 drivers/video/omap2/dss/dss_features.h
>>>> 
>>>> diff --git a/drivers/video/omap2/dss/dss_features.c
>>>> b/drivers/video/omap2/dss/dss_features.c
>>>> new file mode 100644
>>>> index 0000000..e87816f
>>>> --- /dev/null
>>>> +++ b/drivers/video/omap2/dss/dss_features.c
>>>> @@ -0,0 +1,171 @@
>>>> +/*
>>>> + * linux/drivers/video/omap2/dss/dss_features.c
>>>> + *
>>>> + * Copyright (C) 2010 Texas Instruments
>>>> + * Author: Archit Taneja <archit@ti.com>
>>>> + *
>>>> + * This program is free software; you can redistribute it and/or ++modify
>>>> it + * under the terms of the GNU General Public License version 2 as
>>>> +published by + * the Free Software Foundation.
>>>> + *
>>>> + * This program is distributed in the hope that it will be useful, ++but
>>>> WITHOUT + * ANY WARRANTY; without even the implied warranty of
>>>> MERCHANTABILITY +or + * FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> GNU General Public +License for + * more details.
>>>> + *
>>>> + * You should have received a copy of the GNU General Public + License
>>>> +along with + * this program.  If not, see
> <http://www.gnu.org/licenses/>.
>>>> + */
>>>> +
>>>> +#include <linux/kernel.h>
>>>> +#include <linux/types.h>
>>>> +#include <linux/err.h>
>>>> +#include <linux/slab.h>
>>>> +
>>>> +#include <plat/display.h>
>>>> +#include <plat/cpu.h>
>>>> +
>>>> +#include "dss_features.h"
>>>> +
>>>> +/* Defines a generic omap register field */ struct dss_reg_field { +	enum
>>>> dss_feat_reg_field id; +	u8 start, end;
>>>> +};
>>>> +
>>>> +struct omap_dss_features {
>>>> +	struct dss_reg_field reg_fields[MAX_DSS_REG_FIELDS];
>>> 
>>> Perhaps this should be a pointer to a list, and add a separate field
>>> for num_reg_fields. That way you don't need a MAX_DSS_REG_FIELDS
>>> definition.
>> 
>> If it is a pointer to a list then we can't initialize things
>> statically, won't we need functions at runtime to add to the list of
>> reg_fields etc, this is what I did in v1?
> 
> Something like:
> 
> static struct dss_reg_field omap2_dss_reg_fields[] = {       {FIRHINC, 11, 0},
>       {FIRVINC, 27, 16},
>       {FIFOLOWTHRESHOLD, 8, 0},
>       {FIFOHIGHTHRESHOLD, 24, 16},
>       {FIFOSIZE, 8, 0},
> };
> 
> static struct omap_dss_features omap2_dss_features = {
>        .num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
>        .reg_fields = omap2_dss_reg_fields,
> 
> ...

Oh okay..I will make this change..what do we do about dss_feature_functions?
Should I rework dss_init_overlays and dss_init_overlay_managers to loop based
on the enums ion display.h?

Archit

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-09-09 11:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-08 11:17 [PATCH v2 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Archit Taneja
2010-09-08 11:17 ` [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files Archit Taneja
2010-09-09 10:25   ` Tomi Valkeinen
2010-09-09 10:53     ` Taneja, Archit
2010-09-09 10:59       ` Tomi Valkeinen
2010-09-09 11:09         ` Taneja, Archit
2010-09-08 11:17 ` [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code Archit Taneja
2010-09-09 10:29   ` Tomi Valkeinen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.