Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: sscape: Allocate resources with device-managed APIs

This patch converts the resource management in ISA sscape driver with
devres as a clean up. Each manual resource management is converted
with the corresponding devres helper. The remove callback became
superfluous and dropped.

This should give no user-visible functional changes.

Link: https://lore.kernel.org/r/20210715075941.23332-71-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+20 -72
+20 -72
sound/isa/sscape.c
··· 328 328 } 329 329 330 330 /* 331 - * Do the necessary ALSA-level cleanup to deallocate our driver ... 332 - */ 333 - static void soundscape_free(struct snd_card *c) 334 - { 335 - struct soundscape *sscape = get_card_soundscape(c); 336 - release_and_free_resource(sscape->io_res); 337 - release_and_free_resource(sscape->wss_res); 338 - free_dma(sscape->chip->dma1); 339 - } 340 - 341 - /* 342 331 * Tell the SoundScape to begin a DMA transfer using the given channel. 343 332 * All locking issues are left to the caller. 344 333 */ ··· 930 941 * Grab IO ports that we will need to probe so that we 931 942 * can detect and control this hardware ... 932 943 */ 933 - io_res = request_region(port[dev], 8, "SoundScape"); 944 + io_res = devm_request_region(card->dev, port[dev], 8, "SoundScape"); 934 945 if (!io_res) { 935 946 snd_printk(KERN_ERR 936 947 "sscape: can't grab port 0x%lx\n", port[dev]); ··· 938 949 } 939 950 wss_res = NULL; 940 951 if (sscape->type == SSCAPE_VIVO) { 941 - wss_res = request_region(wss_port[dev], 4, "SoundScape"); 952 + wss_res = devm_request_region(card->dev, wss_port[dev], 4, 953 + "SoundScape"); 942 954 if (!wss_res) { 943 955 snd_printk(KERN_ERR "sscape: can't grab port 0x%lx\n", 944 956 wss_port[dev]); 945 - err = -EBUSY; 946 - goto _release_region; 957 + return -EBUSY; 947 958 } 948 959 } 949 960 950 961 /* 951 962 * Grab one DMA channel ... 952 963 */ 953 - err = request_dma(dma[dev], "SoundScape"); 964 + err = snd_devm_request_dma(card->dev, dma[dev], "SoundScape"); 954 965 if (err < 0) { 955 966 snd_printk(KERN_ERR "sscape: can't grab DMA %d\n", dma[dev]); 956 - goto _release_region; 967 + return err; 957 968 } 958 969 959 970 spin_lock_init(&sscape->lock); ··· 964 975 if (!detect_sscape(sscape, wss_port[dev])) { 965 976 printk(KERN_ERR "sscape: hardware not detected at 0x%x\n", 966 977 sscape->io_base); 967 - err = -ENODEV; 968 - goto _release_dma; 978 + return -ENODEV; 969 979 } 970 980 971 981 switch (sscape->type) { ··· 994 1006 irq_cfg = get_irq_config(sscape->type, irq[dev]); 995 1007 if (irq_cfg == INVALID_IRQ) { 996 1008 snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); 997 - err = -ENXIO; 998 - goto _release_dma; 1009 + return -ENXIO; 999 1010 } 1000 1011 1001 1012 mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]); 1002 1013 if (mpu_irq_cfg == INVALID_IRQ) { 1003 1014 snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); 1004 - err = -ENXIO; 1005 - goto _release_dma; 1015 + return -ENXIO; 1006 1016 } 1007 1017 1008 1018 /* ··· 1046 1060 snd_printk(KERN_ERR 1047 1061 "sscape: No AD1845 device at 0x%lx, IRQ %d\n", 1048 1062 wss_port[dev], irq[dev]); 1049 - goto _release_dma; 1063 + return err; 1050 1064 } 1051 1065 strcpy(card->driver, "SoundScape"); 1052 1066 strcpy(card->shortname, name); ··· 1068 1082 snd_printk(KERN_ERR "sscape: Failed to create " 1069 1083 "MPU-401 device at 0x%lx\n", 1070 1084 port[dev]); 1071 - goto _release_dma; 1085 + return err; 1072 1086 } 1073 1087 1074 1088 /* ··· 1095 1109 } 1096 1110 } 1097 1111 1098 - /* 1099 - * Now that we have successfully created this sound card, 1100 - * it is safe to store the pointer. 1101 - * NOTE: we only register the sound card's "destructor" 1102 - * function now that our "constructor" has completed. 1103 - */ 1104 - card->private_free = soundscape_free; 1105 - 1106 1112 return 0; 1107 - 1108 - _release_dma: 1109 - free_dma(dma[dev]); 1110 - 1111 - _release_region: 1112 - release_and_free_resource(wss_res); 1113 - release_and_free_resource(io_res); 1114 - 1115 - return err; 1116 1113 } 1117 1114 1118 1115 ··· 1125 1156 struct soundscape *sscape; 1126 1157 int ret; 1127 1158 1128 - ret = snd_card_new(pdev, index[dev], id[dev], THIS_MODULE, 1129 - sizeof(struct soundscape), &card); 1159 + ret = snd_devm_card_new(pdev, index[dev], id[dev], THIS_MODULE, 1160 + sizeof(struct soundscape), &card); 1130 1161 if (ret < 0) 1131 1162 return ret; 1132 1163 ··· 1137 1168 1138 1169 ret = create_sscape(dev, card); 1139 1170 if (ret < 0) 1140 - goto _release_card; 1171 + return ret; 1141 1172 1142 1173 ret = snd_card_register(card); 1143 1174 if (ret < 0) { 1144 1175 snd_printk(KERN_ERR "sscape: Failed to register sound card\n"); 1145 - goto _release_card; 1176 + return ret; 1146 1177 } 1147 1178 dev_set_drvdata(pdev, card); 1148 1179 return 0; 1149 - 1150 - _release_card: 1151 - snd_card_free(card); 1152 - return ret; 1153 - } 1154 - 1155 - static void snd_sscape_remove(struct device *devptr, unsigned int dev) 1156 - { 1157 - snd_card_free(dev_get_drvdata(devptr)); 1158 1180 } 1159 1181 1160 1182 #define DEV_NAME "sscape" ··· 1153 1193 static struct isa_driver snd_sscape_driver = { 1154 1194 .match = snd_sscape_match, 1155 1195 .probe = snd_sscape_probe, 1156 - .remove = snd_sscape_remove, 1157 1196 /* FIXME: suspend/resume */ 1158 1197 .driver = { 1159 1198 .name = DEV_NAME ··· 1203 1244 * Create a new ALSA sound card entry, in anticipation 1204 1245 * of detecting our hardware ... 1205 1246 */ 1206 - ret = snd_card_new(&pcard->card->dev, 1207 - index[idx], id[idx], THIS_MODULE, 1208 - sizeof(struct soundscape), &card); 1247 + ret = snd_devm_card_new(&pcard->card->dev, 1248 + index[idx], id[idx], THIS_MODULE, 1249 + sizeof(struct soundscape), &card); 1209 1250 if (ret < 0) 1210 1251 return ret; 1211 1252 ··· 1236 1277 1237 1278 ret = create_sscape(idx, card); 1238 1279 if (ret < 0) 1239 - goto _release_card; 1280 + return ret; 1240 1281 1241 1282 ret = snd_card_register(card); 1242 1283 if (ret < 0) { 1243 1284 snd_printk(KERN_ERR "sscape: Failed to register sound card\n"); 1244 - goto _release_card; 1285 + return ret; 1245 1286 } 1246 1287 1247 1288 pnp_set_card_drvdata(pcard, card); 1248 1289 ++idx; 1249 1290 return 0; 1250 - 1251 - _release_card: 1252 - snd_card_free(card); 1253 - return ret; 1254 - } 1255 - 1256 - static void sscape_pnp_remove(struct pnp_card_link *pcard) 1257 - { 1258 - snd_card_free(pnp_get_card_drvdata(pcard)); 1259 - pnp_set_card_drvdata(pcard, NULL); 1260 1291 } 1261 1292 1262 1293 static struct pnp_card_driver sscape_pnpc_driver = { ··· 1254 1305 .name = "sscape", 1255 1306 .id_table = sscape_pnpids, 1256 1307 .probe = sscape_pnp_detect, 1257 - .remove = sscape_pnp_remove, 1258 1308 }; 1259 1309 1260 1310 #endif /* CONFIG_PNP */