Changeset 717 for GPL/trunk/alsa-kernel/pci/cmipci.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/cmipci.c
r703 r717 308 308 #define CM_MICGAINZ_SHIFT 0 309 309 310 #define CM_REG_MIXER3 0x24311 310 #define CM_REG_AUX_VOL 0x26 312 311 #define CM_VAUXL_MASK 0xf0 … … 2873 2872 for (i = 0; ports[i]; i++) { 2874 2873 io_port = ports[i]; 2875 r = request_region(io_port, 1, "CMIPCI gameport"); 2874 r = devm_request_region(&cm->pci->dev, io_port, 1, 2875 "CMIPCI gameport"); 2876 2876 if (r) 2877 2877 break; … … 2879 2879 } else { 2880 2880 io_port = joystick_port[dev]; 2881 r = request_region(io_port, 1, "CMIPCI gameport"); 2881 r = devm_request_region(&cm->pci->dev, io_port, 1, 2882 "CMIPCI gameport"); 2882 2883 } 2883 2884 … … 2890 2891 if (!gp) { 2891 2892 dev_err(cm->card->dev, "cannot allocate memory for gameport\n"); 2892 release_and_free_resource(r);2893 2893 return -ENOMEM; 2894 2894 } … … 2897 2897 gameport_set_dev_parent(gp, &cm->pci->dev); 2898 2898 gp->io = io_port; 2899 gameport_set_port_data(gp, r);2900 2899 2901 2900 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); … … 2909 2908 { 2910 2909 if (cm->gameport) { 2911 struct resource *r = gameport_get_port_data(cm->gameport);2912 2913 2910 gameport_unregister_port(cm->gameport); 2914 2911 cm->gameport = NULL; 2915 2912 2916 2913 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); 2917 release_and_free_resource(r);2918 2914 } 2919 2915 } … … 2923 2919 #endif 2924 2920 2925 static int snd_cmipci_free(struct cmipci *cm) 2926 { 2927 if (cm->irq >= 0) { 2928 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); 2929 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); 2930 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ 2931 snd_cmipci_ch_reset(cm, CM_CH_PLAY); 2932 snd_cmipci_ch_reset(cm, CM_CH_CAPT); 2933 snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ 2934 snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); 2935 2936 /* reset mixer */ 2937 snd_cmipci_mixer_write(cm, 0, 0); 2938 2939 free_irq(cm->irq, cm); 2940 } 2921 static void snd_cmipci_free(struct snd_card *card) 2922 { 2923 struct cmipci *cm = card->private_data; 2924 2925 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); 2926 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); 2927 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ 2928 snd_cmipci_ch_reset(cm, CM_CH_PLAY); 2929 snd_cmipci_ch_reset(cm, CM_CH_CAPT); 2930 snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ 2931 snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); 2932 2933 /* reset mixer */ 2934 snd_cmipci_mixer_write(cm, 0, 0); 2941 2935 2942 2936 snd_cmipci_free_gameport(cm); 2943 pci_release_regions(cm->pci);2944 pci_disable_device(cm->pci);2945 kfree(cm);2946 return 0;2947 }2948 2949 static int snd_cmipci_dev_free(struct snd_device *device)2950 {2951 struct cmipci *cm = device->device_data;2952 return snd_cmipci_free(cm);2953 2937 } 2954 2938 … … 3009 2993 3010 2994 static int snd_cmipci_create(struct snd_card *card, struct pci_dev *pci, 3011 int dev , struct cmipci **rcmipci)3012 { 3013 struct cmipci *cm ;2995 int dev) 2996 { 2997 struct cmipci *cm = card->private_data; 3014 2998 int err; 3015 static const struct snd_device_ops ops = {3016 .dev_free = snd_cmipci_dev_free,3017 };3018 2999 unsigned int val; 3019 3000 long iomidi = 0; … … 3026 3007 }; 3027 3008 3028 *rcmipci = NULL; 3029 3030 err = pci_enable_device(pci); 3009 err = pcim_enable_device(pci); 3031 3010 if (err < 0) 3032 3011 return err; 3033 3034 cm = kzalloc(sizeof(*cm), GFP_KERNEL);3035 if (cm == NULL) {3036 pci_disable_device(pci);3037 return -ENOMEM;3038 }3039 3012 3040 3013 spin_lock_init(&cm->reg_lock); … … 3049 3022 3050 3023 err = pci_request_regions(pci, card->driver); 3051 if (err < 0) { 3052 kfree(cm); 3053 pci_disable_device(pci); 3024 if (err < 0) 3054 3025 return err; 3055 }3056 3026 cm->iobase = pci_resource_start(pci, 0); 3057 3027 3058 if ( request_irq(pci->irq, snd_cmipci_interrupt,3059 IRQF_SHARED, KBUILD_MODNAME, cm)) {3028 if (devm_request_irq(&pci->dev, pci->irq, snd_cmipci_interrupt, 3029 IRQF_SHARED, KBUILD_MODNAME, cm)) { 3060 3030 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 3061 snd_cmipci_free(cm);3062 3031 return -EBUSY; 3063 3032 } 3064 3033 cm->irq = pci->irq; 3065 3034 card->sync_irq = cm->irq; 3035 card->private_free = snd_cmipci_free; 3066 3036 3067 3037 pci_set_master(cm->pci); … … 3163 3133 card->shortname, modelstr, cm->iobase, cm->irq); 3164 3134 3165 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, cm, &ops);3166 if (err < 0) {3167 snd_cmipci_free(cm);3168 return err;3169 }3170 3171 3135 if (cm->chip_version >= 39) { 3172 3136 val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1); … … 3261 3225 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); 3262 3226 3263 *rcmipci = cm;3264 3227 return 0; 3265 3228 } … … 3285 3248 } 3286 3249 3287 err = snd_ card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,3288 0, &card);3250 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 3251 sizeof(*cm), &card); 3289 3252 if (err < 0) 3290 3253 return err; 3254 cm = card->private_data; 3291 3255 3292 3256 switch (pci->device) { … … 3304 3268 } 3305 3269 3306 err = snd_cmipci_create(card, pci, dev , &cm);3270 err = snd_cmipci_create(card, pci, dev); 3307 3271 if (err < 0) 3308 goto free_card; 3309 3310 card->private_data = cm; 3272 goto error; 3311 3273 3312 3274 err = snd_card_register(card); 3313 3275 if (err < 0) 3314 goto free_card;3276 goto error; 3315 3277 3316 3278 pci_set_drvdata(pci, card); … … 3318 3280 return 0; 3319 3281 3320 free_card:3282 error: 3321 3283 snd_card_free(card); 3322 3284 return err; 3323 3285 } 3324 3286 3325 static void snd_cmipci_remove(struct pci_dev *pci)3326 {3327 snd_card_free(pci_get_drvdata(pci));3328 }3329 3330 3331 3287 #ifdef CONFIG_PM_SLEEP 3332 3288 /* … … 3335 3291 static const unsigned char saved_regs[] = { 3336 3292 CM_REG_FUNCTRL1, CM_REG_CHFORMAT, CM_REG_LEGACY_CTRL, CM_REG_MISC_CTRL, 3337 CM_REG_MIXER0, CM_REG_MIXER1, CM_REG_MIXER2, CM_REG_ MIXER3, CM_REG_PLL,3293 CM_REG_MIXER0, CM_REG_MIXER1, CM_REG_MIXER2, CM_REG_AUX_VOL, CM_REG_PLL, 3338 3294 CM_REG_CH0_FRAME1, CM_REG_CH0_FRAME2, 3339 3295 CM_REG_CH1_FRAME1, CM_REG_CH1_FRAME2, CM_REG_EXT_MISC, … … 3403 3359 .id_table = snd_cmipci_ids, 3404 3360 .probe = snd_cmipci_probe, 3405 .remove = snd_cmipci_remove,3406 3361 .driver = { 3407 3362 .pm = SND_CMIPCI_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.