Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / sound / sparc / amd7930.c
index 993d0fb..5549334 100644 (file)
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;     /* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;      /* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;     /* Enable this card */
-static int boot_devs;
 
-module_param_array(index, int, boot_devs, 0444);
+module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for Sun AMD7930 soundcard.");
-MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-module_param_array(id, charp, boot_devs, 0444);
+module_param_array(id, charp, NULL, 0444);
 MODULE_PARM_DESC(id, "ID string for Sun AMD7930 soundcard.");
-MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-module_param_array(enable, bool, boot_devs, 0444);
+module_param_array(enable, bool, NULL, 0444);
 MODULE_PARM_DESC(enable, "Enable Sun AMD7930 soundcard.");
-MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 MODULE_AUTHOR("Thomas K. Dyas and David S. Miller");
 MODULE_DESCRIPTION("Sun AMD7930");
 MODULE_LICENSE("GPL");
-MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{Sun,AMD7930}}");
+MODULE_SUPPORTED_DEVICE("{{Sun,AMD7930}}");
 
 /* Device register layout.  */
 
@@ -316,19 +311,19 @@ struct amd7930_map {
 #define        AMR_PP_PPCR2                    0xC8
 #define        AMR_PP_PPCR3                    0xC9
 
-typedef struct snd_amd7930 {
+struct snd_amd7930 {
        spinlock_t              lock;
-       unsigned long           regs;
+       void __iomem            *regs;
        u32                     flags;
 #define AMD7930_FLAG_PLAYBACK  0x00000001
 #define AMD7930_FLAG_CAPTURE   0x00000002
 
        struct amd7930_map      map;
 
-       snd_card_t              *card;
-       snd_pcm_t               *pcm;
-       snd_pcm_substream_t     *playback_substream;
-       snd_pcm_substream_t     *capture_substream;
+       struct snd_card         *card;
+       struct snd_pcm          *pcm;
+       struct snd_pcm_substream        *playback_substream;
+       struct snd_pcm_substream        *capture_substream;
 
        /* Playback/Capture buffer state. */
        unsigned char           *p_orig, *p_cur;
@@ -344,13 +339,12 @@ typedef struct snd_amd7930 {
        unsigned int            irq;
        unsigned int            regs_size;
        struct snd_amd7930      *next;
-} amd7930_t;
-#define chip_t amd7930_t
+};
 
-static amd7930_t *amd7930_list;
+static struct snd_amd7930 *amd7930_list;
 
 /* Idle the AMD7930 chip.  The amd->lock is not held.  */
-static __inline__ void amd7930_idle(amd7930_t *amd)
+static __inline__ void amd7930_idle(struct snd_amd7930 *amd)
 {
        unsigned long flags;
 
@@ -361,7 +355,7 @@ static __inline__ void amd7930_idle(amd7930_t *amd)
 }
 
 /* Enable chip interrupts.  The amd->lock is not held.  */
-static __inline__ void amd7930_enable_ints(amd7930_t *amd)
+static __inline__ void amd7930_enable_ints(struct snd_amd7930 *amd)
 {
        unsigned long flags;
 
@@ -372,7 +366,7 @@ static __inline__ void amd7930_enable_ints(amd7930_t *amd)
 }
 
 /* Disable chip interrupts.  The amd->lock is not held.  */
-static __inline__ void amd7930_disable_ints(amd7930_t *amd)
+static __inline__ void amd7930_disable_ints(struct snd_amd7930 *amd)
 {
        unsigned long flags;
 
@@ -385,7 +379,7 @@ static __inline__ void amd7930_disable_ints(amd7930_t *amd)
 /* Commit amd7930_map settings to the hardware.
  * The amd->lock is held and local interrupts are disabled.
  */
-static void __amd7930_write_map(amd7930_t *amd)
+static void __amd7930_write_map(struct snd_amd7930 *amd)
 {
        struct amd7930_map *map = &amd->map;
 
@@ -475,19 +469,18 @@ static __const__ __u16 ger_coeff[] = {
        0x000b, /* 16.9 dB */
        0x000f  /* 18. dB */
 };
-#define NR_GER_COEFFS (sizeof(ger_coeff) / sizeof(ger_coeff[0]))
 
 /* Update amd7930_map settings and program them into the hardware.
  * The amd->lock is held and local interrupts are disabled.
  */
-static void __amd7930_update_map(amd7930_t *amd)
+static void __amd7930_update_map(struct snd_amd7930 *amd)
 {
        struct amd7930_map *map = &amd->map;
        int level;
 
        map->gx = gx_coeff[amd->rgain];
        map->stgr = gx_coeff[amd->mgain];
-       level = (amd->pgain * (256 + NR_GER_COEFFS)) >> 8;
+       level = (amd->pgain * (256 + ARRAY_SIZE(ger_coeff))) >> 8;
        if (level >= 256) {
                map->ger = ger_coeff[level - 256];
                map->gr = gx_coeff[255];
@@ -500,7 +493,7 @@ static void __amd7930_update_map(amd7930_t *amd)
 
 static irqreturn_t snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       amd7930_t *amd = dev_id;
+       struct snd_amd7930 *amd = dev_id;
        unsigned int elapsed;
        u8 ir;
 
@@ -541,7 +534,7 @@ static irqreturn_t snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *
        return IRQ_HANDLED;
 }
 
-static int snd_amd7930_trigger(amd7930_t *amd, unsigned int flag, int cmd)
+static int snd_amd7930_trigger(struct snd_amd7930 *amd, unsigned int flag, int cmd)
 {
        unsigned long flags;
        int result = 0;
@@ -571,24 +564,24 @@ static int snd_amd7930_trigger(amd7930_t *amd, unsigned int flag, int cmd)
        return result;
 }
 
-static int snd_amd7930_playback_trigger(snd_pcm_substream_t * substream,
+static int snd_amd7930_playback_trigger(struct snd_pcm_substream *substream,
                                        int cmd)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
        return snd_amd7930_trigger(amd, AMD7930_FLAG_PLAYBACK, cmd);
 }
 
-static int snd_amd7930_capture_trigger(snd_pcm_substream_t * substream,
+static int snd_amd7930_capture_trigger(struct snd_pcm_substream *substream,
                                       int cmd)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
        return snd_amd7930_trigger(amd, AMD7930_FLAG_CAPTURE, cmd);
 }
 
-static int snd_amd7930_playback_prepare(snd_pcm_substream_t * substream)
+static int snd_amd7930_playback_prepare(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
        unsigned int size = snd_pcm_lib_buffer_bytes(substream);
        unsigned long flags;
        u8 new_mmr1;
@@ -617,10 +610,10 @@ static int snd_amd7930_playback_prepare(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_amd7930_capture_prepare(snd_pcm_substream_t * substream)
+static int snd_amd7930_capture_prepare(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
        unsigned int size = snd_pcm_lib_buffer_bytes(substream);
        unsigned long flags;
        u8 new_mmr1;
@@ -649,9 +642,9 @@ static int snd_amd7930_capture_prepare(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static snd_pcm_uframes_t snd_amd7930_playback_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_amd7930_playback_pointer(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
        size_t ptr;
 
        if (!(amd->flags & AMD7930_FLAG_PLAYBACK))
@@ -660,9 +653,9 @@ static snd_pcm_uframes_t snd_amd7930_playback_pointer(snd_pcm_substream_t * subs
        return bytes_to_frames(substream->runtime, ptr);
 }
 
-static snd_pcm_uframes_t snd_amd7930_capture_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_amd7930_capture_pointer(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
        size_t ptr;
 
        if (!(amd->flags & AMD7930_FLAG_CAPTURE))
@@ -673,7 +666,7 @@ static snd_pcm_uframes_t snd_amd7930_capture_pointer(snd_pcm_substream_t * subst
 }
 
 /* Playback and capture have identical properties.  */
-static snd_pcm_hardware_t snd_amd7930_pcm_hw =
+static struct snd_pcm_hardware snd_amd7930_pcm_hw =
 {
        .info                   = (SNDRV_PCM_INFO_MMAP |
                                   SNDRV_PCM_INFO_MMAP_VALID |
@@ -693,54 +686,54 @@ static snd_pcm_hardware_t snd_amd7930_pcm_hw =
        .periods_max            = 1024,
 };
 
-static int snd_amd7930_playback_open(snd_pcm_substream_t * substream)
+static int snd_amd7930_playback_open(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
 
        amd->playback_substream = substream;
        runtime->hw = snd_amd7930_pcm_hw;
        return 0;
 }
 
-static int snd_amd7930_capture_open(snd_pcm_substream_t * substream)
+static int snd_amd7930_capture_open(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
 
        amd->capture_substream = substream;
        runtime->hw = snd_amd7930_pcm_hw;
        return 0;
 }
 
-static int snd_amd7930_playback_close(snd_pcm_substream_t * substream)
+static int snd_amd7930_playback_close(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
 
        amd->playback_substream = NULL;
        return 0;
 }
 
-static int snd_amd7930_capture_close(snd_pcm_substream_t * substream)
+static int snd_amd7930_capture_close(struct snd_pcm_substream *substream)
 {
-       amd7930_t *amd = snd_pcm_substream_chip(substream);
+       struct snd_amd7930 *amd = snd_pcm_substream_chip(substream);
 
        amd->capture_substream = NULL;
        return 0;
 }
 
-static int snd_amd7930_hw_params(snd_pcm_substream_t * substream,
-                                   snd_pcm_hw_params_t * hw_params)
+static int snd_amd7930_hw_params(struct snd_pcm_substream *substream,
+                                   struct snd_pcm_hw_params *hw_params)
 {
        return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
 }
 
-static int snd_amd7930_hw_free(snd_pcm_substream_t * substream)
+static int snd_amd7930_hw_free(struct snd_pcm_substream *substream)
 {
        return snd_pcm_lib_free_pages(substream);
 }
 
-static snd_pcm_ops_t snd_amd7930_playback_ops = {
+static struct snd_pcm_ops snd_amd7930_playback_ops = {
        .open           =       snd_amd7930_playback_open,
        .close          =       snd_amd7930_playback_close,
        .ioctl          =       snd_pcm_lib_ioctl,
@@ -751,7 +744,7 @@ static snd_pcm_ops_t snd_amd7930_playback_ops = {
        .pointer        =       snd_amd7930_playback_pointer,
 };
 
-static snd_pcm_ops_t snd_amd7930_capture_ops = {
+static struct snd_pcm_ops snd_amd7930_capture_ops = {
        .open           =       snd_amd7930_capture_open,
        .close          =       snd_amd7930_capture_close,
        .ioctl          =       snd_pcm_lib_ioctl,
@@ -762,17 +755,9 @@ static snd_pcm_ops_t snd_amd7930_capture_ops = {
        .pointer        =       snd_amd7930_capture_pointer,
 };
 
-static void snd_amd7930_pcm_free(snd_pcm_t *pcm)
-{
-       amd7930_t *amd = snd_magic_cast(amd7930_t, pcm->private_data, return);
-
-       amd->pcm = NULL;
-       snd_pcm_lib_preallocate_free_for_all(pcm);
-}
-
-static int __init snd_amd7930_pcm(amd7930_t *amd)
+static int __init snd_amd7930_pcm(struct snd_amd7930 *amd)
 {
-       snd_pcm_t *pcm;
+       struct snd_pcm *pcm;
        int err;
 
        if ((err = snd_pcm_new(amd->card,
@@ -787,7 +772,6 @@ static int __init snd_amd7930_pcm(amd7930_t *amd)
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_amd7930_capture_ops);
 
        pcm->private_data = amd;
-       pcm->private_free = snd_amd7930_pcm_free;
        pcm->info_flags = 0;
        strcpy(pcm->name, amd->card->shortname);
        amd->pcm = pcm;
@@ -803,7 +787,7 @@ static int __init snd_amd7930_pcm(amd7930_t *amd)
 #define VOLUME_CAPTURE 1
 #define VOLUME_PLAYBACK        2
 
-static int snd_amd7930_info_volume(snd_kcontrol_t *kctl, snd_ctl_elem_info_t *uinfo)
+static int snd_amd7930_info_volume(struct snd_kcontrol *kctl, struct snd_ctl_elem_info *uinfo)
 {
        int type = kctl->private_value;
 
@@ -820,9 +804,9 @@ static int snd_amd7930_info_volume(snd_kcontrol_t *kctl, snd_ctl_elem_info_t *ui
        return 0;
 }
 
-static int snd_amd7930_get_volume(snd_kcontrol_t *kctl, snd_ctl_elem_value_t *ucontrol)
+static int snd_amd7930_get_volume(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *ucontrol)
 {
-       amd7930_t *amd = snd_kcontrol_chip(kctl);
+       struct snd_amd7930 *amd = snd_kcontrol_chip(kctl);
        int type = kctl->private_value;
        int *swval;
 
@@ -848,9 +832,9 @@ static int snd_amd7930_get_volume(snd_kcontrol_t *kctl, snd_ctl_elem_value_t *uc
        return 0;
 }
 
-static int snd_amd7930_put_volume(snd_kcontrol_t *kctl, snd_ctl_elem_value_t *ucontrol)
+static int snd_amd7930_put_volume(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *ucontrol)
 {
-       amd7930_t *amd = snd_kcontrol_chip(kctl);
+       struct snd_amd7930 *amd = snd_kcontrol_chip(kctl);
        unsigned long flags;
        int type = kctl->private_value;
        int *swval, change;
@@ -886,7 +870,7 @@ static int snd_amd7930_put_volume(snd_kcontrol_t *kctl, snd_ctl_elem_value_t *uc
        return change;
 }
 
-static snd_kcontrol_new_t amd7930_controls[] __initdata = {
+static struct snd_kcontrol_new amd7930_controls[] __initdata = {
        {
                .iface          =       SNDRV_CTL_ELEM_IFACE_MIXER,
                .name           =       "Monitor Volume",
@@ -916,11 +900,9 @@ static snd_kcontrol_new_t amd7930_controls[] __initdata = {
        },
 };
 
-#define NUM_AMD7930_CONTROLS (sizeof(amd7930_controls)/sizeof(snd_kcontrol_new_t))
-
-static int __init snd_amd7930_mixer(amd7930_t *amd)
+static int __init snd_amd7930_mixer(struct snd_amd7930 *amd)
 {
-       snd_card_t *card;
+       struct snd_card *card;
        int idx, err;
 
        snd_assert(amd != NULL && amd->card != NULL, return -EINVAL);
@@ -928,7 +910,7 @@ static int __init snd_amd7930_mixer(amd7930_t *amd)
        card = amd->card;
        strcpy(card->mixername, card->shortname);
 
-       for (idx = 0; idx < NUM_AMD7930_CONTROLS; idx++) {
+       for (idx = 0; idx < ARRAY_SIZE(amd7930_controls); idx++) {
                if ((err = snd_ctl_add(card,
                                       snd_ctl_new1(&amd7930_controls[idx], amd))) < 0)
                        return err;
@@ -937,7 +919,7 @@ static int __init snd_amd7930_mixer(amd7930_t *amd)
        return 0;
 }
 
-static int snd_amd7930_free(amd7930_t *amd)
+static int snd_amd7930_free(struct snd_amd7930 *amd)
 {
        amd7930_idle(amd);
 
@@ -947,36 +929,36 @@ static int snd_amd7930_free(amd7930_t *amd)
        if (amd->regs)
                sbus_iounmap(amd->regs, amd->regs_size);
 
-       snd_magic_kfree(amd);
+       kfree(amd);
 
        return 0;
 }
 
-static int snd_amd7930_dev_free(snd_device_t *device)
+static int snd_amd7930_dev_free(struct snd_device *device)
 {
-       amd7930_t *amd = snd_magic_cast(amd7930_t, device->device_data, return -ENXIO);
+       struct snd_amd7930 *amd = device->device_data;
 
        return snd_amd7930_free(amd);
 }
 
-static snd_device_ops_t snd_amd7930_dev_ops = {
+static struct snd_device_ops snd_amd7930_dev_ops = {
        .dev_free       =       snd_amd7930_dev_free,
 };
 
-static int __init snd_amd7930_create(snd_card_t *card,
+static int __init snd_amd7930_create(struct snd_card *card,
                                     struct sbus_dev *sdev,
                                     struct resource *rp,
                                     unsigned int reg_size,
                                     struct linux_prom_irqs *irq_prop,
                                     int dev,
-                                    amd7930_t **ramd)
+                                    struct snd_amd7930 **ramd)
 {
        unsigned long flags;
-       amd7930_t *amd;
+       struct snd_amd7930 *amd;
        int err;
 
        *ramd = NULL;
-       amd = snd_magic_kcalloc(amd7930_t, 0, GFP_KERNEL);
+       amd = kzalloc(sizeof(*amd), GFP_KERNEL);
        if (amd == NULL)
                return -ENOMEM;
 
@@ -1041,8 +1023,8 @@ static int __init amd7930_attach(int prom_node, struct sbus_dev *sdev)
        struct linux_prom_registers reg_prop;
        struct linux_prom_irqs irq_prop;
        struct resource res, *rp;
-       snd_card_t *card;
-       amd7930_t *amd;
+       struct snd_card *card;
+       struct snd_amd7930 *amd;
        int err;
 
        if (dev >= SNDRV_CARDS)
@@ -1138,10 +1120,10 @@ static int __init amd7930_init(void)
 
 static void __exit amd7930_exit(void)
 {
-       amd7930_t *p = amd7930_list;
+       struct snd_amd7930 *p = amd7930_list;
 
        while (p != NULL) {
-               amd7930_t *next = p->next;
+               struct snd_amd7930 *next = p->next;
 
                snd_card_free(p->card);