omapdss: HDMI: Rename hdmi driver files to nicer names
authorArchit Taneja <archit@ti.com>
Thu, 12 Sep 2013 12:15:57 +0000 (17:45 +0530)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 9 Oct 2013 09:42:30 +0000 (12:42 +0300)
Replace the ti_hdmi_4xxx* notation for OMAP4 HDMI driver with hdmi4. Rename
the hdmi.c encoder driver to hdmi4.c. Rename ti_hdmi.h to hdmi.h

Signed-off-by: Archit Taneja <archit@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
14 files changed:
drivers/video/omap2/dss/Makefile
drivers/video/omap2/dss/core.c
drivers/video/omap2/dss/dss.h
drivers/video/omap2/dss/hdmi.c [deleted file]
drivers/video/omap2/dss/hdmi.h [new file with mode: 0644]
drivers/video/omap2/dss/hdmi4.c [new file with mode: 0644]
drivers/video/omap2/dss/hdmi4_core.c [new file with mode: 0644]
drivers/video/omap2/dss/hdmi4_core.h [new file with mode: 0644]
drivers/video/omap2/dss/hdmi_phy.c
drivers/video/omap2/dss/hdmi_pll.c
drivers/video/omap2/dss/hdmi_wp.c
drivers/video/omap2/dss/ti_hdmi.h [deleted file]
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c [deleted file]
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h [deleted file]

index d88e93870e155df2bc4f2eb42c36eff101d1e2dd..f87ca3216a1fb96dc781533b634a19bf8bc731c7 100644 (file)
@@ -10,6 +10,6 @@ omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o
 omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o
 omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o
 omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o
-omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi.o hdmi_wp.o hdmi_pll.o hdmi_phy.o \
-       ti_hdmi_4xxx_ip.o
+omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi4.o hdmi_wp.o hdmi_pll.o hdmi_phy.o \
+       hdmi4_core.o
 ccflags-$(CONFIG_OMAP2_DSS_DEBUG) += -DDEBUG
index 60d3958d04f7b0274b5198907bd0277d9de94e71..ffa45c894cd433820191c74c08b4c2d1b96bffcd 100644 (file)
@@ -266,7 +266,7 @@ static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
        venc_init_platform_driver,
 #endif
 #ifdef CONFIG_OMAP4_DSS_HDMI
-       hdmi_init_platform_driver,
+       hdmi4_init_platform_driver,
 #endif
 };
 
@@ -287,7 +287,7 @@ static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = {
        venc_uninit_platform_driver,
 #endif
 #ifdef CONFIG_OMAP4_DSS_HDMI
-       hdmi_uninit_platform_driver,
+       hdmi4_uninit_platform_driver,
 #endif
 };
 
index e172531d196bd2f09320af18797560f3bf606d4e..f538e867c0f8c707c596e8a014ff4688ca67b930 100644 (file)
@@ -427,8 +427,8 @@ int venc_init_platform_driver(void) __init;
 void venc_uninit_platform_driver(void) __exit;
 
 /* HDMI */
-int hdmi_init_platform_driver(void) __init;
-void hdmi_uninit_platform_driver(void) __exit;
+int hdmi4_init_platform_driver(void) __init;
+void hdmi4_uninit_platform_driver(void) __exit;
 
 /* RFBI */
 int rfbi_init_platform_driver(void) __init;
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
deleted file mode 100644 (file)
index f03d6c7..0000000
+++ /dev/null
@@ -1,1128 +0,0 @@
-/*
- * hdmi.c
- *
- * HDMI interface DSS driver setting for TI's OMAP4 family of processor.
- * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/
- * Authors: Yong Zhi
- *     Mythri pk <mythripk@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/>.
- */
-
-#define DSS_SUBSYS_NAME "HDMI"
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-#include <linux/delay.h>
-#include <linux/string.h>
-#include <linux/platform_device.h>
-#include <linux/pm_runtime.h>
-#include <linux/clk.h>
-#include <linux/gpio.h>
-#include <linux/regulator/consumer.h>
-#include <video/omapdss.h>
-
-#include "ti_hdmi.h"
-#include "ti_hdmi_4xxx_ip.h"
-#include "dss.h"
-#include "dss_features.h"
-
-/* HDMI EDID Length move this */
-#define HDMI_EDID_MAX_LENGTH                   256
-#define EDID_TIMING_DESCRIPTOR_SIZE            0x12
-#define EDID_DESCRIPTOR_BLOCK0_ADDRESS         0x36
-#define EDID_DESCRIPTOR_BLOCK1_ADDRESS         0x80
-#define EDID_SIZE_BLOCK0_TIMING_DESCRIPTOR     4
-#define EDID_SIZE_BLOCK1_TIMING_DESCRIPTOR     4
-
-static struct {
-       struct mutex lock;
-       struct platform_device *pdev;
-
-       struct hdmi_wp_data     wp;
-       struct hdmi_pll_data    pll;
-       struct hdmi_phy_data    phy;
-       struct hdmi_core_data   core;
-
-       struct hdmi_config cfg;
-
-       struct clk *sys_clk;
-       struct regulator *vdda_hdmi_dac_reg;
-
-       bool core_enabled;
-
-       struct omap_dss_device output;
-} hdmi;
-
-/*
- * Logic for the below structure :
- * user enters the CEA or VESA timings by specifying the HDMI/DVI code.
- * There is a correspondence between CEA/VESA timing and code, please
- * refer to section 6.3 in HDMI 1.3 specification for timing code.
- *
- * In the below structure, cea_vesa_timings corresponds to all OMAP4
- * supported CEA and VESA timing values.code_cea corresponds to the CEA
- * code, It is used to get the timing from cea_vesa_timing array.Similarly
- * with code_vesa. Code_index is used for back mapping, that is once EDID
- * is read from the TV, EDID is parsed to find the timing values and then
- * map it to corresponding CEA or VESA index.
- */
-
-static const struct hdmi_config cea_timings[] = {
-       {
-               { 640, 480, 25200, 96, 16, 48, 2, 10, 33,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 1, HDMI_HDMI },
-       },
-       {
-               { 720, 480, 27027, 62, 16, 60, 6, 9, 30,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 2, HDMI_HDMI },
-       },
-       {
-               { 1280, 720, 74250, 40, 110, 220, 5, 5, 20,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 4, HDMI_HDMI },
-       },
-       {
-               { 1920, 540, 74250, 44, 88, 148, 5, 2, 15,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       true, },
-               { 5, HDMI_HDMI },
-       },
-       {
-               { 1440, 240, 27027, 124, 38, 114, 3, 4, 15,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       true, },
-               { 6, HDMI_HDMI },
-       },
-       {
-               { 1920, 1080, 148500, 44, 88, 148, 5, 4, 36,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 16, HDMI_HDMI },
-       },
-       {
-               { 720, 576, 27000, 64, 12, 68, 5, 5, 39,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 17, HDMI_HDMI },
-       },
-       {
-               { 1280, 720, 74250, 40, 440, 220, 5, 5, 20,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 19, HDMI_HDMI },
-       },
-       {
-               { 1920, 540, 74250, 44, 528, 148, 5, 2, 15,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       true, },
-               { 20, HDMI_HDMI },
-       },
-       {
-               { 1440, 288, 27000, 126, 24, 138, 3, 2, 19,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       true, },
-               { 21, HDMI_HDMI },
-       },
-       {
-               { 1440, 576, 54000, 128, 24, 136, 5, 5, 39,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 29, HDMI_HDMI },
-       },
-       {
-               { 1920, 1080, 148500, 44, 528, 148, 5, 4, 36,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 31, HDMI_HDMI },
-       },
-       {
-               { 1920, 1080, 74250, 44, 638, 148, 5, 4, 36,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 32, HDMI_HDMI },
-       },
-       {
-               { 2880, 480, 108108, 248, 64, 240, 6, 9, 30,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 35, HDMI_HDMI },
-       },
-       {
-               { 2880, 576, 108000, 256, 48, 272, 5, 5, 39,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 37, HDMI_HDMI },
-       },
-};
-
-static const struct hdmi_config vesa_timings[] = {
-/* VESA From Here */
-       {
-               { 640, 480, 25175, 96, 16, 48, 2, 11, 31,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 4, HDMI_DVI },
-       },
-       {
-               { 800, 600, 40000, 128, 40, 88, 4, 1, 23,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 9, HDMI_DVI },
-       },
-       {
-               { 848, 480, 33750, 112, 16, 112, 8, 6, 23,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0xE, HDMI_DVI },
-       },
-       {
-               { 1280, 768, 79500, 128, 64, 192, 7, 3, 20,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x17, HDMI_DVI },
-       },
-       {
-               { 1280, 800, 83500, 128, 72, 200, 6, 3, 22,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x1C, HDMI_DVI },
-       },
-       {
-               { 1360, 768, 85500, 112, 64, 256, 6, 3, 18,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x27, HDMI_DVI },
-       },
-       {
-               { 1280, 960, 108000, 112, 96, 312, 3, 1, 36,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x20, HDMI_DVI },
-       },
-       {
-               { 1280, 1024, 108000, 112, 48, 248, 3, 1, 38,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x23, HDMI_DVI },
-       },
-       {
-               { 1024, 768, 65000, 136, 24, 160, 6, 3, 29,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x10, HDMI_DVI },
-       },
-       {
-               { 1400, 1050, 121750, 144, 88, 232, 4, 3, 32,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x2A, HDMI_DVI },
-       },
-       {
-               { 1440, 900, 106500, 152, 80, 232, 6, 3, 25,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x2F, HDMI_DVI },
-       },
-       {
-               { 1680, 1050, 146250, 176 , 104, 280, 6, 3, 30,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
-                       false, },
-               { 0x3A, HDMI_DVI },
-       },
-       {
-               { 1366, 768, 85500, 143, 70, 213, 3, 3, 24,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x51, HDMI_DVI },
-       },
-       {
-               { 1920, 1080, 148500, 44, 148, 80, 5, 4, 36,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x52, HDMI_DVI },
-       },
-       {
-               { 1280, 768, 68250, 32, 48, 80, 7, 3, 12,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x16, HDMI_DVI },
-       },
-       {
-               { 1400, 1050, 101000, 32, 48, 80, 4, 3, 23,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x29, HDMI_DVI },
-       },
-       {
-               { 1680, 1050, 119000, 32, 48, 80, 6, 3, 21,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x39, HDMI_DVI },
-       },
-       {
-               { 1280, 800, 79500, 32, 48, 80, 6, 3, 14,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x1B, HDMI_DVI },
-       },
-       {
-               { 1280, 720, 74250, 40, 110, 220, 5, 5, 20,
-                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x55, HDMI_DVI },
-       },
-       {
-               { 1920, 1200, 154000, 32, 48, 80, 6, 3, 26,
-                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
-                       false, },
-               { 0x44, HDMI_DVI },
-       },
-};
-
-static int hdmi_runtime_get(void)
-{
-       int r;
-
-       DSSDBG("hdmi_runtime_get\n");
-
-       r = pm_runtime_get_sync(&hdmi.pdev->dev);
-       WARN_ON(r < 0);
-       if (r < 0)
-               return r;
-
-       return 0;
-}
-
-static void hdmi_runtime_put(void)
-{
-       int r;
-
-       DSSDBG("hdmi_runtime_put\n");
-
-       r = pm_runtime_put_sync(&hdmi.pdev->dev);
-       WARN_ON(r < 0 && r != -ENOSYS);
-}
-
-static int hdmi_init_regulator(void)
-{
-       struct regulator *reg;
-
-       if (hdmi.vdda_hdmi_dac_reg != NULL)
-               return 0;
-
-       reg = devm_regulator_get(&hdmi.pdev->dev, "vdda_hdmi_dac");
-
-       /* DT HACK: try VDAC to make omapdss work for o4 sdp/panda */
-       if (IS_ERR(reg))
-               reg = devm_regulator_get(&hdmi.pdev->dev, "VDAC");
-
-       if (IS_ERR(reg)) {
-               DSSERR("can't get VDDA_HDMI_DAC regulator\n");
-               return PTR_ERR(reg);
-       }
-
-       hdmi.vdda_hdmi_dac_reg = reg;
-
-       return 0;
-}
-
-static const struct hdmi_config *hdmi_find_timing(
-                                       const struct hdmi_config *timings_arr,
-                                       int len)
-{
-       int i;
-
-       for (i = 0; i < len; i++) {
-               if (timings_arr[i].cm.code == hdmi.cfg.cm.code)
-                       return &timings_arr[i];
-       }
-       return NULL;
-}
-
-static const struct hdmi_config *hdmi_get_timings(void)
-{
-       const struct hdmi_config *arr;
-       int len;
-
-       if (hdmi.cfg.cm.mode == HDMI_DVI) {
-               arr = vesa_timings;
-               len = ARRAY_SIZE(vesa_timings);
-       } else {
-               arr = cea_timings;
-               len = ARRAY_SIZE(cea_timings);
-       }
-
-       return hdmi_find_timing(arr, len);
-}
-
-static bool hdmi_timings_compare(struct omap_video_timings *timing1,
-                               const struct omap_video_timings *timing2)
-{
-       int timing1_vsync, timing1_hsync, timing2_vsync, timing2_hsync;
-
-       if ((DIV_ROUND_CLOSEST(timing2->pixel_clock, 1000) ==
-                       DIV_ROUND_CLOSEST(timing1->pixel_clock, 1000)) &&
-               (timing2->x_res == timing1->x_res) &&
-               (timing2->y_res == timing1->y_res)) {
-
-               timing2_hsync = timing2->hfp + timing2->hsw + timing2->hbp;
-               timing1_hsync = timing1->hfp + timing1->hsw + timing1->hbp;
-               timing2_vsync = timing2->vfp + timing2->vsw + timing2->vbp;
-               timing1_vsync = timing2->vfp + timing2->vsw + timing2->vbp;
-
-               DSSDBG("timing1_hsync = %d timing1_vsync = %d"\
-                       "timing2_hsync = %d timing2_vsync = %d\n",
-                       timing1_hsync, timing1_vsync,
-                       timing2_hsync, timing2_vsync);
-
-               if ((timing1_hsync == timing2_hsync) &&
-                       (timing1_vsync == timing2_vsync)) {
-                       return true;
-               }
-       }
-       return false;
-}
-
-static struct hdmi_cm hdmi_get_code(struct omap_video_timings *timing)
-{
-       int i;
-       struct hdmi_cm cm = {-1};
-       DSSDBG("hdmi_get_code\n");
-
-       for (i = 0; i < ARRAY_SIZE(cea_timings); i++) {
-               if (hdmi_timings_compare(timing, &cea_timings[i].timings)) {
-                       cm = cea_timings[i].cm;
-                       goto end;
-               }
-       }
-       for (i = 0; i < ARRAY_SIZE(vesa_timings); i++) {
-               if (hdmi_timings_compare(timing, &vesa_timings[i].timings)) {
-                       cm = vesa_timings[i].cm;
-                       goto end;
-               }
-       }
-
-end:   return cm;
-
-}
-
-static int hdmi_power_on_core(struct omap_dss_device *dssdev)
-{
-       int r;
-
-       r = regulator_enable(hdmi.vdda_hdmi_dac_reg);
-       if (r)
-               return r;
-
-       r = hdmi_runtime_get();
-       if (r)
-               goto err_runtime_get;
-
-       /* Make selection of HDMI in DSS */
-       dss_select_hdmi_venc_clk_source(DSS_HDMI_M_PCLK);
-
-       hdmi.core_enabled = true;
-
-       return 0;
-
-err_runtime_get:
-       regulator_disable(hdmi.vdda_hdmi_dac_reg);
-
-       return r;
-}
-
-static void hdmi_power_off_core(struct omap_dss_device *dssdev)
-{
-       hdmi.core_enabled = false;
-
-       hdmi_runtime_put();
-       regulator_disable(hdmi.vdda_hdmi_dac_reg);
-}
-
-static int hdmi_power_on_full(struct omap_dss_device *dssdev)
-{
-       int r;
-       struct omap_video_timings *p;
-       struct omap_overlay_manager *mgr = hdmi.output.manager;
-       unsigned long phy;
-
-       r = hdmi_power_on_core(dssdev);
-       if (r)
-               return r;
-
-       dss_mgr_disable(mgr);
-
-       p = &hdmi.cfg.timings;
-
-       DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res);
-
-       phy = p->pixel_clock;
-
-       hdmi_pll_compute(&hdmi.pll, clk_get_rate(hdmi.sys_clk), phy);
-
-       hdmi_wp_video_stop(&hdmi.wp);
-
-       /* config the PLL and PHY hdmi_set_pll_pwrfirst */
-       r = hdmi_pll_enable(&hdmi.pll, &hdmi.wp);
-       if (r) {
-               DSSDBG("Failed to lock PLL\n");
-               goto err_pll_enable;
-       }
-
-       r = hdmi_phy_enable(&hdmi.phy, &hdmi.wp, &hdmi.cfg);
-       if (r) {
-               DSSDBG("Failed to start PHY\n");
-               goto err_phy_enable;
-       }
-
-       hdmi4_configure(&hdmi.core, &hdmi.wp, &hdmi.cfg);
-
-       /* bypass TV gamma table */
-       dispc_enable_gamma_table(0);
-
-       /* tv size */
-       dss_mgr_set_timings(mgr, p);
-
-       r = hdmi_wp_video_start(&hdmi.wp);
-       if (r)
-               goto err_vid_enable;
-
-       r = dss_mgr_enable(mgr);
-       if (r)
-               goto err_mgr_enable;
-
-       return 0;
-
-err_mgr_enable:
-       hdmi_wp_video_stop(&hdmi.wp);
-err_vid_enable:
-       hdmi_phy_disable(&hdmi.phy, &hdmi.wp);
-err_phy_enable:
-       hdmi_pll_disable(&hdmi.pll, &hdmi.wp);
-err_pll_enable:
-       hdmi_power_off_core(dssdev);
-       return -EIO;
-}
-
-static void hdmi_power_off_full(struct omap_dss_device *dssdev)
-{
-       struct omap_overlay_manager *mgr = hdmi.output.manager;
-
-       dss_mgr_disable(mgr);
-
-       hdmi_wp_video_stop(&hdmi.wp);
-       hdmi_phy_disable(&hdmi.phy, &hdmi.wp);
-       hdmi_pll_disable(&hdmi.pll, &hdmi.wp);
-
-       hdmi_power_off_core(dssdev);
-}
-
-static int hdmi_display_check_timing(struct omap_dss_device *dssdev,
-                                       struct omap_video_timings *timings)
-{
-       struct hdmi_cm cm;
-
-       cm = hdmi_get_code(timings);
-       if (cm.code == -1) {
-               return -EINVAL;
-       }
-
-       return 0;
-
-}
-
-static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
-               struct omap_video_timings *timings)
-{
-       struct hdmi_cm cm;
-       const struct hdmi_config *t;
-
-       mutex_lock(&hdmi.lock);
-
-       cm = hdmi_get_code(timings);
-       hdmi.cfg.cm = cm;
-
-       t = hdmi_get_timings();
-       if (t != NULL) {
-               hdmi.cfg = *t;
-
-               dispc_set_tv_pclk(t->timings.pixel_clock * 1000);
-       }
-
-       mutex_unlock(&hdmi.lock);
-}
-
-static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
-               struct omap_video_timings *timings)
-{
-       const struct hdmi_config *cfg;
-
-       cfg = hdmi_get_timings();
-       if (cfg == NULL)
-               cfg = &vesa_timings[0];
-
-       memcpy(timings, &cfg->timings, sizeof(cfg->timings));
-}
-
-static void hdmi_dump_regs(struct seq_file *s)
-{
-       mutex_lock(&hdmi.lock);
-
-       if (hdmi_runtime_get()) {
-               mutex_unlock(&hdmi.lock);
-               return;
-       }
-
-       hdmi_wp_dump(&hdmi.wp, s);
-       hdmi_pll_dump(&hdmi.pll, s);
-       hdmi_phy_dump(&hdmi.phy, s);
-       hdmi4_core_dump(&hdmi.core, s);
-
-       hdmi_runtime_put();
-       mutex_unlock(&hdmi.lock);
-}
-
-static int read_edid(u8 *buf, int len)
-{
-       int r;
-
-       mutex_lock(&hdmi.lock);
-
-       r = hdmi_runtime_get();
-       BUG_ON(r);
-
-       r = hdmi4_read_edid(&hdmi.core,  buf, len);
-
-       hdmi_runtime_put();
-       mutex_unlock(&hdmi.lock);
-
-       return r;
-}
-
-static int hdmi_display_enable(struct omap_dss_device *dssdev)
-{
-       struct omap_dss_device *out = &hdmi.output;
-       int r = 0;
-
-       DSSDBG("ENTER hdmi_display_enable\n");
-
-       mutex_lock(&hdmi.lock);
-
-       if (out == NULL || out->manager == NULL) {
-               DSSERR("failed to enable display: no output/manager\n");
-               r = -ENODEV;
-               goto err0;
-       }
-
-       r = hdmi_power_on_full(dssdev);
-       if (r) {
-               DSSERR("failed to power on device\n");
-               goto err0;
-       }
-
-       mutex_unlock(&hdmi.lock);
-       return 0;
-
-err0:
-       mutex_unlock(&hdmi.lock);
-       return r;
-}
-
-static void hdmi_display_disable(struct omap_dss_device *dssdev)
-{
-       DSSDBG("Enter hdmi_display_disable\n");
-
-       mutex_lock(&hdmi.lock);
-
-       hdmi_power_off_full(dssdev);
-
-       mutex_unlock(&hdmi.lock);
-}
-
-static int hdmi_core_enable(struct omap_dss_device *dssdev)
-{
-       int r = 0;
-
-       DSSDBG("ENTER omapdss_hdmi_core_enable\n");
-
-       mutex_lock(&hdmi.lock);
-
-       r = hdmi_power_on_core(dssdev);
-       if (r) {
-               DSSERR("failed to power on device\n");
-               goto err0;
-       }
-
-       mutex_unlock(&hdmi.lock);
-       return 0;
-
-err0:
-       mutex_unlock(&hdmi.lock);
-       return r;
-}
-
-static void hdmi_core_disable(struct omap_dss_device *dssdev)
-{
-       DSSDBG("Enter omapdss_hdmi_core_disable\n");
-
-       mutex_lock(&hdmi.lock);
-
-       hdmi_power_off_core(dssdev);
-
-       mutex_unlock(&hdmi.lock);
-}
-
-static int hdmi_get_clocks(struct platform_device *pdev)
-{
-       struct clk *clk;
-
-       clk = devm_clk_get(&pdev->dev, "sys_clk");
-       if (IS_ERR(clk)) {
-               DSSERR("can't get sys_clk\n");
-               return PTR_ERR(clk);
-       }
-
-       hdmi.sys_clk = clk;
-
-       return 0;
-}
-
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts)
-{
-       u32 deep_color;
-       bool deep_color_correct = false;
-       u32 pclk = hdmi.cfg.timings.pixel_clock;
-
-       if (n == NULL || cts == NULL)
-               return -EINVAL;
-
-       /* TODO: When implemented, query deep color mode here. */
-       deep_color = 100;
-
-       /*
-        * When using deep color, the default N value (as in the HDMI
-        * specification) yields to an non-integer CTS. Hence, we
-        * modify it while keeping the restrictions described in
-        * section 7.2.1 of the HDMI 1.4a specification.
-        */
-       switch (sample_freq) {
-       case 32000:
-       case 48000:
-       case 96000:
-       case 192000:
-               if (deep_color == 125)
-                       if (pclk == 27027 || pclk == 74250)
-                               deep_color_correct = true;
-               if (deep_color == 150)
-                       if (pclk == 27027)
-                               deep_color_correct = true;
-               break;
-       case 44100:
-       case 88200:
-       case 176400:
-               if (deep_color == 125)
-                       if (pclk == 27027)
-                               deep_color_correct = true;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       if (deep_color_correct) {
-               switch (sample_freq) {
-               case 32000:
-                       *n = 8192;
-                       break;
-               case 44100:
-                       *n = 12544;
-                       break;
-               case 48000:
-                       *n = 8192;
-                       break;
-               case 88200:
-                       *n = 25088;
-                       break;
-               case 96000:
-                       *n = 16384;
-                       break;
-               case 176400:
-                       *n = 50176;
-                       break;
-               case 192000:
-                       *n = 32768;
-                       break;
-               default:
-                       return -EINVAL;
-               }
-       } else {
-               switch (sample_freq) {
-               case 32000:
-                       *n = 4096;
-                       break;
-               case 44100:
-                       *n = 6272;
-                       break;
-               case 48000:
-                       *n = 6144;
-                       break;
-               case 88200:
-                       *n = 12544;
-                       break;
-               case 96000:
-                       *n = 12288;
-                       break;
-               case 176400:
-                       *n = 25088;
-                       break;
-               case 192000:
-                       *n = 24576;
-                       break;
-               default:
-                       return -EINVAL;
-               }
-       }
-       /* Calculate CTS. See HDMI 1.3a or 1.4a specifications */
-       *cts = pclk * (*n / 128) * deep_color / (sample_freq / 10);
-
-       return 0;
-}
-
-static bool hdmi_mode_has_audio(void)
-{
-       if (hdmi.cfg.cm.mode == HDMI_HDMI)
-               return true;
-       else
-               return false;
-}
-
-#endif
-
-static int hdmi_connect(struct omap_dss_device *dssdev,
-               struct omap_dss_device *dst)
-{
-       struct omap_overlay_manager *mgr;
-       int r;
-
-       r = hdmi_init_regulator();
-       if (r)
-               return r;
-
-       mgr = omap_dss_get_overlay_manager(dssdev->dispc_channel);
-       if (!mgr)
-               return -ENODEV;
-
-       r = dss_mgr_connect(mgr, dssdev);
-       if (r)
-               return r;
-
-       r = omapdss_output_set_device(dssdev, dst);
-       if (r) {
-               DSSERR("failed to connect output to new device: %s\n",
-                               dst->name);
-               dss_mgr_disconnect(mgr, dssdev);
-               return r;
-       }
-
-       return 0;
-}
-
-static void hdmi_disconnect(struct omap_dss_device *dssdev,
-               struct omap_dss_device *dst)
-{
-       WARN_ON(dst != dssdev->dst);
-
-       if (dst != dssdev->dst)
-               return;
-
-       omapdss_output_unset_device(dssdev);
-
-       if (dssdev->manager)
-               dss_mgr_disconnect(dssdev->manager, dssdev);
-}
-
-static int hdmi_read_edid(struct omap_dss_device *dssdev,
-               u8 *edid, int len)
-{
-       bool need_enable;
-       int r;
-
-       need_enable = hdmi.core_enabled == false;
-
-       if (need_enable) {
-               r = hdmi_core_enable(dssdev);
-               if (r)
-                       return r;
-       }
-
-       r = read_edid(edid, len);
-
-       if (need_enable)
-               hdmi_core_disable(dssdev);
-
-       return r;
-}
-
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-static int hdmi_audio_enable(struct omap_dss_device *dssdev)
-{
-       int r;
-
-       mutex_lock(&hdmi.lock);
-
-       if (!hdmi_mode_has_audio()) {
-               r = -EPERM;
-               goto err;
-       }
-
-       r = hdmi_wp_audio_enable(&hdmi.wp, true);
-       if (r)
-               goto err;
-
-       mutex_unlock(&hdmi.lock);
-       return 0;
-
-err:
-       mutex_unlock(&hdmi.lock);
-       return r;
-}
-
-static void hdmi_audio_disable(struct omap_dss_device *dssdev)
-{
-       hdmi_wp_audio_enable(&hdmi.wp, false);
-}
-
-static int hdmi_audio_start(struct omap_dss_device *dssdev)
-{
-       return hdmi4_audio_start(&hdmi.core, &hdmi.wp);
-}
-
-static void hdmi_audio_stop(struct omap_dss_device *dssdev)
-{
-       hdmi4_audio_stop(&hdmi.core, &hdmi.wp);
-}
-
-static bool hdmi_audio_supported(struct omap_dss_device *dssdev)
-{
-       bool r;
-
-       mutex_lock(&hdmi.lock);
-
-       r = hdmi_mode_has_audio();
-
-       mutex_unlock(&hdmi.lock);
-       return r;
-}
-
-static int hdmi_audio_config(struct omap_dss_device *dssdev,
-               struct omap_dss_audio *audio)
-{
-       int r;
-
-       mutex_lock(&hdmi.lock);
-
-       if (!hdmi_mode_has_audio()) {
-               r = -EPERM;
-               goto err;
-       }
-
-       r = hdmi4_audio_config(&hdmi.core, &hdmi.wp, audio);
-       if (r)
-               goto err;
-
-       mutex_unlock(&hdmi.lock);
-       return 0;
-
-err:
-       mutex_unlock(&hdmi.lock);
-       return r;
-}
-#else
-static int hdmi_audio_enable(struct omap_dss_device *dssdev)
-{
-       return -EPERM;
-}
-
-static void hdmi_audio_disable(struct omap_dss_device *dssdev)
-{
-}
-
-static int hdmi_audio_start(struct omap_dss_device *dssdev)
-{
-       return -EPERM;
-}
-
-static void hdmi_audio_stop(struct omap_dss_device *dssdev)
-{
-}
-
-static bool hdmi_audio_supported(struct omap_dss_device *dssdev)
-{
-       return false;
-}
-
-static int hdmi_audio_config(struct omap_dss_device *dssdev,
-               struct omap_dss_audio *audio)
-{
-       return -EPERM;
-}
-#endif
-
-static const struct omapdss_hdmi_ops hdmi_ops = {
-       .connect                = hdmi_connect,
-       .disconnect             = hdmi_disconnect,
-
-       .enable                 = hdmi_display_enable,
-       .disable                = hdmi_display_disable,
-
-       .check_timings          = hdmi_display_check_timing,
-       .set_timings            = hdmi_display_set_timing,
-       .get_timings            = hdmi_display_get_timings,
-
-       .read_edid              = hdmi_read_edid,
-
-       .audio_enable           = hdmi_audio_enable,
-       .audio_disable          = hdmi_audio_disable,
-       .audio_start            = hdmi_audio_start,
-       .audio_stop             = hdmi_audio_stop,
-       .audio_supported        = hdmi_audio_supported,
-       .audio_config           = hdmi_audio_config,
-};
-
-static void hdmi_init_output(struct platform_device *pdev)
-{
-       struct omap_dss_device *out = &hdmi.output;
-
-       out->dev = &pdev->dev;
-       out->id = OMAP_DSS_OUTPUT_HDMI;
-       out->output_type = OMAP_DISPLAY_TYPE_HDMI;
-       out->name = "hdmi.0";
-       out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
-       out->ops.hdmi = &hdmi_ops;
-       out->owner = THIS_MODULE;
-
-       omapdss_register_output(out);
-}
-
-static void __exit hdmi_uninit_output(struct platform_device *pdev)
-{
-       struct omap_dss_device *out = &hdmi.output;
-
-       omapdss_unregister_output(out);
-}
-
-/* HDMI HW IP initialisation */
-static int omapdss_hdmihw_probe(struct platform_device *pdev)
-{
-       int r;
-
-       hdmi.pdev = pdev;
-
-       mutex_init(&hdmi.lock);
-
-       r = hdmi_wp_init(pdev, &hdmi.wp);
-       if (r)
-               return r;
-
-       r = hdmi_pll_init(pdev, &hdmi.pll);
-       if (r)
-               return r;
-
-       r = hdmi_phy_init(pdev, &hdmi.phy);
-       if (r)
-               return r;
-
-       r = hdmi4_core_init(pdev, &hdmi.core);
-       if (r)
-               return r;
-
-       r = hdmi_get_clocks(pdev);
-       if (r) {
-               DSSERR("can't get clocks\n");
-               return r;
-       }
-
-       pm_runtime_enable(&pdev->dev);
-
-       hdmi_init_output(pdev);
-
-       dss_debugfs_create_file("hdmi", hdmi_dump_regs);
-
-       return 0;
-}
-
-static int __exit omapdss_hdmihw_remove(struct platform_device *pdev)
-{
-       hdmi_uninit_output(pdev);
-
-       pm_runtime_disable(&pdev->dev);
-
-       return 0;
-}
-
-static int hdmi_runtime_suspend(struct device *dev)
-{
-       clk_disable_unprepare(hdmi.sys_clk);
-
-       dispc_runtime_put();
-
-       return 0;
-}
-
-static int hdmi_runtime_resume(struct device *dev)
-{
-       int r;
-
-       r = dispc_runtime_get();
-       if (r < 0)
-               return r;
-
-       clk_prepare_enable(hdmi.sys_clk);
-
-       return 0;
-}
-
-static const struct dev_pm_ops hdmi_pm_ops = {
-       .runtime_suspend = hdmi_runtime_suspend,
-       .runtime_resume = hdmi_runtime_resume,
-};
-
-static struct platform_driver omapdss_hdmihw_driver = {
-       .probe          = omapdss_hdmihw_probe,
-       .remove         = __exit_p(omapdss_hdmihw_remove),
-       .driver         = {
-               .name   = "omapdss_hdmi",
-               .owner  = THIS_MODULE,
-               .pm     = &hdmi_pm_ops,
-       },
-};
-
-int __init hdmi_init_platform_driver(void)
-{
-       return platform_driver_register(&omapdss_hdmihw_driver);
-}
-
-void __exit hdmi_uninit_platform_driver(void)
-{
-       platform_driver_unregister(&omapdss_hdmihw_driver);
-}
diff --git a/drivers/video/omap2/dss/hdmi.h b/drivers/video/omap2/dss/hdmi.h
new file mode 100644 (file)
index 0000000..b92d981
--- /dev/null
@@ -0,0 +1,435 @@
+/*
+ * HDMI driver definition for TI OMAP4 Processor.
+ *
+ * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.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 _HDMI_H
+#define _HDMI_H
+
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <video/omapdss.h>
+
+#include "dss.h"
+
+/* HDMI Wrapper */
+
+#define HDMI_WP_REVISION                       0x0
+#define HDMI_WP_SYSCONFIG                      0x10
+#define HDMI_WP_IRQSTATUS_RAW                  0x24
+#define HDMI_WP_IRQSTATUS                      0x28
+#define HDMI_WP_IRQENABLE_SET                  0x2C
+#define HDMI_WP_IRQENABLE_CLR                  0x30
+#define HDMI_WP_IRQWAKEEN                      0x34
+#define HDMI_WP_PWR_CTRL                       0x40
+#define HDMI_WP_DEBOUNCE                       0x44
+#define HDMI_WP_VIDEO_CFG                      0x50
+#define HDMI_WP_VIDEO_SIZE                     0x60
+#define HDMI_WP_VIDEO_TIMING_H                 0x68
+#define HDMI_WP_VIDEO_TIMING_V                 0x6C
+#define HDMI_WP_WP_CLK                         0x70
+#define HDMI_WP_AUDIO_CFG                      0x80
+#define HDMI_WP_AUDIO_CFG2                     0x84
+#define HDMI_WP_AUDIO_CTRL                     0x88
+#define HDMI_WP_AUDIO_DATA                     0x8C
+
+/* HDMI WP IRQ flags */
+
+#define HDMI_IRQ_OCP_TIMEOUT                   (1 << 4)
+#define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW          (1 << 8)
+#define HDMI_IRQ_AUDIO_FIFO_OVERFLOW           (1 << 9)
+#define HDMI_IRQ_AUDIO_FIFO_SAMPLE_REQ         (1 << 10)
+#define HDMI_IRQ_VIDEO_VSYNC                   (1 << 16)
+#define HDMI_IRQ_VIDEO_FRAME_DONE              (1 << 17)
+#define HDMI_IRQ_PHY_LINE5V_ASSERT             (1 << 24)
+#define HDMI_IRQ_LINK_CONNECT                  (1 << 25)
+#define HDMI_IRQ_LINK_DISCONNECT               (1 << 26)
+#define HDMI_IRQ_PLL_LOCK                      (1 << 29)
+#define HDMI_IRQ_PLL_UNLOCK                    (1 << 30)
+#define HDMI_IRQ_PLL_RECAL                     (1 << 31)
+
+/* HDMI PLL */
+
+#define PLLCTRL_PLL_CONTROL                    0x0
+#define PLLCTRL_PLL_STATUS                     0x4
+#define PLLCTRL_PLL_GO                         0x8
+#define PLLCTRL_CFG1                           0xC
+#define PLLCTRL_CFG2                           0x10
+#define PLLCTRL_CFG3                           0x14
+#define PLLCTRL_SSC_CFG1                       0x18
+#define PLLCTRL_SSC_CFG2                       0x1C
+#define PLLCTRL_CFG4                           0x20
+
+/* HDMI PHY */
+
+#define HDMI_TXPHY_TX_CTRL                     0x0
+#define HDMI_TXPHY_DIGITAL_CTRL                        0x4
+#define HDMI_TXPHY_POWER_CTRL                  0x8
+#define HDMI_TXPHY_PAD_CFG_CTRL                        0xC
+
+enum hdmi_pll_pwr {
+       HDMI_PLLPWRCMD_ALLOFF = 0,
+       HDMI_PLLPWRCMD_PLLONLY = 1,
+       HDMI_PLLPWRCMD_BOTHON_ALLCLKS = 2,
+       HDMI_PLLPWRCMD_BOTHON_NOPHYCLK = 3
+};
+
+enum hdmi_phy_pwr {
+       HDMI_PHYPWRCMD_OFF = 0,
+       HDMI_PHYPWRCMD_LDOON = 1,
+       HDMI_PHYPWRCMD_TXON = 2
+};
+
+enum hdmi_core_hdmi_dvi {
+       HDMI_DVI = 0,
+       HDMI_HDMI = 1
+};
+
+enum hdmi_clk_refsel {
+       HDMI_REFSEL_PCLK = 0,
+       HDMI_REFSEL_REF1 = 1,
+       HDMI_REFSEL_REF2 = 2,
+       HDMI_REFSEL_SYSCLK = 3
+};
+
+enum hdmi_packing_mode {
+       HDMI_PACK_10b_RGB_YUV444 = 0,
+       HDMI_PACK_24b_RGB_YUV444_YUV422 = 1,
+       HDMI_PACK_20b_YUV422 = 2,
+       HDMI_PACK_ALREADYPACKED = 7
+};
+
+enum hdmi_stereo_channels {
+       HDMI_AUDIO_STEREO_NOCHANNELS = 0,
+       HDMI_AUDIO_STEREO_ONECHANNEL = 1,
+       HDMI_AUDIO_STEREO_TWOCHANNELS = 2,
+       HDMI_AUDIO_STEREO_THREECHANNELS = 3,
+       HDMI_AUDIO_STEREO_FOURCHANNELS = 4
+};
+
+enum hdmi_audio_type {
+       HDMI_AUDIO_TYPE_LPCM = 0,
+       HDMI_AUDIO_TYPE_IEC = 1
+};
+
+enum hdmi_audio_justify {
+       HDMI_AUDIO_JUSTIFY_LEFT = 0,
+       HDMI_AUDIO_JUSTIFY_RIGHT = 1
+};
+
+enum hdmi_audio_sample_order {
+       HDMI_AUDIO_SAMPLE_RIGHT_FIRST = 0,
+       HDMI_AUDIO_SAMPLE_LEFT_FIRST = 1
+};
+
+enum hdmi_audio_samples_perword {
+       HDMI_AUDIO_ONEWORD_ONESAMPLE = 0,
+       HDMI_AUDIO_ONEWORD_TWOSAMPLES = 1
+};
+
+enum hdmi_audio_sample_size {
+       HDMI_AUDIO_SAMPLE_16BITS = 0,
+       HDMI_AUDIO_SAMPLE_24BITS = 1
+};
+
+enum hdmi_audio_transf_mode {
+       HDMI_AUDIO_TRANSF_DMA = 0,
+       HDMI_AUDIO_TRANSF_IRQ = 1
+};
+
+enum hdmi_audio_blk_strt_end_sig {
+       HDMI_AUDIO_BLOCK_SIG_STARTEND_ON = 0,
+       HDMI_AUDIO_BLOCK_SIG_STARTEND_OFF = 1
+};
+
+enum hdmi_core_audio_layout {
+       HDMI_AUDIO_LAYOUT_2CH = 0,
+       HDMI_AUDIO_LAYOUT_8CH = 1
+};
+
+enum hdmi_core_cts_mode {
+       HDMI_AUDIO_CTS_MODE_HW = 0,
+       HDMI_AUDIO_CTS_MODE_SW = 1
+};
+
+enum hdmi_audio_mclk_mode {
+       HDMI_AUDIO_MCLK_128FS = 0,
+       HDMI_AUDIO_MCLK_256FS = 1,
+       HDMI_AUDIO_MCLK_384FS = 2,
+       HDMI_AUDIO_MCLK_512FS = 3,
+       HDMI_AUDIO_MCLK_768FS = 4,
+       HDMI_AUDIO_MCLK_1024FS = 5,
+       HDMI_AUDIO_MCLK_1152FS = 6,
+       HDMI_AUDIO_MCLK_192FS = 7
+};
+
+/* INFOFRAME_AVI_ and INFOFRAME_AUDIO_ definitions */
+enum hdmi_core_infoframe {
+       HDMI_INFOFRAME_AVI_DB1Y_RGB = 0,
+       HDMI_INFOFRAME_AVI_DB1Y_YUV422 = 1,
+       HDMI_INFOFRAME_AVI_DB1Y_YUV444 = 2,
+       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF = 0,
+       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_ON =  1,
+       HDMI_INFOFRAME_AVI_DB1B_NO = 0,
+       HDMI_INFOFRAME_AVI_DB1B_VERT = 1,
+       HDMI_INFOFRAME_AVI_DB1B_HORI = 2,
+       HDMI_INFOFRAME_AVI_DB1B_VERTHORI = 3,
+       HDMI_INFOFRAME_AVI_DB1S_0 = 0,
+       HDMI_INFOFRAME_AVI_DB1S_1 = 1,
+       HDMI_INFOFRAME_AVI_DB1S_2 = 2,
+       HDMI_INFOFRAME_AVI_DB2C_NO = 0,
+       HDMI_INFOFRAME_AVI_DB2C_ITU601 = 1,
+       HDMI_INFOFRAME_AVI_DB2C_ITU709 = 2,
+       HDMI_INFOFRAME_AVI_DB2C_EC_EXTENDED = 3,
+       HDMI_INFOFRAME_AVI_DB2M_NO = 0,
+       HDMI_INFOFRAME_AVI_DB2M_43 = 1,
+       HDMI_INFOFRAME_AVI_DB2M_169 = 2,
+       HDMI_INFOFRAME_AVI_DB2R_SAME = 8,
+       HDMI_INFOFRAME_AVI_DB2R_43 = 9,
+       HDMI_INFOFRAME_AVI_DB2R_169 = 10,
+       HDMI_INFOFRAME_AVI_DB2R_149 = 11,
+       HDMI_INFOFRAME_AVI_DB3ITC_NO = 0,
+       HDMI_INFOFRAME_AVI_DB3ITC_YES = 1,
+       HDMI_INFOFRAME_AVI_DB3EC_XVYUV601 = 0,
+       HDMI_INFOFRAME_AVI_DB3EC_XVYUV709 = 1,
+       HDMI_INFOFRAME_AVI_DB3Q_DEFAULT = 0,
+       HDMI_INFOFRAME_AVI_DB3Q_LR = 1,
+       HDMI_INFOFRAME_AVI_DB3Q_FR = 2,
+       HDMI_INFOFRAME_AVI_DB3SC_NO = 0,
+       HDMI_INFOFRAME_AVI_DB3SC_HORI = 1,
+       HDMI_INFOFRAME_AVI_DB3SC_VERT = 2,
+       HDMI_INFOFRAME_AVI_DB3SC_HORIVERT = 3,
+       HDMI_INFOFRAME_AVI_DB5PR_NO = 0,
+       HDMI_INFOFRAME_AVI_DB5PR_2 = 1,
+       HDMI_INFOFRAME_AVI_DB5PR_3 = 2,
+       HDMI_INFOFRAME_AVI_DB5PR_4 = 3,
+       HDMI_INFOFRAME_AVI_DB5PR_5 = 4,
+       HDMI_INFOFRAME_AVI_DB5PR_6 = 5,
+       HDMI_INFOFRAME_AVI_DB5PR_7 = 6,
+       HDMI_INFOFRAME_AVI_DB5PR_8 = 7,
+       HDMI_INFOFRAME_AVI_DB5PR_9 = 8,
+       HDMI_INFOFRAME_AVI_DB5PR_10 = 9,
+};
+
+struct hdmi_cm {
+       int     code;
+       int     mode;
+};
+
+struct hdmi_video_format {
+       enum hdmi_packing_mode  packing_mode;
+       u32                     y_res;  /* Line per panel */
+       u32                     x_res;  /* pixel per line */
+};
+
+struct hdmi_config {
+       struct omap_video_timings timings;
+       struct hdmi_cm cm;
+};
+
+/* HDMI PLL structure */
+struct hdmi_pll_info {
+       u16 regn;
+       u16 regm;
+       u32 regmf;
+       u16 regm2;
+       u16 regsd;
+       u16 dcofreq;
+       enum hdmi_clk_refsel refsel;
+};
+
+struct hdmi_audio_format {
+       enum hdmi_stereo_channels               stereo_channels;
+       u8                                      active_chnnls_msk;
+       enum hdmi_audio_type                    type;
+       enum hdmi_audio_justify                 justification;
+       enum hdmi_audio_sample_order            sample_order;
+       enum hdmi_audio_samples_perword         samples_per_word;
+       enum hdmi_audio_sample_size             sample_size;
+       enum hdmi_audio_blk_strt_end_sig        en_sig_blk_strt_end;
+};
+
+struct hdmi_audio_dma {
+       u8                              transfer_size;
+       u8                              block_size;
+       enum hdmi_audio_transf_mode     mode;
+       u16                             fifo_threshold;
+};
+
+struct hdmi_core_audio_i2s_config {
+       u8 in_length_bits;
+       u8 justification;
+       u8 sck_edge_mode;
+       u8 vbit;
+       u8 direction;
+       u8 shift;
+       u8 active_sds;
+};
+
+struct hdmi_core_audio_config {
+       struct hdmi_core_audio_i2s_config       i2s_cfg;
+       struct snd_aes_iec958                   *iec60958_cfg;
+       bool                                    fs_override;
+       u32                                     n;
+       u32                                     cts;
+       u32                                     aud_par_busclk;
+       enum hdmi_core_audio_layout             layout;
+       enum hdmi_core_cts_mode                 cts_mode;
+       bool                                    use_mclk;
+       enum hdmi_audio_mclk_mode               mclk_mode;
+       bool                                    en_acr_pkt;
+       bool                                    en_dsd_audio;
+       bool                                    en_parallel_aud_input;
+       bool                                    en_spdif;
+};
+
+/*
+ * Refer to section 8.2 in HDMI 1.3 specification for
+ * details about infoframe databytes
+ */
+struct hdmi_core_infoframe_avi {
+       /* Y0, Y1 rgb,yCbCr */
+       u8      db1_format;
+       /* A0  Active information Present */
+       u8      db1_active_info;
+       /* B0, B1 Bar info data valid */
+       u8      db1_bar_info_dv;
+       /* S0, S1 scan information */
+       u8      db1_scan_info;
+       /* C0, C1 colorimetry */
+       u8      db2_colorimetry;
+       /* M0, M1 Aspect ratio (4:3, 16:9) */
+       u8      db2_aspect_ratio;
+       /* R0...R3 Active format aspect ratio */
+       u8      db2_active_fmt_ar;
+       /* ITC IT content. */
+       u8      db3_itc;
+       /* EC0, EC1, EC2 Extended colorimetry */
+       u8      db3_ec;
+       /* Q1, Q0 Quantization range */
+       u8      db3_q_range;
+       /* SC1, SC0 Non-uniform picture scaling */
+       u8      db3_nup_scaling;
+       /* VIC0..6 Video format identification */
+       u8      db4_videocode;
+       /* PR0..PR3 Pixel repetition factor */
+       u8      db5_pixel_repeat;
+       /* Line number end of top bar */
+       u16     db6_7_line_eoftop;
+       /* Line number start of bottom bar */
+       u16     db8_9_line_sofbottom;
+       /* Pixel number end of left bar */
+       u16     db10_11_pixel_eofleft;
+       /* Pixel number start of right bar */
+       u16     db12_13_pixel_sofright;
+};
+
+struct hdmi_wp_data {
+       void __iomem *base;
+};
+
+struct hdmi_pll_data {
+       void __iomem *base;
+
+       struct hdmi_pll_info info;
+};
+
+struct hdmi_phy_data {
+       void __iomem *base;
+
+       int irq;
+};
+
+struct hdmi_core_data {
+       void __iomem *base;
+
+       struct hdmi_core_infoframe_avi avi_cfg;
+};
+
+static inline void hdmi_write_reg(void __iomem *base_addr, const u16 idx,
+               u32 val)
+{
+       __raw_writel(val, base_addr + idx);
+}
+
+static inline u32 hdmi_read_reg(void __iomem *base_addr, const u16 idx)
+{
+       return __raw_readl(base_addr + idx);
+}
+
+#define REG_FLD_MOD(base, idx, val, start, end) \
+       hdmi_write_reg(base, idx, FLD_MOD(hdmi_read_reg(base, idx),\
+                                                       val, start, end))
+#define REG_GET(base, idx, start, end) \
+       FLD_GET(hdmi_read_reg(base, idx), start, end)
+
+static inline int hdmi_wait_for_bit_change(void __iomem *base_addr,
+               const u16 idx, int b2, int b1, u32 val)
+{
+       u32 t = 0;
+       while (val != REG_GET(base_addr, idx, b2, b1)) {
+               udelay(1);
+               if (t++ > 10000)
+                       return !val;
+       }
+       return val;
+}
+
+/* HDMI wrapper funcs */
+int hdmi_wp_video_start(struct hdmi_wp_data *wp);
+void hdmi_wp_video_stop(struct hdmi_wp_data *wp);
+void hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s);
+u32 hdmi_wp_get_irqstatus(struct hdmi_wp_data *wp);
+void hdmi_wp_set_irqstatus(struct hdmi_wp_data *wp, u32 irqstatus);
+void hdmi_wp_set_irqenable(struct hdmi_wp_data *wp, u32 mask);
+void hdmi_wp_clear_irqenable(struct hdmi_wp_data *wp, u32 mask);
+int hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val);
+int hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val);
+void hdmi_wp_video_config_format(struct hdmi_wp_data *wp,
+               struct hdmi_video_format *video_fmt);
+void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp,
+               struct omap_video_timings *timings);
+void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp,
+               struct omap_video_timings *timings);
+void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt,
+               struct omap_video_timings *timings, struct hdmi_config *param);
+int hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp);
+
+/* HDMI PLL funcs */
+int hdmi_pll_enable(struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
+void hdmi_pll_disable(struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
+void hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s);
+void hdmi_pll_compute(struct hdmi_pll_data *pll, unsigned long clkin, int phy);
+int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll);
+
+/* HDMI PHY funcs */
+int hdmi_phy_enable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp,
+               struct hdmi_config *cfg);
+void hdmi_phy_disable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp);
+void hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s);
+int hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy);
+
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts);
+int hdmi_wp_audio_enable(struct hdmi_wp_data *wp, bool enable);
+int hdmi_wp_audio_core_req_enable(struct hdmi_wp_data *wp, bool enable);
+void hdmi_wp_audio_config_format(struct hdmi_wp_data *wp,
+               struct hdmi_audio_format *aud_fmt);
+void hdmi_wp_audio_config_dma(struct hdmi_wp_data *wp,
+               struct hdmi_audio_dma *aud_dma);
+#endif
+#endif
diff --git a/drivers/video/omap2/dss/hdmi4.c b/drivers/video/omap2/dss/hdmi4.c
new file mode 100644 (file)
index 0000000..324ecd0
--- /dev/null
@@ -0,0 +1,1124 @@
+/*
+ * HDMI interface DSS driver for TI's OMAP4 family of SoCs.
+ * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/
+ * Authors: Yong Zhi
+ *     Mythri pk <mythripk@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/>.
+ */
+
+#define DSS_SUBSYS_NAME "HDMI"
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/mutex.h>
+#include <linux/delay.h>
+#include <linux/string.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/clk.h>
+#include <linux/gpio.h>
+#include <linux/regulator/consumer.h>
+#include <video/omapdss.h>
+
+#include "hdmi4_core.h"
+#include "dss.h"
+#include "dss_features.h"
+
+/* HDMI EDID Length move this */
+#define HDMI_EDID_MAX_LENGTH                   256
+#define EDID_TIMING_DESCRIPTOR_SIZE            0x12
+#define EDID_DESCRIPTOR_BLOCK0_ADDRESS         0x36
+#define EDID_DESCRIPTOR_BLOCK1_ADDRESS         0x80
+#define EDID_SIZE_BLOCK0_TIMING_DESCRIPTOR     4
+#define EDID_SIZE_BLOCK1_TIMING_DESCRIPTOR     4
+
+static struct {
+       struct mutex lock;
+       struct platform_device *pdev;
+
+       struct hdmi_wp_data     wp;
+       struct hdmi_pll_data    pll;
+       struct hdmi_phy_data    phy;
+       struct hdmi_core_data   core;
+
+       struct hdmi_config cfg;
+
+       struct clk *sys_clk;
+       struct regulator *vdda_hdmi_dac_reg;
+
+       bool core_enabled;
+
+       struct omap_dss_device output;
+} hdmi;
+
+/*
+ * Logic for the below structure :
+ * user enters the CEA or VESA timings by specifying the HDMI/DVI code.
+ * There is a correspondence between CEA/VESA timing and code, please
+ * refer to section 6.3 in HDMI 1.3 specification for timing code.
+ *
+ * In the below structure, cea_vesa_timings corresponds to all OMAP4
+ * supported CEA and VESA timing values.code_cea corresponds to the CEA
+ * code, It is used to get the timing from cea_vesa_timing array.Similarly
+ * with code_vesa. Code_index is used for back mapping, that is once EDID
+ * is read from the TV, EDID is parsed to find the timing values and then
+ * map it to corresponding CEA or VESA index.
+ */
+
+static const struct hdmi_config cea_timings[] = {
+       {
+               { 640, 480, 25200, 96, 16, 48, 2, 10, 33,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 1, HDMI_HDMI },
+       },
+       {
+               { 720, 480, 27027, 62, 16, 60, 6, 9, 30,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 2, HDMI_HDMI },
+       },
+       {
+               { 1280, 720, 74250, 40, 110, 220, 5, 5, 20,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 4, HDMI_HDMI },
+       },
+       {
+               { 1920, 540, 74250, 44, 88, 148, 5, 2, 15,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       true, },
+               { 5, HDMI_HDMI },
+       },
+       {
+               { 1440, 240, 27027, 124, 38, 114, 3, 4, 15,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       true, },
+               { 6, HDMI_HDMI },
+       },
+       {
+               { 1920, 1080, 148500, 44, 88, 148, 5, 4, 36,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 16, HDMI_HDMI },
+       },
+       {
+               { 720, 576, 27000, 64, 12, 68, 5, 5, 39,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 17, HDMI_HDMI },
+       },
+       {
+               { 1280, 720, 74250, 40, 440, 220, 5, 5, 20,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 19, HDMI_HDMI },
+       },
+       {
+               { 1920, 540, 74250, 44, 528, 148, 5, 2, 15,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       true, },
+               { 20, HDMI_HDMI },
+       },
+       {
+               { 1440, 288, 27000, 126, 24, 138, 3, 2, 19,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       true, },
+               { 21, HDMI_HDMI },
+       },
+       {
+               { 1440, 576, 54000, 128, 24, 136, 5, 5, 39,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 29, HDMI_HDMI },
+       },
+       {
+               { 1920, 1080, 148500, 44, 528, 148, 5, 4, 36,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 31, HDMI_HDMI },
+       },
+       {
+               { 1920, 1080, 74250, 44, 638, 148, 5, 4, 36,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 32, HDMI_HDMI },
+       },
+       {
+               { 2880, 480, 108108, 248, 64, 240, 6, 9, 30,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 35, HDMI_HDMI },
+       },
+       {
+               { 2880, 576, 108000, 256, 48, 272, 5, 5, 39,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 37, HDMI_HDMI },
+       },
+};
+
+static const struct hdmi_config vesa_timings[] = {
+/* VESA From Here */
+       {
+               { 640, 480, 25175, 96, 16, 48, 2, 11, 31,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 4, HDMI_DVI },
+       },
+       {
+               { 800, 600, 40000, 128, 40, 88, 4, 1, 23,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 9, HDMI_DVI },
+       },
+       {
+               { 848, 480, 33750, 112, 16, 112, 8, 6, 23,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0xE, HDMI_DVI },
+       },
+       {
+               { 1280, 768, 79500, 128, 64, 192, 7, 3, 20,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x17, HDMI_DVI },
+       },
+       {
+               { 1280, 800, 83500, 128, 72, 200, 6, 3, 22,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x1C, HDMI_DVI },
+       },
+       {
+               { 1360, 768, 85500, 112, 64, 256, 6, 3, 18,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x27, HDMI_DVI },
+       },
+       {
+               { 1280, 960, 108000, 112, 96, 312, 3, 1, 36,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x20, HDMI_DVI },
+       },
+       {
+               { 1280, 1024, 108000, 112, 48, 248, 3, 1, 38,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x23, HDMI_DVI },
+       },
+       {
+               { 1024, 768, 65000, 136, 24, 160, 6, 3, 29,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x10, HDMI_DVI },
+       },
+       {
+               { 1400, 1050, 121750, 144, 88, 232, 4, 3, 32,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x2A, HDMI_DVI },
+       },
+       {
+               { 1440, 900, 106500, 152, 80, 232, 6, 3, 25,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x2F, HDMI_DVI },
+       },
+       {
+               { 1680, 1050, 146250, 176 , 104, 280, 6, 3, 30,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_LOW,
+                       false, },
+               { 0x3A, HDMI_DVI },
+       },
+       {
+               { 1366, 768, 85500, 143, 70, 213, 3, 3, 24,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x51, HDMI_DVI },
+       },
+       {
+               { 1920, 1080, 148500, 44, 148, 80, 5, 4, 36,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x52, HDMI_DVI },
+       },
+       {
+               { 1280, 768, 68250, 32, 48, 80, 7, 3, 12,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x16, HDMI_DVI },
+       },
+       {
+               { 1400, 1050, 101000, 32, 48, 80, 4, 3, 23,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x29, HDMI_DVI },
+       },
+       {
+               { 1680, 1050, 119000, 32, 48, 80, 6, 3, 21,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x39, HDMI_DVI },
+       },
+       {
+               { 1280, 800, 79500, 32, 48, 80, 6, 3, 14,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x1B, HDMI_DVI },
+       },
+       {
+               { 1280, 720, 74250, 40, 110, 220, 5, 5, 20,
+                       OMAPDSS_SIG_ACTIVE_HIGH, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x55, HDMI_DVI },
+       },
+       {
+               { 1920, 1200, 154000, 32, 48, 80, 6, 3, 26,
+                       OMAPDSS_SIG_ACTIVE_LOW, OMAPDSS_SIG_ACTIVE_HIGH,
+                       false, },
+               { 0x44, HDMI_DVI },
+       },
+};
+
+static int hdmi_runtime_get(void)
+{
+       int r;
+
+       DSSDBG("hdmi_runtime_get\n");
+
+       r = pm_runtime_get_sync(&hdmi.pdev->dev);
+       WARN_ON(r < 0);
+       if (r < 0)
+               return r;
+
+       return 0;
+}
+
+static void hdmi_runtime_put(void)
+{
+       int r;
+
+       DSSDBG("hdmi_runtime_put\n");
+
+       r = pm_runtime_put_sync(&hdmi.pdev->dev);
+       WARN_ON(r < 0 && r != -ENOSYS);
+}
+
+static int hdmi_init_regulator(void)
+{
+       struct regulator *reg;
+
+       if (hdmi.vdda_hdmi_dac_reg != NULL)
+               return 0;
+
+       reg = devm_regulator_get(&hdmi.pdev->dev, "vdda_hdmi_dac");
+
+       /* DT HACK: try VDAC to make omapdss work for o4 sdp/panda */
+       if (IS_ERR(reg))
+               reg = devm_regulator_get(&hdmi.pdev->dev, "VDAC");
+
+       if (IS_ERR(reg)) {
+               DSSERR("can't get VDDA_HDMI_DAC regulator\n");
+               return PTR_ERR(reg);
+       }
+
+       hdmi.vdda_hdmi_dac_reg = reg;
+
+       return 0;
+}
+
+static const struct hdmi_config *hdmi_find_timing(
+                                       const struct hdmi_config *timings_arr,
+                                       int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++) {
+               if (timings_arr[i].cm.code == hdmi.cfg.cm.code)
+                       return &timings_arr[i];
+       }
+       return NULL;
+}
+
+static const struct hdmi_config *hdmi_get_timings(void)
+{
+       const struct hdmi_config *arr;
+       int len;
+
+       if (hdmi.cfg.cm.mode == HDMI_DVI) {
+               arr = vesa_timings;
+               len = ARRAY_SIZE(vesa_timings);
+       } else {
+               arr = cea_timings;
+               len = ARRAY_SIZE(cea_timings);
+       }
+
+       return hdmi_find_timing(arr, len);
+}
+
+static bool hdmi_timings_compare(struct omap_video_timings *timing1,
+                               const struct omap_video_timings *timing2)
+{
+       int timing1_vsync, timing1_hsync, timing2_vsync, timing2_hsync;
+
+       if ((DIV_ROUND_CLOSEST(timing2->pixel_clock, 1000) ==
+                       DIV_ROUND_CLOSEST(timing1->pixel_clock, 1000)) &&
+               (timing2->x_res == timing1->x_res) &&
+               (timing2->y_res == timing1->y_res)) {
+
+               timing2_hsync = timing2->hfp + timing2->hsw + timing2->hbp;
+               timing1_hsync = timing1->hfp + timing1->hsw + timing1->hbp;
+               timing2_vsync = timing2->vfp + timing2->vsw + timing2->vbp;
+               timing1_vsync = timing2->vfp + timing2->vsw + timing2->vbp;
+
+               DSSDBG("timing1_hsync = %d timing1_vsync = %d"\
+                       "timing2_hsync = %d timing2_vsync = %d\n",
+                       timing1_hsync, timing1_vsync,
+                       timing2_hsync, timing2_vsync);
+
+               if ((timing1_hsync == timing2_hsync) &&
+                       (timing1_vsync == timing2_vsync)) {
+                       return true;
+               }
+       }
+       return false;
+}
+
+static struct hdmi_cm hdmi_get_code(struct omap_video_timings *timing)
+{
+       int i;
+       struct hdmi_cm cm = {-1};
+       DSSDBG("hdmi_get_code\n");
+
+       for (i = 0; i < ARRAY_SIZE(cea_timings); i++) {
+               if (hdmi_timings_compare(timing, &cea_timings[i].timings)) {
+                       cm = cea_timings[i].cm;
+                       goto end;
+               }
+       }
+       for (i = 0; i < ARRAY_SIZE(vesa_timings); i++) {
+               if (hdmi_timings_compare(timing, &vesa_timings[i].timings)) {
+                       cm = vesa_timings[i].cm;
+                       goto end;
+               }
+       }
+
+end:   return cm;
+
+}
+
+static int hdmi_power_on_core(struct omap_dss_device *dssdev)
+{
+       int r;
+
+       r = regulator_enable(hdmi.vdda_hdmi_dac_reg);
+       if (r)
+               return r;
+
+       r = hdmi_runtime_get();
+       if (r)
+               goto err_runtime_get;
+
+       /* Make selection of HDMI in DSS */
+       dss_select_hdmi_venc_clk_source(DSS_HDMI_M_PCLK);
+
+       hdmi.core_enabled = true;
+
+       return 0;
+
+err_runtime_get:
+       regulator_disable(hdmi.vdda_hdmi_dac_reg);
+
+       return r;
+}
+
+static void hdmi_power_off_core(struct omap_dss_device *dssdev)
+{
+       hdmi.core_enabled = false;
+
+       hdmi_runtime_put();
+       regulator_disable(hdmi.vdda_hdmi_dac_reg);
+}
+
+static int hdmi_power_on_full(struct omap_dss_device *dssdev)
+{
+       int r;
+       struct omap_video_timings *p;
+       struct omap_overlay_manager *mgr = hdmi.output.manager;
+       unsigned long phy;
+
+       r = hdmi_power_on_core(dssdev);
+       if (r)
+               return r;
+
+       dss_mgr_disable(mgr);
+
+       p = &hdmi.cfg.timings;
+
+       DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res);
+
+       phy = p->pixel_clock;
+
+       hdmi_pll_compute(&hdmi.pll, clk_get_rate(hdmi.sys_clk), phy);
+
+       hdmi_wp_video_stop(&hdmi.wp);
+
+       /* config the PLL and PHY hdmi_set_pll_pwrfirst */
+       r = hdmi_pll_enable(&hdmi.pll, &hdmi.wp);
+       if (r) {
+               DSSDBG("Failed to lock PLL\n");
+               goto err_pll_enable;
+       }
+
+       r = hdmi_phy_enable(&hdmi.phy, &hdmi.wp, &hdmi.cfg);
+       if (r) {
+               DSSDBG("Failed to start PHY\n");
+               goto err_phy_enable;
+       }
+
+       hdmi4_configure(&hdmi.core, &hdmi.wp, &hdmi.cfg);
+
+       /* bypass TV gamma table */
+       dispc_enable_gamma_table(0);
+
+       /* tv size */
+       dss_mgr_set_timings(mgr, p);
+
+       r = hdmi_wp_video_start(&hdmi.wp);
+       if (r)
+               goto err_vid_enable;
+
+       r = dss_mgr_enable(mgr);
+       if (r)
+               goto err_mgr_enable;
+
+       return 0;
+
+err_mgr_enable:
+       hdmi_wp_video_stop(&hdmi.wp);
+err_vid_enable:
+       hdmi_phy_disable(&hdmi.phy, &hdmi.wp);
+err_phy_enable:
+       hdmi_pll_disable(&hdmi.pll, &hdmi.wp);
+err_pll_enable:
+       hdmi_power_off_core(dssdev);
+       return -EIO;
+}
+
+static void hdmi_power_off_full(struct omap_dss_device *dssdev)
+{
+       struct omap_overlay_manager *mgr = hdmi.output.manager;
+
+       dss_mgr_disable(mgr);
+
+       hdmi_wp_video_stop(&hdmi.wp);
+       hdmi_phy_disable(&hdmi.phy, &hdmi.wp);
+       hdmi_pll_disable(&hdmi.pll, &hdmi.wp);
+
+       hdmi_power_off_core(dssdev);
+}
+
+static int hdmi_display_check_timing(struct omap_dss_device *dssdev,
+                                       struct omap_video_timings *timings)
+{
+       struct hdmi_cm cm;
+
+       cm = hdmi_get_code(timings);
+       if (cm.code == -1)
+               return -EINVAL;
+
+       return 0;
+
+}
+
+static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
+               struct omap_video_timings *timings)
+{
+       struct hdmi_cm cm;
+       const struct hdmi_config *t;
+
+       mutex_lock(&hdmi.lock);
+
+       cm = hdmi_get_code(timings);
+       hdmi.cfg.cm = cm;
+
+       t = hdmi_get_timings();
+       if (t != NULL) {
+               hdmi.cfg = *t;
+
+               dispc_set_tv_pclk(t->timings.pixel_clock * 1000);
+       }
+
+       mutex_unlock(&hdmi.lock);
+}
+
+static void hdmi_display_get_timings(struct omap_dss_device *dssdev,
+               struct omap_video_timings *timings)
+{
+       const struct hdmi_config *cfg;
+
+       cfg = hdmi_get_timings();
+       if (cfg == NULL)
+               cfg = &vesa_timings[0];
+
+       memcpy(timings, &cfg->timings, sizeof(cfg->timings));
+}
+
+static void hdmi_dump_regs(struct seq_file *s)
+{
+       mutex_lock(&hdmi.lock);
+
+       if (hdmi_runtime_get()) {
+               mutex_unlock(&hdmi.lock);
+               return;
+       }
+
+       hdmi_wp_dump(&hdmi.wp, s);
+       hdmi_pll_dump(&hdmi.pll, s);
+       hdmi_phy_dump(&hdmi.phy, s);
+       hdmi4_core_dump(&hdmi.core, s);
+
+       hdmi_runtime_put();
+       mutex_unlock(&hdmi.lock);
+}
+
+static int read_edid(u8 *buf, int len)
+{
+       int r;
+
+       mutex_lock(&hdmi.lock);
+
+       r = hdmi_runtime_get();
+       BUG_ON(r);
+
+       r = hdmi4_read_edid(&hdmi.core,  buf, len);
+
+       hdmi_runtime_put();
+       mutex_unlock(&hdmi.lock);
+
+       return r;
+}
+
+static int hdmi_display_enable(struct omap_dss_device *dssdev)
+{
+       struct omap_dss_device *out = &hdmi.output;
+       int r = 0;
+
+       DSSDBG("ENTER hdmi_display_enable\n");
+
+       mutex_lock(&hdmi.lock);
+
+       if (out == NULL || out->manager == NULL) {
+               DSSERR("failed to enable display: no output/manager\n");
+               r = -ENODEV;
+               goto err0;
+       }
+
+       r = hdmi_power_on_full(dssdev);
+       if (r) {
+               DSSERR("failed to power on device\n");
+               goto err0;
+       }
+
+       mutex_unlock(&hdmi.lock);
+       return 0;
+
+err0:
+       mutex_unlock(&hdmi.lock);
+       return r;
+}
+
+static void hdmi_display_disable(struct omap_dss_device *dssdev)
+{
+       DSSDBG("Enter hdmi_display_disable\n");
+
+       mutex_lock(&hdmi.lock);
+
+       hdmi_power_off_full(dssdev);
+
+       mutex_unlock(&hdmi.lock);
+}
+
+static int hdmi_core_enable(struct omap_dss_device *dssdev)
+{
+       int r = 0;
+
+       DSSDBG("ENTER omapdss_hdmi_core_enable\n");
+
+       mutex_lock(&hdmi.lock);
+
+       r = hdmi_power_on_core(dssdev);
+       if (r) {
+               DSSERR("failed to power on device\n");
+               goto err0;
+       }
+
+       mutex_unlock(&hdmi.lock);
+       return 0;
+
+err0:
+       mutex_unlock(&hdmi.lock);
+       return r;
+}
+
+static void hdmi_core_disable(struct omap_dss_device *dssdev)
+{
+       DSSDBG("Enter omapdss_hdmi_core_disable\n");
+
+       mutex_lock(&hdmi.lock);
+
+       hdmi_power_off_core(dssdev);
+
+       mutex_unlock(&hdmi.lock);
+}
+
+static int hdmi_get_clocks(struct platform_device *pdev)
+{
+       struct clk *clk;
+
+       clk = devm_clk_get(&pdev->dev, "sys_clk");
+       if (IS_ERR(clk)) {
+               DSSERR("can't get sys_clk\n");
+               return PTR_ERR(clk);
+       }
+
+       hdmi.sys_clk = clk;
+
+       return 0;
+}
+
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts)
+{
+       u32 deep_color;
+       bool deep_color_correct = false;
+       u32 pclk = hdmi.cfg.timings.pixel_clock;
+
+       if (n == NULL || cts == NULL)
+               return -EINVAL;
+
+       /* TODO: When implemented, query deep color mode here. */
+       deep_color = 100;
+
+       /*
+        * When using deep color, the default N value (as in the HDMI
+        * specification) yields to an non-integer CTS. Hence, we
+        * modify it while keeping the restrictions described in
+        * section 7.2.1 of the HDMI 1.4a specification.
+        */
+       switch (sample_freq) {
+       case 32000:
+       case 48000:
+       case 96000:
+       case 192000:
+               if (deep_color == 125)
+                       if (pclk == 27027 || pclk == 74250)
+                               deep_color_correct = true;
+               if (deep_color == 150)
+                       if (pclk == 27027)
+                               deep_color_correct = true;
+               break;
+       case 44100:
+       case 88200:
+       case 176400:
+               if (deep_color == 125)
+                       if (pclk == 27027)
+                               deep_color_correct = true;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if (deep_color_correct) {
+               switch (sample_freq) {
+               case 32000:
+                       *n = 8192;
+                       break;
+               case 44100:
+                       *n = 12544;
+                       break;
+               case 48000:
+                       *n = 8192;
+                       break;
+               case 88200:
+                       *n = 25088;
+                       break;
+               case 96000:
+                       *n = 16384;
+                       break;
+               case 176400:
+                       *n = 50176;
+                       break;
+               case 192000:
+                       *n = 32768;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       } else {
+               switch (sample_freq) {
+               case 32000:
+                       *n = 4096;
+                       break;
+               case 44100:
+                       *n = 6272;
+                       break;
+               case 48000:
+                       *n = 6144;
+                       break;
+               case 88200:
+                       *n = 12544;
+                       break;
+               case 96000:
+                       *n = 12288;
+                       break;
+               case 176400:
+                       *n = 25088;
+                       break;
+               case 192000:
+                       *n = 24576;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+       /* Calculate CTS. See HDMI 1.3a or 1.4a specifications */
+       *cts = pclk * (*n / 128) * deep_color / (sample_freq / 10);
+
+       return 0;
+}
+
+static bool hdmi_mode_has_audio(void)
+{
+       if (hdmi.cfg.cm.mode == HDMI_HDMI)
+               return true;
+       else
+               return false;
+}
+
+#endif
+
+static int hdmi_connect(struct omap_dss_device *dssdev,
+               struct omap_dss_device *dst)
+{
+       struct omap_overlay_manager *mgr;
+       int r;
+
+       r = hdmi_init_regulator();
+       if (r)
+               return r;
+
+       mgr = omap_dss_get_overlay_manager(dssdev->dispc_channel);
+       if (!mgr)
+               return -ENODEV;
+
+       r = dss_mgr_connect(mgr, dssdev);
+       if (r)
+               return r;
+
+       r = omapdss_output_set_device(dssdev, dst);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dst->name);
+               dss_mgr_disconnect(mgr, dssdev);
+               return r;
+       }
+
+       return 0;
+}
+
+static void hdmi_disconnect(struct omap_dss_device *dssdev,
+               struct omap_dss_device *dst)
+{
+       WARN_ON(dst != dssdev->dst);
+
+       if (dst != dssdev->dst)
+               return;
+
+       omapdss_output_unset_device(dssdev);
+
+       if (dssdev->manager)
+               dss_mgr_disconnect(dssdev->manager, dssdev);
+}
+
+static int hdmi_read_edid(struct omap_dss_device *dssdev,
+               u8 *edid, int len)
+{
+       bool need_enable;
+       int r;
+
+       need_enable = hdmi.core_enabled == false;
+
+       if (need_enable) {
+               r = hdmi_core_enable(dssdev);
+               if (r)
+                       return r;
+       }
+
+       r = read_edid(edid, len);
+
+       if (need_enable)
+               hdmi_core_disable(dssdev);
+
+       return r;
+}
+
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+static int hdmi_audio_enable(struct omap_dss_device *dssdev)
+{
+       int r;
+
+       mutex_lock(&hdmi.lock);
+
+       if (!hdmi_mode_has_audio()) {
+               r = -EPERM;
+               goto err;
+       }
+
+       r = hdmi_wp_audio_enable(&hdmi.wp, true);
+       if (r)
+               goto err;
+
+       mutex_unlock(&hdmi.lock);
+       return 0;
+
+err:
+       mutex_unlock(&hdmi.lock);
+       return r;
+}
+
+static void hdmi_audio_disable(struct omap_dss_device *dssdev)
+{
+       hdmi_wp_audio_enable(&hdmi.wp, false);
+}
+
+static int hdmi_audio_start(struct omap_dss_device *dssdev)
+{
+       return hdmi4_audio_start(&hdmi.core, &hdmi.wp);
+}
+
+static void hdmi_audio_stop(struct omap_dss_device *dssdev)
+{
+       hdmi4_audio_stop(&hdmi.core, &hdmi.wp);
+}
+
+static bool hdmi_audio_supported(struct omap_dss_device *dssdev)
+{
+       bool r;
+
+       mutex_lock(&hdmi.lock);
+
+       r = hdmi_mode_has_audio();
+
+       mutex_unlock(&hdmi.lock);
+       return r;
+}
+
+static int hdmi_audio_config(struct omap_dss_device *dssdev,
+               struct omap_dss_audio *audio)
+{
+       int r;
+
+       mutex_lock(&hdmi.lock);
+
+       if (!hdmi_mode_has_audio()) {
+               r = -EPERM;
+               goto err;
+       }
+
+       r = hdmi4_audio_config(&hdmi.core, &hdmi.wp, audio);
+       if (r)
+               goto err;
+
+       mutex_unlock(&hdmi.lock);
+       return 0;
+
+err:
+       mutex_unlock(&hdmi.lock);
+       return r;
+}
+#else
+static int hdmi_audio_enable(struct omap_dss_device *dssdev)
+{
+       return -EPERM;
+}
+
+static void hdmi_audio_disable(struct omap_dss_device *dssdev)
+{
+}
+
+static int hdmi_audio_start(struct omap_dss_device *dssdev)
+{
+       return -EPERM;
+}
+
+static void hdmi_audio_stop(struct omap_dss_device *dssdev)
+{
+}
+
+static bool hdmi_audio_supported(struct omap_dss_device *dssdev)
+{
+       return false;
+}
+
+static int hdmi_audio_config(struct omap_dss_device *dssdev,
+               struct omap_dss_audio *audio)
+{
+       return -EPERM;
+}
+#endif
+
+static const struct omapdss_hdmi_ops hdmi_ops = {
+       .connect                = hdmi_connect,
+       .disconnect             = hdmi_disconnect,
+
+       .enable                 = hdmi_display_enable,
+       .disable                = hdmi_display_disable,
+
+       .check_timings          = hdmi_display_check_timing,
+       .set_timings            = hdmi_display_set_timing,
+       .get_timings            = hdmi_display_get_timings,
+
+       .read_edid              = hdmi_read_edid,
+
+       .audio_enable           = hdmi_audio_enable,
+       .audio_disable          = hdmi_audio_disable,
+       .audio_start            = hdmi_audio_start,
+       .audio_stop             = hdmi_audio_stop,
+       .audio_supported        = hdmi_audio_supported,
+       .audio_config           = hdmi_audio_config,
+};
+
+static void hdmi_init_output(struct platform_device *pdev)
+{
+       struct omap_dss_device *out = &hdmi.output;
+
+       out->dev = &pdev->dev;
+       out->id = OMAP_DSS_OUTPUT_HDMI;
+       out->output_type = OMAP_DISPLAY_TYPE_HDMI;
+       out->name = "hdmi.0";
+       out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
+       out->ops.hdmi = &hdmi_ops;
+       out->owner = THIS_MODULE;
+
+       omapdss_register_output(out);
+}
+
+static void __exit hdmi_uninit_output(struct platform_device *pdev)
+{
+       struct omap_dss_device *out = &hdmi.output;
+
+       omapdss_unregister_output(out);
+}
+
+/* HDMI HW IP initialisation */
+static int omapdss_hdmihw_probe(struct platform_device *pdev)
+{
+       int r;
+
+       hdmi.pdev = pdev;
+
+       mutex_init(&hdmi.lock);
+
+       r = hdmi_wp_init(pdev, &hdmi.wp);
+       if (r)
+               return r;
+
+       r = hdmi_pll_init(pdev, &hdmi.pll);
+       if (r)
+               return r;
+
+       r = hdmi_phy_init(pdev, &hdmi.phy);
+       if (r)
+               return r;
+
+       r = hdmi4_core_init(pdev, &hdmi.core);
+       if (r)
+               return r;
+
+       r = hdmi_get_clocks(pdev);
+       if (r) {
+               DSSERR("can't get clocks\n");
+               return r;
+       }
+
+       pm_runtime_enable(&pdev->dev);
+
+       hdmi_init_output(pdev);
+
+       dss_debugfs_create_file("hdmi", hdmi_dump_regs);
+
+       return 0;
+}
+
+static int __exit omapdss_hdmihw_remove(struct platform_device *pdev)
+{
+       hdmi_uninit_output(pdev);
+
+       pm_runtime_disable(&pdev->dev);
+
+       return 0;
+}
+
+static int hdmi_runtime_suspend(struct device *dev)
+{
+       clk_disable_unprepare(hdmi.sys_clk);
+
+       dispc_runtime_put();
+
+       return 0;
+}
+
+static int hdmi_runtime_resume(struct device *dev)
+{
+       int r;
+
+       r = dispc_runtime_get();
+       if (r < 0)
+               return r;
+
+       clk_prepare_enable(hdmi.sys_clk);
+
+       return 0;
+}
+
+static const struct dev_pm_ops hdmi_pm_ops = {
+       .runtime_suspend = hdmi_runtime_suspend,
+       .runtime_resume = hdmi_runtime_resume,
+};
+
+static struct platform_driver omapdss_hdmihw_driver = {
+       .probe          = omapdss_hdmihw_probe,
+       .remove         = __exit_p(omapdss_hdmihw_remove),
+       .driver         = {
+               .name   = "omapdss_hdmi",
+               .owner  = THIS_MODULE,
+               .pm     = &hdmi_pm_ops,
+       },
+};
+
+int __init hdmi4_init_platform_driver(void)
+{
+       return platform_driver_register(&omapdss_hdmihw_driver);
+}
+
+void __exit hdmi4_uninit_platform_driver(void)
+{
+       platform_driver_unregister(&omapdss_hdmihw_driver);
+}
diff --git a/drivers/video/omap2/dss/hdmi4_core.c b/drivers/video/omap2/dss/hdmi4_core.c
new file mode 100644 (file)
index 0000000..3f7fc57
--- /dev/null
@@ -0,0 +1,1034 @@
+/*
+ * ti_hdmi_4xxx_ip.c
+ *
+ * HDMI TI81xx, TI38xx, TI OMAP4 etc IP driver Library
+ * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/
+ * Authors: Yong Zhi
+ *     Mythri pk <mythripk@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/module.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/mutex.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/string.h>
+#include <linux/seq_file.h>
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+#include <sound/asound.h>
+#include <sound/asoundef.h>
+#endif
+
+#include "hdmi4_core.h"
+#include "dss_features.h"
+
+#define HDMI_CORE_AV           0x500
+
+static inline void __iomem *hdmi_av_base(struct hdmi_core_data *core)
+{
+       return core->base + HDMI_CORE_AV;
+}
+
+static int hdmi_core_ddc_init(struct hdmi_core_data *core)
+{
+       void __iomem *base = core->base;
+
+       /* Turn on CLK for DDC */
+       REG_FLD_MOD(base, HDMI_CORE_AV_DPD, 0x7, 2, 0);
+
+       /* IN_PROG */
+       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 4, 4) == 1) {
+               /* Abort transaction */
+               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0xf, 3, 0);
+               /* IN_PROG */
+               if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
+                                       4, 4, 0) != 0) {
+                       DSSERR("Timeout aborting DDC transaction\n");
+                       return -ETIMEDOUT;
+               }
+       }
+
+       /* Clk SCL Devices */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0xA, 3, 0);
+
+       /* HDMI_CORE_DDC_STATUS_IN_PROG */
+       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
+                               4, 4, 0) != 0) {
+               DSSERR("Timeout starting SCL clock\n");
+               return -ETIMEDOUT;
+       }
+
+       /* Clear FIFO */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x9, 3, 0);
+
+       /* HDMI_CORE_DDC_STATUS_IN_PROG */
+       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
+                               4, 4, 0) != 0) {
+               DSSERR("Timeout clearing DDC fifo\n");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int hdmi_core_ddc_edid(struct hdmi_core_data *core,
+               u8 *pedid, int ext)
+{
+       void __iomem *base = core->base;
+       u32 i;
+       char checksum;
+       u32 offset = 0;
+
+       /* HDMI_CORE_DDC_STATUS_IN_PROG */
+       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
+                               4, 4, 0) != 0) {
+               DSSERR("Timeout waiting DDC to be ready\n");
+               return -ETIMEDOUT;
+       }
+
+       if (ext % 2 != 0)
+               offset = 0x80;
+
+       /* Load Segment Address Register */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_SEGM, ext / 2, 7, 0);
+
+       /* Load Slave Address Register */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_ADDR, 0xA0 >> 1, 7, 1);
+
+       /* Load Offset Address Register */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_OFFSET, offset, 7, 0);
+
+       /* Load Byte Count */
+       REG_FLD_MOD(base, HDMI_CORE_DDC_COUNT1, 0x80, 7, 0);
+       REG_FLD_MOD(base, HDMI_CORE_DDC_COUNT2, 0x0, 1, 0);
+
+       /* Set DDC_CMD */
+       if (ext)
+               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x4, 3, 0);
+       else
+               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x2, 3, 0);
+
+       /* HDMI_CORE_DDC_STATUS_BUS_LOW */
+       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 6, 6) == 1) {
+               pr_err("I2C Bus Low?\n");
+               return -EIO;
+       }
+       /* HDMI_CORE_DDC_STATUS_NO_ACK */
+       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 5, 5) == 1) {
+               pr_err("I2C No Ack\n");
+               return -EIO;
+       }
+
+       for (i = 0; i < 0x80; ++i) {
+               int t;
+
+               /* IN_PROG */
+               if (REG_GET(base, HDMI_CORE_DDC_STATUS, 4, 4) == 0) {
+                       DSSERR("operation stopped when reading edid\n");
+                       return -EIO;
+               }
+
+               t = 0;
+               /* FIFO_EMPTY */
+               while (REG_GET(base, HDMI_CORE_DDC_STATUS, 2, 2) == 1) {
+                       if (t++ > 10000) {
+                               DSSERR("timeout reading edid\n");
+                               return -ETIMEDOUT;
+                       }
+                       udelay(1);
+               }
+
+               pedid[i] = REG_GET(base, HDMI_CORE_DDC_DATA, 7, 0);
+       }
+
+       checksum = 0;
+       for (i = 0; i < 0x80; ++i)
+               checksum += pedid[i];
+
+       if (checksum != 0) {
+               pr_err("E-EDID checksum failed!!\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+int hdmi4_read_edid(struct hdmi_core_data *core, u8 *edid, int len)
+{
+       int r, l;
+
+       if (len < 128)
+               return -EINVAL;
+
+       r = hdmi_core_ddc_init(core);
+       if (r)
+               return r;
+
+       r = hdmi_core_ddc_edid(core, edid, 0);
+       if (r)
+               return r;
+
+       l = 128;
+
+       if (len >= 128 * 2 && edid[0x7e] > 0) {
+               r = hdmi_core_ddc_edid(core, edid + 0x80, 1);
+               if (r)
+                       return r;
+               l += 128;
+       }
+
+       return l;
+}
+
+static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
+                       struct hdmi_core_infoframe_avi *avi_cfg,
+                       struct hdmi_core_packet_enable_repeat *repeat_cfg)
+{
+       pr_debug("Enter hdmi_core_init\n");
+
+       /* video core */
+       video_cfg->ip_bus_width = HDMI_INPUT_8BIT;
+       video_cfg->op_dither_truc = HDMI_OUTPUTTRUNCATION_8BIT;
+       video_cfg->deep_color_pkt = HDMI_DEEPCOLORPACKECTDISABLE;
+       video_cfg->pkt_mode = HDMI_PACKETMODERESERVEDVALUE;
+       video_cfg->hdmi_dvi = HDMI_DVI;
+       video_cfg->tclk_sel_clkmult = HDMI_FPLL10IDCK;
+
+       /* info frame */
+       avi_cfg->db1_format = 0;
+       avi_cfg->db1_active_info = 0;
+       avi_cfg->db1_bar_info_dv = 0;
+       avi_cfg->db1_scan_info = 0;
+       avi_cfg->db2_colorimetry = 0;
+       avi_cfg->db2_aspect_ratio = 0;
+       avi_cfg->db2_active_fmt_ar = 0;
+       avi_cfg->db3_itc = 0;
+       avi_cfg->db3_ec = 0;
+       avi_cfg->db3_q_range = 0;
+       avi_cfg->db3_nup_scaling = 0;
+       avi_cfg->db4_videocode = 0;
+       avi_cfg->db5_pixel_repeat = 0;
+       avi_cfg->db6_7_line_eoftop = 0;
+       avi_cfg->db8_9_line_sofbottom = 0;
+       avi_cfg->db10_11_pixel_eofleft = 0;
+       avi_cfg->db12_13_pixel_sofright = 0;
+
+       /* packet enable and repeat */
+       repeat_cfg->audio_pkt = 0;
+       repeat_cfg->audio_pkt_repeat = 0;
+       repeat_cfg->avi_infoframe = 0;
+       repeat_cfg->avi_infoframe_repeat = 0;
+       repeat_cfg->gen_cntrl_pkt = 0;
+       repeat_cfg->gen_cntrl_pkt_repeat = 0;
+       repeat_cfg->generic_pkt = 0;
+       repeat_cfg->generic_pkt_repeat = 0;
+}
+
+static void hdmi_core_powerdown_disable(struct hdmi_core_data *core)
+{
+       pr_debug("Enter hdmi_core_powerdown_disable\n");
+       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SYS_CTRL1, 0x0, 0, 0);
+}
+
+static void hdmi_core_swreset_release(struct hdmi_core_data *core)
+{
+       pr_debug("Enter hdmi_core_swreset_release\n");
+       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x0, 0, 0);
+}
+
+static void hdmi_core_swreset_assert(struct hdmi_core_data *core)
+{
+       pr_debug("Enter hdmi_core_swreset_assert\n");
+       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x1, 0, 0);
+}
+
+/* HDMI_CORE_VIDEO_CONFIG */
+static void hdmi_core_video_config(struct hdmi_core_data *core,
+                               struct hdmi_core_video_config *cfg)
+{
+       u32 r = 0;
+       void __iomem *core_sys_base = core->base;
+       void __iomem *core_av_base = hdmi_av_base(core);
+
+       /* sys_ctrl1 default configuration not tunable */
+       r = hdmi_read_reg(core_sys_base, HDMI_CORE_SYS_SYS_CTRL1);
+       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_VEN_FOLLOWVSYNC, 5, 5);
+       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_HEN_FOLLOWHSYNC, 4, 4);
+       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_BSEL_24BITBUS, 2, 2);
+       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_EDGE_RISINGEDGE, 1, 1);
+       hdmi_write_reg(core_sys_base, HDMI_CORE_SYS_SYS_CTRL1, r);
+
+       REG_FLD_MOD(core_sys_base,
+                       HDMI_CORE_SYS_VID_ACEN, cfg->ip_bus_width, 7, 6);
+
+       /* Vid_Mode */
+       r = hdmi_read_reg(core_sys_base, HDMI_CORE_SYS_VID_MODE);
+
+       /* dither truncation configuration */
+       if (cfg->op_dither_truc > HDMI_OUTPUTTRUNCATION_12BIT) {
+               r = FLD_MOD(r, cfg->op_dither_truc - 3, 7, 6);
+               r = FLD_MOD(r, 1, 5, 5);
+       } else {
+               r = FLD_MOD(r, cfg->op_dither_truc, 7, 6);
+               r = FLD_MOD(r, 0, 5, 5);
+       }
+       hdmi_write_reg(core_sys_base, HDMI_CORE_SYS_VID_MODE, r);
+
+       /* HDMI_Ctrl */
+       r = hdmi_read_reg(core_av_base, HDMI_CORE_AV_HDMI_CTRL);
+       r = FLD_MOD(r, cfg->deep_color_pkt, 6, 6);
+       r = FLD_MOD(r, cfg->pkt_mode, 5, 3);
+       r = FLD_MOD(r, cfg->hdmi_dvi, 0, 0);
+       hdmi_write_reg(core_av_base, HDMI_CORE_AV_HDMI_CTRL, r);
+
+       /* TMDS_CTRL */
+       REG_FLD_MOD(core_sys_base,
+                       HDMI_CORE_SYS_TMDS_CTRL, cfg->tclk_sel_clkmult, 6, 5);
+}
+
+static void hdmi_core_aux_infoframe_avi_config(struct hdmi_core_data *core)
+{
+       u32 val;
+       char sum = 0, checksum = 0;
+       void __iomem *av_base = hdmi_av_base(core);
+       struct hdmi_core_infoframe_avi info_avi = core->avi_cfg;
+
+       sum += 0x82 + 0x002 + 0x00D;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_TYPE, 0x082);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_VERS, 0x002);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_LEN, 0x00D);
+
+       val = (info_avi.db1_format << 5) |
+               (info_avi.db1_active_info << 4) |
+               (info_avi.db1_bar_info_dv << 2) |
+               (info_avi.db1_scan_info);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(0), val);
+       sum += val;
+
+       val = (info_avi.db2_colorimetry << 6) |
+               (info_avi.db2_aspect_ratio << 4) |
+               (info_avi.db2_active_fmt_ar);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(1), val);
+       sum += val;
+
+       val = (info_avi.db3_itc << 7) |
+               (info_avi.db3_ec << 4) |
+               (info_avi.db3_q_range << 2) |
+               (info_avi.db3_nup_scaling);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(2), val);
+       sum += val;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(3),
+                                       info_avi.db4_videocode);
+       sum += info_avi.db4_videocode;
+
+       val = info_avi.db5_pixel_repeat;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(4), val);
+       sum += val;
+
+       val = info_avi.db6_7_line_eoftop & 0x00FF;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(5), val);
+       sum += val;
+
+       val = ((info_avi.db6_7_line_eoftop >> 8) & 0x00FF);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(6), val);
+       sum += val;
+
+       val = info_avi.db8_9_line_sofbottom & 0x00FF;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(7), val);
+       sum += val;
+
+       val = ((info_avi.db8_9_line_sofbottom >> 8) & 0x00FF);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(8), val);
+       sum += val;
+
+       val = info_avi.db10_11_pixel_eofleft & 0x00FF;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(9), val);
+       sum += val;
+
+       val = ((info_avi.db10_11_pixel_eofleft >> 8) & 0x00FF);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(10), val);
+       sum += val;
+
+       val = info_avi.db12_13_pixel_sofright & 0x00FF;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(11), val);
+       sum += val;
+
+       val = ((info_avi.db12_13_pixel_sofright >> 8) & 0x00FF);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(12), val);
+       sum += val;
+
+       checksum = 0x100 - sum;
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_CHSUM, checksum);
+}
+
+static void hdmi_core_av_packet_config(struct hdmi_core_data *core,
+               struct hdmi_core_packet_enable_repeat repeat_cfg)
+{
+       /* enable/repeat the infoframe */
+       hdmi_write_reg(hdmi_av_base(core), HDMI_CORE_AV_PB_CTRL1,
+               (repeat_cfg.audio_pkt << 5) |
+               (repeat_cfg.audio_pkt_repeat << 4) |
+               (repeat_cfg.avi_infoframe << 1) |
+               (repeat_cfg.avi_infoframe_repeat));
+
+       /* enable/repeat the packet */
+       hdmi_write_reg(hdmi_av_base(core), HDMI_CORE_AV_PB_CTRL2,
+               (repeat_cfg.gen_cntrl_pkt << 3) |
+               (repeat_cfg.gen_cntrl_pkt_repeat << 2) |
+               (repeat_cfg.generic_pkt << 1) |
+               (repeat_cfg.generic_pkt_repeat));
+}
+
+void hdmi4_configure(struct hdmi_core_data *core,
+       struct hdmi_wp_data *wp, struct hdmi_config *cfg)
+{
+       /* HDMI */
+       struct omap_video_timings video_timing;
+       struct hdmi_video_format video_format;
+       /* HDMI core */
+       struct hdmi_core_infoframe_avi *avi_cfg = &core->avi_cfg;
+       struct hdmi_core_video_config v_core_cfg;
+       struct hdmi_core_packet_enable_repeat repeat_cfg;
+
+       hdmi_core_init(&v_core_cfg, avi_cfg, &repeat_cfg);
+
+       hdmi_wp_init_vid_fmt_timings(&video_format, &video_timing, cfg);
+
+       hdmi_wp_video_config_timing(wp, &video_timing);
+
+       /* video config */
+       video_format.packing_mode = HDMI_PACK_24b_RGB_YUV444_YUV422;
+
+       hdmi_wp_video_config_format(wp, &video_format);
+
+       hdmi_wp_video_config_interface(wp, &video_timing);
+
+       /*
+        * configure core video part
+        * set software reset in the core
+        */
+       hdmi_core_swreset_assert(core);
+
+       /* power down off */
+       hdmi_core_powerdown_disable(core);
+
+       v_core_cfg.pkt_mode = HDMI_PACKETMODE24BITPERPIXEL;
+       v_core_cfg.hdmi_dvi = cfg->cm.mode;
+
+       hdmi_core_video_config(core, &v_core_cfg);
+
+       /* release software reset in the core */
+       hdmi_core_swreset_release(core);
+
+       /*
+        * configure packet
+        * info frame video see doc CEA861-D page 65
+        */
+       avi_cfg->db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB;
+       avi_cfg->db1_active_info =
+                       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF;
+       avi_cfg->db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO;
+       avi_cfg->db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0;
+       avi_cfg->db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO;
+       avi_cfg->db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO;
+       avi_cfg->db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME;
+       avi_cfg->db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO;
+       avi_cfg->db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601;
+       avi_cfg->db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT;
+       avi_cfg->db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO;
+       avi_cfg->db4_videocode = cfg->cm.code;
+       avi_cfg->db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO;
+       avi_cfg->db6_7_line_eoftop = 0;
+       avi_cfg->db8_9_line_sofbottom = 0;
+       avi_cfg->db10_11_pixel_eofleft = 0;
+       avi_cfg->db12_13_pixel_sofright = 0;
+
+       hdmi_core_aux_infoframe_avi_config(core);
+
+       /* enable/repeat the infoframe */
+       repeat_cfg.avi_infoframe = HDMI_PACKETENABLE;
+       repeat_cfg.avi_infoframe_repeat = HDMI_PACKETREPEATON;
+       /* wakeup */
+       repeat_cfg.audio_pkt = HDMI_PACKETENABLE;
+       repeat_cfg.audio_pkt_repeat = HDMI_PACKETREPEATON;
+       hdmi_core_av_packet_config(core, repeat_cfg);
+}
+
+void hdmi4_core_dump(struct hdmi_core_data *core, struct seq_file *s)
+{
+       int i;
+
+#define CORE_REG(i, name) name(i)
+#define DUMPCORE(r) seq_printf(s, "%-35s %08x\n", #r,\
+               hdmi_read_reg(core->base, r))
+#define DUMPCOREAV(r) seq_printf(s, "%-35s %08x\n", #r,\
+               hdmi_read_reg(hdmi_av_base(core), r))
+#define DUMPCOREAV2(i, r) seq_printf(s, "%s[%d]%*s %08x\n", #r, i, \
+               (i < 10) ? 32 - (int)strlen(#r) : 31 - (int)strlen(#r), " ", \
+               hdmi_read_reg(hdmi_av_base(core), CORE_REG(i, r)))
+
+       DUMPCORE(HDMI_CORE_SYS_VND_IDL);
+       DUMPCORE(HDMI_CORE_SYS_DEV_IDL);
+       DUMPCORE(HDMI_CORE_SYS_DEV_IDH);
+       DUMPCORE(HDMI_CORE_SYS_DEV_REV);
+       DUMPCORE(HDMI_CORE_SYS_SRST);
+       DUMPCORE(HDMI_CORE_SYS_SYS_CTRL1);
+       DUMPCORE(HDMI_CORE_SYS_SYS_STAT);
+       DUMPCORE(HDMI_CORE_SYS_SYS_CTRL3);
+       DUMPCORE(HDMI_CORE_SYS_DE_DLY);
+       DUMPCORE(HDMI_CORE_SYS_DE_CTRL);
+       DUMPCORE(HDMI_CORE_SYS_DE_TOP);
+       DUMPCORE(HDMI_CORE_SYS_DE_CNTL);
+       DUMPCORE(HDMI_CORE_SYS_DE_CNTH);
+       DUMPCORE(HDMI_CORE_SYS_DE_LINL);
+       DUMPCORE(HDMI_CORE_SYS_DE_LINH_1);
+       DUMPCORE(HDMI_CORE_SYS_HRES_L);
+       DUMPCORE(HDMI_CORE_SYS_HRES_H);
+       DUMPCORE(HDMI_CORE_SYS_VRES_L);
+       DUMPCORE(HDMI_CORE_SYS_VRES_H);
+       DUMPCORE(HDMI_CORE_SYS_IADJUST);
+       DUMPCORE(HDMI_CORE_SYS_POLDETECT);
+       DUMPCORE(HDMI_CORE_SYS_HWIDTH1);
+       DUMPCORE(HDMI_CORE_SYS_HWIDTH2);
+       DUMPCORE(HDMI_CORE_SYS_VWIDTH);
+       DUMPCORE(HDMI_CORE_SYS_VID_CTRL);
+       DUMPCORE(HDMI_CORE_SYS_VID_ACEN);
+       DUMPCORE(HDMI_CORE_SYS_VID_MODE);
+       DUMPCORE(HDMI_CORE_SYS_VID_BLANK1);
+       DUMPCORE(HDMI_CORE_SYS_VID_BLANK3);
+       DUMPCORE(HDMI_CORE_SYS_VID_BLANK1);
+       DUMPCORE(HDMI_CORE_SYS_DC_HEADER);
+       DUMPCORE(HDMI_CORE_SYS_VID_DITHER);
+       DUMPCORE(HDMI_CORE_SYS_RGB2XVYCC_CT);
+       DUMPCORE(HDMI_CORE_SYS_R2Y_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_R2Y_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_G2Y_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_G2Y_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_B2Y_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_B2Y_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_R2CB_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_R2CB_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_G2CB_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_G2CB_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_B2CB_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_B2CB_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_R2CR_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_R2CR_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_G2CR_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_G2CR_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_B2CR_COEFF_LOW);
+       DUMPCORE(HDMI_CORE_SYS_B2CR_COEFF_UP);
+       DUMPCORE(HDMI_CORE_SYS_RGB_OFFSET_LOW);
+       DUMPCORE(HDMI_CORE_SYS_RGB_OFFSET_UP);
+       DUMPCORE(HDMI_CORE_SYS_Y_OFFSET_LOW);
+       DUMPCORE(HDMI_CORE_SYS_Y_OFFSET_UP);
+       DUMPCORE(HDMI_CORE_SYS_CBCR_OFFSET_LOW);
+       DUMPCORE(HDMI_CORE_SYS_CBCR_OFFSET_UP);
+       DUMPCORE(HDMI_CORE_SYS_INTR_STATE);
+       DUMPCORE(HDMI_CORE_SYS_INTR1);
+       DUMPCORE(HDMI_CORE_SYS_INTR2);
+       DUMPCORE(HDMI_CORE_SYS_INTR3);
+       DUMPCORE(HDMI_CORE_SYS_INTR4);
+       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK1);
+       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK2);
+       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK3);
+       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK4);
+       DUMPCORE(HDMI_CORE_SYS_INTR_CTRL);
+       DUMPCORE(HDMI_CORE_SYS_TMDS_CTRL);
+
+       DUMPCORE(HDMI_CORE_DDC_ADDR);
+       DUMPCORE(HDMI_CORE_DDC_SEGM);
+       DUMPCORE(HDMI_CORE_DDC_OFFSET);
+       DUMPCORE(HDMI_CORE_DDC_COUNT1);
+       DUMPCORE(HDMI_CORE_DDC_COUNT2);
+       DUMPCORE(HDMI_CORE_DDC_STATUS);
+       DUMPCORE(HDMI_CORE_DDC_CMD);
+       DUMPCORE(HDMI_CORE_DDC_DATA);
+
+       DUMPCOREAV(HDMI_CORE_AV_ACR_CTRL);
+       DUMPCOREAV(HDMI_CORE_AV_FREQ_SVAL);
+       DUMPCOREAV(HDMI_CORE_AV_N_SVAL1);
+       DUMPCOREAV(HDMI_CORE_AV_N_SVAL2);
+       DUMPCOREAV(HDMI_CORE_AV_N_SVAL3);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL1);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL2);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL3);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL1);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL2);
+       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL3);
+       DUMPCOREAV(HDMI_CORE_AV_AUD_MODE);
+       DUMPCOREAV(HDMI_CORE_AV_SPDIF_CTRL);
+       DUMPCOREAV(HDMI_CORE_AV_HW_SPDIF_FS);
+       DUMPCOREAV(HDMI_CORE_AV_SWAP_I2S);
+       DUMPCOREAV(HDMI_CORE_AV_SPDIF_ERTH);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_MAP);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_CTRL);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST0);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST1);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST2);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST4);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST5);
+       DUMPCOREAV(HDMI_CORE_AV_ASRC);
+       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_LEN);
+       DUMPCOREAV(HDMI_CORE_AV_HDMI_CTRL);
+       DUMPCOREAV(HDMI_CORE_AV_AUDO_TXSTAT);
+       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_1);
+       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_2);
+       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_3);
+       DUMPCOREAV(HDMI_CORE_AV_TEST_TXCTRL);
+       DUMPCOREAV(HDMI_CORE_AV_DPD);
+       DUMPCOREAV(HDMI_CORE_AV_PB_CTRL1);
+       DUMPCOREAV(HDMI_CORE_AV_PB_CTRL2);
+       DUMPCOREAV(HDMI_CORE_AV_AVI_TYPE);
+       DUMPCOREAV(HDMI_CORE_AV_AVI_VERS);
+       DUMPCOREAV(HDMI_CORE_AV_AVI_LEN);
+       DUMPCOREAV(HDMI_CORE_AV_AVI_CHSUM);
+
+       for (i = 0; i < HDMI_CORE_AV_AVI_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_AVI_DBYTE);
+
+       DUMPCOREAV(HDMI_CORE_AV_SPD_TYPE);
+       DUMPCOREAV(HDMI_CORE_AV_SPD_VERS);
+       DUMPCOREAV(HDMI_CORE_AV_SPD_LEN);
+       DUMPCOREAV(HDMI_CORE_AV_SPD_CHSUM);
+
+       for (i = 0; i < HDMI_CORE_AV_SPD_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_SPD_DBYTE);
+
+       DUMPCOREAV(HDMI_CORE_AV_AUDIO_TYPE);
+       DUMPCOREAV(HDMI_CORE_AV_AUDIO_VERS);
+       DUMPCOREAV(HDMI_CORE_AV_AUDIO_LEN);
+       DUMPCOREAV(HDMI_CORE_AV_AUDIO_CHSUM);
+
+       for (i = 0; i < HDMI_CORE_AV_AUD_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_AUD_DBYTE);
+
+       DUMPCOREAV(HDMI_CORE_AV_MPEG_TYPE);
+       DUMPCOREAV(HDMI_CORE_AV_MPEG_VERS);
+       DUMPCOREAV(HDMI_CORE_AV_MPEG_LEN);
+       DUMPCOREAV(HDMI_CORE_AV_MPEG_CHSUM);
+
+       for (i = 0; i < HDMI_CORE_AV_MPEG_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_MPEG_DBYTE);
+
+       for (i = 0; i < HDMI_CORE_AV_GEN_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_GEN_DBYTE);
+
+       DUMPCOREAV(HDMI_CORE_AV_CP_BYTE1);
+
+       for (i = 0; i < HDMI_CORE_AV_GEN2_DBYTE_NELEMS; i++)
+               DUMPCOREAV2(i, HDMI_CORE_AV_GEN2_DBYTE);
+
+       DUMPCOREAV(HDMI_CORE_AV_CEC_ADDR_ID);
+}
+
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+static void hdmi_core_audio_config(struct hdmi_core_data *core,
+                                       struct hdmi_core_audio_config *cfg)
+{
+       u32 r;
+       void __iomem *av_base = hdmi_av_base(core);
+
+       /*
+        * Parameters for generation of Audio Clock Recovery packets
+        */
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL1, cfg->n, 7, 0);
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL2, cfg->n >> 8, 7, 0);
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL3, cfg->n >> 16, 7, 0);
+
+       if (cfg->cts_mode == HDMI_AUDIO_CTS_MODE_SW) {
+               REG_FLD_MOD(av_base, HDMI_CORE_AV_CTS_SVAL1, cfg->cts, 7, 0);
+               REG_FLD_MOD(av_base,
+                               HDMI_CORE_AV_CTS_SVAL2, cfg->cts >> 8, 7, 0);
+               REG_FLD_MOD(av_base,
+                               HDMI_CORE_AV_CTS_SVAL3, cfg->cts >> 16, 7, 0);
+       } else {
+               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_1,
+                               cfg->aud_par_busclk, 7, 0);
+               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_2,
+                               (cfg->aud_par_busclk >> 8), 7, 0);
+               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_3,
+                               (cfg->aud_par_busclk >> 16), 7, 0);
+       }
+
+       /* Set ACR clock divisor */
+       REG_FLD_MOD(av_base,
+                       HDMI_CORE_AV_FREQ_SVAL, cfg->mclk_mode, 2, 0);
+
+       r = hdmi_read_reg(av_base, HDMI_CORE_AV_ACR_CTRL);
+       /*
+        * Use TMDS clock for ACR packets. For devices that use
+        * the MCLK, this is the first part of the MCLK initialization.
+        */
+       r = FLD_MOD(r, 0, 2, 2);
+
+       r = FLD_MOD(r, cfg->en_acr_pkt, 1, 1);
+       r = FLD_MOD(r, cfg->cts_mode, 0, 0);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_ACR_CTRL, r);
+
+       /* For devices using MCLK, this completes its initialization. */
+       if (cfg->use_mclk)
+               REG_FLD_MOD(av_base, HDMI_CORE_AV_ACR_CTRL, 1, 2, 2);
+
+       /* Override of SPDIF sample frequency with value in I2S_CHST4 */
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_SPDIF_CTRL,
+                                               cfg->fs_override, 1, 1);
+
+       /*
+        * Set IEC-60958-3 channel status word. It is passed to the IP
+        * just as it is received. The user of the driver is responsible
+        * for its contents.
+        */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST0,
+                      cfg->iec60958_cfg->status[0]);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST1,
+                      cfg->iec60958_cfg->status[1]);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST2,
+                      cfg->iec60958_cfg->status[2]);
+       /* yes, this is correct: status[3] goes to CHST4 register */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST4,
+                      cfg->iec60958_cfg->status[3]);
+       /* yes, this is correct: status[4] goes to CHST5 register */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5,
+                      cfg->iec60958_cfg->status[4]);
+
+       /* set I2S parameters */
+       r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL);
+       r = FLD_MOD(r, cfg->i2s_cfg.sck_edge_mode, 6, 6);
+       r = FLD_MOD(r, cfg->i2s_cfg.vbit, 4, 4);
+       r = FLD_MOD(r, cfg->i2s_cfg.justification, 2, 2);
+       r = FLD_MOD(r, cfg->i2s_cfg.direction, 1, 1);
+       r = FLD_MOD(r, cfg->i2s_cfg.shift, 0, 0);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL, r);
+
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_IN_LEN,
+                       cfg->i2s_cfg.in_length_bits, 3, 0);
+
+       /* Audio channels and mode parameters */
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_HDMI_CTRL, cfg->layout, 2, 1);
+       r = hdmi_read_reg(av_base, HDMI_CORE_AV_AUD_MODE);
+       r = FLD_MOD(r, cfg->i2s_cfg.active_sds, 7, 4);
+       r = FLD_MOD(r, cfg->en_dsd_audio, 3, 3);
+       r = FLD_MOD(r, cfg->en_parallel_aud_input, 2, 2);
+       r = FLD_MOD(r, cfg->en_spdif, 1, 1);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_MODE, r);
+
+       /* Audio channel mappings */
+       /* TODO: Make channel mapping dynamic. For now, map channels
+        * in the ALSA order: FL/FR/RL/RR/C/LFE/SL/SR. Remapping is needed as
+        * HDMI speaker order is different. See CEA-861 Section 6.6.2.
+        */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_MAP, 0x78);
+       REG_FLD_MOD(av_base, HDMI_CORE_AV_SWAP_I2S, 1, 5, 5);
+}
+
+static void hdmi_core_audio_infoframe_cfg(struct hdmi_core_data *core,
+               struct snd_cea_861_aud_if *info_aud)
+{
+       u8 sum = 0, checksum = 0;
+       void __iomem *av_base = hdmi_av_base(core);
+
+       /*
+        * Set audio info frame type, version and length as
+        * described in HDMI 1.4a Section 8.2.2 specification.
+        * Checksum calculation is defined in Section 5.3.5.
+        */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_TYPE, 0x84);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_VERS, 0x01);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_LEN, 0x0a);
+       sum += 0x84 + 0x001 + 0x00a;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(0),
+                      info_aud->db1_ct_cc);
+       sum += info_aud->db1_ct_cc;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(1),
+                      info_aud->db2_sf_ss);
+       sum += info_aud->db2_sf_ss;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(2), info_aud->db3);
+       sum += info_aud->db3;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(3), info_aud->db4_ca);
+       sum += info_aud->db4_ca;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(4),
+                      info_aud->db5_dminh_lsv);
+       sum += info_aud->db5_dminh_lsv;
+
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(5), 0x00);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(6), 0x00);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(7), 0x00);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(8), 0x00);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(9), 0x00);
+
+       checksum = 0x100 - sum;
+       hdmi_write_reg(av_base,
+                                       HDMI_CORE_AV_AUDIO_CHSUM, checksum);
+
+       /*
+        * TODO: Add MPEG and SPD enable and repeat cfg when EDID parsing
+        * is available.
+        */
+}
+
+int hdmi4_audio_config(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
+               struct omap_dss_audio *audio)
+{
+       struct hdmi_audio_format audio_format;
+       struct hdmi_audio_dma audio_dma;
+       struct hdmi_core_audio_config acore;
+       int err, n, cts, channel_count;
+       unsigned int fs_nr;
+       bool word_length_16b = false;
+
+       if (!audio || !audio->iec || !audio->cea || !core)
+               return -EINVAL;
+
+       acore.iec60958_cfg = audio->iec;
+       /*
+        * In the IEC-60958 status word, check if the audio sample word length
+        * is 16-bit as several optimizations can be performed in such case.
+        */
+       if (!(audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24))
+               if (audio->iec->status[4] & IEC958_AES4_CON_WORDLEN_20_16)
+                       word_length_16b = true;
+
+       /* I2S configuration. See Phillips' specification */
+       if (word_length_16b)
+               acore.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_LEFT;
+       else
+               acore.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_RIGHT;
+       /*
+        * The I2S input word length is twice the lenght given in the IEC-60958
+        * status word. If the word size is greater than
+        * 20 bits, increment by one.
+        */
+       acore.i2s_cfg.in_length_bits = audio->iec->status[4]
+               & IEC958_AES4_CON_WORDLEN;
+       if (audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24)
+               acore.i2s_cfg.in_length_bits++;
+       acore.i2s_cfg.sck_edge_mode = HDMI_AUDIO_I2S_SCK_EDGE_RISING;
+       acore.i2s_cfg.vbit = HDMI_AUDIO_I2S_VBIT_FOR_PCM;
+       acore.i2s_cfg.direction = HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST;
+       acore.i2s_cfg.shift = HDMI_AUDIO_I2S_FIRST_BIT_SHIFT;
+
+       /* convert sample frequency to a number */
+       switch (audio->iec->status[3] & IEC958_AES3_CON_FS) {
+       case IEC958_AES3_CON_FS_32000:
+               fs_nr = 32000;
+               break;
+       case IEC958_AES3_CON_FS_44100:
+               fs_nr = 44100;
+               break;
+       case IEC958_AES3_CON_FS_48000:
+               fs_nr = 48000;
+               break;
+       case IEC958_AES3_CON_FS_88200:
+               fs_nr = 88200;
+               break;
+       case IEC958_AES3_CON_FS_96000:
+               fs_nr = 96000;
+               break;
+       case IEC958_AES3_CON_FS_176400:
+               fs_nr = 176400;
+               break;
+       case IEC958_AES3_CON_FS_192000:
+               fs_nr = 192000;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       err = hdmi_compute_acr(fs_nr, &n, &cts);
+
+       /* Audio clock regeneration settings */
+       acore.n = n;
+       acore.cts = cts;
+       if (dss_has_feature(FEAT_HDMI_CTS_SWMODE)) {
+               acore.aud_par_busclk = 0;
+               acore.cts_mode = HDMI_AUDIO_CTS_MODE_SW;
+               acore.use_mclk = dss_has_feature(FEAT_HDMI_AUDIO_USE_MCLK);
+       } else {
+               acore.aud_par_busclk = (((128 * 31) - 1) << 8);
+               acore.cts_mode = HDMI_AUDIO_CTS_MODE_HW;
+               acore.use_mclk = true;
+       }
+
+       if (acore.use_mclk)
+               acore.mclk_mode = HDMI_AUDIO_MCLK_128FS;
+
+       /* Audio channels settings */
+       channel_count = (audio->cea->db1_ct_cc &
+                        CEA861_AUDIO_INFOFRAME_DB1CC) + 1;
+
+       switch (channel_count) {
+       case 2:
+               audio_format.active_chnnls_msk = 0x03;
+               break;
+       case 3:
+               audio_format.active_chnnls_msk = 0x07;
+               break;
+       case 4:
+               audio_format.active_chnnls_msk = 0x0f;
+               break;
+       case 5:
+               audio_format.active_chnnls_msk = 0x1f;
+               break;
+       case 6:
+               audio_format.active_chnnls_msk = 0x3f;
+               break;
+       case 7:
+               audio_format.active_chnnls_msk = 0x7f;
+               break;
+       case 8:
+               audio_format.active_chnnls_msk = 0xff;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /*
+        * the HDMI IP needs to enable four stereo channels when transmitting
+        * more than 2 audio channels
+        */
+       if (channel_count == 2) {
+               audio_format.stereo_channels = HDMI_AUDIO_STEREO_ONECHANNEL;
+               acore.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN;
+               acore.layout = HDMI_AUDIO_LAYOUT_2CH;
+       } else {
+               audio_format.stereo_channels = HDMI_AUDIO_STEREO_FOURCHANNELS;
+               acore.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN |
+                               HDMI_AUDIO_I2S_SD1_EN | HDMI_AUDIO_I2S_SD2_EN |
+                               HDMI_AUDIO_I2S_SD3_EN;
+               acore.layout = HDMI_AUDIO_LAYOUT_8CH;
+       }
+
+       acore.en_spdif = false;
+       /* use sample frequency from channel status word */
+       acore.fs_override = true;
+       /* enable ACR packets */
+       acore.en_acr_pkt = true;
+       /* disable direct streaming digital audio */
+       acore.en_dsd_audio = false;
+       /* use parallel audio interface */
+       acore.en_parallel_aud_input = true;
+
+       /* DMA settings */
+       if (word_length_16b)
+               audio_dma.transfer_size = 0x10;
+       else
+               audio_dma.transfer_size = 0x20;
+       audio_dma.block_size = 0xC0;
+       audio_dma.mode = HDMI_AUDIO_TRANSF_DMA;
+       audio_dma.fifo_threshold = 0x20; /* in number of samples */
+
+       /* audio FIFO format settings */
+       if (word_length_16b) {
+               audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_TWOSAMPLES;
+               audio_format.sample_size = HDMI_AUDIO_SAMPLE_16BITS;
+               audio_format.justification = HDMI_AUDIO_JUSTIFY_LEFT;
+       } else {
+               audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_ONESAMPLE;
+               audio_format.sample_size = HDMI_AUDIO_SAMPLE_24BITS;
+               audio_format.justification = HDMI_AUDIO_JUSTIFY_RIGHT;
+       }
+       audio_format.type = HDMI_AUDIO_TYPE_LPCM;
+       audio_format.sample_order = HDMI_AUDIO_SAMPLE_LEFT_FIRST;
+       /* disable start/stop signals of IEC 60958 blocks */
+       audio_format.en_sig_blk_strt_end = HDMI_AUDIO_BLOCK_SIG_STARTEND_ON;
+
+       /* configure DMA and audio FIFO format*/
+       hdmi_wp_audio_config_dma(wp, &audio_dma);
+       hdmi_wp_audio_config_format(wp, &audio_format);
+
+       /* configure the core*/
+       hdmi_core_audio_config(core, &acore);
+
+       /* configure CEA 861 audio infoframe*/
+       hdmi_core_audio_infoframe_cfg(core, audio->cea);
+
+       return 0;
+}
+
+int hdmi4_audio_start(struct hdmi_core_data *core, struct hdmi_wp_data *wp)
+{
+       REG_FLD_MOD(hdmi_av_base(core),
+                   HDMI_CORE_AV_AUD_MODE, true, 0, 0);
+
+       hdmi_wp_audio_core_req_enable(wp, true);
+
+       return 0;
+}
+
+void hdmi4_audio_stop(struct hdmi_core_data *core, struct hdmi_wp_data *wp)
+{
+       REG_FLD_MOD(hdmi_av_base(core),
+                   HDMI_CORE_AV_AUD_MODE, false, 0, 0);
+
+       hdmi_wp_audio_core_req_enable(wp, false);
+}
+
+int hdmi4_audio_get_dma_port(u32 *offset, u32 *size)
+{
+       if (!offset || !size)
+               return -EINVAL;
+       *offset = HDMI_WP_AUDIO_DATA;
+       *size = 4;
+       return 0;
+}
+
+#endif
+
+#define CORE_OFFSET            0x400
+#define CORE_SIZE              0xc00
+
+int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core)
+{
+       struct resource *res;
+       struct resource temp_res;
+
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_core");
+       if (!res) {
+               DSSDBG("can't get CORE mem resource by name\n");
+               /*
+                * if hwmod/DT doesn't have the memory resource information
+                * split into HDMI sub blocks by name, we try again by getting
+                * the platform's first resource. this code will be removed when
+                * the driver can get the mem resources by name
+                */
+               res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+               if (!res) {
+                       DSSERR("can't get CORE mem resource\n");
+                       return -EINVAL;
+               }
+
+               temp_res.start = res->start + CORE_OFFSET;
+               temp_res.end = temp_res.start + CORE_SIZE - 1;
+               res = &temp_res;
+       }
+
+       core->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+       if (!core->base) {
+               DSSERR("can't ioremap CORE\n");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
diff --git a/drivers/video/omap2/dss/hdmi4_core.h b/drivers/video/omap2/dss/hdmi4_core.h
new file mode 100644 (file)
index 0000000..1181b4c
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * HDMI header definition for OMAP4 HDMI core IP
+ *
+ * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.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 _HDMI4_CORE_H_
+#define _HDMI4_CORE_H_
+
+#include "hdmi.h"
+
+/* OMAP4 HDMI IP Core System */
+
+#define HDMI_CORE_SYS_VND_IDL                  0x0
+#define HDMI_CORE_SYS_DEV_IDL                  0x8
+#define HDMI_CORE_SYS_DEV_IDH                  0xC
+#define HDMI_CORE_SYS_DEV_REV                  0x10
+#define HDMI_CORE_SYS_SRST                     0x14
+#define HDMI_CORE_SYS_SYS_CTRL1                        0x20
+#define HDMI_CORE_SYS_SYS_STAT                 0x24
+#define HDMI_CORE_SYS_SYS_CTRL3                        0x28
+#define HDMI_CORE_SYS_DCTL                     0x34
+#define HDMI_CORE_SYS_DE_DLY                   0xC8
+#define HDMI_CORE_SYS_DE_CTRL                  0xCC
+#define HDMI_CORE_SYS_DE_TOP                   0xD0
+#define HDMI_CORE_SYS_DE_CNTL                  0xD8
+#define HDMI_CORE_SYS_DE_CNTH                  0xDC
+#define HDMI_CORE_SYS_DE_LINL                  0xE0
+#define HDMI_CORE_SYS_DE_LINH_1                        0xE4
+#define HDMI_CORE_SYS_HRES_L                   0xE8
+#define HDMI_CORE_SYS_HRES_H                   0xEC
+#define HDMI_CORE_SYS_VRES_L                   0xF0
+#define HDMI_CORE_SYS_VRES_H                   0xF4
+#define HDMI_CORE_SYS_IADJUST                  0xF8
+#define HDMI_CORE_SYS_POLDETECT                        0xFC
+#define HDMI_CORE_SYS_HWIDTH1                  0x110
+#define HDMI_CORE_SYS_HWIDTH2                  0x114
+#define HDMI_CORE_SYS_VWIDTH                   0x11C
+#define HDMI_CORE_SYS_VID_CTRL                 0x120
+#define HDMI_CORE_SYS_VID_ACEN                 0x124
+#define HDMI_CORE_SYS_VID_MODE                 0x128
+#define HDMI_CORE_SYS_VID_BLANK1               0x12C
+#define HDMI_CORE_SYS_VID_BLANK2               0x130
+#define HDMI_CORE_SYS_VID_BLANK3               0x134
+#define HDMI_CORE_SYS_DC_HEADER                        0x138
+#define HDMI_CORE_SYS_VID_DITHER               0x13C
+#define HDMI_CORE_SYS_RGB2XVYCC_CT             0x140
+#define HDMI_CORE_SYS_R2Y_COEFF_LOW            0x144
+#define HDMI_CORE_SYS_R2Y_COEFF_UP             0x148
+#define HDMI_CORE_SYS_G2Y_COEFF_LOW            0x14C
+#define HDMI_CORE_SYS_G2Y_COEFF_UP             0x150
+#define HDMI_CORE_SYS_B2Y_COEFF_LOW            0x154
+#define HDMI_CORE_SYS_B2Y_COEFF_UP             0x158
+#define HDMI_CORE_SYS_R2CB_COEFF_LOW           0x15C
+#define HDMI_CORE_SYS_R2CB_COEFF_UP            0x160
+#define HDMI_CORE_SYS_G2CB_COEFF_LOW           0x164
+#define HDMI_CORE_SYS_G2CB_COEFF_UP            0x168
+#define HDMI_CORE_SYS_B2CB_COEFF_LOW           0x16C
+#define HDMI_CORE_SYS_B2CB_COEFF_UP            0x170
+#define HDMI_CORE_SYS_R2CR_COEFF_LOW           0x174
+#define HDMI_CORE_SYS_R2CR_COEFF_UP            0x178
+#define HDMI_CORE_SYS_G2CR_COEFF_LOW           0x17C
+#define HDMI_CORE_SYS_G2CR_COEFF_UP            0x180
+#define HDMI_CORE_SYS_B2CR_COEFF_LOW           0x184
+#define HDMI_CORE_SYS_B2CR_COEFF_UP            0x188
+#define HDMI_CORE_SYS_RGB_OFFSET_LOW           0x18C
+#define HDMI_CORE_SYS_RGB_OFFSET_UP            0x190
+#define HDMI_CORE_SYS_Y_OFFSET_LOW             0x194
+#define HDMI_CORE_SYS_Y_OFFSET_UP              0x198
+#define HDMI_CORE_SYS_CBCR_OFFSET_LOW          0x19C
+#define HDMI_CORE_SYS_CBCR_OFFSET_UP           0x1A0
+#define HDMI_CORE_SYS_INTR_STATE               0x1C0
+#define HDMI_CORE_SYS_INTR1                    0x1C4
+#define HDMI_CORE_SYS_INTR2                    0x1C8
+#define HDMI_CORE_SYS_INTR3                    0x1CC
+#define HDMI_CORE_SYS_INTR4                    0x1D0
+#define HDMI_CORE_SYS_INTR_UNMASK1             0x1D4
+#define HDMI_CORE_SYS_INTR_UNMASK2             0x1D8
+#define HDMI_CORE_SYS_INTR_UNMASK3             0x1DC
+#define HDMI_CORE_SYS_INTR_UNMASK4             0x1E0
+#define HDMI_CORE_SYS_INTR_CTRL                        0x1E4
+#define HDMI_CORE_SYS_TMDS_CTRL                        0x208
+
+/* value definitions for HDMI_CORE_SYS_SYS_CTRL1 fields */
+#define HDMI_CORE_SYS_SYS_CTRL1_VEN_FOLLOWVSYNC        0x1
+#define HDMI_CORE_SYS_SYS_CTRL1_HEN_FOLLOWHSYNC        0x1
+#define HDMI_CORE_SYS_SYS_CTRL1_BSEL_24BITBUS  0x1
+#define HDMI_CORE_SYS_SYS_CTRL1_EDGE_RISINGEDGE        0x1
+
+/* HDMI DDC E-DID */
+#define HDMI_CORE_DDC_ADDR                     0x3B4
+#define HDMI_CORE_DDC_SEGM                     0x3B8
+#define HDMI_CORE_DDC_OFFSET                   0x3BC
+#define HDMI_CORE_DDC_COUNT1                   0x3C0
+#define HDMI_CORE_DDC_COUNT2                   0x3C4
+#define HDMI_CORE_DDC_STATUS                   0x3C8
+#define HDMI_CORE_DDC_CMD                      0x3CC
+#define HDMI_CORE_DDC_DATA                     0x3D0
+
+/* HDMI IP Core Audio Video */
+
+#define HDMI_CORE_AV_ACR_CTRL                  0x4
+#define HDMI_CORE_AV_FREQ_SVAL                 0x8
+#define HDMI_CORE_AV_N_SVAL1                   0xC
+#define HDMI_CORE_AV_N_SVAL2                   0x10
+#define HDMI_CORE_AV_N_SVAL3                   0x14
+#define HDMI_CORE_AV_CTS_SVAL1                 0x18
+#define HDMI_CORE_AV_CTS_SVAL2                 0x1C
+#define HDMI_CORE_AV_CTS_SVAL3                 0x20
+#define HDMI_CORE_AV_CTS_HVAL1                 0x24
+#define HDMI_CORE_AV_CTS_HVAL2                 0x28
+#define HDMI_CORE_AV_CTS_HVAL3                 0x2C
+#define HDMI_CORE_AV_AUD_MODE                  0x50
+#define HDMI_CORE_AV_SPDIF_CTRL                        0x54
+#define HDMI_CORE_AV_HW_SPDIF_FS               0x60
+#define HDMI_CORE_AV_SWAP_I2S                  0x64
+#define HDMI_CORE_AV_SPDIF_ERTH                        0x6C
+#define HDMI_CORE_AV_I2S_IN_MAP                        0x70
+#define HDMI_CORE_AV_I2S_IN_CTRL               0x74
+#define HDMI_CORE_AV_I2S_CHST0                 0x78
+#define HDMI_CORE_AV_I2S_CHST1                 0x7C
+#define HDMI_CORE_AV_I2S_CHST2                 0x80
+#define HDMI_CORE_AV_I2S_CHST4                 0x84
+#define HDMI_CORE_AV_I2S_CHST5                 0x88
+#define HDMI_CORE_AV_ASRC                      0x8C
+#define HDMI_CORE_AV_I2S_IN_LEN                        0x90
+#define HDMI_CORE_AV_HDMI_CTRL                 0xBC
+#define HDMI_CORE_AV_AUDO_TXSTAT               0xC0
+#define HDMI_CORE_AV_AUD_PAR_BUSCLK_1          0xCC
+#define HDMI_CORE_AV_AUD_PAR_BUSCLK_2          0xD0
+#define HDMI_CORE_AV_AUD_PAR_BUSCLK_3          0xD4
+#define HDMI_CORE_AV_TEST_TXCTRL               0xF0
+#define HDMI_CORE_AV_DPD                       0xF4
+#define HDMI_CORE_AV_PB_CTRL1                  0xF8
+#define HDMI_CORE_AV_PB_CTRL2                  0xFC
+#define HDMI_CORE_AV_AVI_TYPE                  0x100
+#define HDMI_CORE_AV_AVI_VERS                  0x104
+#define HDMI_CORE_AV_AVI_LEN                   0x108
+#define HDMI_CORE_AV_AVI_CHSUM                 0x10C
+#define HDMI_CORE_AV_AVI_DBYTE(n)              (n * 4 + 0x110)
+#define HDMI_CORE_AV_SPD_TYPE                  0x180
+#define HDMI_CORE_AV_SPD_VERS                  0x184
+#define HDMI_CORE_AV_SPD_LEN                   0x188
+#define HDMI_CORE_AV_SPD_CHSUM                 0x18C
+#define HDMI_CORE_AV_SPD_DBYTE(n)              (n * 4 + 0x190)
+#define HDMI_CORE_AV_AUDIO_TYPE                        0x200
+#define HDMI_CORE_AV_AUDIO_VERS                        0x204
+#define HDMI_CORE_AV_AUDIO_LEN                 0x208
+#define HDMI_CORE_AV_AUDIO_CHSUM               0x20C
+#define HDMI_CORE_AV_AUD_DBYTE(n)              (n * 4 + 0x210)
+#define HDMI_CORE_AV_MPEG_TYPE                 0x280
+#define HDMI_CORE_AV_MPEG_VERS                 0x284
+#define HDMI_CORE_AV_MPEG_LEN                  0x288
+#define HDMI_CORE_AV_MPEG_CHSUM                        0x28C
+#define HDMI_CORE_AV_MPEG_DBYTE(n)             (n * 4 + 0x290)
+#define HDMI_CORE_AV_GEN_DBYTE(n)              (n * 4 + 0x300)
+#define HDMI_CORE_AV_CP_BYTE1                  0x37C
+#define HDMI_CORE_AV_GEN2_DBYTE(n)             (n * 4 + 0x380)
+#define HDMI_CORE_AV_CEC_ADDR_ID               0x3FC
+
+#define HDMI_CORE_AV_SPD_DBYTE_ELSIZE          0x4
+#define HDMI_CORE_AV_GEN2_DBYTE_ELSIZE         0x4
+#define HDMI_CORE_AV_MPEG_DBYTE_ELSIZE         0x4
+#define HDMI_CORE_AV_GEN_DBYTE_ELSIZE          0x4
+
+#define HDMI_CORE_AV_AVI_DBYTE_NELEMS          15
+#define HDMI_CORE_AV_SPD_DBYTE_NELEMS          27
+#define HDMI_CORE_AV_AUD_DBYTE_NELEMS          10
+#define HDMI_CORE_AV_MPEG_DBYTE_NELEMS         27
+#define HDMI_CORE_AV_GEN_DBYTE_NELEMS          31
+#define HDMI_CORE_AV_GEN2_DBYTE_NELEMS         31
+
+enum hdmi_core_inputbus_width {
+       HDMI_INPUT_8BIT = 0,
+       HDMI_INPUT_10BIT = 1,
+       HDMI_INPUT_12BIT = 2
+};
+
+enum hdmi_core_dither_trunc {
+       HDMI_OUTPUTTRUNCATION_8BIT = 0,
+       HDMI_OUTPUTTRUNCATION_10BIT = 1,
+       HDMI_OUTPUTTRUNCATION_12BIT = 2,
+       HDMI_OUTPUTDITHER_8BIT = 3,
+       HDMI_OUTPUTDITHER_10BIT = 4,
+       HDMI_OUTPUTDITHER_12BIT = 5
+};
+
+enum hdmi_core_deepcolor_ed {
+       HDMI_DEEPCOLORPACKECTDISABLE = 0,
+       HDMI_DEEPCOLORPACKECTENABLE = 1
+};
+
+enum hdmi_core_packet_mode {
+       HDMI_PACKETMODERESERVEDVALUE = 0,
+       HDMI_PACKETMODE24BITPERPIXEL = 4,
+       HDMI_PACKETMODE30BITPERPIXEL = 5,
+       HDMI_PACKETMODE36BITPERPIXEL = 6,
+       HDMI_PACKETMODE48BITPERPIXEL = 7
+};
+
+enum hdmi_core_tclkselclkmult {
+       HDMI_FPLL05IDCK = 0,
+       HDMI_FPLL10IDCK = 1,
+       HDMI_FPLL20IDCK = 2,
+       HDMI_FPLL40IDCK = 3
+};
+
+enum hdmi_core_packet_ctrl {
+       HDMI_PACKETENABLE = 1,
+       HDMI_PACKETDISABLE = 0,
+       HDMI_PACKETREPEATON = 1,
+       HDMI_PACKETREPEATOFF = 0
+};
+
+enum hdmi_audio_i2s_config {
+       HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST = 0,
+       HDMI_AUDIO_I2S_LSB_SHIFTED_FIRST = 1,
+       HDMI_AUDIO_I2S_SCK_EDGE_FALLING = 0,
+       HDMI_AUDIO_I2S_SCK_EDGE_RISING = 1,
+       HDMI_AUDIO_I2S_VBIT_FOR_PCM = 0,
+       HDMI_AUDIO_I2S_VBIT_FOR_COMPRESSED = 1,
+       HDMI_AUDIO_I2S_FIRST_BIT_SHIFT = 0,
+       HDMI_AUDIO_I2S_FIRST_BIT_NO_SHIFT = 1,
+       HDMI_AUDIO_I2S_SD0_EN = 1,
+       HDMI_AUDIO_I2S_SD1_EN = 1 << 1,
+       HDMI_AUDIO_I2S_SD2_EN = 1 << 2,
+       HDMI_AUDIO_I2S_SD3_EN = 1 << 3,
+};
+
+struct hdmi_core_video_config {
+       enum hdmi_core_inputbus_width   ip_bus_width;
+       enum hdmi_core_dither_trunc     op_dither_truc;
+       enum hdmi_core_deepcolor_ed     deep_color_pkt;
+       enum hdmi_core_packet_mode      pkt_mode;
+       enum hdmi_core_hdmi_dvi         hdmi_dvi;
+       enum hdmi_core_tclkselclkmult   tclk_sel_clkmult;
+};
+
+struct hdmi_core_packet_enable_repeat {
+       u32     audio_pkt;
+       u32     audio_pkt_repeat;
+       u32     avi_infoframe;
+       u32     avi_infoframe_repeat;
+       u32     gen_cntrl_pkt;
+       u32     gen_cntrl_pkt_repeat;
+       u32     generic_pkt;
+       u32     generic_pkt_repeat;
+};
+
+int hdmi4_read_edid(struct hdmi_core_data *core, u8 *edid, int len);
+void hdmi4_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
+               struct hdmi_config *cfg);
+void hdmi4_core_dump(struct hdmi_core_data *core, struct seq_file *s);
+int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core);
+
+#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
+int hdmi4_audio_start(struct hdmi_core_data *core, struct hdmi_wp_data *wp);
+void hdmi4_audio_stop(struct hdmi_core_data *core, struct hdmi_wp_data *wp);
+int hdmi4_audio_config(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
+               struct omap_dss_audio *audio);
+int hdmi4_audio_get_dma_port(u32 *offset, u32 *size);
+#endif
+
+#endif
index 16feaa80b3b42ac012fc7acf1205cbcfffbf8516..45acb997ac0021336c6d72c74e9e53dd57409e55 100644 (file)
@@ -15,7 +15,7 @@
 #include <video/omapdss.h>
 
 #include "dss.h"
-#include "ti_hdmi.h"
+#include "hdmi.h"
 
 void hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s)
 {
index 6e187e63daae1911f1108db6f8a123677b4b02e3..d3e6e78c00820d85b4476cae73c3df25be81033d 100644 (file)
@@ -16,7 +16,7 @@
 #include <video/omapdss.h>
 
 #include "dss.h"
-#include "ti_hdmi.h"
+#include "hdmi.h"
 
 #define HDMI_DEFAULT_REGN 16
 #define HDMI_DEFAULT_REGM2 1
index 93039ea970f0ca9b636c1ed0624c3863ff55998f..8151d8969a6eb560dfa0aec0ed4cb094190d1369 100644 (file)
@@ -15,7 +15,7 @@
 #include <video/omapdss.h>
 
 #include "dss.h"
-#include "ti_hdmi.h"
+#include "hdmi.h"
 
 void hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s)
 {
diff --git a/drivers/video/omap2/dss/ti_hdmi.h b/drivers/video/omap2/dss/ti_hdmi.h
deleted file mode 100644 (file)
index 5034080..0000000
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * ti_hdmi.h
- *
- * HDMI driver definition for TI OMAP4, DM81xx, DM38xx  Processor.
- *
- * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.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 _TI_HDMI_H
-#define _TI_HDMI_H
-
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <video/omapdss.h>
-
-#include "dss.h"
-
-/* HDMI Wrapper */
-
-#define HDMI_WP_REVISION                       0x0
-#define HDMI_WP_SYSCONFIG                      0x10
-#define HDMI_WP_IRQSTATUS_RAW                  0x24
-#define HDMI_WP_IRQSTATUS                      0x28
-#define HDMI_WP_IRQENABLE_SET                  0x2C
-#define HDMI_WP_IRQENABLE_CLR                  0x30
-#define HDMI_WP_IRQWAKEEN                      0x34
-#define HDMI_WP_PWR_CTRL                       0x40
-#define HDMI_WP_DEBOUNCE                       0x44
-#define HDMI_WP_VIDEO_CFG                      0x50
-#define HDMI_WP_VIDEO_SIZE                     0x60
-#define HDMI_WP_VIDEO_TIMING_H                 0x68
-#define HDMI_WP_VIDEO_TIMING_V                 0x6C
-#define HDMI_WP_WP_CLK                         0x70
-#define HDMI_WP_AUDIO_CFG                      0x80
-#define HDMI_WP_AUDIO_CFG2                     0x84
-#define HDMI_WP_AUDIO_CTRL                     0x88
-#define HDMI_WP_AUDIO_DATA                     0x8C
-
-/* HDMI WP IRQ flags */
-
-#define HDMI_IRQ_OCP_TIMEOUT                   (1 << 4)
-#define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW          (1 << 8)
-#define HDMI_IRQ_AUDIO_FIFO_OVERFLOW           (1 << 9)
-#define HDMI_IRQ_AUDIO_FIFO_SAMPLE_REQ         (1 << 10)
-#define HDMI_IRQ_VIDEO_VSYNC                   (1 << 16)
-#define HDMI_IRQ_VIDEO_FRAME_DONE              (1 << 17)
-#define HDMI_IRQ_PHY_LINE5V_ASSERT             (1 << 24)
-#define HDMI_IRQ_LINK_CONNECT                  (1 << 25)
-#define HDMI_IRQ_LINK_DISCONNECT               (1 << 26)
-#define HDMI_IRQ_PLL_LOCK                      (1 << 29)
-#define HDMI_IRQ_PLL_UNLOCK                    (1 << 30)
-#define HDMI_IRQ_PLL_RECAL                     (1 << 31)
-
-/* HDMI PLL */
-
-#define PLLCTRL_PLL_CONTROL                    0x0
-#define PLLCTRL_PLL_STATUS                     0x4
-#define PLLCTRL_PLL_GO                         0x8
-#define PLLCTRL_CFG1                           0xC
-#define PLLCTRL_CFG2                           0x10
-#define PLLCTRL_CFG3                           0x14
-#define PLLCTRL_SSC_CFG1                       0x18
-#define PLLCTRL_SSC_CFG2                       0x1C
-#define PLLCTRL_CFG4                           0x20
-
-/* HDMI PHY */
-
-#define HDMI_TXPHY_TX_CTRL                     0x0
-#define HDMI_TXPHY_DIGITAL_CTRL                        0x4
-#define HDMI_TXPHY_POWER_CTRL                  0x8
-#define HDMI_TXPHY_PAD_CFG_CTRL                        0xC
-
-enum hdmi_pll_pwr {
-       HDMI_PLLPWRCMD_ALLOFF = 0,
-       HDMI_PLLPWRCMD_PLLONLY = 1,
-       HDMI_PLLPWRCMD_BOTHON_ALLCLKS = 2,
-       HDMI_PLLPWRCMD_BOTHON_NOPHYCLK = 3
-};
-
-enum hdmi_phy_pwr {
-       HDMI_PHYPWRCMD_OFF = 0,
-       HDMI_PHYPWRCMD_LDOON = 1,
-       HDMI_PHYPWRCMD_TXON = 2
-};
-
-enum hdmi_core_hdmi_dvi {
-       HDMI_DVI = 0,
-       HDMI_HDMI = 1
-};
-
-enum hdmi_clk_refsel {
-       HDMI_REFSEL_PCLK = 0,
-       HDMI_REFSEL_REF1 = 1,
-       HDMI_REFSEL_REF2 = 2,
-       HDMI_REFSEL_SYSCLK = 3
-};
-
-enum hdmi_packing_mode {
-       HDMI_PACK_10b_RGB_YUV444 = 0,
-       HDMI_PACK_24b_RGB_YUV444_YUV422 = 1,
-       HDMI_PACK_20b_YUV422 = 2,
-       HDMI_PACK_ALREADYPACKED = 7
-};
-
-enum hdmi_stereo_channels {
-       HDMI_AUDIO_STEREO_NOCHANNELS = 0,
-       HDMI_AUDIO_STEREO_ONECHANNEL = 1,
-       HDMI_AUDIO_STEREO_TWOCHANNELS = 2,
-       HDMI_AUDIO_STEREO_THREECHANNELS = 3,
-       HDMI_AUDIO_STEREO_FOURCHANNELS = 4
-};
-
-enum hdmi_audio_type {
-       HDMI_AUDIO_TYPE_LPCM = 0,
-       HDMI_AUDIO_TYPE_IEC = 1
-};
-
-enum hdmi_audio_justify {
-       HDMI_AUDIO_JUSTIFY_LEFT = 0,
-       HDMI_AUDIO_JUSTIFY_RIGHT = 1
-};
-
-enum hdmi_audio_sample_order {
-       HDMI_AUDIO_SAMPLE_RIGHT_FIRST = 0,
-       HDMI_AUDIO_SAMPLE_LEFT_FIRST = 1
-};
-
-enum hdmi_audio_samples_perword {
-       HDMI_AUDIO_ONEWORD_ONESAMPLE = 0,
-       HDMI_AUDIO_ONEWORD_TWOSAMPLES = 1
-};
-
-enum hdmi_audio_sample_size {
-       HDMI_AUDIO_SAMPLE_16BITS = 0,
-       HDMI_AUDIO_SAMPLE_24BITS = 1
-};
-
-enum hdmi_audio_transf_mode {
-       HDMI_AUDIO_TRANSF_DMA = 0,
-       HDMI_AUDIO_TRANSF_IRQ = 1
-};
-
-enum hdmi_audio_blk_strt_end_sig {
-       HDMI_AUDIO_BLOCK_SIG_STARTEND_ON = 0,
-       HDMI_AUDIO_BLOCK_SIG_STARTEND_OFF = 1
-};
-
-enum hdmi_core_audio_layout {
-       HDMI_AUDIO_LAYOUT_2CH = 0,
-       HDMI_AUDIO_LAYOUT_8CH = 1
-};
-
-enum hdmi_core_cts_mode {
-       HDMI_AUDIO_CTS_MODE_HW = 0,
-       HDMI_AUDIO_CTS_MODE_SW = 1
-};
-
-enum hdmi_audio_mclk_mode {
-       HDMI_AUDIO_MCLK_128FS = 0,
-       HDMI_AUDIO_MCLK_256FS = 1,
-       HDMI_AUDIO_MCLK_384FS = 2,
-       HDMI_AUDIO_MCLK_512FS = 3,
-       HDMI_AUDIO_MCLK_768FS = 4,
-       HDMI_AUDIO_MCLK_1024FS = 5,
-       HDMI_AUDIO_MCLK_1152FS = 6,
-       HDMI_AUDIO_MCLK_192FS = 7
-};
-
-/* INFOFRAME_AVI_ and INFOFRAME_AUDIO_ definitions */
-enum hdmi_core_infoframe {
-       HDMI_INFOFRAME_AVI_DB1Y_RGB = 0,
-       HDMI_INFOFRAME_AVI_DB1Y_YUV422 = 1,
-       HDMI_INFOFRAME_AVI_DB1Y_YUV444 = 2,
-       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF = 0,
-       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_ON =  1,
-       HDMI_INFOFRAME_AVI_DB1B_NO = 0,
-       HDMI_INFOFRAME_AVI_DB1B_VERT = 1,
-       HDMI_INFOFRAME_AVI_DB1B_HORI = 2,
-       HDMI_INFOFRAME_AVI_DB1B_VERTHORI = 3,
-       HDMI_INFOFRAME_AVI_DB1S_0 = 0,
-       HDMI_INFOFRAME_AVI_DB1S_1 = 1,
-       HDMI_INFOFRAME_AVI_DB1S_2 = 2,
-       HDMI_INFOFRAME_AVI_DB2C_NO = 0,
-       HDMI_INFOFRAME_AVI_DB2C_ITU601 = 1,
-       HDMI_INFOFRAME_AVI_DB2C_ITU709 = 2,
-       HDMI_INFOFRAME_AVI_DB2C_EC_EXTENDED = 3,
-       HDMI_INFOFRAME_AVI_DB2M_NO = 0,
-       HDMI_INFOFRAME_AVI_DB2M_43 = 1,
-       HDMI_INFOFRAME_AVI_DB2M_169 = 2,
-       HDMI_INFOFRAME_AVI_DB2R_SAME = 8,
-       HDMI_INFOFRAME_AVI_DB2R_43 = 9,
-       HDMI_INFOFRAME_AVI_DB2R_169 = 10,
-       HDMI_INFOFRAME_AVI_DB2R_149 = 11,
-       HDMI_INFOFRAME_AVI_DB3ITC_NO = 0,
-       HDMI_INFOFRAME_AVI_DB3ITC_YES = 1,
-       HDMI_INFOFRAME_AVI_DB3EC_XVYUV601 = 0,
-       HDMI_INFOFRAME_AVI_DB3EC_XVYUV709 = 1,
-       HDMI_INFOFRAME_AVI_DB3Q_DEFAULT = 0,
-       HDMI_INFOFRAME_AVI_DB3Q_LR = 1,
-       HDMI_INFOFRAME_AVI_DB3Q_FR = 2,
-       HDMI_INFOFRAME_AVI_DB3SC_NO = 0,
-       HDMI_INFOFRAME_AVI_DB3SC_HORI = 1,
-       HDMI_INFOFRAME_AVI_DB3SC_VERT = 2,
-       HDMI_INFOFRAME_AVI_DB3SC_HORIVERT = 3,
-       HDMI_INFOFRAME_AVI_DB5PR_NO = 0,
-       HDMI_INFOFRAME_AVI_DB5PR_2 = 1,
-       HDMI_INFOFRAME_AVI_DB5PR_3 = 2,
-       HDMI_INFOFRAME_AVI_DB5PR_4 = 3,
-       HDMI_INFOFRAME_AVI_DB5PR_5 = 4,
-       HDMI_INFOFRAME_AVI_DB5PR_6 = 5,
-       HDMI_INFOFRAME_AVI_DB5PR_7 = 6,
-       HDMI_INFOFRAME_AVI_DB5PR_8 = 7,
-       HDMI_INFOFRAME_AVI_DB5PR_9 = 8,
-       HDMI_INFOFRAME_AVI_DB5PR_10 = 9,
-};
-
-struct hdmi_cm {
-       int     code;
-       int     mode;
-};
-
-struct hdmi_video_format {
-       enum hdmi_packing_mode  packing_mode;
-       u32                     y_res;  /* Line per panel */
-       u32                     x_res;  /* pixel per line */
-};
-
-struct hdmi_config {
-       struct omap_video_timings timings;
-       struct hdmi_cm cm;
-};
-
-/* HDMI PLL structure */
-struct hdmi_pll_info {
-       u16 regn;
-       u16 regm;
-       u32 regmf;
-       u16 regm2;
-       u16 regsd;
-       u16 dcofreq;
-       enum hdmi_clk_refsel refsel;
-};
-
-struct hdmi_audio_format {
-       enum hdmi_stereo_channels               stereo_channels;
-       u8                                      active_chnnls_msk;
-       enum hdmi_audio_type                    type;
-       enum hdmi_audio_justify                 justification;
-       enum hdmi_audio_sample_order            sample_order;
-       enum hdmi_audio_samples_perword         samples_per_word;
-       enum hdmi_audio_sample_size             sample_size;
-       enum hdmi_audio_blk_strt_end_sig        en_sig_blk_strt_end;
-};
-
-struct hdmi_audio_dma {
-       u8                              transfer_size;
-       u8                              block_size;
-       enum hdmi_audio_transf_mode     mode;
-       u16                             fifo_threshold;
-};
-
-struct hdmi_core_audio_i2s_config {
-       u8 in_length_bits;
-       u8 justification;
-       u8 sck_edge_mode;
-       u8 vbit;
-       u8 direction;
-       u8 shift;
-       u8 active_sds;
-};
-
-struct hdmi_core_audio_config {
-       struct hdmi_core_audio_i2s_config       i2s_cfg;
-       struct snd_aes_iec958                   *iec60958_cfg;
-       bool                                    fs_override;
-       u32                                     n;
-       u32                                     cts;
-       u32                                     aud_par_busclk;
-       enum hdmi_core_audio_layout             layout;
-       enum hdmi_core_cts_mode                 cts_mode;
-       bool                                    use_mclk;
-       enum hdmi_audio_mclk_mode               mclk_mode;
-       bool                                    en_acr_pkt;
-       bool                                    en_dsd_audio;
-       bool                                    en_parallel_aud_input;
-       bool                                    en_spdif;
-};
-
-/*
- * Refer to section 8.2 in HDMI 1.3 specification for
- * details about infoframe databytes
- */
-struct hdmi_core_infoframe_avi {
-       /* Y0, Y1 rgb,yCbCr */
-       u8      db1_format;
-       /* A0  Active information Present */
-       u8      db1_active_info;
-       /* B0, B1 Bar info data valid */
-       u8      db1_bar_info_dv;
-       /* S0, S1 scan information */
-       u8      db1_scan_info;
-       /* C0, C1 colorimetry */
-       u8      db2_colorimetry;
-       /* M0, M1 Aspect ratio (4:3, 16:9) */
-       u8      db2_aspect_ratio;
-       /* R0...R3 Active format aspect ratio */
-       u8      db2_active_fmt_ar;
-       /* ITC IT content. */
-       u8      db3_itc;
-       /* EC0, EC1, EC2 Extended colorimetry */
-       u8      db3_ec;
-       /* Q1, Q0 Quantization range */
-       u8      db3_q_range;
-       /* SC1, SC0 Non-uniform picture scaling */
-       u8      db3_nup_scaling;
-       /* VIC0..6 Video format identification */
-       u8      db4_videocode;
-       /* PR0..PR3 Pixel repetition factor */
-       u8      db5_pixel_repeat;
-       /* Line number end of top bar */
-       u16     db6_7_line_eoftop;
-       /* Line number start of bottom bar */
-       u16     db8_9_line_sofbottom;
-       /* Pixel number end of left bar */
-       u16     db10_11_pixel_eofleft;
-       /* Pixel number start of right bar */
-       u16     db12_13_pixel_sofright;
-};
-
-struct hdmi_wp_data {
-       void __iomem *base;
-};
-
-struct hdmi_pll_data {
-       void __iomem *base;
-
-       struct hdmi_pll_info info;
-};
-
-struct hdmi_phy_data {
-       void __iomem *base;
-
-       int irq;
-};
-
-struct hdmi_core_data {
-       void __iomem *base;
-
-       struct hdmi_core_infoframe_avi avi_cfg;
-};
-
-static inline void hdmi_write_reg(void __iomem *base_addr, const u16 idx,
-               u32 val)
-{
-       __raw_writel(val, base_addr + idx);
-}
-
-static inline u32 hdmi_read_reg(void __iomem *base_addr, const u16 idx)
-{
-       return __raw_readl(base_addr + idx);
-}
-
-#define REG_FLD_MOD(base, idx, val, start, end) \
-       hdmi_write_reg(base, idx, FLD_MOD(hdmi_read_reg(base, idx),\
-                                                       val, start, end))
-#define REG_GET(base, idx, start, end) \
-       FLD_GET(hdmi_read_reg(base, idx), start, end)
-
-static inline int hdmi_wait_for_bit_change(void __iomem *base_addr,
-               const u16 idx, int b2, int b1, u32 val)
-{
-       u32 t = 0;
-       while (val != REG_GET(base_addr, idx, b2, b1)) {
-               udelay(1);
-               if (t++ > 10000)
-                       return !val;
-       }
-       return val;
-}
-
-/* HDMI wrapper funcs */
-int hdmi_wp_video_start(struct hdmi_wp_data *wp);
-void hdmi_wp_video_stop(struct hdmi_wp_data *wp);
-void hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s);
-u32 hdmi_wp_get_irqstatus(struct hdmi_wp_data *wp);
-void hdmi_wp_set_irqstatus(struct hdmi_wp_data *wp, u32 irqstatus);
-void hdmi_wp_set_irqenable(struct hdmi_wp_data *wp, u32 mask);
-void hdmi_wp_clear_irqenable(struct hdmi_wp_data *wp, u32 mask);
-int hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val);
-int hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val);
-void hdmi_wp_video_config_format(struct hdmi_wp_data *wp,
-               struct hdmi_video_format *video_fmt);
-void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp,
-               struct omap_video_timings *timings);
-void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp,
-               struct omap_video_timings *timings);
-void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt,
-               struct omap_video_timings *timings, struct hdmi_config *param);
-int hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp);
-
-/* HDMI PLL funcs */
-int hdmi_pll_enable(struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
-void hdmi_pll_disable(struct hdmi_pll_data *pll, struct hdmi_wp_data *wp);
-void hdmi_pll_dump(struct hdmi_pll_data *pll, struct seq_file *s);
-void hdmi_pll_compute(struct hdmi_pll_data *pll, unsigned long clkin, int phy);
-int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll);
-
-/* HDMI PHY funcs */
-int hdmi_phy_enable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp,
-               struct hdmi_config *cfg);
-void hdmi_phy_disable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp);
-void hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s);
-int hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy);
-
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-int hdmi_compute_acr(u32 sample_freq, u32 *n, u32 *cts);
-int hdmi_wp_audio_enable(struct hdmi_wp_data *wp, bool enable);
-int hdmi_wp_audio_core_req_enable(struct hdmi_wp_data *wp, bool enable);
-void hdmi_wp_audio_config_format(struct hdmi_wp_data *wp,
-               struct hdmi_audio_format *aud_fmt);
-void hdmi_wp_audio_config_dma(struct hdmi_wp_data *wp,
-               struct hdmi_audio_dma *aud_dma);
-#endif
-#endif
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
deleted file mode 100644 (file)
index 93a99fd..0000000
+++ /dev/null
@@ -1,1034 +0,0 @@
-/*
- * ti_hdmi_4xxx_ip.c
- *
- * HDMI TI81xx, TI38xx, TI OMAP4 etc IP driver Library
- * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com/
- * Authors: Yong Zhi
- *     Mythri pk <mythripk@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/module.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-#include <linux/delay.h>
-#include <linux/platform_device.h>
-#include <linux/string.h>
-#include <linux/seq_file.h>
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-#include <sound/asound.h>
-#include <sound/asoundef.h>
-#endif
-
-#include "ti_hdmi_4xxx_ip.h"
-#include "dss_features.h"
-
-#define HDMI_CORE_AV           0x500
-
-static inline void __iomem *hdmi_av_base(struct hdmi_core_data *core)
-{
-       return core->base + HDMI_CORE_AV;
-}
-
-static int hdmi_core_ddc_init(struct hdmi_core_data *core)
-{
-       void __iomem *base = core->base;
-
-       /* Turn on CLK for DDC */
-       REG_FLD_MOD(base, HDMI_CORE_AV_DPD, 0x7, 2, 0);
-
-       /* IN_PROG */
-       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 4, 4) == 1) {
-               /* Abort transaction */
-               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0xf, 3, 0);
-               /* IN_PROG */
-               if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
-                                       4, 4, 0) != 0) {
-                       DSSERR("Timeout aborting DDC transaction\n");
-                       return -ETIMEDOUT;
-               }
-       }
-
-       /* Clk SCL Devices */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0xA, 3, 0);
-
-       /* HDMI_CORE_DDC_STATUS_IN_PROG */
-       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
-                               4, 4, 0) != 0) {
-               DSSERR("Timeout starting SCL clock\n");
-               return -ETIMEDOUT;
-       }
-
-       /* Clear FIFO */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x9, 3, 0);
-
-       /* HDMI_CORE_DDC_STATUS_IN_PROG */
-       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
-                               4, 4, 0) != 0) {
-               DSSERR("Timeout clearing DDC fifo\n");
-               return -ETIMEDOUT;
-       }
-
-       return 0;
-}
-
-static int hdmi_core_ddc_edid(struct hdmi_core_data *core,
-               u8 *pedid, int ext)
-{
-       void __iomem *base = core->base;
-       u32 i;
-       char checksum;
-       u32 offset = 0;
-
-       /* HDMI_CORE_DDC_STATUS_IN_PROG */
-       if (hdmi_wait_for_bit_change(base, HDMI_CORE_DDC_STATUS,
-                               4, 4, 0) != 0) {
-               DSSERR("Timeout waiting DDC to be ready\n");
-               return -ETIMEDOUT;
-       }
-
-       if (ext % 2 != 0)
-               offset = 0x80;
-
-       /* Load Segment Address Register */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_SEGM, ext / 2, 7, 0);
-
-       /* Load Slave Address Register */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_ADDR, 0xA0 >> 1, 7, 1);
-
-       /* Load Offset Address Register */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_OFFSET, offset, 7, 0);
-
-       /* Load Byte Count */
-       REG_FLD_MOD(base, HDMI_CORE_DDC_COUNT1, 0x80, 7, 0);
-       REG_FLD_MOD(base, HDMI_CORE_DDC_COUNT2, 0x0, 1, 0);
-
-       /* Set DDC_CMD */
-       if (ext)
-               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x4, 3, 0);
-       else
-               REG_FLD_MOD(base, HDMI_CORE_DDC_CMD, 0x2, 3, 0);
-
-       /* HDMI_CORE_DDC_STATUS_BUS_LOW */
-       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 6, 6) == 1) {
-               pr_err("I2C Bus Low?\n");
-               return -EIO;
-       }
-       /* HDMI_CORE_DDC_STATUS_NO_ACK */
-       if (REG_GET(base, HDMI_CORE_DDC_STATUS, 5, 5) == 1) {
-               pr_err("I2C No Ack\n");
-               return -EIO;
-       }
-
-       for (i = 0; i < 0x80; ++i) {
-               int t;
-
-               /* IN_PROG */
-               if (REG_GET(base, HDMI_CORE_DDC_STATUS, 4, 4) == 0) {
-                       DSSERR("operation stopped when reading edid\n");
-                       return -EIO;
-               }
-
-               t = 0;
-               /* FIFO_EMPTY */
-               while (REG_GET(base, HDMI_CORE_DDC_STATUS, 2, 2) == 1) {
-                       if (t++ > 10000) {
-                               DSSERR("timeout reading edid\n");
-                               return -ETIMEDOUT;
-                       }
-                       udelay(1);
-               }
-
-               pedid[i] = REG_GET(base, HDMI_CORE_DDC_DATA, 7, 0);
-       }
-
-       checksum = 0;
-       for (i = 0; i < 0x80; ++i)
-               checksum += pedid[i];
-
-       if (checksum != 0) {
-               pr_err("E-EDID checksum failed!!\n");
-               return -EIO;
-       }
-
-       return 0;
-}
-
-int hdmi4_read_edid(struct hdmi_core_data *core, u8 *edid, int len)
-{
-       int r, l;
-
-       if (len < 128)
-               return -EINVAL;
-
-       r = hdmi_core_ddc_init(core);
-       if (r)
-               return r;
-
-       r = hdmi_core_ddc_edid(core, edid, 0);
-       if (r)
-               return r;
-
-       l = 128;
-
-       if (len >= 128 * 2 && edid[0x7e] > 0) {
-               r = hdmi_core_ddc_edid(core, edid + 0x80, 1);
-               if (r)
-                       return r;
-               l += 128;
-       }
-
-       return l;
-}
-
-static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
-                       struct hdmi_core_infoframe_avi *avi_cfg,
-                       struct hdmi_core_packet_enable_repeat *repeat_cfg)
-{
-       pr_debug("Enter hdmi_core_init\n");
-
-       /* video core */
-       video_cfg->ip_bus_width = HDMI_INPUT_8BIT;
-       video_cfg->op_dither_truc = HDMI_OUTPUTTRUNCATION_8BIT;
-       video_cfg->deep_color_pkt = HDMI_DEEPCOLORPACKECTDISABLE;
-       video_cfg->pkt_mode = HDMI_PACKETMODERESERVEDVALUE;
-       video_cfg->hdmi_dvi = HDMI_DVI;
-       video_cfg->tclk_sel_clkmult = HDMI_FPLL10IDCK;
-
-       /* info frame */
-       avi_cfg->db1_format = 0;
-       avi_cfg->db1_active_info = 0;
-       avi_cfg->db1_bar_info_dv = 0;
-       avi_cfg->db1_scan_info = 0;
-       avi_cfg->db2_colorimetry = 0;
-       avi_cfg->db2_aspect_ratio = 0;
-       avi_cfg->db2_active_fmt_ar = 0;
-       avi_cfg->db3_itc = 0;
-       avi_cfg->db3_ec = 0;
-       avi_cfg->db3_q_range = 0;
-       avi_cfg->db3_nup_scaling = 0;
-       avi_cfg->db4_videocode = 0;
-       avi_cfg->db5_pixel_repeat = 0;
-       avi_cfg->db6_7_line_eoftop = 0 ;
-       avi_cfg->db8_9_line_sofbottom = 0;
-       avi_cfg->db10_11_pixel_eofleft = 0;
-       avi_cfg->db12_13_pixel_sofright = 0;
-
-       /* packet enable and repeat */
-       repeat_cfg->audio_pkt = 0;
-       repeat_cfg->audio_pkt_repeat = 0;
-       repeat_cfg->avi_infoframe = 0;
-       repeat_cfg->avi_infoframe_repeat = 0;
-       repeat_cfg->gen_cntrl_pkt = 0;
-       repeat_cfg->gen_cntrl_pkt_repeat = 0;
-       repeat_cfg->generic_pkt = 0;
-       repeat_cfg->generic_pkt_repeat = 0;
-}
-
-static void hdmi_core_powerdown_disable(struct hdmi_core_data *core)
-{
-       pr_debug("Enter hdmi_core_powerdown_disable\n");
-       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SYS_CTRL1, 0x0, 0, 0);
-}
-
-static void hdmi_core_swreset_release(struct hdmi_core_data *core)
-{
-       pr_debug("Enter hdmi_core_swreset_release\n");
-       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x0, 0, 0);
-}
-
-static void hdmi_core_swreset_assert(struct hdmi_core_data *core)
-{
-       pr_debug("Enter hdmi_core_swreset_assert\n");
-       REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x1, 0, 0);
-}
-
-/* HDMI_CORE_VIDEO_CONFIG */
-static void hdmi_core_video_config(struct hdmi_core_data *core,
-                               struct hdmi_core_video_config *cfg)
-{
-       u32 r = 0;
-       void __iomem *core_sys_base = core->base;
-       void __iomem *core_av_base = hdmi_av_base(core);
-
-       /* sys_ctrl1 default configuration not tunable */
-       r = hdmi_read_reg(core_sys_base, HDMI_CORE_SYS_SYS_CTRL1);
-       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_VEN_FOLLOWVSYNC, 5, 5);
-       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_HEN_FOLLOWHSYNC, 4, 4);
-       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_BSEL_24BITBUS, 2, 2);
-       r = FLD_MOD(r, HDMI_CORE_SYS_SYS_CTRL1_EDGE_RISINGEDGE, 1, 1);
-       hdmi_write_reg(core_sys_base, HDMI_CORE_SYS_SYS_CTRL1, r);
-
-       REG_FLD_MOD(core_sys_base,
-                       HDMI_CORE_SYS_VID_ACEN, cfg->ip_bus_width, 7, 6);
-
-       /* Vid_Mode */
-       r = hdmi_read_reg(core_sys_base, HDMI_CORE_SYS_VID_MODE);
-
-       /* dither truncation configuration */
-       if (cfg->op_dither_truc > HDMI_OUTPUTTRUNCATION_12BIT) {
-               r = FLD_MOD(r, cfg->op_dither_truc - 3, 7, 6);
-               r = FLD_MOD(r, 1, 5, 5);
-       } else {
-               r = FLD_MOD(r, cfg->op_dither_truc, 7, 6);
-               r = FLD_MOD(r, 0, 5, 5);
-       }
-       hdmi_write_reg(core_sys_base, HDMI_CORE_SYS_VID_MODE, r);
-
-       /* HDMI_Ctrl */
-       r = hdmi_read_reg(core_av_base, HDMI_CORE_AV_HDMI_CTRL);
-       r = FLD_MOD(r, cfg->deep_color_pkt, 6, 6);
-       r = FLD_MOD(r, cfg->pkt_mode, 5, 3);
-       r = FLD_MOD(r, cfg->hdmi_dvi, 0, 0);
-       hdmi_write_reg(core_av_base, HDMI_CORE_AV_HDMI_CTRL, r);
-
-       /* TMDS_CTRL */
-       REG_FLD_MOD(core_sys_base,
-                       HDMI_CORE_SYS_TMDS_CTRL, cfg->tclk_sel_clkmult, 6, 5);
-}
-
-static void hdmi_core_aux_infoframe_avi_config(struct hdmi_core_data *core)
-{
-       u32 val;
-       char sum = 0, checksum = 0;
-       void __iomem *av_base = hdmi_av_base(core);
-       struct hdmi_core_infoframe_avi info_avi = core->avi_cfg;
-
-       sum += 0x82 + 0x002 + 0x00D;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_TYPE, 0x082);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_VERS, 0x002);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_LEN, 0x00D);
-
-       val = (info_avi.db1_format << 5) |
-               (info_avi.db1_active_info << 4) |
-               (info_avi.db1_bar_info_dv << 2) |
-               (info_avi.db1_scan_info);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(0), val);
-       sum += val;
-
-       val = (info_avi.db2_colorimetry << 6) |
-               (info_avi.db2_aspect_ratio << 4) |
-               (info_avi.db2_active_fmt_ar);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(1), val);
-       sum += val;
-
-       val = (info_avi.db3_itc << 7) |
-               (info_avi.db3_ec << 4) |
-               (info_avi.db3_q_range << 2) |
-               (info_avi.db3_nup_scaling);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(2), val);
-       sum += val;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(3),
-                                       info_avi.db4_videocode);
-       sum += info_avi.db4_videocode;
-
-       val = info_avi.db5_pixel_repeat;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(4), val);
-       sum += val;
-
-       val = info_avi.db6_7_line_eoftop & 0x00FF;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(5), val);
-       sum += val;
-
-       val = ((info_avi.db6_7_line_eoftop >> 8) & 0x00FF);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(6), val);
-       sum += val;
-
-       val = info_avi.db8_9_line_sofbottom & 0x00FF;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(7), val);
-       sum += val;
-
-       val = ((info_avi.db8_9_line_sofbottom >> 8) & 0x00FF);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(8), val);
-       sum += val;
-
-       val = info_avi.db10_11_pixel_eofleft & 0x00FF;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(9), val);
-       sum += val;
-
-       val = ((info_avi.db10_11_pixel_eofleft >> 8) & 0x00FF);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(10), val);
-       sum += val;
-
-       val = info_avi.db12_13_pixel_sofright & 0x00FF;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(11), val);
-       sum += val;
-
-       val = ((info_avi.db12_13_pixel_sofright >> 8) & 0x00FF);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_DBYTE(12), val);
-       sum += val;
-
-       checksum = 0x100 - sum;
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AVI_CHSUM, checksum);
-}
-
-static void hdmi_core_av_packet_config(struct hdmi_core_data *core,
-               struct hdmi_core_packet_enable_repeat repeat_cfg)
-{
-       /* enable/repeat the infoframe */
-       hdmi_write_reg(hdmi_av_base(core), HDMI_CORE_AV_PB_CTRL1,
-               (repeat_cfg.audio_pkt << 5) |
-               (repeat_cfg.audio_pkt_repeat << 4) |
-               (repeat_cfg.avi_infoframe << 1) |
-               (repeat_cfg.avi_infoframe_repeat));
-
-       /* enable/repeat the packet */
-       hdmi_write_reg(hdmi_av_base(core), HDMI_CORE_AV_PB_CTRL2,
-               (repeat_cfg.gen_cntrl_pkt << 3) |
-               (repeat_cfg.gen_cntrl_pkt_repeat << 2) |
-               (repeat_cfg.generic_pkt << 1) |
-               (repeat_cfg.generic_pkt_repeat));
-}
-
-void hdmi4_configure(struct hdmi_core_data *core,
-       struct hdmi_wp_data *wp, struct hdmi_config *cfg)
-{
-       /* HDMI */
-       struct omap_video_timings video_timing;
-       struct hdmi_video_format video_format;
-       /* HDMI core */
-       struct hdmi_core_infoframe_avi *avi_cfg = &core->avi_cfg;
-       struct hdmi_core_video_config v_core_cfg;
-       struct hdmi_core_packet_enable_repeat repeat_cfg;
-
-       hdmi_core_init(&v_core_cfg, avi_cfg, &repeat_cfg);
-
-       hdmi_wp_init_vid_fmt_timings(&video_format, &video_timing, cfg);
-
-       hdmi_wp_video_config_timing(wp, &video_timing);
-
-       /* video config */
-       video_format.packing_mode = HDMI_PACK_24b_RGB_YUV444_YUV422;
-
-       hdmi_wp_video_config_format(wp, &video_format);
-
-       hdmi_wp_video_config_interface(wp, &video_timing);
-
-       /*
-        * configure core video part
-        * set software reset in the core
-        */
-       hdmi_core_swreset_assert(core);
-
-       /* power down off */
-       hdmi_core_powerdown_disable(core);
-
-       v_core_cfg.pkt_mode = HDMI_PACKETMODE24BITPERPIXEL;
-       v_core_cfg.hdmi_dvi = cfg->cm.mode;
-
-       hdmi_core_video_config(core, &v_core_cfg);
-
-       /* release software reset in the core */
-       hdmi_core_swreset_release(core);
-
-       /*
-        * configure packet
-        * info frame video see doc CEA861-D page 65
-        */
-       avi_cfg->db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB;
-       avi_cfg->db1_active_info =
-                       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF;
-       avi_cfg->db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO;
-       avi_cfg->db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0;
-       avi_cfg->db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO;
-       avi_cfg->db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO;
-       avi_cfg->db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME;
-       avi_cfg->db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO;
-       avi_cfg->db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601;
-       avi_cfg->db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT;
-       avi_cfg->db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO;
-       avi_cfg->db4_videocode = cfg->cm.code;
-       avi_cfg->db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO;
-       avi_cfg->db6_7_line_eoftop = 0;
-       avi_cfg->db8_9_line_sofbottom = 0;
-       avi_cfg->db10_11_pixel_eofleft = 0;
-       avi_cfg->db12_13_pixel_sofright = 0;
-
-       hdmi_core_aux_infoframe_avi_config(core);
-
-       /* enable/repeat the infoframe */
-       repeat_cfg.avi_infoframe = HDMI_PACKETENABLE;
-       repeat_cfg.avi_infoframe_repeat = HDMI_PACKETREPEATON;
-       /* wakeup */
-       repeat_cfg.audio_pkt = HDMI_PACKETENABLE;
-       repeat_cfg.audio_pkt_repeat = HDMI_PACKETREPEATON;
-       hdmi_core_av_packet_config(core, repeat_cfg);
-}
-
-void hdmi4_core_dump(struct hdmi_core_data *core, struct seq_file *s)
-{
-       int i;
-
-#define CORE_REG(i, name) name(i)
-#define DUMPCORE(r) seq_printf(s, "%-35s %08x\n", #r,\
-               hdmi_read_reg(core->base, r))
-#define DUMPCOREAV(r) seq_printf(s, "%-35s %08x\n", #r,\
-               hdmi_read_reg(hdmi_av_base(core), r))
-#define DUMPCOREAV2(i, r) seq_printf(s, "%s[%d]%*s %08x\n", #r, i, \
-               (i < 10) ? 32 - (int)strlen(#r) : 31 - (int)strlen(#r), " ", \
-               hdmi_read_reg(hdmi_av_base(core), CORE_REG(i, r)))
-
-       DUMPCORE(HDMI_CORE_SYS_VND_IDL);
-       DUMPCORE(HDMI_CORE_SYS_DEV_IDL);
-       DUMPCORE(HDMI_CORE_SYS_DEV_IDH);
-       DUMPCORE(HDMI_CORE_SYS_DEV_REV);
-       DUMPCORE(HDMI_CORE_SYS_SRST);
-       DUMPCORE(HDMI_CORE_SYS_SYS_CTRL1);
-       DUMPCORE(HDMI_CORE_SYS_SYS_STAT);
-       DUMPCORE(HDMI_CORE_SYS_SYS_CTRL3);
-       DUMPCORE(HDMI_CORE_SYS_DE_DLY);
-       DUMPCORE(HDMI_CORE_SYS_DE_CTRL);
-       DUMPCORE(HDMI_CORE_SYS_DE_TOP);
-       DUMPCORE(HDMI_CORE_SYS_DE_CNTL);
-       DUMPCORE(HDMI_CORE_SYS_DE_CNTH);
-       DUMPCORE(HDMI_CORE_SYS_DE_LINL);
-       DUMPCORE(HDMI_CORE_SYS_DE_LINH_1);
-       DUMPCORE(HDMI_CORE_SYS_HRES_L);
-       DUMPCORE(HDMI_CORE_SYS_HRES_H);
-       DUMPCORE(HDMI_CORE_SYS_VRES_L);
-       DUMPCORE(HDMI_CORE_SYS_VRES_H);
-       DUMPCORE(HDMI_CORE_SYS_IADJUST);
-       DUMPCORE(HDMI_CORE_SYS_POLDETECT);
-       DUMPCORE(HDMI_CORE_SYS_HWIDTH1);
-       DUMPCORE(HDMI_CORE_SYS_HWIDTH2);
-       DUMPCORE(HDMI_CORE_SYS_VWIDTH);
-       DUMPCORE(HDMI_CORE_SYS_VID_CTRL);
-       DUMPCORE(HDMI_CORE_SYS_VID_ACEN);
-       DUMPCORE(HDMI_CORE_SYS_VID_MODE);
-       DUMPCORE(HDMI_CORE_SYS_VID_BLANK1);
-       DUMPCORE(HDMI_CORE_SYS_VID_BLANK3);
-       DUMPCORE(HDMI_CORE_SYS_VID_BLANK1);
-       DUMPCORE(HDMI_CORE_SYS_DC_HEADER);
-       DUMPCORE(HDMI_CORE_SYS_VID_DITHER);
-       DUMPCORE(HDMI_CORE_SYS_RGB2XVYCC_CT);
-       DUMPCORE(HDMI_CORE_SYS_R2Y_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_R2Y_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_G2Y_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_G2Y_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_B2Y_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_B2Y_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_R2CB_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_R2CB_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_G2CB_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_G2CB_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_B2CB_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_B2CB_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_R2CR_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_R2CR_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_G2CR_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_G2CR_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_B2CR_COEFF_LOW);
-       DUMPCORE(HDMI_CORE_SYS_B2CR_COEFF_UP);
-       DUMPCORE(HDMI_CORE_SYS_RGB_OFFSET_LOW);
-       DUMPCORE(HDMI_CORE_SYS_RGB_OFFSET_UP);
-       DUMPCORE(HDMI_CORE_SYS_Y_OFFSET_LOW);
-       DUMPCORE(HDMI_CORE_SYS_Y_OFFSET_UP);
-       DUMPCORE(HDMI_CORE_SYS_CBCR_OFFSET_LOW);
-       DUMPCORE(HDMI_CORE_SYS_CBCR_OFFSET_UP);
-       DUMPCORE(HDMI_CORE_SYS_INTR_STATE);
-       DUMPCORE(HDMI_CORE_SYS_INTR1);
-       DUMPCORE(HDMI_CORE_SYS_INTR2);
-       DUMPCORE(HDMI_CORE_SYS_INTR3);
-       DUMPCORE(HDMI_CORE_SYS_INTR4);
-       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK1);
-       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK2);
-       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK3);
-       DUMPCORE(HDMI_CORE_SYS_INTR_UNMASK4);
-       DUMPCORE(HDMI_CORE_SYS_INTR_CTRL);
-       DUMPCORE(HDMI_CORE_SYS_TMDS_CTRL);
-
-       DUMPCORE(HDMI_CORE_DDC_ADDR);
-       DUMPCORE(HDMI_CORE_DDC_SEGM);
-       DUMPCORE(HDMI_CORE_DDC_OFFSET);
-       DUMPCORE(HDMI_CORE_DDC_COUNT1);
-       DUMPCORE(HDMI_CORE_DDC_COUNT2);
-       DUMPCORE(HDMI_CORE_DDC_STATUS);
-       DUMPCORE(HDMI_CORE_DDC_CMD);
-       DUMPCORE(HDMI_CORE_DDC_DATA);
-
-       DUMPCOREAV(HDMI_CORE_AV_ACR_CTRL);
-       DUMPCOREAV(HDMI_CORE_AV_FREQ_SVAL);
-       DUMPCOREAV(HDMI_CORE_AV_N_SVAL1);
-       DUMPCOREAV(HDMI_CORE_AV_N_SVAL2);
-       DUMPCOREAV(HDMI_CORE_AV_N_SVAL3);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL1);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL2);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_SVAL3);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL1);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL2);
-       DUMPCOREAV(HDMI_CORE_AV_CTS_HVAL3);
-       DUMPCOREAV(HDMI_CORE_AV_AUD_MODE);
-       DUMPCOREAV(HDMI_CORE_AV_SPDIF_CTRL);
-       DUMPCOREAV(HDMI_CORE_AV_HW_SPDIF_FS);
-       DUMPCOREAV(HDMI_CORE_AV_SWAP_I2S);
-       DUMPCOREAV(HDMI_CORE_AV_SPDIF_ERTH);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_MAP);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_CTRL);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST0);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST1);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST2);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST4);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_CHST5);
-       DUMPCOREAV(HDMI_CORE_AV_ASRC);
-       DUMPCOREAV(HDMI_CORE_AV_I2S_IN_LEN);
-       DUMPCOREAV(HDMI_CORE_AV_HDMI_CTRL);
-       DUMPCOREAV(HDMI_CORE_AV_AUDO_TXSTAT);
-       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_1);
-       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_2);
-       DUMPCOREAV(HDMI_CORE_AV_AUD_PAR_BUSCLK_3);
-       DUMPCOREAV(HDMI_CORE_AV_TEST_TXCTRL);
-       DUMPCOREAV(HDMI_CORE_AV_DPD);
-       DUMPCOREAV(HDMI_CORE_AV_PB_CTRL1);
-       DUMPCOREAV(HDMI_CORE_AV_PB_CTRL2);
-       DUMPCOREAV(HDMI_CORE_AV_AVI_TYPE);
-       DUMPCOREAV(HDMI_CORE_AV_AVI_VERS);
-       DUMPCOREAV(HDMI_CORE_AV_AVI_LEN);
-       DUMPCOREAV(HDMI_CORE_AV_AVI_CHSUM);
-
-       for (i = 0; i < HDMI_CORE_AV_AVI_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_AVI_DBYTE);
-
-       DUMPCOREAV(HDMI_CORE_AV_SPD_TYPE);
-       DUMPCOREAV(HDMI_CORE_AV_SPD_VERS);
-       DUMPCOREAV(HDMI_CORE_AV_SPD_LEN);
-       DUMPCOREAV(HDMI_CORE_AV_SPD_CHSUM);
-
-       for (i = 0; i < HDMI_CORE_AV_SPD_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_SPD_DBYTE);
-
-       DUMPCOREAV(HDMI_CORE_AV_AUDIO_TYPE);
-       DUMPCOREAV(HDMI_CORE_AV_AUDIO_VERS);
-       DUMPCOREAV(HDMI_CORE_AV_AUDIO_LEN);
-       DUMPCOREAV(HDMI_CORE_AV_AUDIO_CHSUM);
-
-       for (i = 0; i < HDMI_CORE_AV_AUD_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_AUD_DBYTE);
-
-       DUMPCOREAV(HDMI_CORE_AV_MPEG_TYPE);
-       DUMPCOREAV(HDMI_CORE_AV_MPEG_VERS);
-       DUMPCOREAV(HDMI_CORE_AV_MPEG_LEN);
-       DUMPCOREAV(HDMI_CORE_AV_MPEG_CHSUM);
-
-       for (i = 0; i < HDMI_CORE_AV_MPEG_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_MPEG_DBYTE);
-
-       for (i = 0; i < HDMI_CORE_AV_GEN_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_GEN_DBYTE);
-
-       DUMPCOREAV(HDMI_CORE_AV_CP_BYTE1);
-
-       for (i = 0; i < HDMI_CORE_AV_GEN2_DBYTE_NELEMS; i++)
-               DUMPCOREAV2(i, HDMI_CORE_AV_GEN2_DBYTE);
-
-       DUMPCOREAV(HDMI_CORE_AV_CEC_ADDR_ID);
-}
-
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-static void hdmi_core_audio_config(struct hdmi_core_data *core,
-                                       struct hdmi_core_audio_config *cfg)
-{
-       u32 r;
-       void __iomem *av_base = hdmi_av_base(core);
-
-       /*
-        * Parameters for generation of Audio Clock Recovery packets
-        */
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL1, cfg->n, 7, 0);
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL2, cfg->n >> 8, 7, 0);
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_N_SVAL3, cfg->n >> 16, 7, 0);
-
-       if (cfg->cts_mode == HDMI_AUDIO_CTS_MODE_SW) {
-               REG_FLD_MOD(av_base, HDMI_CORE_AV_CTS_SVAL1, cfg->cts, 7, 0);
-               REG_FLD_MOD(av_base,
-                               HDMI_CORE_AV_CTS_SVAL2, cfg->cts >> 8, 7, 0);
-               REG_FLD_MOD(av_base,
-                               HDMI_CORE_AV_CTS_SVAL3, cfg->cts >> 16, 7, 0);
-       } else {
-               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_1,
-                               cfg->aud_par_busclk, 7, 0);
-               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_2,
-                               (cfg->aud_par_busclk >> 8), 7, 0);
-               REG_FLD_MOD(av_base, HDMI_CORE_AV_AUD_PAR_BUSCLK_3,
-                               (cfg->aud_par_busclk >> 16), 7, 0);
-       }
-
-       /* Set ACR clock divisor */
-       REG_FLD_MOD(av_base,
-                       HDMI_CORE_AV_FREQ_SVAL, cfg->mclk_mode, 2, 0);
-
-       r = hdmi_read_reg(av_base, HDMI_CORE_AV_ACR_CTRL);
-       /*
-        * Use TMDS clock for ACR packets. For devices that use
-        * the MCLK, this is the first part of the MCLK initialization.
-        */
-       r = FLD_MOD(r, 0, 2, 2);
-
-       r = FLD_MOD(r, cfg->en_acr_pkt, 1, 1);
-       r = FLD_MOD(r, cfg->cts_mode, 0, 0);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_ACR_CTRL, r);
-
-       /* For devices using MCLK, this completes its initialization. */
-       if (cfg->use_mclk)
-               REG_FLD_MOD(av_base, HDMI_CORE_AV_ACR_CTRL, 1, 2, 2);
-
-       /* Override of SPDIF sample frequency with value in I2S_CHST4 */
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_SPDIF_CTRL,
-                                               cfg->fs_override, 1, 1);
-
-       /*
-        * Set IEC-60958-3 channel status word. It is passed to the IP
-        * just as it is received. The user of the driver is responsible
-        * for its contents.
-        */
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST0,
-                      cfg->iec60958_cfg->status[0]);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST1,
-                      cfg->iec60958_cfg->status[1]);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST2,
-                      cfg->iec60958_cfg->status[2]);
-       /* yes, this is correct: status[3] goes to CHST4 register */
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST4,
-                      cfg->iec60958_cfg->status[3]);
-       /* yes, this is correct: status[4] goes to CHST5 register */
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5,
-                      cfg->iec60958_cfg->status[4]);
-
-       /* set I2S parameters */
-       r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL);
-       r = FLD_MOD(r, cfg->i2s_cfg.sck_edge_mode, 6, 6);
-       r = FLD_MOD(r, cfg->i2s_cfg.vbit, 4, 4);
-       r = FLD_MOD(r, cfg->i2s_cfg.justification, 2, 2);
-       r = FLD_MOD(r, cfg->i2s_cfg.direction, 1, 1);
-       r = FLD_MOD(r, cfg->i2s_cfg.shift, 0, 0);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL, r);
-
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_IN_LEN,
-                       cfg->i2s_cfg.in_length_bits, 3, 0);
-
-       /* Audio channels and mode parameters */
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_HDMI_CTRL, cfg->layout, 2, 1);
-       r = hdmi_read_reg(av_base, HDMI_CORE_AV_AUD_MODE);
-       r = FLD_MOD(r, cfg->i2s_cfg.active_sds, 7, 4);
-       r = FLD_MOD(r, cfg->en_dsd_audio, 3, 3);
-       r = FLD_MOD(r, cfg->en_parallel_aud_input, 2, 2);
-       r = FLD_MOD(r, cfg->en_spdif, 1, 1);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_MODE, r);
-
-       /* Audio channel mappings */
-       /* TODO: Make channel mapping dynamic. For now, map channels
-        * in the ALSA order: FL/FR/RL/RR/C/LFE/SL/SR. Remapping is needed as
-        * HDMI speaker order is different. See CEA-861 Section 6.6.2.
-        */
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_MAP, 0x78);
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_SWAP_I2S, 1, 5, 5);
-}
-
-static void hdmi_core_audio_infoframe_cfg(struct hdmi_core_data *core,
-               struct snd_cea_861_aud_if *info_aud)
-{
-       u8 sum = 0, checksum = 0;
-       void __iomem *av_base = hdmi_av_base(core);
-
-       /*
-        * Set audio info frame type, version and length as
-        * described in HDMI 1.4a Section 8.2.2 specification.
-        * Checksum calculation is defined in Section 5.3.5.
-        */
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_TYPE, 0x84);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_VERS, 0x01);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUDIO_LEN, 0x0a);
-       sum += 0x84 + 0x001 + 0x00a;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(0),
-                      info_aud->db1_ct_cc);
-       sum += info_aud->db1_ct_cc;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(1),
-                      info_aud->db2_sf_ss);
-       sum += info_aud->db2_sf_ss;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(2), info_aud->db3);
-       sum += info_aud->db3;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(3), info_aud->db4_ca);
-       sum += info_aud->db4_ca;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(4),
-                      info_aud->db5_dminh_lsv);
-       sum += info_aud->db5_dminh_lsv;
-
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(5), 0x00);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(6), 0x00);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(7), 0x00);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(8), 0x00);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_AUD_DBYTE(9), 0x00);
-
-       checksum = 0x100 - sum;
-       hdmi_write_reg(av_base,
-                                       HDMI_CORE_AV_AUDIO_CHSUM, checksum);
-
-       /*
-        * TODO: Add MPEG and SPD enable and repeat cfg when EDID parsing
-        * is available.
-        */
-}
-
-int hdmi4_audio_config(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
-               struct omap_dss_audio *audio)
-{
-       struct hdmi_audio_format audio_format;
-       struct hdmi_audio_dma audio_dma;
-       struct hdmi_core_audio_config acore;
-       int err, n, cts, channel_count;
-       unsigned int fs_nr;
-       bool word_length_16b = false;
-
-       if (!audio || !audio->iec || !audio->cea || !core)
-               return -EINVAL;
-
-       acore.iec60958_cfg = audio->iec;
-       /*
-        * In the IEC-60958 status word, check if the audio sample word length
-        * is 16-bit as several optimizations can be performed in such case.
-        */
-       if (!(audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24))
-               if (audio->iec->status[4] & IEC958_AES4_CON_WORDLEN_20_16)
-                       word_length_16b = true;
-
-       /* I2S configuration. See Phillips' specification */
-       if (word_length_16b)
-               acore.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_LEFT;
-       else
-               acore.i2s_cfg.justification = HDMI_AUDIO_JUSTIFY_RIGHT;
-       /*
-        * The I2S input word length is twice the lenght given in the IEC-60958
-        * status word. If the word size is greater than
-        * 20 bits, increment by one.
-        */
-       acore.i2s_cfg.in_length_bits = audio->iec->status[4]
-               & IEC958_AES4_CON_WORDLEN;
-       if (audio->iec->status[4] & IEC958_AES4_CON_MAX_WORDLEN_24)
-               acore.i2s_cfg.in_length_bits++;
-       acore.i2s_cfg.sck_edge_mode = HDMI_AUDIO_I2S_SCK_EDGE_RISING;
-       acore.i2s_cfg.vbit = HDMI_AUDIO_I2S_VBIT_FOR_PCM;
-       acore.i2s_cfg.direction = HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST;
-       acore.i2s_cfg.shift = HDMI_AUDIO_I2S_FIRST_BIT_SHIFT;
-
-       /* convert sample frequency to a number */
-       switch (audio->iec->status[3] & IEC958_AES3_CON_FS) {
-       case IEC958_AES3_CON_FS_32000:
-               fs_nr = 32000;
-               break;
-       case IEC958_AES3_CON_FS_44100:
-               fs_nr = 44100;
-               break;
-       case IEC958_AES3_CON_FS_48000:
-               fs_nr = 48000;
-               break;
-       case IEC958_AES3_CON_FS_88200:
-               fs_nr = 88200;
-               break;
-       case IEC958_AES3_CON_FS_96000:
-               fs_nr = 96000;
-               break;
-       case IEC958_AES3_CON_FS_176400:
-               fs_nr = 176400;
-               break;
-       case IEC958_AES3_CON_FS_192000:
-               fs_nr = 192000;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       err = hdmi_compute_acr(fs_nr, &n, &cts);
-
-       /* Audio clock regeneration settings */
-       acore.n = n;
-       acore.cts = cts;
-       if (dss_has_feature(FEAT_HDMI_CTS_SWMODE)) {
-               acore.aud_par_busclk = 0;
-               acore.cts_mode = HDMI_AUDIO_CTS_MODE_SW;
-               acore.use_mclk = dss_has_feature(FEAT_HDMI_AUDIO_USE_MCLK);
-       } else {
-               acore.aud_par_busclk = (((128 * 31) - 1) << 8);
-               acore.cts_mode = HDMI_AUDIO_CTS_MODE_HW;
-               acore.use_mclk = true;
-       }
-
-       if (acore.use_mclk)
-               acore.mclk_mode = HDMI_AUDIO_MCLK_128FS;
-
-       /* Audio channels settings */
-       channel_count = (audio->cea->db1_ct_cc &
-                        CEA861_AUDIO_INFOFRAME_DB1CC) + 1;
-
-       switch (channel_count) {
-       case 2:
-               audio_format.active_chnnls_msk = 0x03;
-               break;
-       case 3:
-               audio_format.active_chnnls_msk = 0x07;
-               break;
-       case 4:
-               audio_format.active_chnnls_msk = 0x0f;
-               break;
-       case 5:
-               audio_format.active_chnnls_msk = 0x1f;
-               break;
-       case 6:
-               audio_format.active_chnnls_msk = 0x3f;
-               break;
-       case 7:
-               audio_format.active_chnnls_msk = 0x7f;
-               break;
-       case 8:
-               audio_format.active_chnnls_msk = 0xff;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       /*
-        * the HDMI IP needs to enable four stereo channels when transmitting
-        * more than 2 audio channels
-        */
-       if (channel_count == 2) {
-               audio_format.stereo_channels = HDMI_AUDIO_STEREO_ONECHANNEL;
-               acore.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN;
-               acore.layout = HDMI_AUDIO_LAYOUT_2CH;
-       } else {
-               audio_format.stereo_channels = HDMI_AUDIO_STEREO_FOURCHANNELS;
-               acore.i2s_cfg.active_sds = HDMI_AUDIO_I2S_SD0_EN |
-                               HDMI_AUDIO_I2S_SD1_EN | HDMI_AUDIO_I2S_SD2_EN |
-                               HDMI_AUDIO_I2S_SD3_EN;
-               acore.layout = HDMI_AUDIO_LAYOUT_8CH;
-       }
-
-       acore.en_spdif = false;
-       /* use sample frequency from channel status word */
-       acore.fs_override = true;
-       /* enable ACR packets */
-       acore.en_acr_pkt = true;
-       /* disable direct streaming digital audio */
-       acore.en_dsd_audio = false;
-       /* use parallel audio interface */
-       acore.en_parallel_aud_input = true;
-
-       /* DMA settings */
-       if (word_length_16b)
-               audio_dma.transfer_size = 0x10;
-       else
-               audio_dma.transfer_size = 0x20;
-       audio_dma.block_size = 0xC0;
-       audio_dma.mode = HDMI_AUDIO_TRANSF_DMA;
-       audio_dma.fifo_threshold = 0x20; /* in number of samples */
-
-       /* audio FIFO format settings */
-       if (word_length_16b) {
-               audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_TWOSAMPLES;
-               audio_format.sample_size = HDMI_AUDIO_SAMPLE_16BITS;
-               audio_format.justification = HDMI_AUDIO_JUSTIFY_LEFT;
-       } else {
-               audio_format.samples_per_word = HDMI_AUDIO_ONEWORD_ONESAMPLE;
-               audio_format.sample_size = HDMI_AUDIO_SAMPLE_24BITS;
-               audio_format.justification = HDMI_AUDIO_JUSTIFY_RIGHT;
-       }
-       audio_format.type = HDMI_AUDIO_TYPE_LPCM;
-       audio_format.sample_order = HDMI_AUDIO_SAMPLE_LEFT_FIRST;
-       /* disable start/stop signals of IEC 60958 blocks */
-       audio_format.en_sig_blk_strt_end = HDMI_AUDIO_BLOCK_SIG_STARTEND_ON;
-
-       /* configure DMA and audio FIFO format*/
-       hdmi_wp_audio_config_dma(wp, &audio_dma);
-       hdmi_wp_audio_config_format(wp, &audio_format);
-
-       /* configure the core*/
-       hdmi_core_audio_config(core, &acore);
-
-       /* configure CEA 861 audio infoframe*/
-       hdmi_core_audio_infoframe_cfg(core, audio->cea);
-
-       return 0;
-}
-
-int hdmi4_audio_start(struct hdmi_core_data *core, struct hdmi_wp_data *wp)
-{
-       REG_FLD_MOD(hdmi_av_base(core),
-                   HDMI_CORE_AV_AUD_MODE, true, 0, 0);
-
-       hdmi_wp_audio_core_req_enable(wp, true);
-
-       return 0;
-}
-
-void hdmi4_audio_stop(struct hdmi_core_data *core, struct hdmi_wp_data *wp)
-{
-       REG_FLD_MOD(hdmi_av_base(core),
-                   HDMI_CORE_AV_AUD_MODE, false, 0, 0);
-
-       hdmi_wp_audio_core_req_enable(wp, false);
-}
-
-int hdmi4_audio_get_dma_port(u32 *offset, u32 *size)
-{
-       if (!offset || !size)
-               return -EINVAL;
-       *offset = HDMI_WP_AUDIO_DATA;
-       *size = 4;
-       return 0;
-}
-
-#endif
-
-#define CORE_OFFSET            0x400
-#define CORE_SIZE              0xc00
-
-int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core)
-{
-       struct resource *res;
-       struct resource temp_res;
-
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_core");
-       if (!res) {
-               DSSDBG("can't get CORE mem resource by name\n");
-               /*
-                * if hwmod/DT doesn't have the memory resource information
-                * split into HDMI sub blocks by name, we try again by getting
-                * the platform's first resource. this code will be removed when
-                * the driver can get the mem resources by name
-                */
-               res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-               if (!res) {
-                       DSSERR("can't get CORE mem resource\n");
-                       return -EINVAL;
-               }
-
-               temp_res.start = res->start + CORE_OFFSET;
-               temp_res.end = temp_res.start + CORE_SIZE - 1;
-               res = &temp_res;
-       }
-
-       core->base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
-       if (!core->base) {
-               DSSERR("can't ioremap CORE\n");
-               return -ENOMEM;
-       }
-
-       return 0;
-}
diff --git a/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h b/drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h
deleted file mode 100644 (file)
index 78319ff..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * ti_hdmi_4xxx_ip.h
- *
- * HDMI header definition for DM81xx, DM38xx, TI OMAP4 etc processors.
- *
- * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.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 _HDMI_TI_4xxx_H_
-#define _HDMI_TI_4xxx_H_
-
-#include "ti_hdmi.h"
-
-/* OMAP4 HDMI IP Core System */
-
-#define HDMI_CORE_SYS_VND_IDL                  0x0
-#define HDMI_CORE_SYS_DEV_IDL                  0x8
-#define HDMI_CORE_SYS_DEV_IDH                  0xC
-#define HDMI_CORE_SYS_DEV_REV                  0x10
-#define HDMI_CORE_SYS_SRST                     0x14
-#define HDMI_CORE_SYS_SYS_CTRL1                        0x20
-#define HDMI_CORE_SYS_SYS_STAT                 0x24
-#define HDMI_CORE_SYS_SYS_CTRL3                        0x28
-#define HDMI_CORE_SYS_DCTL                     0x34
-#define HDMI_CORE_SYS_DE_DLY                   0xC8
-#define HDMI_CORE_SYS_DE_CTRL                  0xCC
-#define HDMI_CORE_SYS_DE_TOP                   0xD0
-#define HDMI_CORE_SYS_DE_CNTL                  0xD8
-#define HDMI_CORE_SYS_DE_CNTH                  0xDC
-#define HDMI_CORE_SYS_DE_LINL                  0xE0
-#define HDMI_CORE_SYS_DE_LINH_1                        0xE4
-#define HDMI_CORE_SYS_HRES_L                   0xE8
-#define HDMI_CORE_SYS_HRES_H                   0xEC
-#define HDMI_CORE_SYS_VRES_L                   0xF0
-#define HDMI_CORE_SYS_VRES_H                   0xF4
-#define HDMI_CORE_SYS_IADJUST                  0xF8
-#define HDMI_CORE_SYS_POLDETECT                        0xFC
-#define HDMI_CORE_SYS_HWIDTH1                  0x110
-#define HDMI_CORE_SYS_HWIDTH2                  0x114
-#define HDMI_CORE_SYS_VWIDTH                   0x11C
-#define HDMI_CORE_SYS_VID_CTRL                 0x120
-#define HDMI_CORE_SYS_VID_ACEN                 0x124
-#define HDMI_CORE_SYS_VID_MODE                 0x128
-#define HDMI_CORE_SYS_VID_BLANK1               0x12C
-#define HDMI_CORE_SYS_VID_BLANK2               0x130
-#define HDMI_CORE_SYS_VID_BLANK3               0x134
-#define HDMI_CORE_SYS_DC_HEADER                        0x138
-#define HDMI_CORE_SYS_VID_DITHER               0x13C
-#define HDMI_CORE_SYS_RGB2XVYCC_CT             0x140
-#define HDMI_CORE_SYS_R2Y_COEFF_LOW            0x144
-#define HDMI_CORE_SYS_R2Y_COEFF_UP             0x148
-#define HDMI_CORE_SYS_G2Y_COEFF_LOW            0x14C
-#define HDMI_CORE_SYS_G2Y_COEFF_UP             0x150
-#define HDMI_CORE_SYS_B2Y_COEFF_LOW            0x154
-#define HDMI_CORE_SYS_B2Y_COEFF_UP             0x158
-#define HDMI_CORE_SYS_R2CB_COEFF_LOW           0x15C
-#define HDMI_CORE_SYS_R2CB_COEFF_UP            0x160
-#define HDMI_CORE_SYS_G2CB_COEFF_LOW           0x164
-#define HDMI_CORE_SYS_G2CB_COEFF_UP            0x168
-#define HDMI_CORE_SYS_B2CB_COEFF_LOW           0x16C
-#define HDMI_CORE_SYS_B2CB_COEFF_UP            0x170
-#define HDMI_CORE_SYS_R2CR_COEFF_LOW           0x174
-#define HDMI_CORE_SYS_R2CR_COEFF_UP            0x178
-#define HDMI_CORE_SYS_G2CR_COEFF_LOW           0x17C
-#define HDMI_CORE_SYS_G2CR_COEFF_UP            0x180
-#define HDMI_CORE_SYS_B2CR_COEFF_LOW           0x184
-#define HDMI_CORE_SYS_B2CR_COEFF_UP            0x188
-#define HDMI_CORE_SYS_RGB_OFFSET_LOW           0x18C
-#define HDMI_CORE_SYS_RGB_OFFSET_UP            0x190
-#define HDMI_CORE_SYS_Y_OFFSET_LOW             0x194
-#define HDMI_CORE_SYS_Y_OFFSET_UP              0x198
-#define HDMI_CORE_SYS_CBCR_OFFSET_LOW          0x19C
-#define HDMI_CORE_SYS_CBCR_OFFSET_UP           0x1A0
-#define HDMI_CORE_SYS_INTR_STATE               0x1C0
-#define HDMI_CORE_SYS_INTR1                    0x1C4
-#define HDMI_CORE_SYS_INTR2                    0x1C8
-#define HDMI_CORE_SYS_INTR3                    0x1CC
-#define HDMI_CORE_SYS_INTR4                    0x1D0
-#define HDMI_CORE_SYS_INTR_UNMASK1             0x1D4
-#define HDMI_CORE_SYS_INTR_UNMASK2             0x1D8
-#define HDMI_CORE_SYS_INTR_UNMASK3             0x1DC
-#define HDMI_CORE_SYS_INTR_UNMASK4             0x1E0
-#define HDMI_CORE_SYS_INTR_CTRL                        0x1E4
-#define HDMI_CORE_SYS_TMDS_CTRL                        0x208
-
-/* value definitions for HDMI_CORE_SYS_SYS_CTRL1 fields */
-#define HDMI_CORE_SYS_SYS_CTRL1_VEN_FOLLOWVSYNC        0x1
-#define HDMI_CORE_SYS_SYS_CTRL1_HEN_FOLLOWHSYNC        0x1
-#define HDMI_CORE_SYS_SYS_CTRL1_BSEL_24BITBUS  0x1
-#define HDMI_CORE_SYS_SYS_CTRL1_EDGE_RISINGEDGE        0x1
-
-/* HDMI DDC E-DID */
-#define HDMI_CORE_DDC_ADDR                     0x3B4
-#define HDMI_CORE_DDC_SEGM                     0x3B8
-#define HDMI_CORE_DDC_OFFSET                   0x3BC
-#define HDMI_CORE_DDC_COUNT1                   0x3C0
-#define HDMI_CORE_DDC_COUNT2                   0x3C4
-#define HDMI_CORE_DDC_STATUS                   0x3C8
-#define HDMI_CORE_DDC_CMD                      0x3CC
-#define HDMI_CORE_DDC_DATA                     0x3D0
-
-/* HDMI IP Core Audio Video */
-
-#define HDMI_CORE_AV_ACR_CTRL                  0x4
-#define HDMI_CORE_AV_FREQ_SVAL                 0x8
-#define HDMI_CORE_AV_N_SVAL1                   0xC
-#define HDMI_CORE_AV_N_SVAL2                   0x10
-#define HDMI_CORE_AV_N_SVAL3                   0x14
-#define HDMI_CORE_AV_CTS_SVAL1                 0x18
-#define HDMI_CORE_AV_CTS_SVAL2                 0x1C
-#define HDMI_CORE_AV_CTS_SVAL3                 0x20
-#define HDMI_CORE_AV_CTS_HVAL1                 0x24
-#define HDMI_CORE_AV_CTS_HVAL2                 0x28
-#define HDMI_CORE_AV_CTS_HVAL3                 0x2C
-#define HDMI_CORE_AV_AUD_MODE                  0x50
-#define HDMI_CORE_AV_SPDIF_CTRL                        0x54
-#define HDMI_CORE_AV_HW_SPDIF_FS               0x60
-#define HDMI_CORE_AV_SWAP_I2S                  0x64
-#define HDMI_CORE_AV_SPDIF_ERTH                        0x6C
-#define HDMI_CORE_AV_I2S_IN_MAP                        0x70
-#define HDMI_CORE_AV_I2S_IN_CTRL               0x74
-#define HDMI_CORE_AV_I2S_CHST0                 0x78
-#define HDMI_CORE_AV_I2S_CHST1                 0x7C
-#define HDMI_CORE_AV_I2S_CHST2                 0x80
-#define HDMI_CORE_AV_I2S_CHST4                 0x84
-#define HDMI_CORE_AV_I2S_CHST5                 0x88
-#define HDMI_CORE_AV_ASRC                      0x8C
-#define HDMI_CORE_AV_I2S_IN_LEN                        0x90
-#define HDMI_CORE_AV_HDMI_CTRL                 0xBC
-#define HDMI_CORE_AV_AUDO_TXSTAT               0xC0
-#define HDMI_CORE_AV_AUD_PAR_BUSCLK_1          0xCC
-#define HDMI_CORE_AV_AUD_PAR_BUSCLK_2          0xD0
-#define HDMI_CORE_AV_AUD_PAR_BUSCLK_3          0xD4
-#define HDMI_CORE_AV_TEST_TXCTRL               0xF0
-#define HDMI_CORE_AV_DPD                       0xF4
-#define HDMI_CORE_AV_PB_CTRL1                  0xF8
-#define HDMI_CORE_AV_PB_CTRL2                  0xFC
-#define HDMI_CORE_AV_AVI_TYPE                  0x100
-#define HDMI_CORE_AV_AVI_VERS                  0x104
-#define HDMI_CORE_AV_AVI_LEN                   0x108
-#define HDMI_CORE_AV_AVI_CHSUM                 0x10C
-#define HDMI_CORE_AV_AVI_DBYTE(n)              (n * 4 + 0x110)
-#define HDMI_CORE_AV_SPD_TYPE                  0x180
-#define HDMI_CORE_AV_SPD_VERS                  0x184
-#define HDMI_CORE_AV_SPD_LEN                   0x188
-#define HDMI_CORE_AV_SPD_CHSUM                 0x18C
-#define HDMI_CORE_AV_SPD_DBYTE(n)              (n * 4 + 0x190)
-#define HDMI_CORE_AV_AUDIO_TYPE                        0x200
-#define HDMI_CORE_AV_AUDIO_VERS                        0x204
-#define HDMI_CORE_AV_AUDIO_LEN                 0x208
-#define HDMI_CORE_AV_AUDIO_CHSUM               0x20C
-#define HDMI_CORE_AV_AUD_DBYTE(n)              (n * 4 + 0x210)
-#define HDMI_CORE_AV_MPEG_TYPE                 0x280
-#define HDMI_CORE_AV_MPEG_VERS                 0x284
-#define HDMI_CORE_AV_MPEG_LEN                  0x288
-#define HDMI_CORE_AV_MPEG_CHSUM                        0x28C
-#define HDMI_CORE_AV_MPEG_DBYTE(n)             (n * 4 + 0x290)
-#define HDMI_CORE_AV_GEN_DBYTE(n)              (n * 4 + 0x300)
-#define HDMI_CORE_AV_CP_BYTE1                  0x37C
-#define HDMI_CORE_AV_GEN2_DBYTE(n)             (n * 4 + 0x380)
-#define HDMI_CORE_AV_CEC_ADDR_ID               0x3FC
-
-#define HDMI_CORE_AV_SPD_DBYTE_ELSIZE          0x4
-#define HDMI_CORE_AV_GEN2_DBYTE_ELSIZE         0x4
-#define HDMI_CORE_AV_MPEG_DBYTE_ELSIZE         0x4
-#define HDMI_CORE_AV_GEN_DBYTE_ELSIZE          0x4
-
-#define HDMI_CORE_AV_AVI_DBYTE_NELEMS          15
-#define HDMI_CORE_AV_SPD_DBYTE_NELEMS          27
-#define HDMI_CORE_AV_AUD_DBYTE_NELEMS          10
-#define HDMI_CORE_AV_MPEG_DBYTE_NELEMS         27
-#define HDMI_CORE_AV_GEN_DBYTE_NELEMS          31
-#define HDMI_CORE_AV_GEN2_DBYTE_NELEMS         31
-
-enum hdmi_core_inputbus_width {
-       HDMI_INPUT_8BIT = 0,
-       HDMI_INPUT_10BIT = 1,
-       HDMI_INPUT_12BIT = 2
-};
-
-enum hdmi_core_dither_trunc {
-       HDMI_OUTPUTTRUNCATION_8BIT = 0,
-       HDMI_OUTPUTTRUNCATION_10BIT = 1,
-       HDMI_OUTPUTTRUNCATION_12BIT = 2,
-       HDMI_OUTPUTDITHER_8BIT = 3,
-       HDMI_OUTPUTDITHER_10BIT = 4,
-       HDMI_OUTPUTDITHER_12BIT = 5
-};
-
-enum hdmi_core_deepcolor_ed {
-       HDMI_DEEPCOLORPACKECTDISABLE = 0,
-       HDMI_DEEPCOLORPACKECTENABLE = 1
-};
-
-enum hdmi_core_packet_mode {
-       HDMI_PACKETMODERESERVEDVALUE = 0,
-       HDMI_PACKETMODE24BITPERPIXEL = 4,
-       HDMI_PACKETMODE30BITPERPIXEL = 5,
-       HDMI_PACKETMODE36BITPERPIXEL = 6,
-       HDMI_PACKETMODE48BITPERPIXEL = 7
-};
-
-enum hdmi_core_tclkselclkmult {
-       HDMI_FPLL05IDCK = 0,
-       HDMI_FPLL10IDCK = 1,
-       HDMI_FPLL20IDCK = 2,
-       HDMI_FPLL40IDCK = 3
-};
-
-enum hdmi_core_packet_ctrl {
-       HDMI_PACKETENABLE = 1,
-       HDMI_PACKETDISABLE = 0,
-       HDMI_PACKETREPEATON = 1,
-       HDMI_PACKETREPEATOFF = 0
-};
-
-enum hdmi_audio_i2s_config {
-       HDMI_AUDIO_I2S_MSB_SHIFTED_FIRST = 0,
-       HDMI_AUDIO_I2S_LSB_SHIFTED_FIRST = 1,
-       HDMI_AUDIO_I2S_SCK_EDGE_FALLING = 0,
-       HDMI_AUDIO_I2S_SCK_EDGE_RISING = 1,
-       HDMI_AUDIO_I2S_VBIT_FOR_PCM = 0,
-       HDMI_AUDIO_I2S_VBIT_FOR_COMPRESSED = 1,
-       HDMI_AUDIO_I2S_FIRST_BIT_SHIFT = 0,
-       HDMI_AUDIO_I2S_FIRST_BIT_NO_SHIFT = 1,
-       HDMI_AUDIO_I2S_SD0_EN = 1,
-       HDMI_AUDIO_I2S_SD1_EN = 1 << 1,
-       HDMI_AUDIO_I2S_SD2_EN = 1 << 2,
-       HDMI_AUDIO_I2S_SD3_EN = 1 << 3,
-};
-
-struct hdmi_core_video_config {
-       enum hdmi_core_inputbus_width   ip_bus_width;
-       enum hdmi_core_dither_trunc     op_dither_truc;
-       enum hdmi_core_deepcolor_ed     deep_color_pkt;
-       enum hdmi_core_packet_mode      pkt_mode;
-       enum hdmi_core_hdmi_dvi         hdmi_dvi;
-       enum hdmi_core_tclkselclkmult   tclk_sel_clkmult;
-};
-
-struct hdmi_core_packet_enable_repeat {
-       u32     audio_pkt;
-       u32     audio_pkt_repeat;
-       u32     avi_infoframe;
-       u32     avi_infoframe_repeat;
-       u32     gen_cntrl_pkt;
-       u32     gen_cntrl_pkt_repeat;
-       u32     generic_pkt;
-       u32     generic_pkt_repeat;
-};
-
-int hdmi4_read_edid(struct hdmi_core_data *core, u8 *edid, int len);
-void hdmi4_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
-               struct hdmi_config *cfg);
-void hdmi4_core_dump(struct hdmi_core_data *core, struct seq_file *s);
-int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core);
-
-#if defined(CONFIG_OMAP4_DSS_HDMI_AUDIO)
-int hdmi4_audio_start(struct hdmi_core_data *core, struct hdmi_wp_data *wp);
-void hdmi4_audio_stop(struct hdmi_core_data *core, struct hdmi_wp_data *wp);
-int hdmi4_audio_config(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
-               struct omap_dss_audio *audio);
-int hdmi4_audio_get_dma_port(u32 *offset, u32 *size);
-#endif
-
-#endif