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
