linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features
@ 2010-09-15 14:09 archit
  2010-09-15 14:09 ` [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files archit
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: archit @ 2010-09-15 14:09 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

From: Archit Taneja <archit@ti.com>

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    |  191 +++++++++++++++++++++++++++++
 drivers/video/omap2/dss/dss_features.h    |   50 ++++++++
 drivers/video/omap2/dss/manager.c         |   33 +++---
 drivers/video/omap2/dss/overlay.c         |   24 ++--
 8 files changed, 302 insertions(+), 88 deletions(-)
 create mode 100644 drivers/video/omap2/dss/dss_features.c
 create mode 100644 drivers/video/omap2/dss/dss_features.h
--
Version 4:
 - all dss_features members are made const, better naming of some
   vaiables
Version 3:
 - Naming of register fields enums is changed, dss_features struct
   has some members changed as pointers to static arrays.
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] 11+ messages in thread

* [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-15 14:09 [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features archit
@ 2010-09-15 14:09 ` archit
  2010-10-07  7:09   ` Tomi Valkeinen
  2010-09-15 14:09 ` [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code archit
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: archit @ 2010-09-15 14:09 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

From: Archit Taneja <archit@ti.com>

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/Makefile       |    2 +-
 drivers/video/omap2/dss/dss_features.c |  191 ++++++++++++++++++++++++++++++++
 drivers/video/omap2/dss/dss_features.h |   50 ++++++++
 3 files changed, 242 insertions(+), 1 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/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/dss_features.c b/drivers/video/omap2/dss/dss_features.c
new file mode 100644
index 0000000..867f68d
--- /dev/null
+++ b/drivers/video/omap2/dss/dss_features.c
@@ -0,0 +1,191 @@
+/*
+ * 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 {
+	const struct dss_reg_field *reg_fields;
+	const int num_reg_fields;
+
+	const u32 has_feature;
+
+	const int num_mgrs;
+	const int num_ovls;
+	const enum omap_display_type *supported_displays;
+	const enum omap_color_mode *supported_color_modes;
+};
+
+/* This struct is assigned to one of the below during initialization */
+static struct omap_dss_features *omap_current_dss_features;
+
+static const struct dss_reg_field omap2_dss_reg_fields[] = {
+	{ FEAT_REG_FIRHINC, 11, 0 },
+	{ FEAT_REG_FIRVINC, 27, 16 },
+	{ FEAT_REG_FIFOLOWTHRESHOLD, 8, 0 },
+	{ FEAT_REG_FIFOHIGHTHRESHOLD, 24, 16 },
+	{ FEAT_REG_FIFOSIZE, 8, 0 },
+};
+
+static const struct dss_reg_field omap3_dss_reg_fields[] = {
+	{ FEAT_REG_FIRHINC, 12, 0 },
+	{ FEAT_REG_FIRVINC, 28, 16 },
+	{ FEAT_REG_FIFOLOWTHRESHOLD, 11, 0 },
+	{ FEAT_REG_FIFOHIGHTHRESHOLD, 27, 16 },
+	{ FEAT_REG_FIFOSIZE, 10, 0 },
+};
+
+static const enum omap_display_type omap2_dss_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,
+};
+
+static const enum omap_display_type omap3_dss_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,
+};
+
+static const enum omap_color_mode omap2_dss_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,
+};
+
+static const enum omap_color_mode omap3_dss_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,
+};
+
+/* OMAP2 DSS Features */
+static struct omap_dss_features omap2_dss_features = {
+	.reg_fields = omap2_dss_reg_fields,
+	.num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
+
+	.num_mgrs = 2,
+	.num_ovls = 3,
+	.supported_displays = omap2_dss_supported_displays,
+	.supported_color_modes = omap2_dss_supported_color_modes,
+};
+
+/* OMAP3 DSS Features */
+static struct omap_dss_features omap3_dss_features = {
+	.reg_fields = omap3_dss_reg_fields,
+	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
+
+	.has_feature	= FEAT_GLOBAL_ALPHA,
+
+	.num_mgrs = 2,
+	.num_ovls = 3,
+	.supported_displays = omap3_dss_supported_displays,
+	.supported_color_modes = omap3_dss_supported_color_modes,
+};
+
+/* 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(enum omap_channel channel)
+{
+	return omap_current_dss_features->supported_displays[channel];
+}
+
+enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane)
+{
+	return omap_current_dss_features->supported_color_modes[plane];
+}
+
+/* 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)
+{
+	if (id >= omap_current_dss_features->num_reg_fields)
+		BUG();
+
+	*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..cb231ea
--- /dev/null
+++ b/drivers/video/omap2/dss/dss_features.h
@@ -0,0 +1,50 @@
+/*
+ * 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
+
+/* 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 {
+	FEAT_REG_FIRHINC,
+	FEAT_REG_FIRVINC,
+	FEAT_REG_FIFOHIGHTHRESHOLD,
+	FEAT_REG_FIFOLOWTHRESHOLD,
+	FEAT_REG_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(enum omap_channel channel);
+enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane);
+
+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] 11+ messages in thread

* [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code
  2010-09-15 14:09 [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features archit
  2010-09-15 14:09 ` [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files archit
@ 2010-09-15 14:09 ` archit
  2010-09-21  7:51   ` Taneja, Archit
  2010-09-15 17:59 ` [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Tony Lindgren
  2010-10-07  8:27 ` Tomi Valkeinen
  3 siblings, 1 reply; 11+ messages in thread
From: archit @ 2010-09-15 14:09 UTC (permalink / raw)
  To: tomi.valkeinen; +Cc: linux-omap, Archit Taneja

From: Archit Taneja <archit@ti.com>

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/core.c            |    3 ++
 drivers/video/omap2/dss/dispc.c           |   56 ++++++++++++++++-------------
 drivers/video/omap2/dss/manager.c         |   33 ++++++++---------
 drivers/video/omap2/dss/overlay.c         |   24 +++++-------
 5 files changed, 60 insertions(+), 87 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/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..fa40fa5
--- 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 start, end;
 
 	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(FEAT_REG_FIFOSIZE, &start, &end);
 
+	for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) {
+		size = FLD_GET(dispc_read_reg(fsz_reg[plane]), start, end);
 		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 hi_start, hi_end, lo_start, lo_end;
+
 	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(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
+	dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
+
+	dispc_write_reg(ftrs_reg[plane],
+			FLD_VAL(high, hi_start, hi_end) |
+			FLD_VAL(low, lo_start, lo_end));
 
 	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 hinc_start, hinc_end, vinc_start, vinc_end;
 
 	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(FEAT_REG_FIRHINC, &hinc_start, &hinc_end);
+	dss_feat_get_reg_field(FEAT_REG_FIRVINC, &vinc_start, &vinc_end);
+
+	val = FLD_VAL(vinc, vinc_start, vinc_end) |
+			FLD_VAL(hinc, hinc_start, hinc_end);
+
 	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] 11+ messages in thread

* Re: [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features
  2010-09-15 14:09 [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features archit
  2010-09-15 14:09 ` [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files archit
  2010-09-15 14:09 ` [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code archit
@ 2010-09-15 17:59 ` Tony Lindgren
  2010-10-07  8:32   ` Tomi Valkeinen
  2010-10-07  8:27 ` Tomi Valkeinen
  3 siblings, 1 reply; 11+ messages in thread
From: Tony Lindgren @ 2010-09-15 17:59 UTC (permalink / raw)
  To: archit@ti.com; +Cc: tomi.valkeinen, linux-omap

* archit@ti.com <archit@ti.com> [100915 07:00]:
> From: Archit Taneja <archit@ti.com>
> 
> 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.

Glad to hear. We should absolutely not use cpu_is_omapxxxx checks
anywhere in the drivers. The drivers should be arch independent.
Basically any driver using those is broken from Linux point of view.

The current mess is:

$ grep -r cpu_is_omap drivers/ | wc -l
139

The right way to replace those is to pass feature flags from
the platform_data.

Tony

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

* RE: [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code
  2010-09-15 14:09 ` [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code archit
@ 2010-09-21  7:51   ` Taneja, Archit
  0 siblings, 0 replies; 11+ messages in thread
From: Taneja, Archit @ 2010-09-21  7:51 UTC (permalink / raw)
  To: tomi.valkeinen@nokia.com; +Cc: linux-omap@vger.kernel.org

Any more comments?

Archit


Taneja, Archit wrote:
> From: Archit Taneja <archit@ti.com>
>
> 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/core.c            |    3 ++
>  drivers/video/omap2/dss/dispc.c           |   56
> ++++++++++++++++-------------
>  drivers/video/omap2/dss/manager.c         |   33 ++++++++---------
>  drivers/video/omap2/dss/overlay.c         |   24 +++++-------
>  5 files changed, 60 insertions(+), 87 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/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..fa40fa5
> --- 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 start, end;
>
>       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(FEAT_REG_FIFOSIZE, &start, &end);
>
> +     for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) {
> +             size = FLD_GET(dispc_read_reg(fsz_reg[plane]),
> start, end);
>               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 hi_start, hi_end, lo_start, lo_end;
> +
>       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(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
> +     dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
> +
> +     dispc_write_reg(ftrs_reg[plane],
> +                     FLD_VAL(high, hi_start, hi_end) |
> +                     FLD_VAL(low, lo_start, lo_end));
>
>       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 hinc_start, hinc_end, vinc_start, vinc_end;
>
>       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(FEAT_REG_FIRHINC, &hinc_start, &hinc_end);
> +     dss_feat_get_reg_field(FEAT_REG_FIRVINC, &vinc_start, &vinc_end);
> +
> +     val = FLD_VAL(vinc, vinc_start, vinc_end) |
> +                     FLD_VAL(hinc, hinc_start, hinc_end);
> +
>       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) {

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

* Re: [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files
  2010-09-15 14:09 ` [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files archit
@ 2010-10-07  7:09   ` Tomi Valkeinen
  2010-10-07  7:37     ` Taneja, Archit
  0 siblings, 1 reply; 11+ messages in thread
From: Tomi Valkeinen @ 2010-10-07  7:09 UTC (permalink / raw)
  To: ext archit@ti.com; +Cc: linux-omap@vger.kernel.org

Hi,

On Wed, 2010-09-15 at 16:09 +0200, ext archit@ti.com wrote:
> From: Archit Taneja <archit@ti.com>
> 
> Add dss_features.c and dss_features.h for the dss_features framework
> 
> Signed-off-by: Archit Taneja <archit@ti.com>
> ---

<snip> 

> +struct omap_dss_features {
> +	const struct dss_reg_field *reg_fields;
> +	const int num_reg_fields;
> +
> +	const u32 has_feature;

I only now noticed that you had changed the feature list to a bit array.
It was an array of ints previously. Are you sure 32 features is enough?
It sounds a bit small to me.

 Tomi



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

* RE: [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files
  2010-10-07  7:09   ` Tomi Valkeinen
@ 2010-10-07  7:37     ` Taneja, Archit
  2010-10-07  7:42       ` Tomi Valkeinen
  0 siblings, 1 reply; 11+ messages in thread
From: Taneja, Archit @ 2010-10-07  7:37 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: linux-omap@vger.kernel.org

Hi,

Tomi Valkeinen wrote:
> Hi,
> 
> On Wed, 2010-09-15 at 16:09 +0200, ext archit@ti.com wrote:
>> From: Archit Taneja <archit@ti.com>
>> 
>> Add dss_features.c and dss_features.h for the dss_features framework
>> 
>> Signed-off-by: Archit Taneja <archit@ti.com>
>> ---
> 
> <snip>
> 
>> +struct omap_dss_features {
>> +	const struct dss_reg_field *reg_fields;
>> +	const int num_reg_fields;
>> +
>> +	const u32 has_feature;
> 
> I only now noticed that you had changed the feature list to a bit array.
> It was an array of ints previously. Are you sure 32 features is enough?
> It sounds a bit small to me.
> 
>  Tomi

I was reworking our omap4 tree with the dss_features patch and was able to reach to 11
features. 32 may be probably enough till omap4, but yeah you are right, we will cross
32 at some point in time. I didn't like the array way before, any idea how we can extend
the bit array method for more than 32 features?

Thanks,

Archit

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

* RE: [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files
  2010-10-07  7:37     ` Taneja, Archit
@ 2010-10-07  7:42       ` Tomi Valkeinen
  2010-10-07  8:16         ` Taneja, Archit
  0 siblings, 1 reply; 11+ messages in thread
From: Tomi Valkeinen @ 2010-10-07  7:42 UTC (permalink / raw)
  To: ext Taneja, Archit; +Cc: linux-omap@vger.kernel.org

On Thu, 2010-10-07 at 09:37 +0200, ext Taneja, Archit wrote:
> Hi,

> > I only now noticed that you had changed the feature list to a bit array.
> > It was an array of ints previously. Are you sure 32 features is enough?
> > It sounds a bit small to me.
> > 
> >  Tomi
> 
> I was reworking our omap4 tree with the dss_features patch and was able to reach to 11
> features. 32 may be probably enough till omap4, but yeah you are right, we will cross
> 32 at some point in time. I didn't like the array way before, any idea how we can extend
> the bit array method for more than 32 features?

Do you mean 32 will probably be enough for omap2,3 and 4? If so, I think
we can go forward with this. It is a dss_features.c internal detail, and
can be changed easily in the future to accomodate more features.

 Tomi



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

* RE: [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files
  2010-10-07  7:42       ` Tomi Valkeinen
@ 2010-10-07  8:16         ` Taneja, Archit
  0 siblings, 0 replies; 11+ messages in thread
From: Taneja, Archit @ 2010-10-07  8:16 UTC (permalink / raw)
  To: Tomi Valkeinen; +Cc: linux-omap@vger.kernel.org

Hi,

Tomi Valkeinen wrote:
> On Thu, 2010-10-07 at 09:37 +0200, ext Taneja, Archit wrote:
>> Hi,
> 
>>> I only now noticed that you had changed the feature list to a bit array.
>>> It was an array of ints previously. Are you sure 32 features is enough? It
>>> sounds a bit small to me. 
>>> 
>>>  Tomi
>> 
>> I was reworking our omap4 tree with the dss_features patch and was
>> able to reach to 11 features. 32 may be probably enough till omap4,
>> but yeah you are right, we will cross
>> 32 at some point in time. I didn't like the array way before, any idea
>> how we can extend the bit array method for more than 32 features?
> 
> Do you mean 32 will probably be enough for omap2,3 and 4? If
> so, I think we can go forward with this. It is a
> dss_features.c internal detail, and can be changed easily in
> the future to accomodate more features.
> 
>  Tomi

Yes, a rough count results in around 25-26 features till omap4. I think
we can go ahead with the bit array for now.

Regards,

Archit

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

* Re: [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features
  2010-09-15 14:09 [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features archit
                   ` (2 preceding siblings ...)
  2010-09-15 17:59 ` [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Tony Lindgren
@ 2010-10-07  8:27 ` Tomi Valkeinen
  3 siblings, 0 replies; 11+ messages in thread
From: Tomi Valkeinen @ 2010-10-07  8:27 UTC (permalink / raw)
  To: ext archit@ti.com; +Cc: linux-omap@vger.kernel.org

On Wed, 2010-09-15 at 16:09 +0200, ext archit@ti.com wrote:
> From: Archit Taneja <archit@ti.com>
> 
> 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.

Thanks, applied to DSS2 tree.

 Tomi



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

* Re: [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features
  2010-09-15 17:59 ` [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Tony Lindgren
@ 2010-10-07  8:32   ` Tomi Valkeinen
  0 siblings, 0 replies; 11+ messages in thread
From: Tomi Valkeinen @ 2010-10-07  8:32 UTC (permalink / raw)
  To: ext Tony Lindgren; +Cc: archit@ti.com, linux-omap@vger.kernel.org

On Wed, 2010-09-15 at 19:59 +0200, ext Tony Lindgren wrote:
> * archit@ti.com <archit@ti.com> [100915 07:00]:
> > From: Archit Taneja <archit@ti.com>
> > 
> > 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.
> 
> Glad to hear. We should absolutely not use cpu_is_omapxxxx checks
> anywhere in the drivers. The drivers should be arch independent.
> Basically any driver using those is broken from Linux point of view.

Yep. This patch set won't accomplish that, but after they have been
moved to one central place, it'll be much easier to remove the
cpu_is_omapxxxx calls totally from the driver.

 Tomi



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

end of thread, other threads:[~2010-10-07  8:32 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-15 14:09 [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features archit
2010-09-15 14:09 ` [PATCH v4 1/2] OMAP: DSS2: Introduce dss_features files archit
2010-10-07  7:09   ` Tomi Valkeinen
2010-10-07  7:37     ` Taneja, Archit
2010-10-07  7:42       ` Tomi Valkeinen
2010-10-07  8:16         ` Taneja, Archit
2010-09-15 14:09 ` [PATCH v4 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code archit
2010-09-21  7:51   ` Taneja, Archit
2010-09-15 17:59 ` [PATCH v4 0/2] OMAP: DSS2: Framework to handle omap version specific DSS features Tony Lindgren
2010-10-07  8:32   ` Tomi Valkeinen
2010-10-07  8:27 ` Tomi Valkeinen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).