diff options
Diffstat (limited to '')
-rw-r--r-- | sound/pci/bt87x.c | 125 |
1 files changed, 39 insertions, 86 deletions
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 8c48864c844a..621985bfee5d 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c @@ -23,14 +23,12 @@ MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); MODULE_DESCRIPTION("Brooktree Bt87x audio driver"); MODULE_LICENSE("GPL"); -MODULE_SUPPORTED_DEVICE("{{Brooktree,Bt878}," - "{Brooktree,Bt879}}"); static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ static int digital_rate[SNDRV_CARDS]; /* digital input rate */ -static bool load_all; /* allow to load the non-whitelisted cards */ +static bool load_all; /* allow to load cards not the allowlist */ module_param_array(index, int, NULL, 0444); MODULE_PARM_DESC(index, "Index value for Bt87x soundcard"); @@ -41,7 +39,7 @@ MODULE_PARM_DESC(enable, "Enable Bt87x soundcard"); module_param_array(digital_rate, int, NULL, 0444); MODULE_PARM_DESC(digital_rate, "Digital input rate for Bt87x soundcard"); module_param(load_all, bool, 0444); -MODULE_PARM_DESC(load_all, "Allow to load the non-whitelisted cards"); +MODULE_PARM_DESC(load_all, "Allow to load cards not on the allowlist"); /* register offsets */ @@ -271,13 +269,8 @@ static void snd_bt87x_free_risc(struct snd_bt87x *chip) static void snd_bt87x_pci_error(struct snd_bt87x *chip, unsigned int status) { - u16 pci_status; + int pci_status = pci_status_get_and_clear_errors(chip->pci); - pci_read_config_word(chip->pci, PCI_STATUS, &pci_status); - pci_status &= PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT | - PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT | - PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY; - pci_write_config_word(chip->pci, PCI_STATUS, pci_status); if (pci_status != PCI_STATUS_DETECTED_PARITY) dev_err(chip->card->dev, "Aieee - PCI error! status %#08x, PCI status %#04x\n", @@ -332,7 +325,8 @@ static irqreturn_t snd_bt87x_interrupt(int irq, void *dev_id) current_block = chip->current_line * 16 / chip->lines; irq_block = status >> INT_RISCS_SHIFT; if (current_block != irq_block) - chip->current_line = (irq_block * chip->lines + 15) / 16; + chip->current_line = DIV_ROUND_UP(irq_block * chip->lines, + 16); snd_pcm_period_elapsed(chip->substream); } @@ -662,23 +656,11 @@ static const struct snd_kcontrol_new snd_bt87x_capture_source = { .put = snd_bt87x_capture_source_put, }; -static int snd_bt87x_free(struct snd_bt87x *chip) +static void snd_bt87x_free(struct snd_card *card) { - if (chip->mmio) - snd_bt87x_stop(chip); - if (chip->irq >= 0) - free_irq(chip->irq, chip); - iounmap(chip->mmio); - pci_release_regions(chip->pci); - pci_disable_device(chip->pci); - kfree(chip); - return 0; -} + struct snd_bt87x *chip = card->private_data; -static int snd_bt87x_dev_free(struct snd_device *device) -{ - struct snd_bt87x *chip = device->device_data; - return snd_bt87x_free(chip); + snd_bt87x_stop(chip); } static int snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name) @@ -700,42 +682,24 @@ static int snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name) } static int snd_bt87x_create(struct snd_card *card, - struct pci_dev *pci, - struct snd_bt87x **rchip) + struct pci_dev *pci) { - struct snd_bt87x *chip; + struct snd_bt87x *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_bt87x_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) { - pci_disable_device(pci); - return -ENOMEM; - } chip->card = card; chip->pci = pci; chip->irq = -1; spin_lock_init(&chip->reg_lock); - if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) { - kfree(chip); - pci_disable_device(pci); + err = pcim_iomap_regions(pci, 1 << 0, "Bt87x audio"); + if (err < 0) return err; - } - chip->mmio = pci_ioremap_bar(pci, 0); - if (!chip->mmio) { - dev_err(card->dev, "cannot remap io memory\n"); - err = -ENOMEM; - goto fail; - } + chip->mmio = pcim_iomap_table(pci)[0]; chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 | CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT); @@ -744,26 +708,18 @@ static int snd_bt87x_create(struct snd_card *card, snd_bt87x_writel(chip, REG_INT_MASK, 0); snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS); - err = request_irq(pci->irq, snd_bt87x_interrupt, IRQF_SHARED, - KBUILD_MODNAME, chip); + err = devm_request_irq(&pci->dev, pci->irq, snd_bt87x_interrupt, + IRQF_SHARED, KBUILD_MODNAME, chip); if (err < 0) { dev_err(card->dev, "cannot grab irq %d\n", pci->irq); - goto fail; + return err; } chip->irq = pci->irq; card->sync_irq = chip->irq; + card->private_free = snd_bt87x_free; pci_set_master(pci); - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto fail; - - *rchip = chip; return 0; - -fail: - snd_bt87x_free(chip); - return err; } #define BT_DEVICE(chip, subvend, subdev, id) \ @@ -806,7 +762,7 @@ MODULE_DEVICE_TABLE(pci, snd_bt87x_ids); * (DVB cards use the audio function to transfer MPEG data) */ static struct { unsigned short subvendor, subdevice; -} blacklist[] = { +} denylist[] = { {0x0071, 0x0101}, /* Nebula Electronics DigiTV */ {0x11bd, 0x001c}, /* Pinnacle PCTV Sat */ {0x11bd, 0x0026}, /* Pinnacle PCTV SAT CI */ @@ -822,7 +778,7 @@ static struct { static struct pci_driver driver; -/* return the id of the card, or a negative value if it's blacklisted */ +/* return the id of the card, or a negative value if it's on the denylist */ static int snd_bt87x_detect_card(struct pci_dev *pci) { int i; @@ -832,9 +788,9 @@ static int snd_bt87x_detect_card(struct pci_dev *pci) if (supported && supported->driver_data > 0) return supported->driver_data; - for (i = 0; i < ARRAY_SIZE(blacklist); ++i) - if (blacklist[i].subvendor == pci->subsystem_vendor && - blacklist[i].subdevice == pci->subsystem_device) { + for (i = 0; i < ARRAY_SIZE(denylist); ++i) + if (denylist[i].subvendor == pci->subsystem_vendor && + denylist[i].subdevice == pci->subsystem_device) { dev_dbg(&pci->dev, "card %#04x-%#04x:%#04x has no audio\n", pci->device, pci->subsystem_vendor, pci->subsystem_device); @@ -849,8 +805,8 @@ static int snd_bt87x_detect_card(struct pci_dev *pci) return SND_BT87X_BOARD_UNKNOWN; } -static int snd_bt87x_probe(struct pci_dev *pci, - const struct pci_device_id *pci_id) +static int __snd_bt87x_probe(struct pci_dev *pci, + const struct pci_device_id *pci_id) { static int dev; struct snd_card *card; @@ -873,14 +829,15 @@ static int snd_bt87x_probe(struct pci_dev *pci, return -ENOENT; } - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, - 0, &card); + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, + sizeof(*chip), &card); if (err < 0) return err; + chip = card->private_data; - err = snd_bt87x_create(card, pci, &chip); + err = snd_bt87x_create(card, pci); if (err < 0) - goto _error; + return err; memcpy(&chip->board, &snd_bt87x_boards[boardid], sizeof(chip->board)); @@ -892,24 +849,24 @@ static int snd_bt87x_probe(struct pci_dev *pci, err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital"); if (err < 0) - goto _error; + return err; } if (!chip->board.no_analog) { err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog"); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_volume, chip)); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_boost, chip)); if (err < 0) - goto _error; + return err; err = snd_ctl_add(card, snd_ctl_new1( &snd_bt87x_capture_source, chip)); if (err < 0) - goto _error; + return err; } dev_info(card->dev, "bt87x%d: Using board %d, %sanalog, %sdigital " "(rate %d Hz)\n", dev, boardid, @@ -925,20 +882,17 @@ static int snd_bt87x_probe(struct pci_dev *pci, err = snd_card_register(card); if (err < 0) - goto _error; + return err; pci_set_drvdata(pci, card); ++dev; return 0; - -_error: - snd_card_free(card); - return err; } -static void snd_bt87x_remove(struct pci_dev *pci) +static int snd_bt87x_probe(struct pci_dev *pci, + const struct pci_device_id *pci_id) { - snd_card_free(pci_get_drvdata(pci)); + return snd_card_free_on_error(&pci->dev, __snd_bt87x_probe(pci, pci_id)); } /* default entries for all Bt87x cards - it's not exported */ @@ -953,7 +907,6 @@ static struct pci_driver driver = { .name = KBUILD_MODNAME, .id_table = snd_bt87x_ids, .probe = snd_bt87x_probe, - .remove = snd_bt87x_remove, }; static int __init alsa_card_bt87x_init(void) |