Changeset 710 for GPL/branches/uniaud32-next/alsa-kernel/pci/intel8x0.c
- Timestamp:
- Aug 5, 2022, 2:58:37 AM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/branches/uniaud32-next/alsa-kernel/pci/intel8x0.c
r697 r710 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 */ 3014 #ifndef TARGET_OS2 3015 chip->bdbars = snd_devm_alloc_pages(&pci->dev, intel8x0_dma_type(chip), 3016 chip->bdbars_count * sizeof(u32) * 3017 ICH_MAX_FRAGS * 2); 3018 if (!chip->bdbars) 3019 return -ENOMEM; 3020 #else 3053 3021 if (snd_dma_alloc_pages(intel8x0_dma_type(chip), &pci->dev, 3054 3022 chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2, … … 3058 3026 return -ENOMEM; 3059 3027 } 3028 #endif 3060 3029 /* tables must be aligned to 8 bytes here, but the kernel pages 3061 3030 are much bigger, so we don't care (on i386) */ … … 3063 3032 for (i = 0; i < chip->bdbars_count; i++) { 3064 3033 ichdev = &chip->ichd[i]; 3065 ichdev->bdbar = ((__le32 *)chip->bdbars .area) +3034 ichdev->bdbar = ((__le32 *)chip->bdbars->area) + 3066 3035 (i * ICH_MAX_FRAGS * 2); 3067 ichdev->bdbar_addr = chip->bdbars .addr +3036 ichdev->bdbar_addr = chip->bdbars->addr + 3068 3037 (i * sizeof(u32) * ICH_MAX_FRAGS * 2); 3069 3038 int_sta_masks |= ichdev->int_sta_mask; … … 3099 3068 3100 3069 err = snd_intel8x0_chip_init(chip, 1); 3101 if (err < 0) { 3102 snd_intel8x0_free(chip); 3070 if (err < 0) 3103 3071 return err; 3104 }3105 3072 3106 3073 /* request irq after initializaing int_sta_mask, etc */ 3074 /* NOTE: we don't use devm version here since it's released / 3075 * re-acquired in PM callbacks. 3076 * It's released explicitly in snd_intel8x0_free(), too. 3077 */ 3107 3078 if (request_irq(pci->irq, snd_intel8x0_interrupt, 3108 3079 IRQF_SHARED, KBUILD_MODNAME, chip)) { 3109 3080 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 3110 snd_intel8x0_free(chip);3111 3081 return -EBUSY; 3112 3082 } … … 3114 3084 card->sync_irq = chip->irq; 3115 3085 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; 3086 card->private_free = snd_intel8x0_free; 3087 3123 3088 return 0; 3124 3089 } … … 3186 3151 struct shortname_table *name; 3187 3152 3188 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); 3153 err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, 3154 sizeof(*chip), &card); 3189 3155 if (err < 0) 3190 3156 return err; 3157 chip = card->private_data; 3191 3158 3192 3159 if (spdif_aclink < 0) … … 3222 3189 } 3223 3190 3224 err = snd_intel8x0_create(card, pci, pci_id->driver_data, &chip); 3225 if (err < 0) { 3226 snd_card_free(card); 3191 err = snd_intel8x0_init(card, pci, pci_id->driver_data); 3192 if (err < 0) 3227 3193 return err; 3228 }3229 card->private_data = chip;3230 3194 3231 3195 err = snd_intel8x0_mixer(chip, ac97_clock, ac97_quirk); 3232 if (err < 0) { 3233 snd_card_free(card); 3196 if (err < 0) 3234 3197 return err; 3235 }3236 3198 err = snd_intel8x0_pcm(chip); 3237 if (err < 0) { 3238 snd_card_free(card); 3199 if (err < 0) 3239 3200 return err; 3240 }3241 3201 3242 3202 snd_intel8x0_proc_init(chip); … … 3256 3216 3257 3217 err = snd_card_register(card); 3258 if (err < 0) { 3259 snd_card_free(card); 3218 if (err < 0) 3260 3219 return err; 3261 } 3220 3262 3221 pci_set_drvdata(pci, card); 3263 3222 return 0; 3264 }3265 3266 static void snd_intel8x0_remove(struct pci_dev *pci)3267 {3268 snd_card_free(pci_get_drvdata(pci));3269 3223 } 3270 3224 … … 3273 3227 .id_table = snd_intel8x0_ids, 3274 3228 .probe = snd_intel8x0_probe, 3275 .remove = snd_intel8x0_remove,3276 3229 .driver = { 3277 3230 .pm = INTEL8X0_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.
