[PATCH] [UBUNTU:sound/pci/ice1712/] Fix M-Audio Delta 1010LT SPDIF output
crimsun at fungus.sh.nu
crimsun at fungus.sh.nu
Fri Apr 14 00:21:56 UTC 2006
Subject: [PATCH] [UBUNTU:sound/pci/ice1712/] Fix M-Audio Delta 1010LT SPDIF output
UpstreamStatus: Added in upstream pci/ice1712/delta.c r1.2[56] ,
pci/ice1712/ice1712.c r1.7[79]
Jaroslav Kysela <perex at suse.cz> committed this series of patches that
fix M-Audio Delta 1010LT SPDIF output. This fix actually is only the
kernel portion of the fix; an update to the userspace envy24control
utility is also required.
This commit closes LP#39185.
Signed-off-by: Daniel T Chen <crimsun at ubuntu.com>
---
sound/pci/ice1712/delta.c | 36 +++++++++++++++++++++++++++++++++++-
sound/pci/ice1712/ice1712.c | 36 +++++++++++++++++++++---------------
2 files changed, 56 insertions(+), 16 deletions(-)
4668becfae1e3a18ca9a02402a5991da0d176a0c
diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c
index 576f69d..34c4304 100644
--- a/sound/pci/ice1712/delta.c
+++ b/sound/pci/ice1712/delta.c
@@ -391,6 +391,37 @@ static void delta_setup_spdif(ice1712_t
snd_ice1712_delta_cs8403_spdif_write(ice, tmp);
}
+int snd_ice1712_delta1010lt_wordclock_status_info(snd_kcontrol_t *kcontrol,
+ snd_ctl_elem_info_t *uinfo)
+{
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+ uinfo->count = 1;
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max = 1;
+ return 0;
+}
+
+int snd_ice1712_delta1010lt_wordclock_status_get(snd_kcontrol_t *kcontrol,
+ snd_ctl_elem_value_t *ucontrol)
+{
+ char reg = 0x10; // cs8427 receiver error register
+ ice1712_t *ice = snd_kcontrol_chip(kcontrol);
+
+ if (snd_i2c_sendbytes(ice->cs8427, ®, 1) != 1)
+ snd_printk(KERN_ERR "unable to send register 0x%x byte to CS8427\n", reg);
+ snd_i2c_readbytes(ice->cs8427, ®, 1);
+ ucontrol->value.integer.value[0] = (reg ? 1 : 0);
+ return 0;
+}
+
+static struct snd_kcontrol_new snd_ice1712_delta1010lt_wordclock_status __devinitdata =
+{
+ .access = (SNDRV_CTL_ELEM_ACCESS_READ),
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+ .name = "Word Clock Status",
+ .info = snd_ice1712_delta1010lt_wordclock_status_info,
+ .get = snd_ice1712_delta1010lt_wordclock_status_get,
+};
/*
* initialize the chips on M-Audio cards
@@ -620,7 +651,7 @@ static int __devinit snd_ice1712_delta_i
static snd_kcontrol_new_t snd_ice1712_delta1010_wordclock_select __devinitdata =
ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_WORD_CLOCK_SELECT, 1, 0);
static snd_kcontrol_new_t snd_ice1712_delta1010lt_wordclock_select __devinitdata =
-ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 1, 0);
+ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Sync", 0, ICE1712_DELTA_1010LT_WORDCLOCK, 0, 0);
static snd_kcontrol_new_t snd_ice1712_delta1010_wordclock_status __devinitdata =
ICE1712_GPIO(SNDRV_CTL_ELEM_IFACE_MIXER, "Word Clock Status", 0, ICE1712_DELTA_WORD_CLOCK_STATUS, 1, SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE);
static snd_kcontrol_new_t snd_ice1712_deltadio2496_spdif_in_select __devinitdata =
@@ -653,6 +684,9 @@ static int __devinit snd_ice1712_delta_a
err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_delta1010lt_wordclock_select, ice));
if (err < 0)
return err;
+ err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_delta1010lt_wordclock_status, ice));
+ if (err < 0)
+ return err;
break;
}
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
index bd71bf4..736edf1 100644
--- a/sound/pci/ice1712/ice1712.c
+++ b/sound/pci/ice1712/ice1712.c
@@ -316,7 +316,6 @@ static void snd_ice1712_set_gpio_data(ic
inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */
}
-
/*
*
* CS8427 interface
@@ -396,6 +395,20 @@ int __devinit snd_ice1712_init_cs8427(ic
return 0;
}
+static void snd_ice1712_set_input_clock_source(ice1712_t *ice, int spdif_is_master)
+{
+ /* change CS8427 clock source too */
+ if (ice->cs8427)
+ snd_ice1712_cs8427_set_input_clock(ice, spdif_is_master);
+ /* notify ak4524 chip as well */
+ if (spdif_is_master) {
+ unsigned int i;
+ for (i = 0; i < ice->akm_codecs; i++) {
+ if (ice->akm[i].ops.set_rate_val)
+ ice->akm[i].ops.set_rate_val(&ice->akm[i], 0);
+ }
+ }
+}
/*
* Interrupt handler
@@ -1591,6 +1604,9 @@ static void snd_ice1712_proc_read(snd_in
snd_iprintf(buffer, " CAPTURE : 0x%08x\n", inl(ICEMT(ice, ROUTE_CAPTURE)));
snd_iprintf(buffer, " SPDOUT : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_SPDOUT)));
snd_iprintf(buffer, " RATE : 0x%02x\n", (unsigned)inb(ICEMT(ice, RATE)));
+ snd_iprintf(buffer, " GPIO_DATA : 0x%02x\n", (unsigned)snd_ice1712_get_gpio_data(ice));
+ snd_iprintf(buffer, " GPIO_WRITE_MASK : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_WRITE_MASK));
+ snd_iprintf(buffer, " GPIO_DIRECTION : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION));
}
static void __devinit snd_ice1712_proc_init(ice1712_t * ice)
@@ -1868,20 +1884,8 @@ static int snd_ice1712_pro_internal_cloc
change = inb(ICEMT(ice, RATE)) != oval;
spin_unlock_irq(&ice->reg_lock);
- if ((oval & ICE1712_SPDIF_MASTER) != (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER)) {
- /* change CS8427 clock source too */
- if (ice->cs8427) {
- snd_ice1712_cs8427_set_input_clock(ice, is_spdif_master(ice));
- }
- /* notify ak4524 chip as well */
- if (is_spdif_master(ice)) {
- unsigned int i;
- for (i = 0; i < ice->akm_codecs; i++) {
- if (ice->akm[i].ops.set_rate_val)
- ice->akm[i].ops.set_rate_val(&ice->akm[i], 0);
- }
- }
- }
+ if ((oval & ICE1712_SPDIF_MASTER) != (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER))
+ snd_ice1712_cs8427_set_input_clock(ice, is_spdif_master(ice));
return change;
}
@@ -2715,6 +2719,8 @@ static int __devinit snd_ice1712_probe(s
}
}
+ snd_ice1712_set_input_clock_source(ice, 0);
+
sprintf(card->longname, "%s at 0x%lx, irq %i",
card->shortname, ice->port, ice->irq);
--
1.1.3
--
Daniel T. Chen crimsun at ubuntu.com
GPG key: www.sh.nu/~crimsun/pubkey.gpg.asc
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20060413/5ee429da/attachment.sig>
More information about the kernel-team
mailing list