mirror of https://gitee.com/openkylin/linux.git
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: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
faa7c13481
commit
3f23a81a10
|
@ -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,
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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 chip->buf_pos;
|
||||||
|
|
||||||
return runtime->period_size * (count & (runtime->periods-1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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)
|
||||||
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)
|
||||||
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 {
|
||||||
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 {
|
||||||
|
|
Loading…
Reference in New Issue