From: Hitesh K. Patel <[email protected]>

Handled HDMI HPD as MSIC_HDMI pci device interrupt.

Signed-off-by: Jim Liu <[email protected]>
Signed-off-by: Hitesh K. Patel <[email protected]>
---
 drivers/staging/mrst/drv/mdfld_hdmi_audio.c   |   17 +++-
 drivers/staging/mrst/drv/mdfld_intel_hdcp.c   |   21 ++--
 drivers/staging/mrst/drv/mdfld_msic.c         |  164 +++++++++++++++++++++++++
 drivers/staging/mrst/drv/mdfld_msic.h         |   30 +++++
 drivers/staging/mrst/drv/psb_bl.c             |    3 +-
 drivers/staging/mrst/drv/psb_drm.h            |   15 ---
 drivers/staging/mrst/drv/psb_drv.c            |   58 ++-------
 drivers/staging/mrst/drv/psb_drv.h            |    6 -
 drivers/staging/mrst/drv/psb_intel_display2.c |    3 -
 drivers/staging/mrst/drv/psb_intel_hdmi.c     |   65 ++--------
 drivers/staging/mrst/drv/psb_intel_hdmi.h     |   42 +++++++
 drivers/staging/mrst/drv/psb_irq.c            |    6 -
 drivers/staging/mrst/medfield/Makefile        |    3 +
 drivers/staging/mrst/moorestown/Makefile      |    3 +
 14 files changed, 295 insertions(+), 141 deletions(-)
 create mode 100644 drivers/staging/mrst/drv/mdfld_msic.c
 create mode 100644 drivers/staging/mrst/drv/mdfld_msic.h

diff --git a/drivers/staging/mrst/drv/mdfld_hdmi_audio.c 
b/drivers/staging/mrst/drv/mdfld_hdmi_audio.c
index 9fa12f3..61568a8 100644
--- a/drivers/staging/mrst/drv/mdfld_hdmi_audio.c
+++ b/drivers/staging/mrst/drv/mdfld_hdmi_audio.c
@@ -18,7 +18,12 @@
  *     jim liu <[email protected]>
  */
 
-
+#include <drm/drmP.h>
+#include "psb_drv.h"
+#include "psb_intel_reg.h"
+#include "psb_intel_hdmi_reg.h"
+#include "psb_intel_hdmi_edid.h"
+#include "psb_intel_hdmi.h"
 #include "mdfld_hdmi_audio_if.h"
 
 
@@ -28,6 +33,16 @@
 
 #define IS_HDMI_AUDIO_REG(reg) ((reg >= 0x69000) && (reg < 0x69118))
 
+/*
+ *
+ */
+static struct mid_intel_hdmi_priv *hdmi_priv;
+
+void mdfld_hdmi_audio_init(struct mid_intel_hdmi_priv *p_hdmi_priv)
+{
+       hdmi_priv = p_hdmi_priv;
+}
+
 /**
  * mdfld_hdmi_audio_write:
  * used to write into display controller HDMI audio registers.
diff --git a/drivers/staging/mrst/drv/mdfld_intel_hdcp.c 
b/drivers/staging/mrst/drv/mdfld_intel_hdcp.c
index a25db1c..86b37a4 100644
--- a/drivers/staging/mrst/drv/mdfld_intel_hdcp.c
+++ b/drivers/staging/mrst/drv/mdfld_intel_hdcp.c
@@ -18,18 +18,26 @@
  *     jim liu <[email protected]>
  */
 
-
-#ifdef MDFLD_HDCP                                                              
   
-
+#include <drm/drmP.h>
+#include "psb_drv.h"
+#include "psb_intel_reg.h"
+#include "psb_intel_hdmi_reg.h"
+#include "psb_intel_hdmi.h"
 #include "mdfld_hdcp_if.h"
 #include "mdfld_hdcp_reg.h"
 #include "mdfld_hdcp.h"
 
+
 /*
  *
  */
 static struct mid_intel_hdmi_priv *hdmi_priv;
 
+void mdfld_hdcp_init(struct mid_intel_hdmi_priv *p_hdmi_priv)
+{
+       hdmi_priv = p_hdmi_priv;
+}
+
 /* 
  * IsValidBKSV:
  * Checks if the BKSV is valid or not.
@@ -1341,10 +1349,3 @@ uint32_t hdcp_set_cp_data(cp_parameters_t* cp)
 
     return ret;
 }
-
-void mdfld_hdcp_init(struct mid_intel_hdmi_priv *p_hdmi_priv)
-{
-       hdmi_priv = p_hdmi_priv;
-}
-
-#endif                                                                    
diff --git a/drivers/staging/mrst/drv/mdfld_msic.c 
b/drivers/staging/mrst/drv/mdfld_msic.c
new file mode 100644
index 0000000..6c904d1
--- /dev/null
+++ b/drivers/staging/mrst/drv/mdfld_msic.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright © 2010 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *     Jim Liu <[email protected]>
+ */
+
+#include "mdfld_msic.h"
+#include <drm/drmP.h>
+#include "psb_drv.h"
+#include "psb_intel_hdmi.h"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
+#include <asm/intel_scu_ipc.h>
+#endif
+
+#define SRAM_MSIC_VRINT_ADDR 0xFFFF7FCB
+static u8 *sram_vreg_addr = 0;
+/*
+ *
+ */
+static struct mid_intel_hdmi_priv *hdmi_priv;
+
+void mdfld_msic_init(struct mid_intel_hdmi_priv *p_hdmi_priv)
+{
+       hdmi_priv = p_hdmi_priv;
+}
+
+/**
+ *  msic_vreg_handler
+ */
+irqreturn_t msic_vreg_handler(int irq, void *dev_id)
+{
+#ifdef CONFIG_X86_MRST
+       u8 data = 0;
+
+       /* Need to add lock later.*/
+
+       /* Read VREG interrupt status register */
+       if (sram_vreg_addr)
+               data = readb(sram_vreg_addr);
+       else
+               printk(KERN_INFO"%s: sram_vreg_addr = 0x%x. \n", __FUNCTION__, 
(u32) sram_vreg_addr);
+
+       /*      intel_scu_ipc_ioread8(MSIC_VRINT_STATUS, &data); */
+       /* Clear VREG interrupt status register */
+       /*      intel_scu_ipc_iowrite8(MSIC_VRINT_STATUS, data); */
+
+       /* handle HDMI HPD interrupts. */
+       if (data & HDMI_HPD_STATUS) {
+               /* Read HPD signal status register */
+               intel_scu_ipc_ioread8(MSIC_HDMI_STATUS, &data);
+
+               if (data & HPD_SIGNAL_STATUS) {
+                       printk(KERN_INFO"%s: HDMI is connected. data = 0x%x. 
\n", __FUNCTION__, data);
+               } else {
+                       printk(KERN_INFO"%s: HDMI is disconnected. data = 0x%x. 
\n", __FUNCTION__, data);
+               }
+       }
+
+       /* handle other msic vreq interrupts when necessary. */
+#endif
+       return IRQ_HANDLED;
+}
+
+/**
+ *  msic_probe
+ */
+static int __devinit msic_probe(struct pci_dev *pdev,
+                       const struct pci_device_id *ent)
+{
+       struct drm_device *dev = hdmi_priv ? hdmi_priv->dev : 0;
+       int ret = 0;
+
+       if (dev)
+               PSB_DEBUG_ENTRY("\n");
+
+       /* enable msic hdmi device */
+       ret = pci_enable_device(pdev);
+
+       if (!ret) {
+
+               if (pdev->device == MSIC_PCI_DEVICE_ID) {
+                       sram_vreg_addr = ioremap_nocache(SRAM_MSIC_VRINT_ADDR, 
0x2);
+                       ret = request_irq(pdev->irq, msic_vreg_handler, 
IRQF_SHARED, "msic_hdmi_driver",(void *)&hdmi_priv);
+               } else
+                       printk(KERN_INFO"%s: pciid = 0x%x is not msic_hdmi 
pciid. \n", __FUNCTION__, pdev->device);
+
+               if (!ret) {
+#ifdef CONFIG_X86_MRST
+                       u8 data = 0;
+                       /* enable HDMI HPD */
+                       intel_scu_ipc_ioread8(MSIC_VRINT_MASK, &data);
+                       data &= ~HDMI_HPD_MASK;
+                       intel_scu_ipc_iowrite8(MSIC_VRINT_MASK, data);
+
+                       /* enable MSIC first level VREG interrupt. */
+                       intel_scu_ipc_ioread8(MSIC_IRQLVL1_MASK, &data);
+                       data &= ~VREG_MASK;
+                       intel_scu_ipc_iowrite8(MSIC_IRQLVL1_MASK, data);
+                       /* Enable and handle other msic vreq interrupts when 
necessary. */
+#endif
+               } else {
+                       pci_dev_put(pdev);
+                       printk(KERN_INFO"%s: request_irq failed. ret = 0x%x. 
\n", __FUNCTION__, ret);
+               }
+       }
+
+       return ret;
+}
+
+static struct pci_device_id msic_pci_id_list[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, MSIC_PCI_DEVICE_ID) },
+       { 0 }
+};
+
+/*MODULE_DEVICE_TABLE(pci, msic_pci_id_list);*/
+
+
+/* field for registering driver to PCI device */
+static struct pci_driver msic_pci_driver = {
+       .name = "msic_hdmi_driver",
+       .id_table = msic_pci_id_list,
+       .probe = msic_probe
+};
+
+/**
+ *  msic_regsiter_driver - register the msic hdmi device to PCI system.
+ */
+int msic_regsiter_driver(void)
+{
+       return pci_register_driver(&msic_pci_driver);
+}
+
+/**
+ *  msic_unregsiter_driver - unregister the msic hdmi device from PCI system.
+ */
+int msic_unregister_driver(void)
+{
+       if (!sram_vreg_addr) {
+               iounmap(sram_vreg_addr);
+               sram_vreg_addr = 0;
+       }
+       pci_unregister_driver(&msic_pci_driver);
+       return 0;
+}
diff --git a/drivers/staging/mrst/drv/mdfld_msic.h 
b/drivers/staging/mrst/drv/mdfld_msic.h
new file mode 100644
index 0000000..f488346
--- /dev/null
+++ b/drivers/staging/mrst/drv/mdfld_msic.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright © 2010 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *     Jim Liu <[email protected]>
+ */
+
+#define MSIC_PCI_DEVICE_ID 0x831
+
+int msic_regsiter_driver(void);
+int msic_unregister_driver(void);
diff --git a/drivers/staging/mrst/drv/psb_bl.c 
b/drivers/staging/mrst/drv/psb_bl.c
index 7971ecb..60ccd9f 100644
--- a/drivers/staging/mrst/drv/psb_bl.c
+++ b/drivers/staging/mrst/drv/psb_bl.c
@@ -144,10 +144,11 @@ static int device_backlight_init(struct drm_device *dev)
        uint32_t blc_pwm_precision_factor;
        struct drm_psb_private *dev_priv = (struct drm_psb_private *) 
dev->dev_private;
 
-       if (IS_MDFLD(dev))
+       if (IS_MDFLD(dev)) {
                dev_priv->blc_adj1 = BLC_ADJUSTMENT_MAX;
                dev_priv->blc_adj2 = BLC_ADJUSTMENT_MAX;
                return 0;
+       }
 
        if (IS_MRST(dev)) {
                dev_priv->blc_adj1 = BLC_ADJUSTMENT_MAX;
diff --git a/drivers/staging/mrst/drv/psb_drm.h 
b/drivers/staging/mrst/drv/psb_drm.h
index 9f4a67b..0fd7c6b 100644
--- a/drivers/staging/mrst/drv/psb_drm.h
+++ b/drivers/staging/mrst/drv/psb_drm.h
@@ -46,11 +46,8 @@
 #define DRM_PSB_SAREA_MINOR 2
 #define PSB_FIXED_SHIFT 16
 
-
 #define PSB_NUM_PIPE 3
 
-/* #define MDFLD_HDCP */
-
 /*
  * Public memory types.
  */
@@ -546,9 +543,6 @@ struct drm_psb_stolen_memory_arg {
 #define REGRWBITS_PIPEBSRC                     (1 << 4)
 #define REGRWBITS_VTOTAL_A                     (1 << 5)
 #define REGRWBITS_VTOTAL_B                     (1 << 6)
-#ifdef MDFLD_HDCP
-#define REGRWBITS_HDCP                         (1 << 7)
-#endif 
 #define REGRWBITS_DSPACNTR     (1 << 8)
 #define REGRWBITS_DSPBCNTR     (1 << 9)
 #define REGRWBITS_DSPCCNTR     (1 << 10)
@@ -574,10 +568,6 @@ struct drm_psb_register_rw_arg {
                uint32_t pipebsrc;
                uint32_t vtotal_a;
                uint32_t vtotal_b;
-               #ifdef MDFLD_HDCP
-               uint32_t hdcp_reg;
-               uint32_t hdcp_value;
-               #endif 
        } display;
 
        uint32_t overlay_read_mask;
@@ -668,11 +658,6 @@ struct drm_psb_getpageaddrs_arg {
 
 #define DRM_PVR_RESERVED6      0x1E
 
-
-#ifdef MDFLD_HDCP
-#define DRM_PSB_HDCP_I2C_ACCESS 0x1F
-#endif 
-
 #define DRM_PSB_GET_PIPE_FROM_CRTC_ID 0x1F
 #define DRM_PSB_DPU_QUERY 0x20
 #define DRM_PSB_DPU_DSR_ON 0x21
diff --git a/drivers/staging/mrst/drv/psb_drv.c 
b/drivers/staging/mrst/drv/psb_drv.c
index 3954c2c..86a4a3e 100644
--- a/drivers/staging/mrst/drv/psb_drv.c
+++ b/drivers/staging/mrst/drv/psb_drv.c
@@ -52,6 +52,9 @@
 #include "mdfld_gl3.h"
 #endif
 
+#ifdef CONFIG_MDFD_HDMI
+#include "mdfld_msic.h"
+#endif
 
 /*IMG headers*/
 #include "pvr_drm_shared.h"
@@ -214,11 +217,6 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
 #define DRM_IOCTL_PSB_GET_PIPE_FROM_CRTC_ID    \
                DRM_IOWR(DRM_PSB_GET_PIPE_FROM_CRTC_ID + DRM_COMMAND_BASE, \
                         struct drm_psb_get_pipe_from_crtc_id_arg)
-#ifdef MDFLD_HDCP
-#define DRM_IOCTL_PSB_HDCP_I2C_ACCESS DRM_IOWR(DRM_PSB_HDCP_I2C_ACCESS + 
DRM_COMMAND_BASE, \
-                                       struct drm_psb_hdcp_i2c_arg)
-
-#endif 
 
 /*pvr ioctls*/
 #define PVR_DRM_SRVKM_IOCTL \
@@ -362,11 +360,6 @@ static int psb_gamma_ioctl(struct drm_device *dev, void 
*data,
                           struct drm_file *file_priv);
 static int psb_dpst_bl_ioctl(struct drm_device *dev, void *data,
                             struct drm_file *file_priv);
-#ifdef FIX_MDFLD_HDCP /*#ifdef MDFLD_HDCP*/
-static int psb_hdcp_i2c_access_ioctl(struct drm_device *dev, void *data,
-                            struct drm_file *file_priv);
-#endif 
-
 static int psb_dpu_query_ioctl(struct drm_device *dev, void *data,
                                   struct drm_file *file_priv);
 static int psb_dpu_dsr_on_ioctl(struct drm_device *dev, void *data,
@@ -459,11 +452,6 @@ static struct drm_ioctl_desc psb_ioctls[] = {
        /*PSB_IOCTL_DEF(DRM_IOCTL_PSB_FLIP, psb_page_flip, DRM_AUTH),*/
        PSB_IOCTL_DEF(DRM_IOCTL_LNC_VIDEO_GETPARAM,
                        lnc_video_getparam, DRM_AUTH),
-#ifdef FIX_MDFLD_HDCP /*#ifdef MDFLD_HDCP*/
-       PSB_IOCTL_DEF(DRM_IOCTL_PSB_HDCP_I2C_ACCESS, psb_hdcp_i2c_access_ioctl,
-                     DRM_AUTH)
-#endif                       
-                       
        PSB_IOCTL_DEF(DRM_IOCRL_PSB_DPU_QUERY, psb_dpu_query_ioctl,
                     DRM_AUTH),
        PSB_IOCTL_DEF(DRM_IOCRL_PSB_DPU_DSR_ON, psb_dpu_dsr_on_ioctl,
@@ -2068,25 +2056,6 @@ static int psb_stolen_memory_ioctl(struct drm_device 
*dev, void *data,
        return 0;
 }
 
-#ifdef FIX_MDFLD_HDCP /*#ifdef MDFLD_HDCP*/
-static int psb_hdcp_i2c_access_ioctl(struct drm_device *dev, void *data,
-                                  struct drm_file *file_priv)
-{
-       struct drm_psb_private *dev_priv = psb_priv(dev);
-       struct drm_psb_hdcp_i2c_arg *arg = data;
-        int ret = 0;
-
-        if(arg->i2c_read)
-            ret = 
dev_priv->hdmi_i2c_bus->read_data(dev_priv->hdmi_i2c_adapter, 
-                               arg->slave_address, arg->data, arg->size);
-        else 
-            ret = 
dev_priv->hdmi_i2c_bus->write_data(dev_priv->hdmi_i2c_adapter, 
-                               arg->slave_address, arg->data, arg->size);      
                                 
-
-       return ret;
-}
-#endif
-
 static int psb_dpu_query_ioctl(struct drm_device *dev, void *arg,
                                   struct drm_file *file_priv)
 {
@@ -2233,11 +2202,6 @@ static int psb_register_rw_ioctl(struct drm_device *dev, 
void *data,
                        if (arg->display_write_mask & REGRWBITS_VTOTAL_B)
                                PSB_WVDC32(arg->display.vtotal_b,
                                           VTOTAL_B);
-#ifdef FIX_MDFLD_HDCP /*#ifdef MDFLD_HDCP*/
-                       if (arg->display_write_mask & REGRWBITS_HDCP)
-                               PSB_WVDC32(arg->display.hdcp_value,
-                                          arg->display.hdcp_reg);
-#endif                                                                    
                        ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
                } else {
                        if (arg->display_write_mask & REGRWBITS_PFIT_CONTROLS)
@@ -2285,11 +2249,6 @@ static int psb_register_rw_ioctl(struct drm_device *dev, 
void *data,
                        if (arg->display_read_mask & REGRWBITS_VTOTAL_B)
                                arg->display.vtotal_b = PSB_RVDC32(VTOTAL_B);
                        ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND);
-#ifdef FIX_MDFLD_HDCP /*#ifdef MDFLD_HDCP*/
-                       if (arg->display_read_mask & REGRWBITS_HDCP)
-                               arg->display.hdcp_value = 
PSB_RVDC32(arg->display.hdcp_reg);
-#endif                                                                    
-                       
                } else {
                        if (arg->display_read_mask &
                            REGRWBITS_PFIT_CONTROLS)
@@ -2867,12 +2826,23 @@ static int __init psb_init(void)
        }
 
        ret = drm_init(&driver);
+       if (ret != 0)
+       {
+               return ret;
+       }
+
+#ifdef CONFIG_MDFD_HDMI
+       msic_regsiter_driver();
+#endif
 
        return ret;
 }
 
 static void __exit psb_exit(void)
 {
+#ifdef CONFIG_MDFD_HDMI
+       msic_unregister_driver();
+#endif
        drm_exit(&driver);
 }
 
diff --git a/drivers/staging/mrst/drv/psb_drv.h 
b/drivers/staging/mrst/drv/psb_drv.h
index 02c45a7..2b79282 100644
--- a/drivers/staging/mrst/drv/psb_drv.h
+++ b/drivers/staging/mrst/drv/psb_drv.h
@@ -43,9 +43,7 @@
 #include "private_data.h"
 #include "pvr_drm.h"
 
-#ifdef MDFLD_HDCP
 #include "mdfld_hdmi_audio_if.h"
-#endif /* MDFLD_HDCP */
 
 /*Append new drm mode definition here, align with libdrm definition*/
 #define DRM_MODE_SCALE_NO_SCALE   2
@@ -938,11 +936,9 @@ struct drm_psb_private {
 
        bool dsi_device_ready;
 
-#ifdef MDFLD_HDCP
        uint32_t tmds_clock_khz;
        had_event_call_back mdfld_had_event_callbacks;
        uint32_t hdmi_audio_interrupt_mask;
-#endif /* MDFLD_HDCP */
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35))
        /*psb fb dev*/
@@ -1109,10 +1105,8 @@ psb_disable_pipestat(struct drm_psb_private *dev_priv, 
int pipe, u32 mask);
 extern u32 psb_get_vblank_counter(struct drm_device *dev, int crtc);
 extern int mdfld_enable_te(struct drm_device *dev, int pipe);
 extern void mdfld_disable_te(struct drm_device *dev, int pipe);
-#ifdef MDFLD_HDCP
 extern int mdfld_irq_enable_hdmi_audio(struct drm_device *dev);
 extern int mdfld_irq_disable_hdmi_audio(struct drm_device *dev);
-#endif /* MDFLD_HDCP */
 
 /*
  *psb_fence.c
diff --git a/drivers/staging/mrst/drv/psb_intel_display2.c 
b/drivers/staging/mrst/drv/psb_intel_display2.c
index 714ff01..de18bd4 100644
--- a/drivers/staging/mrst/drv/psb_intel_display2.c
+++ b/drivers/staging/mrst/drv/psb_intel_display2.c
@@ -1325,10 +1325,7 @@ static int mdfld_crtc_mode_set(struct drm_crtc *crtc,
                PSB_DEBUG_ENTRY("adjusted_mode->clock = %d, clk_tmp = %d. \n", 
adjusted_mode->clock, clk_tmp);
 
                ok = mdfldFindBestPLL(crtc, clk_tmp, refclk, &clock);
-
-#ifdef MDFLD_HDCP
                dev_priv->tmds_clock_khz = clock.dot / (clk_n * clk_p2 * 
clk_byte);
-#endif /* MDFLD_HDCP */
 
                if (!ok) {
 #if 0                          /* FIXME JLIU7 */
diff --git a/drivers/staging/mrst/drv/psb_intel_hdmi.c 
b/drivers/staging/mrst/drv/psb_intel_hdmi.c
index f295637..f024b6e 100644
--- a/drivers/staging/mrst/drv/psb_intel_hdmi.c
+++ b/drivers/staging/mrst/drv/psb_intel_hdmi.c
@@ -35,43 +35,16 @@
 #include "psb_intel_hdmi_edid.h"
 #include "psb_intel_hdmi.h"
 #include "mdfld_dsi_output.h"
-#ifdef MDFLD_HDCP                                                         
 #include "mdfld_hdmi_audio_if.h"
-#endif /* MDFLD_HDCP */
 
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
 #include <asm/intel_scu_ipc.h>
-#define MSIC_VCC330CNT 0xd3
-  #define VCC330_OFF 0x24
-  #define VCC330_ON 0x37
-#define MSIC_VHDMICNT 0xde
-  #define VHDMI_OFF 0x25
-  #define VHDMI_ON 0xa5
 #endif
 
 /* FIXME_MDFLD HDMI EDID supports */
-
-struct mid_intel_hdmi_priv {
-       u32 hdmib_reg;
-       u32 save_HDMIB;
-       bool has_hdmi_sink;
-       /* Should set this when detect hotplug */
-       bool hdmi_device_connected;
-       struct mdfld_hdmi_i2c *i2c_bus;
-       /* EELD packet holder*/
-       hdmi_eeld_t eeld; 
-       u32 hdmi_eeld_size;
-       cea_861b_adb_t lpcm_sad;
-#ifdef MDFLD_HDCP                                                         
-       bool is_hdcp_supported;
-       struct i2c_adapter *hdmi_i2c_adapter;   /* for control functions */
-       struct drm_device *dev;
-#endif /* MDFLD_HDCP */
-};
-
-#ifdef MDFLD_HDCP                                                              
   
 extern void mdfld_hdcp_init(struct mid_intel_hdmi_priv *p_hdmi_priv);
-#endif                                                                    
+extern void mdfld_hdmi_audio_init(struct mid_intel_hdmi_priv *p_hdmi_priv);
+extern void mdfld_msic_init(struct mid_intel_hdmi_priv *p_hdmi_priv);
 
 #if 1 /*FIXME_MDFLD_HDMI remove it later */    
 static void mdfld_hdmi_mode_set(struct drm_encoder *encoder,
@@ -88,8 +61,6 @@ static void mdfld_hdmi_mode_set(struct drm_encoder *encoder,
 #ifdef CONFIG_X86_MRST
        /* turn on VCC330 */
        intel_scu_ipc_iowrite8(MSIC_VCC330CNT, VCC330_ON);
-       /* turn on HDMI power rails */
-       intel_scu_ipc_iowrite8(MSIC_VHDMICNT, VHDMI_ON);
 #endif
 
        hdmib = REG_READ(hdmi_priv->hdmib_reg) | HDMIB_PORT_EN | 
HDMIB_PIPE_B_SELECT | HDMIB_NULL_PACKET;
@@ -251,8 +222,6 @@ static void mdfld_hdmi_dpms(struct drm_encoder *encoder, 
int mode)
                REG_WRITE(HDMIPHYMISCCTL, hdmi_phy_misc | HDMI_PHY_POWER_DOWN);
 
 #ifdef CONFIG_X86_MRST
-               /* turn off HDMI power rails */
-               intel_scu_ipc_iowrite8(MSIC_VHDMICNT, VHDMI_OFF);
                /* turn off VCC330 */
                intel_scu_ipc_iowrite8(MSIC_VCC330CNT, VCC330_OFF);
 #endif
@@ -260,8 +229,6 @@ static void mdfld_hdmi_dpms(struct drm_encoder *encoder, 
int mode)
 #ifdef CONFIG_X86_MRST
                /* turn on VCC330 */
                intel_scu_ipc_iowrite8(MSIC_VCC330CNT, VCC330_ON);
-               /* turn on HDMI power rails */
-               intel_scu_ipc_iowrite8(MSIC_VHDMICNT, VHDMI_ON);
 #endif
 
                REG_WRITE(HDMIPHYMISCCTL, hdmi_phy_misc & ~HDMI_PHY_POWER_DOWN);
@@ -982,7 +949,6 @@ void mdfld_hdmi_init(struct drm_device *dev,
 
        drm_connector_attach_property(connector, 
dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_FULLSCREEN);
 
-#if MDFLD_HDMI_JLIU7_DEBUG_1
        /* hard-coded the HDMI_I2C_ADAPTER_ID to be 3, Should get from GCT*/
        psb_intel_output->hdmi_i2c_adapter = i2c_get_adapter(3);
 
@@ -993,31 +959,20 @@ void mdfld_hdmi_init(struct drm_device *dev,
        } else {
                printk(KERN_ALERT "No ddc adapter available!\n");
        }
-#ifdef MDFLD_HDCP                                                              
   
+
        hdmi_priv->is_hdcp_supported = true;
        hdmi_priv->hdmi_i2c_adapter = psb_intel_output->hdmi_i2c_adapter;
        hdmi_priv->dev = dev; 
        mdfld_hdcp_init(hdmi_priv);
-#endif                                                                    
-#else /* MDFLD_HDMI_JLIU7_DEBUG */
-#ifdef MDFLD_HDCP                                                              
   
-       mdfld_hdcp_init(hdmi_priv, dev_priv);
-        /* Save a copy for user mode access */
-        dev_priv->hdmi_i2c_bus = hdmi_priv->i2c_bus;
-        dev_priv->hdmi_i2c_adapter = 
psb_intel_output->i2c_bus->hdmi_i2c_adapter;
-#endif                                                                    
-#endif /* MDFLD_HDMI_JLIU7_DEBUG */
+       mdfld_hdmi_audio_init(hdmi_priv);
+       mdfld_msic_init(hdmi_priv);
+
+#ifdef CONFIG_X86_MRST
+       /* turn on HDMI power rails */
+       intel_scu_ipc_iowrite8(MSIC_VHDMICNT, VHDMI_ON);
+#endif
         
        drm_sysfs_connector_add(connector);
        return;
 }
-
-/* Merge the mdfld_intel_hdcp.c & mdfld_hdmi_audio.c into this file later, or 
put them into makefile */
-
-#ifdef MDFLD_HDCP                                                              
   
-#include "mdfld_intel_hdcp.c"
-#include "mdfld_hdmi_audio.c"
-#endif /* MDFLD_HDCP */
-
 #endif
-
diff --git a/drivers/staging/mrst/drv/psb_intel_hdmi.h 
b/drivers/staging/mrst/drv/psb_intel_hdmi.h
index 3eb8664..cdf7b75 100644
--- a/drivers/staging/mrst/drv/psb_intel_hdmi.h
+++ b/drivers/staging/mrst/drv/psb_intel_hdmi.h
@@ -22,6 +22,7 @@
  *
  * Authors:
  *     Chunfeng Zhao <[email protected]>
+ *     Jim Liu <[email protected]>
  */
 
 #ifndef __PSB_INTEL_HDMI_H__
@@ -880,4 +881,45 @@ typedef struct _gamut_metadata_struct {
     #pragma pack()
 } gamut_metadata_st_t;
 
+struct mid_intel_hdmi_priv {
+       u32 hdmib_reg;
+       u32 save_HDMIB;
+       bool has_hdmi_sink;
+       /* Should set this when detect hotplug */
+       bool hdmi_device_connected;
+       struct mdfld_hdmi_i2c *i2c_bus;
+       /* EELD packet holder*/
+       hdmi_eeld_t eeld;
+       u32 hdmi_eeld_size;
+       cea_861b_adb_t lpcm_sad;
+       bool is_hdcp_supported;
+       struct i2c_adapter *hdmi_i2c_adapter;   /* for control functions */
+       struct drm_device *dev;
+};
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34))
+#define MSIC_IRQLVL1_STATUS 0x02
+  #define VREG_STATUS (1 << 5)
+#define MSIC_VRINT_STATUS 0x0d
+  #define HDMI_HPD_STATUS (1 << 3)
+  #define HDMI_OCP_STATUS (1 << 2)
+  #define VR_OCP_STATUS (1 << 1)
+  #define VR_OVP_STATUS (1 << 0)
+#define MSIC_VRINT_MASK 0x1c
+  #define HDMI_HPD_MASK (1 << 3)
+  #define HDMI_OCP_MASK (1 << 2)
+  #define VR_OCP_MASK (1 << 1)
+  #define VR_OVP_MASK (1 << 0)
+#define MSIC_IRQLVL1_MASK 0x21
+  #define VREG_MASK (1 << 5)
+#define MSIC_VCC330CNT 0xd3
+  #define VCC330_OFF 0x24
+  #define VCC330_ON 0x37
+#define MSIC_VHDMICNT 0xde
+  #define VHDMI_OFF 0x25
+  #define VHDMI_ON 0xa5
+#define MSIC_HDMI_STATUS 0x281
+  #define HPD_SIGNAL_STATUS (1 << 0)
+#endif
+
 #endif //__IHDMI_H__
diff --git a/drivers/staging/mrst/drv/psb_irq.c 
b/drivers/staging/mrst/drv/psb_irq.c
index fc5bcd3..8063751 100644
--- a/drivers/staging/mrst/drv/psb_irq.c
+++ b/drivers/staging/mrst/drv/psb_irq.c
@@ -185,7 +185,6 @@ static void mid_vblank_handler(struct drm_device *dev, 
uint32_t pipe)
                (*dev_priv->psb_vsync_handler)(dev,pipe);
 }
 
-#ifdef MDFLD_HDCP
 /**
  * Display controller interrupt handler for pipe hdmi audio underrun.
  *
@@ -211,7 +210,6 @@ static void mdfld_pipe_hdmi_audio_buffer_done(struct 
drm_device *dev)
        if (dev_priv->mdfld_had_event_callbacks)
                
(*dev_priv->mdfld_had_event_callbacks)(HAD_EVENT_AUDIO_BUFFER_DONE, NULL);
 }
-#endif /* MDFLD_HDCP */
 
 /**
  * Display controller interrupt handler for pipe event.
@@ -312,7 +310,6 @@ static void mid_pipe_event_handler(struct drm_device *dev, 
uint32_t pipe)
 #endif
        }
 
-#ifdef MDFLD_HDCP
        if (pipe_stat_val & PIPE_HDMI_AUDIO_UNDERRUN_STATUS) {
                mdfld_pipe_hdmi_audio_underrun(dev);
        }
@@ -320,7 +317,6 @@ static void mid_pipe_event_handler(struct drm_device *dev, 
uint32_t pipe)
        if (pipe_stat_val & PIPE_HDMI_AUDIO_BUFFER_DONE_STATUS) {
                mdfld_pipe_hdmi_audio_buffer_done(dev);
        }
-#endif /* MDFLD_HDCP */
 }
 
 /**
@@ -926,7 +922,6 @@ void mdfld_disable_te(struct drm_device *dev, int pipe)
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
 }
 
-#ifdef MDFLD_HDCP
 int mdfld_irq_enable_hdmi_audio(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv =
@@ -968,4 +963,3 @@ int mdfld_irq_disable_hdmi_audio(struct drm_device *dev)
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
        return 0;
 }
-#endif /* MDFLD_HDCP */
diff --git a/drivers/staging/mrst/medfield/Makefile 
b/drivers/staging/mrst/medfield/Makefile
index 6d8f753..99a4573 100644
--- a/drivers/staging/mrst/medfield/Makefile
+++ b/drivers/staging/mrst/medfield/Makefile
@@ -154,6 +154,9 @@ medfield_gfx-y += $(DRMDRVDIR)/psb_bl.medfield.o \
          $(DRMDRVDIR)/psb_intel_lvds.medfield.o \
          $(DRMDRVDIR)/psb_intel_modes.medfield.o \
          $(DRMDRVDIR)/psb_intel_sdvo.medfield.o \
+         $(DRMDRVDIR)/mdfld_hdmi_audio.medfield.o \
+         $(DRMDRVDIR)/mdfld_msic.medfield.o \
+         $(DRMDRVDIR)/mdfld_intel_hdcp.medfield.o \
          $(DRMDRVDIR)/psb_intel_hdmi.medfield.o \
          $(DRMDRVDIR)/psb_intel_hdmi_i2c.medfield.o \
          $(DRMDRVDIR)/psb_reset.medfield.o \
diff --git a/drivers/staging/mrst/moorestown/Makefile 
b/drivers/staging/mrst/moorestown/Makefile
index ec9ef4a..ca6ffaa 100644
--- a/drivers/staging/mrst/moorestown/Makefile
+++ b/drivers/staging/mrst/moorestown/Makefile
@@ -154,6 +154,9 @@ mrst_gfx-y += $(DRMDRVDIR)/psb_bl.mrst.o \
          $(DRMDRVDIR)/psb_intel_lvds.mrst.o \
          $(DRMDRVDIR)/psb_intel_modes.mrst.o \
          $(DRMDRVDIR)/psb_intel_sdvo.mrst.o \
+         $(DRMDRVDIR)/mdfld_hdmi_audio.mrst.o \
+         $(DRMDRVDIR)/mdfld_msic.mrst.o \
+         $(DRMDRVDIR)/mdfld_intel_hdcp.mrst.o \
          $(DRMDRVDIR)/psb_intel_hdmi.mrst.o \
          $(DRMDRVDIR)/psb_intel_hdmi_i2c.mrst.o \
          $(DRMDRVDIR)/psb_reset.mrst.o \
-- 
1.7.1

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to