⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cs4236.c

📁 LINUX 2.6.17.4的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* CTRL initialization */	if (acard->ctrl && cport[dev] > 0) {		if (snd_cs423x_pnp_init_ctrl(dev, acard->ctrl, cfg) < 0)			goto error;	}	/* MPU initialization */	if (acard->mpu && mpu_port[dev] > 0) {		if (snd_cs423x_pnp_init_mpu(dev, acard->mpu, cfg) < 0)			goto error;	}	kfree(cfg);	return 0; error:	kfree(cfg);	return -EBUSY;}#endif /* CONFIG_PNP */#ifdef CONFIG_PNP#define is_isapnp_selected(dev)		isapnp[dev]#else#define is_isapnp_selected(dev)		0#endifstatic void snd_card_cs4236_free(struct snd_card *card){	struct snd_card_cs4236 *acard = card->private_data;	release_and_free_resource(acard->res_sb_port);}static struct snd_card *snd_cs423x_card_new(int dev){	struct snd_card *card;	card = snd_card_new(index[dev], id[dev], THIS_MODULE,			    sizeof(struct snd_card_cs4236));	if (card == NULL)		return NULL;	card->private_free = snd_card_cs4236_free;	return card;}static int __devinit snd_cs423x_probe(struct snd_card *card, int dev){	struct snd_card_cs4236 *acard;	struct snd_pcm *pcm;	struct snd_cs4231 *chip;	struct snd_opl3 *opl3;	int err;	acard = card->private_data;	if (sb_port[dev] > 0 && sb_port[dev] != SNDRV_AUTO_PORT)		if ((acard->res_sb_port = request_region(sb_port[dev], 16, IDENT " SB")) == NULL) {			printk(KERN_ERR IDENT ": unable to register SB port at 0x%lx\n", sb_port[dev]);			return -EBUSY;		}#ifdef CS4232	if ((err = snd_cs4231_create(card,				     port[dev],				     cport[dev],				     irq[dev],				     dma1[dev],				     dma2[dev],				     CS4231_HW_DETECT,				     0,				     &chip)) < 0)		return err;	acard->chip = chip;	if ((err = snd_cs4231_pcm(chip, 0, &pcm)) < 0)		return err;	if ((err = snd_cs4231_mixer(chip)) < 0)		return err;#else /* CS4236 */	if ((err = snd_cs4236_create(card,				     port[dev],				     cport[dev],				     irq[dev],				     dma1[dev],				     dma2[dev],				     CS4231_HW_DETECT,				     0,				     &chip)) < 0)		return err;	acard->chip = chip;	if ((err = snd_cs4236_pcm(chip, 0, &pcm)) < 0)		return err;	if ((err = snd_cs4236_mixer(chip)) < 0)		return err;#endif	strcpy(card->driver, pcm->name);	strcpy(card->shortname, pcm->name);	sprintf(card->longname, "%s at 0x%lx, irq %i, dma %i",		pcm->name,		chip->port,		irq[dev],		dma1[dev]);	if (dma2[dev] >= 0)		sprintf(card->longname + strlen(card->longname), "&%d", dma2[dev]);	if ((err = snd_cs4231_timer(chip, 0, NULL)) < 0)		return err;	if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {		if (snd_opl3_create(card,				    fm_port[dev], fm_port[dev] + 2,				    OPL3_HW_OPL3_CS, 0, &opl3) < 0) {			printk(KERN_WARNING IDENT ": OPL3 not detected\n");		} else {			if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0)				return err;		}	}	if (mpu_port[dev] > 0 && mpu_port[dev] != SNDRV_AUTO_PORT) {		if (mpu_irq[dev] == SNDRV_AUTO_IRQ)			mpu_irq[dev] = -1;		if (snd_mpu401_uart_new(card, 0, MPU401_HW_CS4232,					mpu_port[dev], 0,					mpu_irq[dev],					mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0)			printk(KERN_WARNING IDENT ": MPU401 not detected\n");	}	return snd_card_register(card);}static int __init snd_cs423x_nonpnp_probe(struct platform_device *pdev){	int dev = pdev->id;	struct snd_card *card;	int err;	if (port[dev] == SNDRV_AUTO_PORT) {		snd_printk(KERN_ERR "specify port\n");		return -EINVAL;	}	if (cport[dev] == SNDRV_AUTO_PORT) {		snd_printk(KERN_ERR "specify cport\n");		return -EINVAL;	}	card = snd_cs423x_card_new(dev);	if (! card)		return -ENOMEM;	snd_card_set_dev(card, &pdev->dev);	if ((err = snd_cs423x_probe(card, dev)) < 0) {		snd_card_free(card);		return err;	}	platform_set_drvdata(pdev, card);	return 0;}static int __devexit snd_cs423x_nonpnp_remove(struct platform_device *devptr){	snd_card_free(platform_get_drvdata(devptr));	platform_set_drvdata(devptr, NULL);	return 0;}#ifdef CONFIG_PMstatic int snd_cs423x_suspend(struct snd_card *card){	struct snd_card_cs4236 *acard = card->private_data;	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);	acard->chip->suspend(acard->chip);	return 0;}static int snd_cs423x_resume(struct snd_card *card){	struct snd_card_cs4236 *acard = card->private_data;	acard->chip->resume(acard->chip);	snd_power_change_state(card, SNDRV_CTL_POWER_D0);	return 0;}static int snd_cs423x_nonpnp_suspend(struct platform_device *dev, pm_message_t state){	return snd_cs423x_suspend(platform_get_drvdata(dev));}static int snd_cs423x_nonpnp_resume(struct platform_device *dev){	return snd_cs423x_resume(platform_get_drvdata(dev));}#endifstatic struct platform_driver cs423x_nonpnp_driver = {	.probe		= snd_cs423x_nonpnp_probe,	.remove		= __devexit_p(snd_cs423x_nonpnp_remove),#ifdef CONFIG_PM	.suspend	= snd_cs423x_nonpnp_suspend,	.resume		= snd_cs423x_nonpnp_resume,#endif	.driver		= {		.name	= CS423X_DRIVER	},};#ifdef CONFIG_PNP#ifdef CS4232static int __devinit snd_cs4232_pnpbios_detect(struct pnp_dev *pdev,					       const struct pnp_device_id *id){	static int dev;	int err;	struct snd_card *card;	if (pnp_device_is_isapnp(pdev))		return -ENOENT;	/* we have another procedure - card */	for (; dev < SNDRV_CARDS; dev++) {		if (enable[dev] && isapnp[dev])			break;	}	if (dev >= SNDRV_CARDS)		return -ENODEV;	card = snd_cs423x_card_new(dev);	if (! card)		return -ENOMEM;	if ((err = snd_card_cs4232_pnp(dev, card->private_data, pdev)) < 0) {		printk(KERN_ERR "PnP BIOS detection failed for " IDENT "\n");		snd_card_free(card);		return err;	}	snd_card_set_dev(card, &pdev->dev);	if ((err = snd_cs423x_probe(card, dev)) < 0) {		snd_card_free(card);		return err;	}	pnp_set_drvdata(pdev, card);	dev++;	snd_cs423x_devices++;	return 0;}static void __devexit snd_cs4232_pnp_remove(struct pnp_dev * pdev){	snd_card_free(pnp_get_drvdata(pdev));	pnp_set_drvdata(pdev, NULL);}#ifdef CONFIG_PMstatic int snd_cs4232_pnp_suspend(struct pnp_dev *pdev, pm_message_t state){	return snd_cs423x_suspend(pnp_get_drvdata(pdev));}static int snd_cs4232_pnp_resume(struct pnp_dev *pdev){	return snd_cs423x_resume(pnp_get_drvdata(pdev));}#endifstatic struct pnp_driver cs4232_pnp_driver = {	.name = "cs4232-pnpbios",	.id_table = snd_cs4232_pnpbiosids,	.probe = snd_cs4232_pnpbios_detect,	.remove = __devexit_p(snd_cs4232_pnp_remove),#ifdef CONFIG_PM	.suspend	= snd_cs4232_pnp_suspend,	.resume		= snd_cs4232_pnp_resume,#endif};#endif /* CS4232 */static int __devinit snd_cs423x_pnpc_detect(struct pnp_card_link *pcard,					    const struct pnp_card_device_id *pid){	static int dev;	struct snd_card *card;	int res;	for ( ; dev < SNDRV_CARDS; dev++) {		if (enable[dev] && isapnp[dev])			break;	}	if (dev >= SNDRV_CARDS)		return -ENODEV;	card = snd_cs423x_card_new(dev);	if (! card)		return -ENOMEM;	if ((res = snd_card_cs423x_pnpc(dev, card->private_data, pcard, pid)) < 0) {		printk(KERN_ERR "isapnp detection failed and probing for " IDENT		       " is not supported\n");		snd_card_free(card);		return res;	}	snd_card_set_dev(card, &pcard->card->dev);	if ((res = snd_cs423x_probe(card, dev)) < 0) {		snd_card_free(card);		return res;	}	pnp_set_card_drvdata(pcard, card);	dev++;	snd_cs423x_devices++;	return 0;}static void __devexit snd_cs423x_pnpc_remove(struct pnp_card_link * pcard){	snd_card_free(pnp_get_card_drvdata(pcard));	pnp_set_card_drvdata(pcard, NULL);}#ifdef CONFIG_PMstatic int snd_cs423x_pnpc_suspend(struct pnp_card_link *pcard, pm_message_t state){	return snd_cs423x_suspend(pnp_get_card_drvdata(pcard));}static int snd_cs423x_pnpc_resume(struct pnp_card_link *pcard){	return snd_cs423x_resume(pnp_get_card_drvdata(pcard));}#endifstatic struct pnp_card_driver cs423x_pnpc_driver = {	.flags = PNP_DRIVER_RES_DISABLE,	.name = CS423X_ISAPNP_DRIVER,	.id_table = snd_cs423x_pnpids,	.probe = snd_cs423x_pnpc_detect,	.remove = __devexit_p(snd_cs423x_pnpc_remove),#ifdef CONFIG_PM	.suspend	= snd_cs423x_pnpc_suspend,	.resume		= snd_cs423x_pnpc_resume,#endif};#endif /* CONFIG_PNP */static void __init_or_module snd_cs423x_unregister_all(void){	int i;#ifdef CONFIG_PNP	if (pnpc_registered)		pnp_unregister_card_driver(&cs423x_pnpc_driver);#ifdef CS4232	if (pnp_registered)		pnp_unregister_driver(&cs4232_pnp_driver);#endif#endif /* CONFIG_PNP */	for (i = 0; i < ARRAY_SIZE(platform_devices); ++i)		platform_device_unregister(platform_devices[i]);	platform_driver_unregister(&cs423x_nonpnp_driver);}static int __init alsa_card_cs423x_init(void){	int i, err;	if ((err = platform_driver_register(&cs423x_nonpnp_driver)) < 0)		return err;	for (i = 0; i < SNDRV_CARDS; i++) {		struct platform_device *device;		if (! enable[i] || is_isapnp_selected(i))			continue;		device = platform_device_register_simple(CS423X_DRIVER,							 i, NULL, 0);		if (IS_ERR(device))			continue;		if (!platform_get_drvdata(device)) {			platform_device_unregister(device);			continue;		}		platform_devices[i] = device;		snd_cs423x_devices++;	}#ifdef CONFIG_PNP#ifdef CS4232	err = pnp_register_driver(&cs4232_pnp_driver);	if (!err)		pnp_registered = 1;#endif	err = pnp_register_card_driver(&cs423x_pnpc_driver);	if (!err)		pnpc_registered = 1;#endif /* CONFIG_PNP */	if (!snd_cs423x_devices) {#ifdef MODULE		printk(KERN_ERR IDENT " soundcard not found or device busy\n");#endif		snd_cs423x_unregister_all();		return -ENODEV;	}	return 0;}static void __exit alsa_card_cs423x_exit(void){	snd_cs423x_unregister_all();}module_init(alsa_card_cs423x_init)module_exit(alsa_card_cs423x_exit)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -