[alsa-devel] [PATCH 2/2] ASoC: add locking to mpc5200-psc-ac97 driver

Grant Likely grant.likely at secretlab.ca
Fri Jul 3 09:12:16 CEST 2009


On Thu, Jul 2, 2009 at 1:08 PM, michael<michael at evidence.eu.com> wrote:
> Hi,
>
> Grant Likely wrote:
>>
>> From: Grant Likely <grant.likely at secretlab.ca>
>>
>> AC97 bus register read/write hooks need to provide locking, but the
>> mpc5200-psc-ac97 driver does not.  This patch adds a mutex around
>> the register access routines.
>>
>> Signed-off-by: Grant Likely <grant.likely at secretlab.ca>
>> ---
>>
>>  sound/soc/fsl/mpc5200_dma.c      |    1 +
>>  sound/soc/fsl/mpc5200_dma.h      |    1 +
>>  sound/soc/fsl/mpc5200_psc_ac97.c |   13 ++++++++++++-
>>  3 files changed, 14 insertions(+), 1 deletions(-)
>>
>>
>> diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c
>> index efec33a..f0a2d40 100644
>> --- a/sound/soc/fsl/mpc5200_dma.c
>> +++ b/sound/soc/fsl/mpc5200_dma.c
>> @@ -456,6 +456,7 @@ int mpc5200_audio_dma_create(struct of_device *op)
>>                return -ENODEV;
>>          spin_lock_init(&psc_dma->lock);
>> +       mutex_init(&psc_dma->mutex);
>>        psc_dma->id = be32_to_cpu(*prop);
>>        psc_dma->irq = irq;
>>        psc_dma->psc_regs = regs;
>> diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h
>> index 2000803..8d396bb 100644
>> --- a/sound/soc/fsl/mpc5200_dma.h
>> +++ b/sound/soc/fsl/mpc5200_dma.h
>> @@ -55,6 +55,7 @@ struct psc_dma {
>>        unsigned int irq;
>>        struct device *dev;
>>        spinlock_t lock;
>> +       struct mutex mutex;
>>        u32 sicr;
>>        uint sysclk;
>>        int imr;
>> diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c
>> b/sound/soc/fsl/mpc5200_psc_ac97.c
>> index 9b8503f..7eb5499 100644
>> --- a/sound/soc/fsl/mpc5200_psc_ac97.c
>> +++ b/sound/soc/fsl/mpc5200_psc_ac97.c
>> @@ -34,11 +34,14 @@ static unsigned short psc_ac97_read(struct snd_ac97
>> *ac97, unsigned short reg)
>>        int status;
>>        unsigned int val;
>>  +       mutex_lock(&psc_dma->mutex);
>> +
>>        /* Wait for command send status zero = ready */
>>        status =
>> spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) &
>>                                MPC52xx_PSC_SR_CMDSEND), 100, 0);
>>        if (status == 0) {
>>                pr_err("timeout on ac97 bus (rdy)\n");
>> +               mutex_unlock(&psc_dma->mutex);
>>                return -ENODEV;
>>
>
> maybe define an err variable and and a goto out.

My first iteration did that, but after looking at it I decided I like
this better and it adds (slightly) fewer lines of code.

g.

-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.


More information about the Alsa-devel mailing list