[PATCH v2 14/79] ALSA: cs4281: Allocate resources with device-managed APIs

Takashi Iwai tiwai at suse.de
Wed Jul 21 00:17:20 CEST 2021


On Tue, 20 Jul 2021 21:46:47 +0200,
Nathan Chancellor wrote:
> 
> On Thu, Jul 15, 2021 at 09:58:36AM +0200, Takashi Iwai wrote:
> > This patch converts the resource management in PCI cs4281 driver with
> > devres as a clean up.  Each manual resource management is converted
> > with the corresponding devres helper, and the card object release is
> > managed now via card->private_free instead of a lowlevel snd_device.
> > 
> > This should give no user-visible functional changes.
> > 
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > ---
> >  sound/pci/cs4281.c | 112 ++++++++++-----------------------------------
> >  1 file changed, 24 insertions(+), 88 deletions(-)
> > 
> > diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c
> > index e122a168c148..f338caf98354 100644
> > --- a/sound/pci/cs4281.c
> > +++ b/sound/pci/cs4281.c
> > @@ -1268,8 +1268,10 @@ static inline int snd_cs4281_create_gameport(struct cs4281 *chip) { return -ENOS
> >  static inline void snd_cs4281_free_gameport(struct cs4281 *chip) { }
> >  #endif /* IS_REACHABLE(CONFIG_GAMEPORT) */
> >  
> > -static int snd_cs4281_free(struct cs4281 *chip)
> > +static void snd_cs4281_free(struct snd_card *card)
> >  {
> > +	struct cs4281 *chip = card->private_data;
> > +
> >  	snd_cs4281_free_gameport(chip);
> >  
> >  	/* Mask interrupts */
> > @@ -1278,49 +1280,20 @@ static int snd_cs4281_free(struct cs4281 *chip)
> >  	snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
> >  	/* Sound System Power Management - Turn Everything OFF */
> >  	snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
> > -	/* PCI interface - D3 state */
> > -	pci_set_power_state(chip->pci, PCI_D3hot);
> > -
> > -	if (chip->irq >= 0)
> > -		free_irq(chip->irq, chip);
> > -	iounmap(chip->ba0);
> > -	iounmap(chip->ba1);
> > -	pci_release_regions(chip->pci);
> > -	pci_disable_device(chip->pci);
> > -
> > -	kfree(chip);
> > -	return 0;
> > -}
> > -
> > -static int snd_cs4281_dev_free(struct snd_device *device)
> > -{
> > -	struct cs4281 *chip = device->device_data;
> > -	return snd_cs4281_free(chip);
> >  }
> >  
> >  static int snd_cs4281_chip_init(struct cs4281 *chip); /* defined below */
> >  
> >  static int snd_cs4281_create(struct snd_card *card,
> >  			     struct pci_dev *pci,
> > -			     struct cs4281 **rchip,
> >  			     int dual_codec)
> >  {
> >  	struct cs4281 *chip;
> > -	unsigned int tmp;
> >  	int err;
> > -	static const struct snd_device_ops ops = {
> > -		.dev_free =	snd_cs4281_dev_free,
> > -	};
> >  
> > -	*rchip = NULL;
> > -	err = pci_enable_device(pci);
> > +	err = pcim_enable_device(pci);
> >  	if (err < 0)
> >  		return err;
> > -	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
> > -	if (chip == NULL) {
> > -		pci_disable_device(pci);
> > -		return -ENOMEM;
> > -	}
> >  	spin_lock_init(&chip->reg_lock);
> >  	chip->card = card;
> 
> clang warns:
> 
> sound/pci/cs4281.c:1298:2: error: variable 'chip' is uninitialized when used here [-Werror,-Wuninitialized]
>         chip->card = card;
>         ^~~~
> sound/pci/cs4281.c:1291:21: note: initialize the variable 'chip' to silence this warning
>         struct cs4281 *chip;
>                            ^
>                             = NULL
> 1 error generated.

Thanks!  The fix patch is below.  I'll queue it up.


Takashi

-- 8< --
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ALSA: cs4281: Fix missing chip initialization

The chip variable was forgotten to be initialized properly while
changing the object creation from the own malloc to
card->private_data.  This patch fixes it.

Fixes: 99041fea70d0 ("ALSA: cs4281: Allocate resources with device-managed APIs")
Reported-by: Nathan Chancellor <nathan at kernel.org>
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 sound/pci/cs4281.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c
index f338caf98354..e7367402b84a 100644
--- a/sound/pci/cs4281.c
+++ b/sound/pci/cs4281.c
@@ -1288,7 +1288,7 @@ static int snd_cs4281_create(struct snd_card *card,
 			     struct pci_dev *pci,
 			     int dual_codec)
 {
-	struct cs4281 *chip;
+	struct cs4281 *chip = card->private_data;
 	int err;
 
 	err = pcim_enable_device(pci);
-- 
2.26.2



More information about the Alsa-devel mailing list