[PATCH] Add DSS driver for OMAP3

Syed Mohammed Khasim khasim at ti.com
Sat Jan 9 05:07:14 CET 2010


Supports dynamic panel configuration
Supports dynamic tv standard selection
Adds support for DSS register access through generic APIs

Signed-off-by: Syed Mohammed Khasim <khasim at ti.com>
---
 drivers/video/Makefile           |    1 +
 drivers/video/omap3_dss.c        |  128 +++++++++++++++++++++++++
 include/asm-arm/arch-omap3/dss.h |  193 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 322 insertions(+), 0 deletions(-)
 create mode 100644 drivers/video/omap3_dss.c
 create mode 100644 include/asm-arm/arch-omap3/dss.h

diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index bb6b5a0..cb15dc2 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -37,6 +37,7 @@ COBJS-$(CONFIG_SED156X) += sed156x.o
 COBJS-$(CONFIG_VIDEO_SM501) += sm501.o
 COBJS-$(CONFIG_VIDEO_SMI_LYNXEM) += smiLynxEM.o
 COBJS-$(CONFIG_VIDEO_VCXK) += bus_vcxk.o
+COBJS-$(CONFIG_VIDEO_OMAP3) += omap3_dss.o
 COBJS-y += videomodes.o

 COBJS	:= $(COBJS-y)
diff --git a/drivers/video/omap3_dss.c b/drivers/video/omap3_dss.c
new file mode 100644
index 0000000..2ead7b9
--- /dev/null
+++ b/drivers/video/omap3_dss.c
@@ -0,0 +1,128 @@
+/*
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim at ti.com>
+ *
+ * Referred to Linux DSS driver files for OMAP3
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation's version 2 of
+ * the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/dss.h>
+
+/*
+ * VENC configuration
+ */
+void omap3_dss_venc_config(const struct venc_config *venc_cfg)
+{
+	dss_write_reg(VENC_STATUS, venc_cfg->status);
+	dss_write_reg(VENC_F_CONTROL, venc_cfg->f_control);
+	dss_write_reg(VENC_VIDOUT_CTRL, venc_cfg->vidout_ctrl);
+	dss_write_reg(VENC_SYNC_CTRL, venc_cfg->sync_ctrl);
+	dss_write_reg(VENC_LLEN, venc_cfg->llen);
+	dss_write_reg(VENC_FLENS, venc_cfg->flens);
+	dss_write_reg(VENC_HFLTR_CTRL, venc_cfg->hfltr_ctrl);
+	dss_write_reg(VENC_CC_CARR_WSS_CARR, venc_cfg->cc_carr_wss_carr);
+	dss_write_reg(VENC_C_PHASE, venc_cfg->c_phase);
+	dss_write_reg(VENC_GAIN_U, venc_cfg->gain_u);
+	dss_write_reg(VENC_GAIN_V, venc_cfg->gain_v);
+	dss_write_reg(VENC_GAIN_Y, venc_cfg->gain_y);
+	dss_write_reg(VENC_BLACK_LEVEL, venc_cfg->black_level);
+	dss_write_reg(VENC_BLANK_LEVEL, venc_cfg->blank_level);
+	dss_write_reg(VENC_X_COLOR, venc_cfg->x_color);
+	dss_write_reg(VENC_M_CONTROL, venc_cfg->m_control);
+	dss_write_reg(VENC_BSTAMP_WSS_DATA, venc_cfg->bstamp_wss_data);
+	dss_write_reg(VENC_S_CARR, venc_cfg->s_carr);
+	dss_write_reg(VENC_LINE21, venc_cfg->line21);
+	dss_write_reg(VENC_LN_SEL, venc_cfg->ln_sel);
+	dss_write_reg(VENC_L21__WC_CTL, venc_cfg->l21__wc_ctl);
+	dss_write_reg(VENC_HTRIGGER_VTRIGGER, venc_cfg->htrigger_vtrigger);
+	dss_write_reg(VENC_SAVID__EAVID, venc_cfg->savid__eavid);
+	dss_write_reg(VENC_FLEN__FAL, venc_cfg->flen__fal);
+	dss_write_reg(VENC_LAL__PHASE_RESET, venc_cfg->lal__phase_reset);
+	dss_write_reg(VENC_HS_INT_START_STOP_X,
+				venc_cfg->hs_int_start_stop_x);
+	dss_write_reg(VENC_HS_EXT_START_STOP_X,
+				venc_cfg->hs_ext_start_stop_x);
+	dss_write_reg(VENC_VS_INT_START_X, venc_cfg->vs_int_start_x);
+	dss_write_reg(VENC_VS_INT_STOP_X__VS_INT_START_Y,
+			venc_cfg->vs_int_stop_x__vs_int_start_y);
+	dss_write_reg(VENC_VS_INT_STOP_Y__VS_EXT_START_X,
+			venc_cfg->vs_int_stop_y__vs_ext_start_x);
+	dss_write_reg(VENC_VS_EXT_STOP_X__VS_EXT_START_Y,
+			venc_cfg->vs_ext_stop_x__vs_ext_start_y);
+	dss_write_reg(VENC_VS_EXT_STOP_Y, venc_cfg->vs_ext_stop_y);
+	dss_write_reg(VENC_AVID_START_STOP_X, venc_cfg->avid_start_stop_x);
+	dss_write_reg(VENC_AVID_START_STOP_Y, venc_cfg->avid_start_stop_y);
+	dss_write_reg(VENC_FID_INT_START_X__FID_INT_START_Y,
+				venc_cfg->fid_int_start_x__fid_int_start_y);
+	dss_write_reg(VENC_FID_INT_OFFSET_Y__FID_EXT_START_X,
+				venc_cfg->fid_int_offset_y__fid_ext_start_x);
+	dss_write_reg(VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y,
+				venc_cfg->fid_ext_start_y__fid_ext_offset_y);
+	dss_write_reg(VENC_TVDETGP_INT_START_STOP_X,
+				venc_cfg->tvdetgp_int_start_stop_x);
+	dss_write_reg(VENC_TVDETGP_INT_START_STOP_Y,
+				venc_cfg->tvdetgp_int_start_stop_y);
+	dss_write_reg(VENC_GEN_CTRL, venc_cfg->gen_ctrl);
+	dss_write_reg(VENC_OUTPUT_CONTROL, venc_cfg->output_control);
+	dss_write_reg(VENC_DAC_B__DAC_C, venc_cfg->dac_b__dac_c);
+	dss_write_reg(DISPC_SIZE_DIG, venc_cfg->height_width);
+	dss_write_reg(DSS_CONTROL, VENC_DSS_CONFIG);
+}
+
+/*
+ * Configure Panel Specific parameters
+ */
+void omap3_dss_panel_config(const struct panel_config *panel_cfg)
+{
+	dss_write_reg(DISPC_TIMING_H, panel_cfg->timing_h);
+	dss_write_reg(DISPC_TIMING_V, panel_cfg->timing_v);
+	dss_write_reg(DISPC_POL_FREQ, panel_cfg->pol_freq);
+	dss_write_reg(DISPC_DIVISOR, panel_cfg->divisor);
+	dss_write_reg(DISPC_SIZE_LCD, panel_cfg->lcd_size);
+	dss_write_reg(DISPC_CONFIG,
+		(panel_cfg->load_mode << FRAME_MODE_OFFSET));
+	dss_write_reg(DISPC_CONTROL,
+		((panel_cfg->panel_type << TFTSTN_OFFSET) |
+		(panel_cfg->data_lines << DATALINES_OFFSET)));
+}
+
+/*
+ * Enable LCD and DIGITAL OUT in DSS
+ */
+void omap3_dss_enable(void)
+{
+	u32 l = 0;
+
+	l = dss_read_reg(DISPC_CONTROL);
+	l |= DISPC_ENABLE;
+
+	dss_write_reg(DISPC_CONTROL, l);
+}
+
+/*
+ * Set Background Color in DISPC
+ */
+void omap3_dss_set_background_col(u32 color)
+{
+	dss_write_reg(DISPC_DEFAULT_COLOR0, color);
+}
diff --git a/include/asm-arm/arch-omap3/dss.h b/include/asm-arm/arch-omap3/dss.h
new file mode 100644
index 0000000..08c7d8d
--- /dev/null
+++ b/include/asm-arm/arch-omap3/dss.h
@@ -0,0 +1,193 @@
+/*
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ * Syed Mohammed Khasim <khasim at ti.com>
+ *
+ * Referred to Linux DSS driver files for OMAP3
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation's version 2 of
+ * the License.
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef DSS_H
+#define DSS_H
+
+/* VENC Register address */
+#define VENC_REV_ID				0x48050C00
+#define VENC_STATUS				0x48050C04
+#define VENC_F_CONTROL				0x48050C08
+#define VENC_VIDOUT_CTRL			0x48050C10
+#define VENC_SYNC_CTRL				0x48050C14
+#define VENC_LLEN				0x48050C1C
+#define VENC_FLENS				0x48050C20
+#define VENC_HFLTR_CTRL				0x48050C24
+#define VENC_CC_CARR_WSS_CARR			0x48050C28
+#define VENC_C_PHASE				0x48050C2C
+#define VENC_GAIN_U				0x48050C30
+#define VENC_GAIN_V				0x48050C34
+#define VENC_GAIN_Y				0x48050C38
+#define VENC_BLACK_LEVEL			0x48050C3C
+#define VENC_BLANK_LEVEL			0x48050C40
+#define VENC_X_COLOR				0x48050C44
+#define VENC_M_CONTROL				0x48050C48
+#define VENC_BSTAMP_WSS_DATA			0x48050C4C
+#define VENC_S_CARR				0x48050C50
+#define VENC_LINE21				0x48050C54
+#define VENC_LN_SEL				0x48050C58
+#define VENC_L21__WC_CTL			0x48050C5C
+#define VENC_HTRIGGER_VTRIGGER			0x48050C60
+#define VENC_SAVID__EAVID			0x48050C64
+#define VENC_FLEN__FAL				0x48050C68
+#define VENC_LAL__PHASE_RESET			0x48050C6C
+#define VENC_HS_INT_START_STOP_X		0x48050C70
+#define VENC_HS_EXT_START_STOP_X		0x48050C74
+#define VENC_VS_INT_START_X			0x48050C78
+#define VENC_VS_INT_STOP_X__VS_INT_START_Y	0x48050C7C
+#define VENC_VS_INT_STOP_Y__VS_EXT_START_X	0x48050C80
+#define VENC_VS_EXT_STOP_X__VS_EXT_START_Y	0x48050C84
+#define VENC_VS_EXT_STOP_Y			0x48050C88
+#define VENC_AVID_START_STOP_X			0x48050C90
+#define VENC_AVID_START_STOP_Y			0x48050C94
+#define VENC_FID_INT_START_X__FID_INT_START_Y	0x48050CA0
+#define VENC_FID_INT_OFFSET_Y__FID_EXT_START_X	0x48050CA4
+#define VENC_FID_EXT_START_Y__FID_EXT_OFFSET_Y	0x48050CA8
+#define VENC_TVDETGP_INT_START_STOP_X		0x48050CB0
+#define VENC_TVDETGP_INT_START_STOP_Y		0x48050CB4
+#define VENC_GEN_CTRL				0x48050CB8
+#define VENC_OUTPUT_CONTROL			0x48050CC4
+#define VENC_DAC_B__DAC_C			0x48050CC8
+
+/* DSS register addresses */
+#define	DSS_SYSCONFIG				0x48050010
+#define DSS_CONTROL				0x48050040
+
+/* DISPC register addresses */
+#define DISPC_SYSCONFIG				0x48050410
+#define DISPC_SYSSTATUS				0x48050414
+#define DISPC_CONTROL 				0x48050440
+#define DISPC_CONFIG				0x48050444
+#define DISPC_DEFAULT_COLOR0			0x4805044c
+#define DISPC_DEFAULT_COLOR1			0x48050450
+#define DISPC_TRANS_COLOR0 			0x48050454
+#define DISPC_TRANS_COLOR1 			0x48050458
+#define DISPC_TIMING_H 				0x48050464
+#define DISPC_TIMING_V 				0x48050468
+#define DISPC_POL_FREQ 				0x4805046c
+#define DISPC_DIVISOR 				0x48050470
+#define DISPC_SIZE_DIG 				0x48050478
+#define DISPC_SIZE_LCD 				0x4805047c
+
+/* Few Register Offsets */
+#define FRAME_MODE_OFFSET			1
+#define TFTSTN_OFFSET				3
+#define DATALINES_OFFSET			8
+
+/* Enabling Display controller */
+#define LCD_ENABLE				1
+#define DIG_ENABLE				(1 << 1)
+#define GO_LCD					(1 << 5)
+#define GO_DIG					(1 << 6)
+#define GP_OUT0					(1 << 15)
+#define GP_OUT1					(1 << 16)
+
+#define DISPC_ENABLE				(LCD_ENABLE | \
+						 DIG_ENABLE | \
+						 GO_LCD | \
+						 GO_DIG | \
+						 GP_OUT0| \
+						 GP_OUT1)
+/* Configure VENC DSS Params */
+#define VENC_CLK_ENABLE				(1 << 3)
+#define DAC_DEMEN				(1 << 4)
+#define DAC_POWERDN				(1 << 5)
+#define VENC_OUT_SEL				(1 << 6)
+
+#define VENC_DSS_CONFIG				(VENC_CLK_ENABLE | \
+						 DAC_DEMEN | \
+						 DAC_POWERDN | \
+						 VENC_OUT_SEL)
+
+struct venc_config {
+	u32 status;
+	u32 f_control;
+	u32 vidout_ctrl;
+	u32 sync_ctrl;
+	u32 llen;
+	u32 flens;
+	u32 hfltr_ctrl;
+	u32 cc_carr_wss_carr;
+	u32 c_phase;
+	u32 gain_u;
+	u32 gain_v;
+	u32 gain_y;
+	u32 black_level;
+	u32 blank_level;
+	u32 x_color;
+	u32 m_control;
+	u32 bstamp_wss_data;
+	u32 s_carr;
+	u32 line21;
+	u32 ln_sel;
+	u32 l21__wc_ctl;
+	u32 htrigger_vtrigger;
+	u32 savid__eavid;
+	u32 flen__fal;
+	u32 lal__phase_reset;
+	u32 hs_int_start_stop_x;
+	u32 hs_ext_start_stop_x;
+	u32 vs_int_start_x;
+	u32 vs_int_stop_x__vs_int_start_y;
+	u32 vs_int_stop_y__vs_ext_start_x;
+	u32 vs_ext_stop_x__vs_ext_start_y;
+	u32 vs_ext_stop_y;
+	u32 avid_start_stop_x;
+	u32 avid_start_stop_y;
+	u32 fid_int_start_x__fid_int_start_y;
+	u32 fid_int_offset_y__fid_ext_start_x;
+	u32 fid_ext_start_y__fid_ext_offset_y;
+	u32 tvdetgp_int_start_stop_x;
+	u32 tvdetgp_int_start_stop_y;
+	u32 gen_ctrl;
+	u32 output_control;
+	u32 dac_b__dac_c;
+	u32 height_width;
+};
+
+struct panel_config {
+	u32 timing_h;
+	u32 timing_v;
+	u32 pol_freq;
+	u32 divisor;
+	u32 lcd_size;
+	u32 panel_type;
+	u32 data_lines;
+	u32 load_mode;
+};
+
+static inline void dss_write_reg(int reg, u32 val)
+{
+	__raw_writel(val, reg);
+}
+
+static inline u32 dss_read_reg(int reg)
+{
+	u32 l = __raw_readl(reg);
+	return l;
+}
+
+#endif /* DSS_H */
-- 
1.5.6.3


More information about the U-Boot mailing list