On 2008.11.05 12:46:25 +0800, Wu, Fengguang wrote:
On Tue, Nov 04, 2008 at 10:36:35PM +0800, Alexander Werner wrote:
It's ready now!
We did a lot of code refactor, testing and bug fixes in the last ten days, and now it's ready for release :-)
Note that X.org intel video patches are also necessary for HDMI sound output.
However our 3 HDMI monitors have only 2-channel audio support, so 8-channel LPCM audio may not work for now.
Thank you, Fengguang
That's great news! I'll test the patch as soon as my replacement board arrives.
Thank you. The G45 HDMI audio can be enabled by the submitted ALSA kernel patch together with this X.org intel driver patch:
Looks mostly fine to me. But we can only enable HDMI audio to one port at one time, so should we handle that case in two HDMI ports case? And note that as DVI is compatible with HDMI, we've seen many boards that using HDMI port for DVI output. So we might also check in that case to not enable audio (recent added xserver xf86MonitorIsHDMI() API might help here).
[PATCH] enable HDMI audio output
Set the SDVO_AUDIO_ENABLE bit to enable audio output for - integrated HDMI (e.g. G45) - SDVO HDMI (e.g. G35)
Signed-off-by: Wu Fengguang wfg@linux.intel.com Signed-off-by: Ma Ling ling.ma@intel.com
src/i810_reg.h | 1 + src/i830_hdmi.c | 1 + src/i830_sdvo.c | 10 ++++++---- 3 files changed, 8 insertions(+), 4 deletions(-)
--- xf86-video-intel.orig/src/i810_reg.h +++ xf86-video-intel/src/i810_reg.h @@ -1281,6 +1281,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN /** Requird for HDMI operation */ #define SDVO_NULL_PACKETS_DURING_VSYNC (1 << 9) #define SDVO_BORDER_ENABLE (1 << 7) +#define SDVO_AUDIO_ENABLE (1 << 6) /** New with 965, default is to be set */ #define SDVO_VSYNC_ACTIVE_HIGH (1 << 4) /** New with 965, default is to be set */ --- xf86-video-intel.orig/src/i830_hdmi.c +++ xf86-video-intel/src/i830_hdmi.c @@ -75,6 +75,7 @@ i830_hdmi_mode_set(xf86OutputPtr output, uint32_t sdvox;
sdvox = SDVO_ENCODING_HDMI |
- SDVO_AUDIO_ENABLE | SDVO_BORDER_ENABLE | SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH;
--- xf86-video-intel.orig/src/i830_sdvo.c +++ xf86-video-intel/src/i830_sdvo.c @@ -1017,7 +1017,7 @@ i830_sdvo_mode_set(xf86OutputPtr output, struct i830_sdvo_priv *dev_priv = intel_output->dev_priv; xf86CrtcPtr crtc = output->crtc; I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
- uint32_t sdvox;
- uint32_t sdvox = 0; int sdvo_pixel_multiply; struct i830_sdvo_in_out_map in_out; struct i830_sdvo_dtd input_dtd;
@@ -1039,8 +1039,10 @@ i830_sdvo_mode_set(xf86OutputPtr output, &in_out, sizeof(in_out)); status = i830_sdvo_read_response(output, NULL, 0);
- if (dev_priv->is_hdmi)
if (dev_priv->is_hdmi){ i830_sdvo_set_avi_infoframe(output, mode);
sdvox |= SDVO_AUDIO_ENABLE;
}
i830_sdvo_get_dtd_from_mode(&input_dtd, mode);
@@ -1088,11 +1090,11 @@ i830_sdvo_mode_set(xf86OutputPtr output,
/* Set the SDVO control regs. */ if (IS_I965G(pI830)) {
- sdvox = SDVO_BORDER_ENABLE |
- sdvox |= SDVO_BORDER_ENABLE | SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH; } else {
- sdvox = INREG(dev_priv->output_device);
- sdvox |= INREG(dev_priv->output_device); switch (dev_priv->output_device) { case SDVOB: sdvox &= SDVOB_PRESERVE_MASK;