Changeset 717 for GPL/trunk/alsa-kernel/pci/intel8x0.c
- Timestamp:
- Aug 7, 2022, 6:11:12 PM (3 years ago)
- Location:
- GPL/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk
- Property svn:mergeinfo changed
/GPL/branches/uniaud32-next merged: 710-716
- Property svn:mergeinfo changed
-
GPL/trunk/alsa-kernel/pci/intel8x0.c
r703 r717 382 382 383 383 u32 bdbars_count; 384 struct snd_dma_buffer bdbars;384 struct snd_dma_buffer *bdbars; 385 385 u32 int_sta_reg; /* interrupt status register */ 386 386 u32 int_sta_mask; /* interrupt status mask */ … … 1431 1431 1432 1432 #define intel8x0_dma_type(chip) \ 1433 ((chip)->fix_nocache ? SNDRV_DMA_TYPE_DEV_ UC : SNDRV_DMA_TYPE_DEV)1433 ((chip)->fix_nocache ? SNDRV_DMA_TYPE_DEV_WC : SNDRV_DMA_TYPE_DEV) 1434 1434 1435 1435 static int snd_intel8x0_pcm1(struct intel8x0 *chip, int device, … … 2534 2534 } 2535 2535 2536 static int snd_intel8x0_free(struct intel8x0 *chip) 2537 { 2536 static void snd_intel8x0_free(struct snd_card *card) 2537 { 2538 struct intel8x0 *chip = card->private_data; 2538 2539 unsigned int i; 2539 2540 … … 2558 2559 if (chip->irq >= 0) 2559 2560 free_irq(chip->irq, chip); 2560 if (chip->bdbars.area)2561 snd_dma_free_pages(&chip->bdbars);2562 if (chip->addr)2563 pci_iounmap(chip->pci, chip->addr);2564 if (chip->bmaddr)2565 pci_iounmap(chip->pci, chip->bmaddr);2566 pci_release_regions(chip->pci);2567 pci_disable_device(chip->pci);2568 kfree(chip);2569 return 0;2570 2561 } 2571 2562 … … 2666 2657 if (chip->ac97_bus->clock != 48000) 2667 2658 return; /* specified in module option */ 2659 if (chip->inside_vm && !ac97_clock) 2660 return; /* no measurement on VM */ 2668 2661 2669 2662 __again: … … 2854 2847 } 2855 2848 2856 static int snd_intel8x0_dev_free(struct snd_device *device)2857 {2858 struct intel8x0 *chip = device->device_data;2859 return snd_intel8x0_free(chip);2860 }2861 2862 2849 struct ich_reg_info { 2863 2850 unsigned int int_sta_mask; … … 2903 2890 } 2904 2891 2905 static int snd_intel8x0_create(struct snd_card *card, 2906 struct pci_dev *pci, 2907 unsigned long device_type, 2908 struct intel8x0 **r_intel8x0) 2909 { 2910 struct intel8x0 *chip; 2892 static int snd_intel8x0_init(struct snd_card *card, 2893 struct pci_dev *pci, 2894 unsigned long device_type) 2895 { 2896 struct intel8x0 *chip = card->private_data; 2911 2897 int err; 2912 2898 unsigned int i; 2913 2899 unsigned int int_sta_masks; 2914 2900 struct ichdev *ichdev; 2915 static const struct snd_device_ops ops = {2916 .dev_free = snd_intel8x0_dev_free,2917 };2918 2901 2919 2902 static const unsigned int bdbars[] = { … … 2948 2931 const struct ich_reg_info *tbl; 2949 2932 2950 *r_intel8x0 = NULL; 2951 2952 err = pci_enable_device(pci); 2933 err = pcim_enable_device(pci); 2953 2934 if (err < 0) 2954 2935 return err; 2955 2936 2956 chip = kzalloc(sizeof(*chip), GFP_KERNEL);2957 if (chip == NULL) {2958 pci_disable_device(pci);2959 return -ENOMEM;2960 }2961 2937 spin_lock_init(&chip->reg_lock); 2962 2938 chip->device_type = device_type; … … 2984 2960 2985 2961 err = pci_request_regions(pci, card->shortname); 2986 if (err < 0) { 2987 kfree(chip); 2988 pci_disable_device(pci); 2962 if (err < 0) 2989 2963 return err; 2990 }2991 2964 2992 2965 if (device_type == DEVICE_ALI) { 2993 2966 /* ALI5455 has no ac97 region */ 2994 chip->bmaddr = pci_iomap(pci, 0, 0); 2995 goto port_inited; 2996 } 2997 2998 if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ 2999 chip->addr = pci_iomap(pci, 2, 0); 3000 else 3001 chip->addr = pci_iomap(pci, 0, 0); 3002 if (!chip->addr) { 3003 dev_err(card->dev, "AC'97 space ioremap problem\n"); 3004 snd_intel8x0_free(chip); 3005 return -EIO; 3006 } 3007 if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ 3008 chip->bmaddr = pci_iomap(pci, 3, 0); 3009 else 3010 chip->bmaddr = pci_iomap(pci, 1, 0); 3011 3012 port_inited: 3013 if (!chip->bmaddr) { 3014 dev_err(card->dev, "Controller space ioremap problem\n"); 3015 snd_intel8x0_free(chip); 3016 return -EIO; 3017 } 2967 chip->bmaddr = pcim_iomap(pci, 0, 0); 2968 } else { 2969 if (pci_resource_flags(pci, 2) & IORESOURCE_MEM) /* ICH4 and Nforce */ 2970 chip->addr = pcim_iomap(pci, 2, 0); 2971 else 2972 chip->addr = pcim_iomap(pci, 0, 0); 2973 if (pci_resource_flags(pci, 3) & IORESOURCE_MEM) /* ICH4 */ 2974 chip->bmaddr = pcim_iomap(pci, 3, 0); 2975 else 2976 chip->bmaddr = pcim_iomap(pci, 1, 0); 2977 } 2978 3018 2979 chip->bdbars_count = bdbars[device_type]; 3019 2980 … … 3051 3012 /* allocate buffer descriptor lists */ 3052 3013 /* the start of each lists must be aligned to 8 bytes */ 3053 if (snd_dma_alloc_pages(intel8x0_dma_type(chip), &pci->dev, 3054 chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, 3055 &chip->bdbars) < 0) { 3056 snd_intel8x0_free(chip); 3057 dev_err(card->dev, "cannot allocate buffer descriptors\n"); 3014 chip->bdbars = snd_devm_alloc_pages(&pci->dev, intel8x0_dma_type(chip), 3015 chip->bdbars_count * sizeof(u32) * 3016 ICH_MAX_FRAGS * 2); 3017 if (!chip->bdbars) 3058 3018 return -ENOMEM; 3059 }3060 3019 /* tables must be aligned to 8 bytes here, but the kernel pages 3061 3020 are much bigger, so we don't care (on i386) */ … … 3063 3022 for (i = 0; i < chip->bdbars_count; i++) { 3064 3023 ichdev = &chip->ichd[i]; 3065 ichdev->bdbar = ((__le32 *)chip->bdbars .area) +3024 ichdev->bdbar = ((__le32 *)chip->bdbars->area) + 3066 3025 (i * ICH_MAX_FRAGS * 2); 3067 ichdev->bdbar_addr = chip->bdbars .addr +3026 ichdev->bdbar_addr = chip->bdbars->addr + 3068 3027 (i * sizeof(u32) * ICH_MAX_FRAGS * 2); 3069 3028 int_sta_masks |= ichdev->int_sta_mask; … … 3099 3058 3100 3059 err = snd_intel8x0_chip_init(chip, 1); 3101 if (err < 0) { 3102 snd_intel8x0_free(chip); 3060 if (err < 0) 3103 3061 return err; 3104 }3105 3062 3106 3063 /* request irq after initializaing int_sta_mask, etc */ 3064 /* NOTE: we don't use devm version here since it's released / 3065 * re-acquired in PM callbacks. 3066 * It's released explicitly in snd_intel8x0_free(), too. 3067 */ 3107 3068 if (request_irq(pci->irq, snd_intel8x0_interrupt, 3108 3069 IRQF_SHARED, KBUILD_MODNAME, chip)) { 3109 3070 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 3110 snd_intel8x0_free(chip);3111 3071 return -EBUSY; 3112 3072 } … … 3114 3074 card->sync_irq = chip->irq; 3115 3075 3116 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); 3117 if (err < 0) { 3118 snd_intel8x0_free(chip); 3119 return err; 3120 } 3121 3122 *r_intel8x0 = chip; 3076 card->private_free = snd_intel8x0_free; 3077 3123 3078 return 0; 3124 3079 } … … 3178 3133 } 3179 3134 3180 static int snd_intel8x0_probe(struct pci_dev *pci,3181 3135 static int __snd_intel8x0_probe(struct pci_dev *pci, 3136 const struct pci_device_id *pci_id) 3182 3137 { 3183 3138 struct snd_card *card; … … 3186 3141 struct shortname_table *name; 3187 3142 3188 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); 3143 err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, 3144 sizeof(*chip), &card); 3189 3145 if (err < 0) 3190 3146 return err; 3147 chip = card->private_data; 3191 3148 3192 3149 if (spdif_aclink < 0) … … 3222 3179 } 3223 3180 3224 err = snd_intel8x0_create(card, pci, pci_id->driver_data, &chip); 3225 if (err < 0) { 3226 snd_card_free(card); 3181 err = snd_intel8x0_init(card, pci, pci_id->driver_data); 3182 if (err < 0) 3227 3183 return err; 3228 }3229 card->private_data = chip;3230 3184 3231 3185 err = snd_intel8x0_mixer(chip, ac97_clock, ac97_quirk); 3232 if (err < 0) { 3233 snd_card_free(card); 3186 if (err < 0) 3234 3187 return err; 3235 }3236 3188 err = snd_intel8x0_pcm(chip); 3237 if (err < 0) { 3238 snd_card_free(card); 3189 if (err < 0) 3239 3190 return err; 3240 }3241 3191 3242 3192 snd_intel8x0_proc_init(chip); … … 3256 3206 3257 3207 err = snd_card_register(card); 3258 if (err < 0) { 3259 snd_card_free(card); 3208 if (err < 0) 3260 3209 return err; 3261 } 3210 3262 3211 pci_set_drvdata(pci, card); 3263 3212 return 0; 3264 3213 } 3265 3214 3266 static void snd_intel8x0_remove(struct pci_dev *pci) 3267 { 3268 snd_card_free(pci_get_drvdata(pci)); 3215 static int snd_intel8x0_probe(struct pci_dev *pci, 3216 const struct pci_device_id *pci_id) 3217 { 3218 return snd_card_free_on_error(&pci->dev, __snd_intel8x0_probe(pci, pci_id)); 3269 3219 } 3270 3220 … … 3273 3223 .id_table = snd_intel8x0_ids, 3274 3224 .probe = snd_intel8x0_probe, 3275 .remove = snd_intel8x0_remove,3276 3225 .driver = { 3277 3226 .pm = INTEL8X0_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.