Skip to contentSkip to conversation

OMAP: DSS2: Framework to handle omap version specific DSS features

PATCH Superseded Archit Taneja 2 participants 8 messages Sep 8, 2010 – Sep 9, 2010

Subsystems (3)

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v2 cover OMAP: DSS2: Framework to handle omap version specific DSS features

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/

#1 lore raw

PATCH v2 1/2 OMAP: DSS2: Introduce dss_features files

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

---
 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
drivers/video/omap2/dss/dss_features.c new file +171 -0
new file mode 100644
index 0000000..e87816f
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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;
+}
drivers/video/omap2/dss/dss_features.h new file +51 -0

51 lines not on this page · raw message

Signature · 1 line
1.7.0.4
#2 lore raw

Re: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files

Hi,

Quoted 43 lines · ext Archit Taneja

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

---
 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
drivers/video/omap2/dss/dss_features.c new file +27 -0
new file mode 100644
index 0000000..e87816f
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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>
+

drivers/video/omap2/dss/dss_features.c line 37

Quoted 10 lines
drivers/video/omap2/dss/dss_features.c new file +10 -0
+#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.

drivers/video/omap2/dss/dss_features.c line 43

Quoted 6 lines
drivers/video/omap2/dss/dss_features.c new file +6 -0
+	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.

drivers/video/omap2/dss/dss_features.c line 56

Quoted 13 lines
drivers/video/omap2/dss/dss_features.c new file +13 -0
+};
+
+/* 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 }.

Quoted 151 lines
drivers/video/omap2/dss/dss_features.c new file +115 -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;
+}
drivers/video/omap2/dss/dss_features.h new file +30 -0
new file mode 100644
index 0000000..f1a7e17
@@ -0,0 +1,51 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.h
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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,

drivers/video/omap2/dss/dss_features.h line 40

Quoted 10 lines
drivers/video/omap2/dss/dss_features.h new file +10 -0
+};
+
+/* DSS register field id */
+enum dss_feat_reg_field {
+	FIRHINC,
+	FIRVINC,
+	FIFOHIGHTHRESHOLD,
+	FIFOLOWTHRESHOLD,
+	FIFOSIZE,
+};

These enums should also have some prefix. FEAT_REG?

drivers/video/omap2/dss/dss_features.h line 46

Quoted 6 lines
drivers/video/omap2/dss/dss_features.h new file +6 -0
+
+/* 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

#3 lore raw

RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files

Hi,

Quoted 51 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · ext Archit Taneja

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

---
 drivers/video/omap2/dss/dss_features.c |  171

++++++++++++++++++++++++++++++++

Quoted 42 lines
 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
drivers/video/omap2/dss/dss_features.c new file +11 -0
new file mode 100644
index 0000000..e87816f
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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/>. + */

drivers/video/omap2/dss/dss_features.c new file +12 -0
+
+#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;

Quoted 8 lines

drivers/video/omap2/dss/dss_features.c line 37

Quoted 4 lines
drivers/video/omap2/dss/dss_features.c new file +4 -0
+};
+
+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?

Quoted 10 lines

drivers/video/omap2/dss/dss_features.c line 43

Quoted 7 lines
drivers/video/omap2/dss/dss_features.c new file +6 -0
+	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.

Quoted 13 lines

drivers/video/omap2/dss/dss_features.c line 56

Quoted 11 lines
drivers/video/omap2/dss/dss_features.c new file +11 -0
+};
+
+/* 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.

Quoted 163 lines
Quoted 140 lines
drivers/video/omap2/dss/dss_features.c new file +103 -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; }
drivers/video/omap2/dss/dss_features.h new file +11 -0
new file mode 100644
index 0000000..f1a7e17
@@ -0,0 +1,51 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.h
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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/>. + */

drivers/video/omap2/dss/dss_features.h new file +12 -0
+
+#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,

drivers/video/omap2/dss/dss_features.h line 40

Quoted 10 lines
drivers/video/omap2/dss/dss_features.h new file +10 -0
+};
+
+/* DSS register field id */
+enum dss_feat_reg_field {
+	FIRHINC,
+	FIRVINC,
+	FIFOHIGHTHRESHOLD,
+	FIFOLOWTHRESHOLD,
+	FIFOSIZE,
+};

These enums should also have some prefix. FEAT_REG?

drivers/video/omap2/dss/dss_features.h

Quoted 6 lines
drivers/video/omap2/dss/dss_features.h new file +6 -0
+
+/* 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...

Quoted 6 lines

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.

Quoted 5 lines

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

#4 lore raw

RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files

Quoted 63 lines · Archit

Hi,

Quoted 51 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · ext Archit Taneja

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

---
 drivers/video/omap2/dss/dss_features.c |  171

++++++++++++++++++++++++++++++++

Quoted 42 lines
 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
drivers/video/omap2/dss/dss_features.c new file +11 -0
new file mode 100644
index 0000000..e87816f
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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/>. + */

drivers/video/omap2/dss/dss_features.c new file +12 -0
+
+#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;

Quoted 8 lines

drivers/video/omap2/dss/dss_features.c line 37

Quoted 4 lines
drivers/video/omap2/dss/dss_features.c new file +4 -0
+};
+
+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.

Quoted 3 lines

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

#5 lore raw

RE: [PATCH v2 1/2] OMAP: DSS2: Introduce dss_features files

Quoted 79 lines · Tomi Valkeinen
Quoted 33 lines · Archit

Hi,

Quoted 30 lines · Tomi Valkeinen

Hi,

Quoted 5 lines · ext Archit Taneja

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

---
 drivers/video/omap2/dss/dss_features.c |  171

++++++++++++++++++++++++++++++++

Quoted 21 lines
 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
drivers/video/omap2/dss/dss_features.c new file +7 -0
new file mode 100644
index 0000000..e87816f
@@ -0,0 +1,171 @@
+/*
+ * linux/drivers/video/omap2/dss/dss_features.c
+ *
+ * Copyright (C) 2010 Texas Instruments
+ * Author: Archit Taneja <[email protected]>
+ *
+ * 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.

Quoted 8 lines
Quoted 8 lines
Quoted 8 lines

+ *
+ * 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/>.

Quoted 23 lines
Quoted 14 lines
Quoted 14 lines

+ */

drivers/video/omap2/dss/dss_features.c new file +12 -0
+
+#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;

Quoted 8 lines

drivers/video/omap2/dss/dss_features.c line 37

Quoted 4 lines
drivers/video/omap2/dss/dss_features.c new file +4 -0
+};
+
+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.

Quoted 3 lines

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},
};
Quoted 5 lines

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

#6 lore raw

PATCH v2 2/2 OMAP: DSS2: Use dss_features framework on DSS2 code

In reply to 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

---
 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(-)
arch/arm/plat-omap/include/plat/display.h +0 -31
index 8bd15bd..c915a66
@@ -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 {
drivers/video/omap2/dss/Makefile +1 -1
index d71b5d9..7db17b5
@@ -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
drivers/video/omap2/dss/core.c +3 -0
index b3a498f..8e89f60
@@ -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);
 
drivers/video/omap2/dss/dispc.c +31 -25

126 lines not on this page · raw message

drivers/video/omap2/dss/manager.c +16 -17
index 6a649ab..545e9b9
@@ -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);
 
drivers/video/omap2/dss/overlay.c +10 -14
index 244dca8..75642c2
@@ -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) {
Signature · 1 line
1.7.0.4
#7 lore raw

Re: [PATCH v2 2/2] OMAP: DSS2: Use dss_features framework on DSS2 code

Quoted 17 lines · ext 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

drivers/video/omap2/dss/Makefile +0 -0
index d71b5d9..7db17b5

drivers/video/omap2/dss/Makefile line 2

Quoted 3 lines
drivers/video/omap2/dss/Makefile +1 -1
@@ -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