]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/pci/ice1712/juli.c
[ARM] 4989/1: [AT91] SAM9 ClockSource / ClockEvents
[linux-2.6-omap-h63xx.git] / sound / pci / ice1712 / juli.c
index d88172fa95da5f9f539871e509afba47e72a2797..e8038c0ceb721a0f9a3d881814f3bc40dcee34e2 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Lowlevel functions for ESI Juli@ cards
  *
- *     Copyright (c) 2004 Jaroslav Kysela <perex@suse.cz>
+ *     Copyright (c) 2004 Jaroslav Kysela <perex@perex.cz>
  *
  *   This program is free software; you can redistribute it and/or modify
  *   it under the terms of the GNU General Public License as published by
@@ -21,7 +21,6 @@
  *
  */      
 
-#include <sound/driver.h>
 #include <asm/io.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include "envy24ht.h"
 #include "juli.h"
 
+struct juli_spec {
+       struct ak4114 *ak4114;
+       unsigned int analog: 1;
+};
+
 /*
  * chip addresses on I2C bus
  */
@@ -125,7 +129,7 @@ static void juli_akm_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
        snd_akm4xxx_reset(ak, 0);
 }
 
-static const struct snd_akm4xxx akm_juli_dac __devinitdata = {
+static struct snd_akm4xxx akm_juli_dac __devinitdata = {
        .type = SND_AK4358,
        .num_dacs = 2,
        .ops = {
@@ -138,7 +142,17 @@ static const struct snd_akm4xxx akm_juli_dac __devinitdata = {
 
 static int __devinit juli_add_controls(struct snd_ice1712 *ice)
 {
-       return snd_ice1712_akm4xxx_build_controls(ice);
+       struct juli_spec *spec = ice->spec;
+       int err;
+       err = snd_ice1712_akm4xxx_build_controls(ice);
+       if (err < 0)
+               return err;
+       /* only capture SPDIF over AK4114 */
+       err = snd_ak4114_build(spec->ak4114, NULL,
+                              ice->pcm_pro->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
+       if (err < 0)
+               return err;
+       return 0;
 }
 
 /*
@@ -158,20 +172,19 @@ static int __devinit juli_init(struct snd_ice1712 *ice)
                0x41, 0x02, 0x2c, 0x00, 0x00
        };
        int err;
+       struct juli_spec *spec;
        struct snd_akm4xxx *ak;
 
-#if 0
-       for (err = 0; err < 0x20; err++)
-               juli_ak4114_read(ice, err);
-       juli_ak4114_write(ice, 0, 0x0f);
-       juli_ak4114_read(ice, 0);
-       juli_ak4114_read(ice, 1);
-#endif
+       spec = kzalloc(sizeof(*spec), GFP_KERNEL);
+       if (!spec)
+               return -ENOMEM;
+       ice->spec = spec;
+
        err = snd_ak4114_create(ice->card,
                                juli_ak4114_read,
                                juli_ak4114_write,
                                ak4114_init_vals, ak4114_init_txcsb,
-                               ice, &ice->spec.juli.ak4114);
+                               ice, &spec->ak4114);
        if (err < 0)
                return err;
 
@@ -179,12 +192,12 @@ static int __devinit juli_init(struct snd_ice1712 *ice)
         /* it seems that the analog doughter board detection does not work
            reliably, so force the analog flag; it should be very rare
            to use Juli@ without the analog doughter board */
-       ice->spec.juli.analog = (ice->gpio.get_data(ice) & GPIO_ANALOG_PRESENT) ? 0 : 1;
+       spec->analog = (ice->gpio.get_data(ice) & GPIO_ANALOG_PRESENT) ? 0 : 1;
 #else
-        ice->spec.juli.analog = 1;
+        spec->analog = 1;
 #endif
 
-       if (ice->spec.juli.analog) {
+       if (spec->analog) {
                printk(KERN_INFO "juli@: analog I/O detected\n");
                ice->num_total_dacs = 2;
                ice->num_total_adcs = 2;
@@ -206,7 +219,7 @@ static int __devinit juli_init(struct snd_ice1712 *ice)
  * hence the driver needs to sets up it properly.
  */
 
-static const unsigned char juli_eeprom[] __devinitdata = {
+static unsigned char juli_eeprom[] __devinitdata = {
        [ICE_EEP2_SYSCONF]     = 0x20,  /* clock 512, mpu401, 1xADC, 1xDACs */
        [ICE_EEP2_ACLINK]      = 0x80,  /* I2S */
        [ICE_EEP2_I2S]         = 0xf8,  /* vol, 96k, 24bit, 192k */
@@ -223,7 +236,7 @@ static const unsigned char juli_eeprom[] __devinitdata = {
 };
 
 /* entry point */
-const struct snd_ice1712_card_info snd_vt1724_juli_cards[] __devinitdata = {
+struct snd_ice1712_card_info snd_vt1724_juli_cards[] __devinitdata = {
        {
                .subvendor = VT1724_SUBDEVICE_JULI,
                .name = "ESI Juli@",