brintos

brintos / linux-shallow public Read only

0
0
Text · 27.0 KiB · 62c2d48 Raw
940 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * linux/drivers/video/omap2/dss/dss_features.c4 *5 * Copyright (C) 2010 Texas Instruments6 * Author: Archit Taneja <archit@ti.com>7 */8 9#include <linux/kernel.h>10#include <linux/module.h>11#include <linux/types.h>12#include <linux/err.h>13#include <linux/slab.h>14 15#include <video/omapfb_dss.h>16 17#include "dss.h"18#include "dss_features.h"19 20/* Defines a generic omap register field */21struct dss_reg_field {22	u8 start, end;23};24 25struct dss_param_range {26	int min, max;27};28 29struct omap_dss_features {30	const struct dss_reg_field *reg_fields;31	const int num_reg_fields;32 33	const enum dss_feat_id *features;34	const int num_features;35 36	const int num_mgrs;37	const int num_ovls;38	const enum omap_display_type *supported_displays;39	const enum omap_dss_output_id *supported_outputs;40	const enum omap_color_mode *supported_color_modes;41	const enum omap_overlay_caps *overlay_caps;42	const char * const *clksrc_names;43	const struct dss_param_range *dss_params;44 45	const enum omap_dss_rotation_type supported_rotation_types;46 47	const u32 buffer_size_unit;48	const u32 burst_size_unit;49};50 51/* This struct is assigned to one of the below during initialization */52static const struct omap_dss_features *omap_current_dss_features;53 54static const struct dss_reg_field omap2_dss_reg_fields[] = {55	[FEAT_REG_FIRHINC]			= { 11, 0 },56	[FEAT_REG_FIRVINC]			= { 27, 16 },57	[FEAT_REG_FIFOLOWTHRESHOLD]		= { 8, 0 },58	[FEAT_REG_FIFOHIGHTHRESHOLD]		= { 24, 16 },59	[FEAT_REG_FIFOSIZE]			= { 8, 0 },60	[FEAT_REG_HORIZONTALACCU]		= { 9, 0 },61	[FEAT_REG_VERTICALACCU]			= { 25, 16 },62	[FEAT_REG_DISPC_CLK_SWITCH]		= { 0, 0 },63};64 65static const struct dss_reg_field omap3_dss_reg_fields[] = {66	[FEAT_REG_FIRHINC]			= { 12, 0 },67	[FEAT_REG_FIRVINC]			= { 28, 16 },68	[FEAT_REG_FIFOLOWTHRESHOLD]		= { 11, 0 },69	[FEAT_REG_FIFOHIGHTHRESHOLD]		= { 27, 16 },70	[FEAT_REG_FIFOSIZE]			= { 10, 0 },71	[FEAT_REG_HORIZONTALACCU]		= { 9, 0 },72	[FEAT_REG_VERTICALACCU]			= { 25, 16 },73	[FEAT_REG_DISPC_CLK_SWITCH]		= { 0, 0 },74};75 76static const struct dss_reg_field am43xx_dss_reg_fields[] = {77	[FEAT_REG_FIRHINC]			= { 12, 0 },78	[FEAT_REG_FIRVINC]			= { 28, 16 },79	[FEAT_REG_FIFOLOWTHRESHOLD]	= { 11, 0 },80	[FEAT_REG_FIFOHIGHTHRESHOLD]		= { 27, 16 },81	[FEAT_REG_FIFOSIZE]		= { 10, 0 },82	[FEAT_REG_HORIZONTALACCU]		= { 9, 0 },83	[FEAT_REG_VERTICALACCU]			= { 25, 16 },84	[FEAT_REG_DISPC_CLK_SWITCH]		= { 0, 0 },85};86 87static const struct dss_reg_field omap4_dss_reg_fields[] = {88	[FEAT_REG_FIRHINC]			= { 12, 0 },89	[FEAT_REG_FIRVINC]			= { 28, 16 },90	[FEAT_REG_FIFOLOWTHRESHOLD]		= { 15, 0 },91	[FEAT_REG_FIFOHIGHTHRESHOLD]		= { 31, 16 },92	[FEAT_REG_FIFOSIZE]			= { 15, 0 },93	[FEAT_REG_HORIZONTALACCU]		= { 10, 0 },94	[FEAT_REG_VERTICALACCU]			= { 26, 16 },95	[FEAT_REG_DISPC_CLK_SWITCH]		= { 9, 8 },96};97 98static const struct dss_reg_field omap5_dss_reg_fields[] = {99	[FEAT_REG_FIRHINC]			= { 12, 0 },100	[FEAT_REG_FIRVINC]			= { 28, 16 },101	[FEAT_REG_FIFOLOWTHRESHOLD]		= { 15, 0 },102	[FEAT_REG_FIFOHIGHTHRESHOLD]		= { 31, 16 },103	[FEAT_REG_FIFOSIZE]			= { 15, 0 },104	[FEAT_REG_HORIZONTALACCU]		= { 10, 0 },105	[FEAT_REG_VERTICALACCU]			= { 26, 16 },106	[FEAT_REG_DISPC_CLK_SWITCH]		= { 9, 7 },107};108 109static const enum omap_display_type omap2_dss_supported_displays[] = {110	/* OMAP_DSS_CHANNEL_LCD */111	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,112 113	/* OMAP_DSS_CHANNEL_DIGIT */114	OMAP_DISPLAY_TYPE_VENC,115};116 117static const enum omap_display_type omap3430_dss_supported_displays[] = {118	/* OMAP_DSS_CHANNEL_LCD */119	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |120	OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI,121 122	/* OMAP_DSS_CHANNEL_DIGIT */123	OMAP_DISPLAY_TYPE_VENC,124};125 126static const enum omap_display_type omap3630_dss_supported_displays[] = {127	/* OMAP_DSS_CHANNEL_LCD */128	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |129	OMAP_DISPLAY_TYPE_DSI,130 131	/* OMAP_DSS_CHANNEL_DIGIT */132	OMAP_DISPLAY_TYPE_VENC,133};134 135static const enum omap_display_type am43xx_dss_supported_displays[] = {136	/* OMAP_DSS_CHANNEL_LCD */137	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI,138};139 140static const enum omap_display_type omap4_dss_supported_displays[] = {141	/* OMAP_DSS_CHANNEL_LCD */142	OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI,143 144	/* OMAP_DSS_CHANNEL_DIGIT */145	OMAP_DISPLAY_TYPE_VENC | OMAP_DISPLAY_TYPE_HDMI,146 147	/* OMAP_DSS_CHANNEL_LCD2 */148	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |149	OMAP_DISPLAY_TYPE_DSI,150};151 152static const enum omap_display_type omap5_dss_supported_displays[] = {153	/* OMAP_DSS_CHANNEL_LCD */154	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |155	OMAP_DISPLAY_TYPE_DSI,156 157	/* OMAP_DSS_CHANNEL_DIGIT */158	OMAP_DISPLAY_TYPE_HDMI | OMAP_DISPLAY_TYPE_DPI,159 160	/* OMAP_DSS_CHANNEL_LCD2 */161	OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |162	OMAP_DISPLAY_TYPE_DSI,163};164 165static const enum omap_dss_output_id omap2_dss_supported_outputs[] = {166	/* OMAP_DSS_CHANNEL_LCD */167	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,168 169	/* OMAP_DSS_CHANNEL_DIGIT */170	OMAP_DSS_OUTPUT_VENC,171};172 173static const enum omap_dss_output_id omap3430_dss_supported_outputs[] = {174	/* OMAP_DSS_CHANNEL_LCD */175	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |176	OMAP_DSS_OUTPUT_SDI | OMAP_DSS_OUTPUT_DSI1,177 178	/* OMAP_DSS_CHANNEL_DIGIT */179	OMAP_DSS_OUTPUT_VENC,180};181 182static const enum omap_dss_output_id omap3630_dss_supported_outputs[] = {183	/* OMAP_DSS_CHANNEL_LCD */184	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |185	OMAP_DSS_OUTPUT_DSI1,186 187	/* OMAP_DSS_CHANNEL_DIGIT */188	OMAP_DSS_OUTPUT_VENC,189};190 191static const enum omap_dss_output_id am43xx_dss_supported_outputs[] = {192	/* OMAP_DSS_CHANNEL_LCD */193	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI,194};195 196static const enum omap_dss_output_id omap4_dss_supported_outputs[] = {197	/* OMAP_DSS_CHANNEL_LCD */198	OMAP_DSS_OUTPUT_DBI | OMAP_DSS_OUTPUT_DSI1,199 200	/* OMAP_DSS_CHANNEL_DIGIT */201	OMAP_DSS_OUTPUT_VENC | OMAP_DSS_OUTPUT_HDMI,202 203	/* OMAP_DSS_CHANNEL_LCD2 */204	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |205	OMAP_DSS_OUTPUT_DSI2,206};207 208static const enum omap_dss_output_id omap5_dss_supported_outputs[] = {209	/* OMAP_DSS_CHANNEL_LCD */210	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |211	OMAP_DSS_OUTPUT_DSI1 | OMAP_DSS_OUTPUT_DSI2,212 213	/* OMAP_DSS_CHANNEL_DIGIT */214	OMAP_DSS_OUTPUT_HDMI,215 216	/* OMAP_DSS_CHANNEL_LCD2 */217	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |218	OMAP_DSS_OUTPUT_DSI1,219 220	/* OMAP_DSS_CHANNEL_LCD3 */221	OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI |222	OMAP_DSS_OUTPUT_DSI2,223};224 225static const enum omap_color_mode omap2_dss_supported_color_modes[] = {226	/* OMAP_DSS_GFX */227	OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |228	OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |229	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |230	OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P,231 232	/* OMAP_DSS_VIDEO1 */233	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |234	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |235	OMAP_DSS_COLOR_UYVY,236 237	/* OMAP_DSS_VIDEO2 */238	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |239	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |240	OMAP_DSS_COLOR_UYVY,241};242 243static const enum omap_color_mode omap3_dss_supported_color_modes[] = {244	/* OMAP_DSS_GFX */245	OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |246	OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |247	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |248	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |249	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |250	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,251 252	/* OMAP_DSS_VIDEO1 */253	OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P |254	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 |255	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY,256 257	/* OMAP_DSS_VIDEO2 */258	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |259	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |260	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 |261	OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 |262	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32,263};264 265static const enum omap_color_mode omap4_dss_supported_color_modes[] = {266	/* OMAP_DSS_GFX */267	OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |268	OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 |269	OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 |270	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U |271	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 |272	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32 |273	OMAP_DSS_COLOR_ARGB16_1555 | OMAP_DSS_COLOR_RGBX16 |274	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_XRGB16_1555,275 276	/* OMAP_DSS_VIDEO1 */277	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |278	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |279	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |280	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |281	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |282	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |283	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |284	OMAP_DSS_COLOR_RGBX32,285 286       /* OMAP_DSS_VIDEO2 */287	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |288	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |289	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |290	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |291	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |292	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |293	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |294	OMAP_DSS_COLOR_RGBX32,295 296	/* OMAP_DSS_VIDEO3 */297	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |298	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |299	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |300	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |301	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |302	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |303	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |304	OMAP_DSS_COLOR_RGBX32,305 306	/* OMAP_DSS_WB */307	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |308	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |309	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |310	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |311	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |312	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |313	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |314	OMAP_DSS_COLOR_RGBX32,315};316 317static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {318	/* OMAP_DSS_GFX */319	OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,320 321	/* OMAP_DSS_VIDEO1 */322	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |323		OMAP_DSS_OVL_CAP_REPLICATION,324 325	/* OMAP_DSS_VIDEO2 */326	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |327		OMAP_DSS_OVL_CAP_REPLICATION,328};329 330static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = {331	/* OMAP_DSS_GFX */332	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_POS |333		OMAP_DSS_OVL_CAP_REPLICATION,334 335	/* OMAP_DSS_VIDEO1 */336	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |337		OMAP_DSS_OVL_CAP_REPLICATION,338 339	/* OMAP_DSS_VIDEO2 */340	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |341		OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,342};343 344static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = {345	/* OMAP_DSS_GFX */346	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |347		OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,348 349	/* OMAP_DSS_VIDEO1 */350	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |351		OMAP_DSS_OVL_CAP_REPLICATION,352 353	/* OMAP_DSS_VIDEO2 */354	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |355		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_POS |356		OMAP_DSS_OVL_CAP_REPLICATION,357};358 359static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {360	/* OMAP_DSS_GFX */361	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |362		OMAP_DSS_OVL_CAP_ZORDER | OMAP_DSS_OVL_CAP_POS |363		OMAP_DSS_OVL_CAP_REPLICATION,364 365	/* OMAP_DSS_VIDEO1 */366	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |367		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |368		OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,369 370	/* OMAP_DSS_VIDEO2 */371	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |372		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |373		OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,374 375	/* OMAP_DSS_VIDEO3 */376	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |377		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |378		OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,379};380 381static const char * const omap2_dss_clk_source_names[] = {382	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]	= "N/A",383	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]	= "N/A",384	[OMAP_DSS_CLK_SRC_FCK]			= "DSS_FCLK1",385};386 387static const char * const omap3_dss_clk_source_names[] = {388	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]	= "DSI1_PLL_FCLK",389	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]	= "DSI2_PLL_FCLK",390	[OMAP_DSS_CLK_SRC_FCK]			= "DSS1_ALWON_FCLK",391};392 393static const char * const omap4_dss_clk_source_names[] = {394	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]	= "PLL1_CLK1",395	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]	= "PLL1_CLK2",396	[OMAP_DSS_CLK_SRC_FCK]			= "DSS_FCLK",397	[OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC]	= "PLL2_CLK1",398	[OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI]	= "PLL2_CLK2",399};400 401static const char * const omap5_dss_clk_source_names[] = {402	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC]	= "DPLL_DSI1_A_CLK1",403	[OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI]	= "DPLL_DSI1_A_CLK2",404	[OMAP_DSS_CLK_SRC_FCK]			= "DSS_CLK",405	[OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC]	= "DPLL_DSI1_C_CLK1",406	[OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI]	= "DPLL_DSI1_C_CLK2",407};408 409static const struct dss_param_range omap2_dss_param_range[] = {410	[FEAT_PARAM_DSS_FCK]			= { 0, 133000000 },411	[FEAT_PARAM_DSS_PCD]			= { 2, 255 },412	[FEAT_PARAM_DOWNSCALE]			= { 1, 2 },413	/*414	 * Assuming the line width buffer to be 768 pixels as OMAP2 DISPC415	 * scaler cannot scale a image with width more than 768.416	 */417	[FEAT_PARAM_LINEWIDTH]			= { 1, 768 },418};419 420static const struct dss_param_range omap3_dss_param_range[] = {421	[FEAT_PARAM_DSS_FCK]			= { 0, 173000000 },422	[FEAT_PARAM_DSS_PCD]			= { 1, 255 },423	[FEAT_PARAM_DSIPLL_LPDIV]		= { 1, (1 << 13) - 1},424	[FEAT_PARAM_DSI_FCK]			= { 0, 173000000 },425	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 },426	[FEAT_PARAM_LINEWIDTH]			= { 1, 1024 },427};428 429static const struct dss_param_range am43xx_dss_param_range[] = {430	[FEAT_PARAM_DSS_FCK]			= { 0, 200000000 },431	[FEAT_PARAM_DSS_PCD]			= { 1, 255 },432	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 },433	[FEAT_PARAM_LINEWIDTH]			= { 1, 1024 },434};435 436static const struct dss_param_range omap4_dss_param_range[] = {437	[FEAT_PARAM_DSS_FCK]			= { 0, 186000000 },438	[FEAT_PARAM_DSS_PCD]			= { 1, 255 },439	[FEAT_PARAM_DSIPLL_LPDIV]		= { 0, (1 << 13) - 1 },440	[FEAT_PARAM_DSI_FCK]			= { 0, 170000000 },441	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 },442	[FEAT_PARAM_LINEWIDTH]			= { 1, 2048 },443};444 445static const struct dss_param_range omap5_dss_param_range[] = {446	[FEAT_PARAM_DSS_FCK]			= { 0, 209250000 },447	[FEAT_PARAM_DSS_PCD]			= { 1, 255 },448	[FEAT_PARAM_DSIPLL_LPDIV]		= { 0, (1 << 13) - 1 },449	[FEAT_PARAM_DSI_FCK]			= { 0, 209250000 },450	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 },451	[FEAT_PARAM_LINEWIDTH]			= { 1, 2048 },452};453 454static const enum dss_feat_id omap2_dss_feat_list[] = {455	FEAT_LCDENABLEPOL,456	FEAT_LCDENABLESIGNAL,457	FEAT_PCKFREEENABLE,458	FEAT_FUNCGATED,459	FEAT_ROWREPEATENABLE,460	FEAT_RESIZECONF,461};462 463static const enum dss_feat_id omap3430_dss_feat_list[] = {464	FEAT_LCDENABLEPOL,465	FEAT_LCDENABLESIGNAL,466	FEAT_PCKFREEENABLE,467	FEAT_FUNCGATED,468	FEAT_LINEBUFFERSPLIT,469	FEAT_ROWREPEATENABLE,470	FEAT_RESIZECONF,471	FEAT_DSI_REVERSE_TXCLKESC,472	FEAT_VENC_REQUIRES_TV_DAC_CLK,473	FEAT_CPR,474	FEAT_PRELOAD,475	FEAT_FIR_COEF_V,476	FEAT_ALPHA_FIXED_ZORDER,477	FEAT_FIFO_MERGE,478	FEAT_OMAP3_DSI_FIFO_BUG,479	FEAT_DPI_USES_VDDS_DSI,480};481 482static const enum dss_feat_id am35xx_dss_feat_list[] = {483	FEAT_LCDENABLEPOL,484	FEAT_LCDENABLESIGNAL,485	FEAT_PCKFREEENABLE,486	FEAT_FUNCGATED,487	FEAT_LINEBUFFERSPLIT,488	FEAT_ROWREPEATENABLE,489	FEAT_RESIZECONF,490	FEAT_DSI_REVERSE_TXCLKESC,491	FEAT_VENC_REQUIRES_TV_DAC_CLK,492	FEAT_CPR,493	FEAT_PRELOAD,494	FEAT_FIR_COEF_V,495	FEAT_ALPHA_FIXED_ZORDER,496	FEAT_FIFO_MERGE,497	FEAT_OMAP3_DSI_FIFO_BUG,498};499 500static const enum dss_feat_id am43xx_dss_feat_list[] = {501	FEAT_LCDENABLEPOL,502	FEAT_LCDENABLESIGNAL,503	FEAT_PCKFREEENABLE,504	FEAT_FUNCGATED,505	FEAT_LINEBUFFERSPLIT,506	FEAT_ROWREPEATENABLE,507	FEAT_RESIZECONF,508	FEAT_CPR,509	FEAT_PRELOAD,510	FEAT_FIR_COEF_V,511	FEAT_ALPHA_FIXED_ZORDER,512	FEAT_FIFO_MERGE,513};514 515static const enum dss_feat_id omap3630_dss_feat_list[] = {516	FEAT_LCDENABLEPOL,517	FEAT_LCDENABLESIGNAL,518	FEAT_PCKFREEENABLE,519	FEAT_FUNCGATED,520	FEAT_LINEBUFFERSPLIT,521	FEAT_ROWREPEATENABLE,522	FEAT_RESIZECONF,523	FEAT_DSI_PLL_PWR_BUG,524	FEAT_CPR,525	FEAT_PRELOAD,526	FEAT_FIR_COEF_V,527	FEAT_ALPHA_FIXED_ZORDER,528	FEAT_FIFO_MERGE,529	FEAT_OMAP3_DSI_FIFO_BUG,530	FEAT_DPI_USES_VDDS_DSI,531};532 533static const enum dss_feat_id omap4430_es1_0_dss_feat_list[] = {534	FEAT_MGR_LCD2,535	FEAT_CORE_CLK_DIV,536	FEAT_LCD_CLK_SRC,537	FEAT_DSI_DCS_CMD_CONFIG_VC,538	FEAT_DSI_VC_OCP_WIDTH,539	FEAT_DSI_GNQ,540	FEAT_HANDLE_UV_SEPARATE,541	FEAT_ATTR2,542	FEAT_CPR,543	FEAT_PRELOAD,544	FEAT_FIR_COEF_V,545	FEAT_ALPHA_FREE_ZORDER,546	FEAT_FIFO_MERGE,547	FEAT_BURST_2D,548};549 550static const enum dss_feat_id omap4430_es2_0_1_2_dss_feat_list[] = {551	FEAT_MGR_LCD2,552	FEAT_CORE_CLK_DIV,553	FEAT_LCD_CLK_SRC,554	FEAT_DSI_DCS_CMD_CONFIG_VC,555	FEAT_DSI_VC_OCP_WIDTH,556	FEAT_DSI_GNQ,557	FEAT_HDMI_CTS_SWMODE,558	FEAT_HANDLE_UV_SEPARATE,559	FEAT_ATTR2,560	FEAT_CPR,561	FEAT_PRELOAD,562	FEAT_FIR_COEF_V,563	FEAT_ALPHA_FREE_ZORDER,564	FEAT_FIFO_MERGE,565	FEAT_BURST_2D,566};567 568static const enum dss_feat_id omap4_dss_feat_list[] = {569	FEAT_MGR_LCD2,570	FEAT_CORE_CLK_DIV,571	FEAT_LCD_CLK_SRC,572	FEAT_DSI_DCS_CMD_CONFIG_VC,573	FEAT_DSI_VC_OCP_WIDTH,574	FEAT_DSI_GNQ,575	FEAT_HDMI_CTS_SWMODE,576	FEAT_HDMI_AUDIO_USE_MCLK,577	FEAT_HANDLE_UV_SEPARATE,578	FEAT_ATTR2,579	FEAT_CPR,580	FEAT_PRELOAD,581	FEAT_FIR_COEF_V,582	FEAT_ALPHA_FREE_ZORDER,583	FEAT_FIFO_MERGE,584	FEAT_BURST_2D,585};586 587static const enum dss_feat_id omap5_dss_feat_list[] = {588	FEAT_MGR_LCD2,589	FEAT_MGR_LCD3,590	FEAT_CORE_CLK_DIV,591	FEAT_LCD_CLK_SRC,592	FEAT_DSI_DCS_CMD_CONFIG_VC,593	FEAT_DSI_VC_OCP_WIDTH,594	FEAT_DSI_GNQ,595	FEAT_HDMI_CTS_SWMODE,596	FEAT_HDMI_AUDIO_USE_MCLK,597	FEAT_HANDLE_UV_SEPARATE,598	FEAT_ATTR2,599	FEAT_CPR,600	FEAT_PRELOAD,601	FEAT_FIR_COEF_V,602	FEAT_ALPHA_FREE_ZORDER,603	FEAT_FIFO_MERGE,604	FEAT_BURST_2D,605	FEAT_DSI_PHY_DCC,606	FEAT_MFLAG,607};608 609/* OMAP2 DSS Features */610static const struct omap_dss_features omap2_dss_features = {611	.reg_fields = omap2_dss_reg_fields,612	.num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),613 614	.features = omap2_dss_feat_list,615	.num_features = ARRAY_SIZE(omap2_dss_feat_list),616 617	.num_mgrs = 2,618	.num_ovls = 3,619	.supported_displays = omap2_dss_supported_displays,620	.supported_outputs = omap2_dss_supported_outputs,621	.supported_color_modes = omap2_dss_supported_color_modes,622	.overlay_caps = omap2_dss_overlay_caps,623	.clksrc_names = omap2_dss_clk_source_names,624	.dss_params = omap2_dss_param_range,625	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,626	.buffer_size_unit = 1,627	.burst_size_unit = 8,628};629 630/* OMAP3 DSS Features */631static const struct omap_dss_features omap3430_dss_features = {632	.reg_fields = omap3_dss_reg_fields,633	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),634 635	.features = omap3430_dss_feat_list,636	.num_features = ARRAY_SIZE(omap3430_dss_feat_list),637 638	.num_mgrs = 2,639	.num_ovls = 3,640	.supported_displays = omap3430_dss_supported_displays,641	.supported_outputs = omap3430_dss_supported_outputs,642	.supported_color_modes = omap3_dss_supported_color_modes,643	.overlay_caps = omap3430_dss_overlay_caps,644	.clksrc_names = omap3_dss_clk_source_names,645	.dss_params = omap3_dss_param_range,646	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,647	.buffer_size_unit = 1,648	.burst_size_unit = 8,649};650 651/*652 * AM35xx DSS Features. This is basically OMAP3 DSS Features without the653 * vdds_dsi regulator.654 */655static const struct omap_dss_features am35xx_dss_features = {656	.reg_fields = omap3_dss_reg_fields,657	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),658 659	.features = am35xx_dss_feat_list,660	.num_features = ARRAY_SIZE(am35xx_dss_feat_list),661 662	.num_mgrs = 2,663	.num_ovls = 3,664	.supported_displays = omap3430_dss_supported_displays,665	.supported_outputs = omap3430_dss_supported_outputs,666	.supported_color_modes = omap3_dss_supported_color_modes,667	.overlay_caps = omap3430_dss_overlay_caps,668	.clksrc_names = omap3_dss_clk_source_names,669	.dss_params = omap3_dss_param_range,670	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,671	.buffer_size_unit = 1,672	.burst_size_unit = 8,673};674 675static const struct omap_dss_features am43xx_dss_features = {676	.reg_fields = am43xx_dss_reg_fields,677	.num_reg_fields = ARRAY_SIZE(am43xx_dss_reg_fields),678 679	.features = am43xx_dss_feat_list,680	.num_features = ARRAY_SIZE(am43xx_dss_feat_list),681 682	.num_mgrs = 1,683	.num_ovls = 3,684	.supported_displays = am43xx_dss_supported_displays,685	.supported_outputs = am43xx_dss_supported_outputs,686	.supported_color_modes = omap3_dss_supported_color_modes,687	.overlay_caps = omap3430_dss_overlay_caps,688	.clksrc_names = omap2_dss_clk_source_names,689	.dss_params = am43xx_dss_param_range,690	.supported_rotation_types = OMAP_DSS_ROT_DMA,691	.buffer_size_unit = 1,692	.burst_size_unit = 8,693};694 695static const struct omap_dss_features omap3630_dss_features = {696	.reg_fields = omap3_dss_reg_fields,697	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),698 699	.features = omap3630_dss_feat_list,700	.num_features = ARRAY_SIZE(omap3630_dss_feat_list),701 702	.num_mgrs = 2,703	.num_ovls = 3,704	.supported_displays = omap3630_dss_supported_displays,705	.supported_outputs = omap3630_dss_supported_outputs,706	.supported_color_modes = omap3_dss_supported_color_modes,707	.overlay_caps = omap3630_dss_overlay_caps,708	.clksrc_names = omap3_dss_clk_source_names,709	.dss_params = omap3_dss_param_range,710	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_VRFB,711	.buffer_size_unit = 1,712	.burst_size_unit = 8,713};714 715/* OMAP4 DSS Features */716/* For OMAP4430 ES 1.0 revision */717static const struct omap_dss_features omap4430_es1_0_dss_features  = {718	.reg_fields = omap4_dss_reg_fields,719	.num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),720 721	.features = omap4430_es1_0_dss_feat_list,722	.num_features = ARRAY_SIZE(omap4430_es1_0_dss_feat_list),723 724	.num_mgrs = 3,725	.num_ovls = 4,726	.supported_displays = omap4_dss_supported_displays,727	.supported_outputs = omap4_dss_supported_outputs,728	.supported_color_modes = omap4_dss_supported_color_modes,729	.overlay_caps = omap4_dss_overlay_caps,730	.clksrc_names = omap4_dss_clk_source_names,731	.dss_params = omap4_dss_param_range,732	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,733	.buffer_size_unit = 16,734	.burst_size_unit = 16,735};736 737/* For OMAP4430 ES 2.0, 2.1 and 2.2 revisions */738static const struct omap_dss_features omap4430_es2_0_1_2_dss_features = {739	.reg_fields = omap4_dss_reg_fields,740	.num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),741 742	.features = omap4430_es2_0_1_2_dss_feat_list,743	.num_features = ARRAY_SIZE(omap4430_es2_0_1_2_dss_feat_list),744 745	.num_mgrs = 3,746	.num_ovls = 4,747	.supported_displays = omap4_dss_supported_displays,748	.supported_outputs = omap4_dss_supported_outputs,749	.supported_color_modes = omap4_dss_supported_color_modes,750	.overlay_caps = omap4_dss_overlay_caps,751	.clksrc_names = omap4_dss_clk_source_names,752	.dss_params = omap4_dss_param_range,753	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,754	.buffer_size_unit = 16,755	.burst_size_unit = 16,756};757 758/* For all the other OMAP4 versions */759static const struct omap_dss_features omap4_dss_features = {760	.reg_fields = omap4_dss_reg_fields,761	.num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),762 763	.features = omap4_dss_feat_list,764	.num_features = ARRAY_SIZE(omap4_dss_feat_list),765 766	.num_mgrs = 3,767	.num_ovls = 4,768	.supported_displays = omap4_dss_supported_displays,769	.supported_outputs = omap4_dss_supported_outputs,770	.supported_color_modes = omap4_dss_supported_color_modes,771	.overlay_caps = omap4_dss_overlay_caps,772	.clksrc_names = omap4_dss_clk_source_names,773	.dss_params = omap4_dss_param_range,774	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,775	.buffer_size_unit = 16,776	.burst_size_unit = 16,777};778 779/* OMAP5 DSS Features */780static const struct omap_dss_features omap5_dss_features = {781	.reg_fields = omap5_dss_reg_fields,782	.num_reg_fields = ARRAY_SIZE(omap5_dss_reg_fields),783 784	.features = omap5_dss_feat_list,785	.num_features = ARRAY_SIZE(omap5_dss_feat_list),786 787	.num_mgrs = 4,788	.num_ovls = 4,789	.supported_displays = omap5_dss_supported_displays,790	.supported_outputs = omap5_dss_supported_outputs,791	.supported_color_modes = omap4_dss_supported_color_modes,792	.overlay_caps = omap4_dss_overlay_caps,793	.clksrc_names = omap5_dss_clk_source_names,794	.dss_params = omap5_dss_param_range,795	.supported_rotation_types = OMAP_DSS_ROT_DMA | OMAP_DSS_ROT_TILER,796	.buffer_size_unit = 16,797	.burst_size_unit = 16,798};799 800/* Functions returning values related to a DSS feature */801int dss_feat_get_num_mgrs(void)802{803	return omap_current_dss_features->num_mgrs;804}805EXPORT_SYMBOL(dss_feat_get_num_mgrs);806 807int dss_feat_get_num_ovls(void)808{809	return omap_current_dss_features->num_ovls;810}811EXPORT_SYMBOL(dss_feat_get_num_ovls);812 813unsigned long dss_feat_get_param_min(enum dss_range_param param)814{815	return omap_current_dss_features->dss_params[param].min;816}817 818unsigned long dss_feat_get_param_max(enum dss_range_param param)819{820	return omap_current_dss_features->dss_params[param].max;821}822 823enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel)824{825	return omap_current_dss_features->supported_displays[channel];826}827 828enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel)829{830	return omap_current_dss_features->supported_outputs[channel];831}832 833enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane)834{835	return omap_current_dss_features->supported_color_modes[plane];836}837EXPORT_SYMBOL(dss_feat_get_supported_color_modes);838 839enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane)840{841	return omap_current_dss_features->overlay_caps[plane];842}843 844bool dss_feat_color_mode_supported(enum omap_plane plane,845		enum omap_color_mode color_mode)846{847	return omap_current_dss_features->supported_color_modes[plane] &848			color_mode;849}850 851const char *dss_feat_get_clk_source_name(enum omap_dss_clk_source id)852{853	return omap_current_dss_features->clksrc_names[id];854}855 856u32 dss_feat_get_buffer_size_unit(void)857{858	return omap_current_dss_features->buffer_size_unit;859}860 861u32 dss_feat_get_burst_size_unit(void)862{863	return omap_current_dss_features->burst_size_unit;864}865 866/* DSS has_feature check */867bool dss_has_feature(enum dss_feat_id id)868{869	int i;870	const enum dss_feat_id *features = omap_current_dss_features->features;871	const int num_features = omap_current_dss_features->num_features;872 873	for (i = 0; i < num_features; i++) {874		if (features[i] == id)875			return true;876	}877 878	return false;879}880 881void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end)882{883	BUG_ON(id >= omap_current_dss_features->num_reg_fields);884 885	*start = omap_current_dss_features->reg_fields[id].start;886	*end = omap_current_dss_features->reg_fields[id].end;887}888 889bool dss_feat_rotation_type_supported(enum omap_dss_rotation_type rot_type)890{891	return omap_current_dss_features->supported_rotation_types & rot_type;892}893 894void dss_features_init(enum omapdss_version version)895{896	switch (version) {897	case OMAPDSS_VER_OMAP24xx:898		omap_current_dss_features = &omap2_dss_features;899		break;900 901	case OMAPDSS_VER_OMAP34xx_ES1:902	case OMAPDSS_VER_OMAP34xx_ES3:903		omap_current_dss_features = &omap3430_dss_features;904		break;905 906	case OMAPDSS_VER_OMAP3630:907		omap_current_dss_features = &omap3630_dss_features;908		break;909 910	case OMAPDSS_VER_OMAP4430_ES1:911		omap_current_dss_features = &omap4430_es1_0_dss_features;912		break;913 914	case OMAPDSS_VER_OMAP4430_ES2:915		omap_current_dss_features = &omap4430_es2_0_1_2_dss_features;916		break;917 918	case OMAPDSS_VER_OMAP4:919		omap_current_dss_features = &omap4_dss_features;920		break;921 922	case OMAPDSS_VER_OMAP5:923	case OMAPDSS_VER_DRA7xx:924		omap_current_dss_features = &omap5_dss_features;925		break;926 927	case OMAPDSS_VER_AM35xx:928		omap_current_dss_features = &am35xx_dss_features;929		break;930 931	case OMAPDSS_VER_AM43xx:932		omap_current_dss_features = &am43xx_dss_features;933		break;934 935	default:936		DSSWARN("Unsupported OMAP version");937		break;938	}939}940