static int __init dac_audio_init(void) { int retval; if ((device_major = register_sound_dsp(&dac_audio_fops, -1)) < 0) { printk(KERN_ERR "Cannot register dsp device"); return device_major; } in_use = 0; data_buffer = (char *)kmalloc(BUFFER_SIZE, GFP_KERNEL); if (data_buffer == NULL) return -ENOMEM; dac_audio_reset(); rate = 8000; dac_audio_set_rate(); retval = request_irq(TIMER1_IRQ, timer1_interrupt, SA_INTERRUPT, MODNAME, 0); if (retval < 0) { printk(KERN_ERR "sh_dac_audio: IRQ %d request failed\n", TIMER1_IRQ); return retval; } return 0; }
static int __devinit snd_sh_dac_create(struct snd_card *card, struct platform_device *devptr, struct snd_sh_dac **rchip) { struct snd_sh_dac *chip; int err; static struct snd_device_ops ops = { .dev_free = snd_sh_dac_dev_free, }; *rchip = NULL; chip = kzalloc(sizeof(*chip), GFP_KERNEL); if (chip == NULL) return -ENOMEM; chip->card = card; hrtimer_init(&chip->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); chip->hrtimer.function = sh_dac_audio_timer; dac_audio_reset(chip); chip->rate = 8000; dac_audio_set_rate(chip); chip->pdata = devptr->dev.platform_data; chip->data_buffer = kmalloc(chip->pdata->buffer_size, GFP_KERNEL); if (chip->data_buffer == NULL) { kfree(chip); return -ENOMEM; } err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); if (err < 0) { snd_sh_dac_free(chip); return err; } *rchip = chip; return 0; }
static int dac_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int val; switch (cmd) { case OSS_GETVERSION: return put_user(SOUND_VERSION, (int *)arg); case SNDCTL_DSP_SYNC: dac_audio_sync(); return 0; case SNDCTL_DSP_RESET: dac_audio_reset(); return 0; case SNDCTL_DSP_GETFMTS: return put_user(AFMT_U8, (int *)arg); case SNDCTL_DSP_SETFMT: return put_user(AFMT_U8, (int *)arg); case SNDCTL_DSP_NONBLOCK: file->f_flags |= O_NONBLOCK; return 0; case SNDCTL_DSP_GETCAPS: return 0; case SOUND_PCM_WRITE_RATE: val = *(int *)arg; if (val > 0) { rate = val; dac_audio_set_rate(); } return put_user(rate, (int *)arg); case SNDCTL_DSP_STEREO: return put_user(0, (int *)arg); case SOUND_PCM_WRITE_CHANNELS: return put_user(1, (int *)arg); case SNDCTL_DSP_SETDUPLEX: return -EINVAL; case SNDCTL_DSP_PROFILE: return -EINVAL; case SNDCTL_DSP_GETBLKSIZE: return put_user(BUFFER_SIZE, (int *)arg); case SNDCTL_DSP_SETFRAGMENT: return 0; default: printk(KERN_ERR "sh_dac_audio: unimplemented ioctl=0x%x\n", cmd); return -EINVAL; } return -EINVAL; }