[alsa-devel] [PATCH] Intel HDMI audio support

Takashi Iwai tiwai at suse.de
Tue Nov 4 12:51:35 CET 2008


At Tue, 4 Nov 2008 17:38:39 +0800,
Wu Fengguang wrote:
> 
> Add support for Intel G45 integrated HDMI audio codecs.
> 
> This initial release supports:
> 	- 2 channel stereo sound output
> 	- report monitor's ELD information
> 
> Signed-off-by: Wu Fengguang <wfg at linux.intel.com>

Thanks.  The patch looks almost fine, but a few things to be fixed.

> +/*
> + * ELD: EDID Like Data
> + */
> +struct sink_eld {
> +	int	eld_size;
> +	int	baseline_len;
> +	int	eld_ver;	/* (eld_ver == 0) indicates invalid ELD */
> +	int	cea_edid_ver;
> +	char	monitor_name[ELD_MAX_MNL + 1];
> +	int	manufacture_id;
> +	int	product_id;
> +	long	port_id;

If you need a 64bit value, use u64 explicitly.

> +struct hdmi_audio_infoframe {
> +	u8 type; /* 0x84 */
> +	u8 ver;  /* 0x01 */
> +	u8 len;  /* 0x0a */
> +
> +	u8 checksum;	/* PB0 */
> +	u8 CC02_CT47;	/* CC in bits 0:2, CT in 4:7 */
> +	u8 SS01_SF24;
> +	u8 CXT04;
> +	u8 CA;
> +	u8 LFEPBL01_LSV36_DM_INH7;
> +	u8 reserved[5];	/* PB6  - PB10 */
> +};

> +#define GRAB_BITS(buf, byte, lowbit, bits, val) \
> +	(val) = ((buf)[(byte)] >> (lowbit)) & ((1 << (bits)) - 1)

This should be rather a form

#define GRAB_BITS(buf, byte, lowbit, bits) \
	((buf)[(byte)] >> (lowbit)) & ((1 << (bits)) - 1)
and

foo = GRAB_BITS(buf, byte, low, bits);


> +static void hdmi_update_short_audio_desc(struct cea_sad *a,
> +					 const unsigned char *buf)
> +{
> +	int i;
> +	int val;
> +
> +	GRAB_BITS(buf, 1, 0, 7, val);

The numbers is GRAB_BITS() could be better defined.

> +static int hdmi_update_sink_eld(struct hda_codec *codec,
> +				const unsigned char *buf, int size)
(snip)
> +	e->port_id	  = le64_to_cpu(*(u64 *)(buf + 8));

Use get_unaligned_*() for this, just to be more portable.
(And include <asm/unaligned.h> beforehand.)

> +	/* the spec's tendency is little endian */
> +	e->manufacture_id = le16_to_cpu(*(u16 *)(buf + 16));
> +	e->product_id	  = le16_to_cpu(*(u16 *)(buf + 18));

Ditto.

> +
> +	if (mnl > ELD_MAX_MNL) {
> +		snd_printd(KERN_INFO "MNL is reserved value %d\n", mnl);
> +		goto out_fail;
> +	} else if (ELD_FIXED_BYTES + mnl > size) {
> +		snd_printd(KERN_INFO "out of range MNL %d\n", mnl);
> +		goto out_fail;
> +	} else {
> +		strncpy(e->monitor_name, buf + ELD_FIXED_BYTES, mnl);
> +		e->monitor_name[mnl] = '\0';

Use strlcpy().

> +static void hdmi_show_eld(struct hda_codec *codec)
> +{
> +	int i;
> +	int j;
> +	struct intel_hdmi_spec *spec = codec->spec;
> +	struct sink_eld *e = &spec->sink;
> +	char buf[80];
(snip)
> +	for (i = 0; i < ARRAY_SIZE(cea_speaker_allocation_names); i++) {
> +		if (e->spk_alloc & (1 << i))
> +			j += sprintf(buf + j, " %s",
> +					cea_speaker_allocation_names[i]);

Use snprintf() instead to avoid overflow.

> +	}
> +	buf[j] = '\0';
> +	printk(KERN_INFO "speaker allocations: (0x%x)%s\n", e->spk_alloc, buf);
> +
> +	for (i = 0; i < e->sad_count; i++) {
> +		hdmi_show_short_audio_desc(e->sad + i);
> +	}

checkpatch.pl warns about these braces.
In general, it's worth to run once before submission.

Could you fix these and repost?


thanks,

Takashi


More information about the Alsa-devel mailing list