[alsa-devel] [PATCH 2/2] fm801: introduce __is_ready()/__is_valid() helpers
Andy Shevchenko
andy.shevchenko at gmail.com
Mon Apr 28 13:26:57 CEST 2014
On Mon, Apr 28, 2014 at 1:25 PM, Takashi Iwai <tiwai at suse.de> wrote:
> At Mon, 28 Apr 2014 11:00:30 +0300,
> Andy Shevchenko wrote:
> >
> > The introduced functios check AC97 if it's ready for communication and
> > read data is valid.
> >
> > Signed-off-by: Andy Shevchenko <andy.shevchenko at gmail.com>
> > ---
> > sound/pci/fm801.c | 86
> +++++++++++++++++++++++++++----------------------------
> > 1 file changed, 42 insertions(+), 44 deletions(-)
> >
> > diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
> > index 8418484..4417409 100644
> > --- a/sound/pci/fm801.c
> > +++ b/sound/pci/fm801.c
> > @@ -224,6 +224,30 @@ MODULE_DEVICE_TABLE(pci, snd_fm801_ids);
> > * common I/O routines
> > */
> >
> > +static inline bool __is_ready(struct fm801 *chip, unsigned int
> iterations)
> > +{
> > + unsigned int idx;
> > +
> > + for (idx = 0; idx < iterations; idx++) {
> > + if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
> > + return true;
> > + udelay(10);
> > + }
> > + return false;
> > +}
>
> The function name is a bit too ambiguous, and you don't have to use
> "__" prefix unnecessarily. Also, don't add inline unless really
> needed. Compilers are often smarter than us.
>
Understood. Will change this in v2.
>
> > +
> > +static inline bool __is_valid(struct fm801 *chip, unsigned int
> iterations)
> > +{
> > + unsigned int idx;
> > +
> > + for (idx = 0; idx < iterations; idx++) {
> > + if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_VALID))
> > + return true;
> > + udelay(10);
> > + }
> > + return false;
> > +}
>
> Does the patch really work as expected? It returns true when no VALID
> bit is set.
>
Oops, rebase issue. Thanks for caught this up!
>
>
> thanks,
>
> Takashi
>
>
> > +
> > static int snd_fm801_update_bits(struct fm801 *chip, unsigned short reg,
> > unsigned short mask, unsigned short value)
> > {
> > @@ -246,32 +270,19 @@ static void snd_fm801_codec_write(struct snd_ac97
> *ac97,
> > unsigned short val)
> > {
> > struct fm801 *chip = ac97->private_data;
> > - int idx;
> >
> > - /*
> > - * Wait until the codec interface is not ready..
> > - */
> > - for (idx = 0; idx < 100; idx++) {
> > - if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
> > - goto ok1;
> > - udelay(10);
> > + if (!__is_ready(chip, 100)) {
> > + dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
> > + return;
> > }
> > - dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
> > - return;
> >
> > - ok1:
> > /* write data and address */
> > fm801_writew(val, chip, AC97_DATA);
> > fm801_writew(reg | (ac97->addr << FM801_AC97_ADDR_SHIFT), chip,
> AC97_CMD);
> > - /*
> > - * Wait until the write command is not completed..
> > - */
> > - for (idx = 0; idx < 1000; idx++) {
> > - if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
> > - return;
> > - udelay(10);
> > - }
> > - dev_err(chip->card->dev, "AC'97 interface #%d is busy (2)\n",
> ac97->num);
> > +
> > + if (!__is_ready(chip, 1000))
> > + dev_err(chip->card->dev, "AC'97 interface #%d is busy
> (2)\n",
> > + ac97->num);
> > }
> >
> > static unsigned short snd_fm801_codec_read(struct snd_ac97 *ac97,
> unsigned short reg)
> > @@ -279,39 +290,26 @@ static unsigned short snd_fm801_codec_read(struct
> snd_ac97 *ac97, unsigned short
> > struct fm801 *chip = ac97->private_data;
> > int idx;
> >
> > - /*
> > - * Wait until the codec interface is not ready..
> > - */
> > - for (idx = 0; idx < 100; idx++) {
> > - if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
> > - goto ok1;
> > - udelay(10);
> > + if (!__is_ready(chip, 100)) {
> > + dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
> > + return 0;
> > }
> > - dev_err(chip->card->dev, "AC'97 interface is busy (1)\n");
> > - return 0;
> >
> > - ok1:
> > /* read command */
> > fm801_writew(reg | (ac97->addr << FM801_AC97_ADDR_SHIFT) |
> > FM801_AC97_READ, chip, AC97_CMD);
> > - for (idx = 0; idx < 100; idx++) {
> > - if (!(fm801_readw(chip, AC97_CMD) & FM801_AC97_BUSY))
> > - goto ok2;
> > - udelay(10);
> > + if (!__is_ready(chip, 100)) {
> > + dev_err(chip->card->dev, "AC'97 interface #%d is busy
> (2)\n",
> > + ac97->num);
> > + return 0;
> > }
> > - dev_err(chip->card->dev, "AC'97 interface #%d is busy (2)\n",
> ac97->num);
> > - return 0;
> >
> > - ok2:
> > - for (idx = 0; idx < 1000; idx++) {
> > - if (fm801_readw(chip, AC97_CMD) & FM801_AC97_VALID)
> > - goto ok3;
> > - udelay(10);
> > + if (!__is_valid(chip, 1000)) {
> > + dev_err(chip->card->dev,
> > + "AC'97 interface #%d is not valid (2)\n",
> ac97->num);
> > + return 0;
> > }
> > - dev_err(chip->card->dev, "AC'97 interface #%d is not valid (2)\n",
> ac97->num);
> > - return 0;
> >
> > - ok3:
> > return fm801_readw(chip, AC97_DATA);
> > }
> >
> > --
> > 1.8.3.101.g727a46b
> >
>
--
With Best Regards,
Andy Shevchenko
More information about the Alsa-devel
mailing list