aboutsummaryrefslogtreecommitdiffstats
path: root/sound/isa/cs423x
diff options
context:
space:
mode:
Diffstat (limited to 'sound/isa/cs423x')
-rw-r--r--sound/isa/cs423x/cs4236.c91
1 files changed, 16 insertions, 75 deletions
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
index 5784b43f4123..0a3fece40f8b 100644
--- a/sound/isa/cs423x/cs4236.c
+++ b/sound/isa/cs423x/cs4236.c
@@ -270,29 +270,9 @@ static struct pnp_card_device_id snd_cs423x_pnpids[] = {
270MODULE_DEVICE_TABLE(pnp_card, snd_cs423x_pnpids); 270MODULE_DEVICE_TABLE(pnp_card, snd_cs423x_pnpids);
271 271
272/* WSS initialization */ 272/* WSS initialization */
273static int __devinit snd_cs423x_pnp_init_wss(int dev, struct pnp_dev *pdev, 273static int __devinit snd_cs423x_pnp_init_wss(int dev, struct pnp_dev *pdev)
274 struct pnp_resource_table *cfg)
275{ 274{
276 int err; 275 if (pnp_activate_dev(pdev) < 0) {
277
278 pnp_init_resource_table(cfg);
279 if (port[dev] != SNDRV_AUTO_PORT)
280 pnp_resource_change(&cfg->port_resource[0], port[dev], 4);
281 if (fm_port[dev] != SNDRV_AUTO_PORT && fm_port[dev] > 0)
282 pnp_resource_change(&cfg->port_resource[1], fm_port[dev], 4);
283 if (sb_port[dev] != SNDRV_AUTO_PORT)
284 pnp_resource_change(&cfg->port_resource[2], sb_port[dev], 16);
285 if (irq[dev] != SNDRV_AUTO_IRQ)
286 pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
287 if (dma1[dev] != SNDRV_AUTO_DMA)
288 pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
289 if (dma2[dev] != SNDRV_AUTO_DMA)
290 pnp_resource_change(&cfg->dma_resource[1], dma2[dev] < 0 ? 4 : dma2[dev], 1);
291 err = pnp_manual_config_dev(pdev, cfg, 0);
292 if (err < 0)
293 snd_printk(KERN_ERR IDENT " WSS PnP manual resources are invalid, using auto config\n");
294 err = pnp_activate_dev(pdev);
295 if (err < 0) {
296 printk(KERN_ERR IDENT " WSS PnP configure failed for WSS (out of resources?)\n"); 276 printk(KERN_ERR IDENT " WSS PnP configure failed for WSS (out of resources?)\n");
297 return -EBUSY; 277 return -EBUSY;
298 } 278 }
@@ -311,19 +291,9 @@ static int __devinit snd_cs423x_pnp_init_wss(int dev, struct pnp_dev *pdev,
311} 291}
312 292
313/* CTRL initialization */ 293/* CTRL initialization */
314static int __devinit snd_cs423x_pnp_init_ctrl(int dev, struct pnp_dev *pdev, 294static int __devinit snd_cs423x_pnp_init_ctrl(int dev, struct pnp_dev *pdev)
315 struct pnp_resource_table *cfg)
316{ 295{
317 int err; 296 if (pnp_activate_dev(pdev) < 0) {
318
319 pnp_init_resource_table(cfg);
320 if (cport[dev] != SNDRV_AUTO_PORT)
321 pnp_resource_change(&cfg->port_resource[0], cport[dev], 8);
322 err = pnp_manual_config_dev(pdev, cfg, 0);
323 if (err < 0)
324 snd_printk(KERN_ERR IDENT " CTRL PnP manual resources are invalid, using auto config\n");
325 err = pnp_activate_dev(pdev);
326 if (err < 0) {
327 printk(KERN_ERR IDENT " CTRL PnP configure failed for WSS (out of resources?)\n"); 297 printk(KERN_ERR IDENT " CTRL PnP configure failed for WSS (out of resources?)\n");
328 return -EBUSY; 298 return -EBUSY;
329 } 299 }
@@ -333,21 +303,9 @@ static int __devinit snd_cs423x_pnp_init_ctrl(int dev, struct pnp_dev *pdev,
333} 303}
334 304
335/* MPU initialization */ 305/* MPU initialization */
336static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev, 306static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev)
337 struct pnp_resource_table *cfg)
338{ 307{
339 int err; 308 if (pnp_activate_dev(pdev) < 0) {
340
341 pnp_init_resource_table(cfg);
342 if (mpu_port[dev] != SNDRV_AUTO_PORT)
343 pnp_resource_change(&cfg->port_resource[0], mpu_port[dev], 2);
344 if (mpu_irq[dev] != SNDRV_AUTO_IRQ && mpu_irq[dev] >= 0)
345 pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
346 err = pnp_manual_config_dev(pdev, cfg, 0);
347 if (err < 0)
348 snd_printk(KERN_ERR IDENT " MPU401 PnP manual resources are invalid, using auto config\n");
349 err = pnp_activate_dev(pdev);
350 if (err < 0) {
351 printk(KERN_ERR IDENT " MPU401 PnP configure failed for WSS (out of resources?)\n"); 309 printk(KERN_ERR IDENT " MPU401 PnP configure failed for WSS (out of resources?)\n");
352 mpu_port[dev] = SNDRV_AUTO_PORT; 310 mpu_port[dev] = SNDRV_AUTO_PORT;
353 mpu_irq[dev] = SNDRV_AUTO_IRQ; 311 mpu_irq[dev] = SNDRV_AUTO_IRQ;
@@ -368,15 +326,8 @@ static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev,
368static int __devinit snd_card_cs4232_pnp(int dev, struct snd_card_cs4236 *acard, 326static int __devinit snd_card_cs4232_pnp(int dev, struct snd_card_cs4236 *acard,
369 struct pnp_dev *pdev) 327 struct pnp_dev *pdev)
370{ 328{
371 struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); 329 if (snd_cs423x_pnp_init_wss(dev, acard->wss) < 0)
372
373 if (!cfg)
374 return -ENOMEM;
375 if (snd_cs423x_pnp_init_wss(dev, acard->wss, cfg) < 0) {
376 kfree(cfg);
377 return -EBUSY; 330 return -EBUSY;
378 }
379 kfree(cfg);
380 cport[dev] = -1; 331 cport[dev] = -1;
381 return 0; 332 return 0;
382} 333}
@@ -386,43 +337,33 @@ static int __devinit snd_card_cs423x_pnpc(int dev, struct snd_card_cs4236 *acard
386 struct pnp_card_link *card, 337 struct pnp_card_link *card,
387 const struct pnp_card_device_id *id) 338 const struct pnp_card_device_id *id)
388{ 339{
389 struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
390
391 if (!cfg)
392 return -ENOMEM;
393
394 acard->wss = pnp_request_card_device(card, id->devs[0].id, NULL); 340 acard->wss = pnp_request_card_device(card, id->devs[0].id, NULL);
395 if (acard->wss == NULL) 341 if (acard->wss == NULL)
396 goto error; 342 return -EBUSY;
397 acard->ctrl = pnp_request_card_device(card, id->devs[1].id, NULL); 343 acard->ctrl = pnp_request_card_device(card, id->devs[1].id, NULL);
398 if (acard->ctrl == NULL) 344 if (acard->ctrl == NULL)
399 goto error; 345 return -EBUSY;
400 if (id->devs[2].id[0]) { 346 if (id->devs[2].id[0]) {
401 acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL); 347 acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
402 if (acard->mpu == NULL) 348 if (acard->mpu == NULL)
403 goto error; 349 return -EBUSY;
404 } 350 }
405 351
406 /* WSS initialization */ 352 /* WSS initialization */
407 if (snd_cs423x_pnp_init_wss(dev, acard->wss, cfg) < 0) 353 if (snd_cs423x_pnp_init_wss(dev, acard->wss) < 0)
408 goto error; 354 return -EBUSY;
409 355
410 /* CTRL initialization */ 356 /* CTRL initialization */
411 if (acard->ctrl && cport[dev] > 0) { 357 if (acard->ctrl && cport[dev] > 0) {
412 if (snd_cs423x_pnp_init_ctrl(dev, acard->ctrl, cfg) < 0) 358 if (snd_cs423x_pnp_init_ctrl(dev, acard->ctrl) < 0)
413 goto error; 359 return -EBUSY;
414 } 360 }
415 /* MPU initialization */ 361 /* MPU initialization */
416 if (acard->mpu && mpu_port[dev] > 0) { 362 if (acard->mpu && mpu_port[dev] > 0) {
417 if (snd_cs423x_pnp_init_mpu(dev, acard->mpu, cfg) < 0) 363 if (snd_cs423x_pnp_init_mpu(dev, acard->mpu) < 0)
418 goto error; 364 return -EBUSY;
419 } 365 }
420 kfree(cfg);
421 return 0; 366 return 0;
422
423 error:
424 kfree(cfg);
425 return -EBUSY;
426} 367}
427#endif /* CONFIG_PNP */ 368#endif /* CONFIG_PNP */
428 369