diff options
Diffstat (limited to 'sound/isa/cs423x')
-rw-r--r-- | sound/isa/cs423x/cs4236.c | 91 |
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[] = { | |||
270 | MODULE_DEVICE_TABLE(pnp_card, snd_cs423x_pnpids); | 270 | MODULE_DEVICE_TABLE(pnp_card, snd_cs423x_pnpids); |
271 | 271 | ||
272 | /* WSS initialization */ | 272 | /* WSS initialization */ |
273 | static int __devinit snd_cs423x_pnp_init_wss(int dev, struct pnp_dev *pdev, | 273 | static 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 */ |
314 | static int __devinit snd_cs423x_pnp_init_ctrl(int dev, struct pnp_dev *pdev, | 294 | static 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 */ |
336 | static int __devinit snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev, | 306 | static 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, | |||
368 | static int __devinit snd_card_cs4232_pnp(int dev, struct snd_card_cs4236 *acard, | 326 | static 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 | ||