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@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@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@kernel.org Signed-off-by: Takashi Iwai tiwai@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);