Commit 3f23a81a authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB: tm6000-alsa: Fix several bugs at the driver initialization code

There are several missing things at the driver, preventing, for example,
the code to start/stop DMA to actually work. Fix them before implementing
a routine to store data at the audio buffers.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent faa7c134
...@@ -78,6 +78,8 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip) ...@@ -78,6 +78,8 @@ static int _tm6000_start_audio_dma(struct snd_tm6000_card *chip)
struct tm6000_core *core = chip->core; struct tm6000_core *core = chip->core;
int val; int val;
dprintk(1, "Starting audio DMA\n");
/* Enables audio */ /* Enables audio */
val = tm6000_get_reg(core, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0x0); val = tm6000_get_reg(core, TM6010_REQ07_RCC_ACTIVE_VIDEO_IF, 0x0);
val |= 0x20; val |= 0x20;
...@@ -237,7 +239,9 @@ static int snd_tm6000_hw_params(struct snd_pcm_substream *substream, ...@@ -237,7 +239,9 @@ static int snd_tm6000_hw_params(struct snd_pcm_substream *substream,
*/ */
static int snd_tm6000_hw_free(struct snd_pcm_substream *substream) static int snd_tm6000_hw_free(struct snd_pcm_substream *substream)
{ {
dsp_buffer_free(substream); struct snd_tm6000_card *chip = snd_pcm_substream_chip(substream);
_tm6000_stop_audio_dma(chip);
return 0; return 0;
} }
...@@ -247,6 +251,11 @@ static int snd_tm6000_hw_free(struct snd_pcm_substream *substream) ...@@ -247,6 +251,11 @@ static int snd_tm6000_hw_free(struct snd_pcm_substream *substream)
*/ */
static int snd_tm6000_prepare(struct snd_pcm_substream *substream) static int snd_tm6000_prepare(struct snd_pcm_substream *substream)
{ {
struct snd_tm6000_card *chip = snd_pcm_substream_chip(substream);
chip->buf_pos = 0;
chip->period_pos = 0;
return 0; return 0;
} }
...@@ -284,12 +293,8 @@ static int snd_tm6000_card_trigger(struct snd_pcm_substream *substream, int cmd) ...@@ -284,12 +293,8 @@ static int snd_tm6000_card_trigger(struct snd_pcm_substream *substream, int cmd)
static snd_pcm_uframes_t snd_tm6000_pointer(struct snd_pcm_substream *substream) static snd_pcm_uframes_t snd_tm6000_pointer(struct snd_pcm_substream *substream)
{ {
struct snd_tm6000_card *chip = snd_pcm_substream_chip(substream); struct snd_tm6000_card *chip = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime;
u16 count;
count = atomic_read(&chip->count);
return runtime->period_size * (count & (runtime->periods-1)); return chip->buf_pos;
} }
/* /*
...@@ -342,6 +347,16 @@ int tm6000_audio_init(struct tm6000_core *dev) ...@@ -342,6 +347,16 @@ int tm6000_audio_init(struct tm6000_core *dev)
snd_printk(KERN_ERR "cannot create card instance %d\n", devnr); snd_printk(KERN_ERR "cannot create card instance %d\n", devnr);
return rc; return rc;
} }
strcpy(card->driver, "tm6000-alsa");
strcpy(card->shortname, "TM5600/60x0");
sprintf(card->longname, "TM5600/60x0 Audio at bus %d device %d",
dev->udev->bus->busnum, dev->udev->devnum);
sprintf(component, "USB%04x:%04x",
le16_to_cpu(dev->udev->descriptor.idVendor),
le16_to_cpu(dev->udev->descriptor.idProduct));
snd_component_add(card, component);
snd_card_set_dev(card, &dev->udev->dev);
chip = kzalloc(sizeof(struct snd_tm6000_card), GFP_KERNEL); chip = kzalloc(sizeof(struct snd_tm6000_card), GFP_KERNEL);
if (!chip) { if (!chip) {
...@@ -349,34 +364,26 @@ int tm6000_audio_init(struct tm6000_core *dev) ...@@ -349,34 +364,26 @@ int tm6000_audio_init(struct tm6000_core *dev)
goto error; goto error;
} }
sprintf(component, "USB%04x:%04x", chip->core = dev;
le16_to_cpu(dev->udev->descriptor.idVendor), chip->card = card;
le16_to_cpu(dev->udev->descriptor.idProduct)); dev->adev = chip;
snd_component_add(card, component);
spin_lock_init(&chip->reg_lock); spin_lock_init(&chip->reg_lock);
rc = snd_pcm_new(card, "TM6000 Audio", 0, 0, 1, &pcm); rc = snd_pcm_new(card, "TM6000 Audio", 0, 0, 1, &pcm);
if (rc < 0) if (rc < 0)
goto error; goto error;
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_tm6000_pcm_ops);
pcm->info_flags = 0; pcm->info_flags = 0;
pcm->private_data = dev; pcm->private_data = chip;
strcpy(pcm->name, "Trident TM5600/60x0"); strcpy(pcm->name, "Trident TM5600/60x0");
strcpy(card->driver, "tm6000-alsa");
strcpy(card->shortname, "TM5600/60x0");
sprintf(card->longname, "TM5600/60x0 Audio at bus %d device %d",
dev->udev->bus->busnum, dev->udev->devnum);
snd_card_set_dev(card, &dev->udev->dev); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_tm6000_pcm_ops);
rc = snd_card_register(card); rc = snd_card_register(card);
if (rc < 0) if (rc < 0)
goto error; goto error;
chip->core = dev; dprintk(1,"Registered audio driver for %s\n", card->longname);
chip->card = card;
dev->adev = chip;
return 0; return 0;
......
...@@ -678,10 +678,10 @@ int tm6000_register_extension(struct tm6000_ops *ops) ...@@ -678,10 +678,10 @@ int tm6000_register_extension(struct tm6000_ops *ops)
mutex_lock(&tm6000_extension_devlist_lock); mutex_lock(&tm6000_extension_devlist_lock);
list_add_tail(&ops->next, &tm6000_extension_devlist); list_add_tail(&ops->next, &tm6000_extension_devlist);
list_for_each_entry(dev, &tm6000_devlist, devlist) { list_for_each_entry(dev, &tm6000_devlist, devlist) {
if (dev) ops->init(dev);
ops->init(dev); printk(KERN_INFO "%s: Initialized (%s) extension\n",
dev->name, ops->name);
} }
printk(KERN_INFO "tm6000: Initialized (%s) extension\n", ops->name);
mutex_unlock(&tm6000_extension_devlist_lock); mutex_unlock(&tm6000_extension_devlist_lock);
mutex_unlock(&tm6000_devlist_mutex); mutex_unlock(&tm6000_devlist_mutex);
return 0; return 0;
......
...@@ -135,9 +135,12 @@ struct tm6000_dvb { ...@@ -135,9 +135,12 @@ struct tm6000_dvb {
struct snd_tm6000_card { struct snd_tm6000_card {
struct snd_card *card; struct snd_card *card;
spinlock_t reg_lock; spinlock_t reg_lock;
atomic_t count;
struct tm6000_core *core; struct tm6000_core *core;
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
/* temporary data for buffer fill processing */
unsigned buf_pos;
unsigned period_pos;
}; };
struct tm6000_endpoint { struct tm6000_endpoint {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment