亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sscape.c

?? linux 內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	int err;	if (sscape->type == SSCAPE_VIVO)		port += 4;	if (dma1 == dma2)		dma2 = -1;	err = snd_cs4231_create(card,				port, -1, irq, dma1, dma2,				CS4231_HW_DETECT, CS4231_HWSHARE_DMA1, &chip);	if (!err) {		unsigned long flags;		struct snd_pcm *pcm;#define AD1845_FREQ_SEL_ENABLE  0x08#define AD1845_PWR_DOWN_CTRL   0x1b#define AD1845_CRYS_CLOCK_SEL  0x1d/* * It turns out that the PLAYBACK_ENABLE bit is set * by the lowlevel driver ... *#define AD1845_IFACE_CONFIG  \           (CS4231_AUTOCALIB | CS4231_RECORD_ENABLE | CS4231_PLAYBACK_ENABLE)    snd_cs4231_mce_up(chip);    spin_lock_irqsave(&chip->reg_lock, flags);    snd_cs4231_out(chip, CS4231_IFACE_CTRL, AD1845_IFACE_CONFIG);    spin_unlock_irqrestore(&chip->reg_lock, flags);    snd_cs4231_mce_down(chip); */		if (sscape->type != SSCAPE_VIVO) {			int val;			/*			 * The input clock frequency on the SoundScape must			 * be 14.31818 MHz, because we must set this register			 * to get the playback to sound correct ...			 */			snd_cs4231_mce_up(chip);			spin_lock_irqsave(&chip->reg_lock, flags);			snd_cs4231_out(chip, AD1845_CRYS_CLOCK_SEL, 0x20);			spin_unlock_irqrestore(&chip->reg_lock, flags);			snd_cs4231_mce_down(chip);			/*			 * More custom configuration:			 * a) select "mode 2" and provide a current drive of 8mA			 * b) enable frequency selection (for capture/playback)			 */			spin_lock_irqsave(&chip->reg_lock, flags);			snd_cs4231_out(chip, CS4231_MISC_INFO,					CS4231_MODE2 | 0x10);			val = snd_cs4231_in(chip, AD1845_PWR_DOWN_CTRL);			snd_cs4231_out(chip, AD1845_PWR_DOWN_CTRL,					val | AD1845_FREQ_SEL_ENABLE);			spin_unlock_irqrestore(&chip->reg_lock, flags);		}		err = snd_cs4231_pcm(chip, 0, &pcm);		if (err < 0) {			snd_printk(KERN_ERR "sscape: No PCM device "					    "for AD1845 chip\n");			goto _error;		}		err = snd_cs4231_mixer(chip);		if (err < 0) {			snd_printk(KERN_ERR "sscape: No mixer device "					    "for AD1845 chip\n");			goto _error;		}		err = snd_cs4231_timer(chip, 0, NULL);		if (err < 0) {			snd_printk(KERN_ERR "sscape: No timer device "					    "for AD1845 chip\n");			goto _error;		}		if (sscape->type != SSCAPE_VIVO) {			err = snd_ctl_add(card,					  snd_ctl_new1(&midi_mixer_ctl, chip));			if (err < 0) {				snd_printk(KERN_ERR "sscape: Could not create "						    "MIDI mixer control\n");				goto _error;			}			chip->set_playback_format = ad1845_playback_format;			chip->set_capture_format = ad1845_capture_format;		}		strcpy(card->driver, "SoundScape");		strcpy(card->shortname, pcm->name);		snprintf(card->longname, sizeof(card->longname),			 "%s at 0x%lx, IRQ %d, DMA1 %d, DMA2 %d\n",			 pcm->name, chip->port, chip->irq,			 chip->dma1, chip->dma2);		sscape->chip = chip;	}	_error:	return err;}/* * Create an ALSA soundcard entry for the SoundScape, using * the given list of port, IRQ and DMA resources. */static int __devinit create_sscape(int dev, struct snd_card *card){	struct soundscape *sscape = get_card_soundscape(card);	unsigned dma_cfg;	unsigned irq_cfg;	unsigned mpu_irq_cfg;	unsigned xport;	struct resource *io_res;	struct resource *wss_res;	unsigned long flags;	int err;	/*	 * Check that the user didn't pass us garbage data ...	 */	irq_cfg = get_irq_config(irq[dev]);	if (irq_cfg == INVALID_IRQ) {		snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]);		return -ENXIO;	}	mpu_irq_cfg = get_irq_config(mpu_irq[dev]);	if (mpu_irq_cfg == INVALID_IRQ) {		printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]);		return -ENXIO;	}	xport = port[dev];	/*	 * Grab IO ports that we will need to probe so that we	 * can detect and control this hardware ...	 */	io_res = request_region(xport, 8, "SoundScape");	if (!io_res) {		snd_printk(KERN_ERR "sscape: can't grab port 0x%x\n", xport);		return -EBUSY;	}	wss_res = NULL;	if (sscape->type == SSCAPE_VIVO) {		wss_res = request_region(wss_port[dev], 4, "SoundScape");		if (!wss_res) {			snd_printk(KERN_ERR "sscape: can't grab port 0x%lx\n",					    wss_port[dev]);			err = -EBUSY;			goto _release_region;		}	}	/*	 * Grab one DMA channel ...	 */	err = request_dma(dma[dev], "SoundScape");	if (err < 0) {		snd_printk(KERN_ERR "sscape: can't grab DMA %d\n", dma[dev]);		goto _release_region;	}	spin_lock_init(&sscape->lock);	spin_lock_init(&sscape->fwlock);	sscape->io_res = io_res;	sscape->wss_res = wss_res;	sscape->io_base = xport;	sscape->wss_base = wss_port[dev];	if (!detect_sscape(sscape)) {		printk(KERN_ERR "sscape: hardware not detected at 0x%x\n", sscape->io_base);		err = -ENODEV;		goto _release_dma;	}	printk(KERN_INFO "sscape: hardware detected at 0x%x, using IRQ %d, DMA %d\n",			 sscape->io_base, irq[dev], dma[dev]);	if (sscape->type != SSCAPE_VIVO) {		/*		 * Now create the hardware-specific device so that we can		 * load the microcode into the on-board processor.		 * We cannot use the MPU-401 MIDI system until this firmware		 * has been loaded into the card.		 */		err = snd_hwdep_new(card, "MC68EC000", 0, &(sscape->hw));		if (err < 0) {			printk(KERN_ERR "sscape: Failed to create "					"firmware device\n");			goto _release_dma;		}		strlcpy(sscape->hw->name, "SoundScape M68K",			sizeof(sscape->hw->name));		sscape->hw->name[sizeof(sscape->hw->name) - 1] = '\0';		sscape->hw->iface = SNDRV_HWDEP_IFACE_SSCAPE;		sscape->hw->ops.open = sscape_hw_open;		sscape->hw->ops.release = sscape_hw_release;		sscape->hw->ops.ioctl = sscape_hw_ioctl;		sscape->hw->private_data = sscape;	}	/*	 * Tell the on-board devices where their resources are (I think -	 * I can't be sure without a datasheet ... So many magic values!)	 */	spin_lock_irqsave(&sscape->lock, flags);	activate_ad1845_unsafe(sscape->io_base);	sscape_write_unsafe(sscape->io_base, GA_INTENA_REG, 0x00); /* disable */	sscape_write_unsafe(sscape->io_base, GA_SMCFGA_REG, 0x2e);	sscape_write_unsafe(sscape->io_base, GA_SMCFGB_REG, 0x00);	/*	 * Enable and configure the DMA channels ...	 */	sscape_write_unsafe(sscape->io_base, GA_DMACFG_REG, 0x50);	dma_cfg = (sscape->ic_type == IC_ODIE ? 0x70 : 0x40);	sscape_write_unsafe(sscape->io_base, GA_DMAA_REG, dma_cfg);	sscape_write_unsafe(sscape->io_base, GA_DMAB_REG, 0x20);	sscape_write_unsafe(sscape->io_base,	                    GA_INTCFG_REG, 0xf0 | (mpu_irq_cfg << 2) | mpu_irq_cfg);	sscape_write_unsafe(sscape->io_base,			    GA_CDCFG_REG, 0x09 | DMA_8BIT			    | (dma[dev] << 4) | (irq_cfg << 1));	spin_unlock_irqrestore(&sscape->lock, flags);	/*	 * We have now enabled the codec chip, and so we should	 * detect the AD1845 device ...	 */	err = create_ad1845(card, wss_port[dev], irq[dev],			    dma[dev], dma2[dev]);	if (err < 0) {		printk(KERN_ERR "sscape: No AD1845 device at 0x%lx, IRQ %d\n",		       wss_port[dev], irq[dev]);		goto _release_dma;	}#define MIDI_DEVNUM  0	if (sscape->type != SSCAPE_VIVO) {		err = create_mpu401(card, MIDI_DEVNUM,				    MPU401_IO(xport), mpu_irq[dev]);		if (err < 0) {			printk(KERN_ERR "sscape: Failed to create "					"MPU-401 device at 0x%x\n",					MPU401_IO(xport));			goto _release_dma;		}		/*		 * Enable the master IRQ ...		 */		sscape_write(sscape, GA_INTENA_REG, 0x80);		/*		 * Initialize mixer		 */		sscape->midi_vol = 0;		host_write_ctrl_unsafe(sscape->io_base, CMD_SET_MIDI_VOL, 100);		host_write_ctrl_unsafe(sscape->io_base, 0, 100);		host_write_ctrl_unsafe(sscape->io_base, CMD_XXX_MIDI_VOL, 100);	}	/*	 * Now that we have successfully created this sound card,	 * it is safe to store the pointer.	 * NOTE: we only register the sound card's "destructor"	 *       function now that our "constructor" has completed.	 */	card->private_free = soundscape_free;	return 0;_release_dma:	free_dma(dma[dev]);_release_region:	release_and_free_resource(wss_res);	release_and_free_resource(io_res);	return err;}static int __devinit snd_sscape_match(struct device *pdev, unsigned int i){	/*	 * Make sure we were given ALL of the other parameters.	 */	if (port[i] == SNDRV_AUTO_PORT)		return 0;	if (irq[i] == SNDRV_AUTO_IRQ ||	    mpu_irq[i] == SNDRV_AUTO_IRQ ||	    dma[i] == SNDRV_AUTO_DMA) {		printk(KERN_INFO		       "sscape: insufficient parameters, need IO, IRQ, MPU-IRQ and DMA\n");		return 0;	}	return 1;}static int __devinit snd_sscape_probe(struct device *pdev, unsigned int dev){	struct snd_card *card;	struct soundscape *sscape;	int ret;	card = snd_card_new(index[dev], id[dev], THIS_MODULE,			    sizeof(struct soundscape));	if (!card)		return -ENOMEM;	sscape = get_card_soundscape(card);	sscape->type = SSCAPE;	dma[dev] &= 0x03;	ret = create_sscape(dev, card);	if (ret < 0)		goto _release_card;	snd_card_set_dev(card, pdev);	if ((ret = snd_card_register(card)) < 0) {		printk(KERN_ERR "sscape: Failed to register sound card\n");		goto _release_card;	}	dev_set_drvdata(pdev, card);	return 0;_release_card:	snd_card_free(card);	return ret;}static int __devexit snd_sscape_remove(struct device *devptr, unsigned int dev){	snd_card_free(dev_get_drvdata(devptr));	dev_set_drvdata(devptr, NULL);	return 0;}#define DEV_NAME "sscape"static struct isa_driver snd_sscape_driver = {	.match		= snd_sscape_match,	.probe		= snd_sscape_probe,	.remove		= __devexit_p(snd_sscape_remove),	/* FIXME: suspend/resume */	.driver		= {		.name	= DEV_NAME	},};#ifdef CONFIG_PNPstatic inline int __devinit get_next_autoindex(int i){	while (i < SNDRV_CARDS && port[i] != SNDRV_AUTO_PORT)		++i;	return i;}static int __devinit sscape_pnp_detect(struct pnp_card_link *pcard,				       const struct pnp_card_device_id *pid){	static int idx = 0;	struct pnp_dev *dev;	struct snd_card *card;	struct soundscape *sscape;	int ret;	/*	 * Allow this function to fail *quietly* if all the ISA PnP	 * devices were configured using module parameters instead.	 */	if ((idx = get_next_autoindex(idx)) >= SNDRV_CARDS)		return -ENOSPC;	/*	 * We have found a candidate ISA PnP card. Now we	 * have to check that it has the devices that we	 * expect it to have.	 *	 * We will NOT try and autoconfigure all of the resources	 * needed and then activate the card as we are assuming that	 * has already been done at boot-time using /proc/isapnp.	 * We shall simply try to give each active card the resources	 * that it wants. This is a sensible strategy for a modular	 * system where unused modules are unloaded regularly.	 *	 * This strategy is utterly useless if we compile the driver	 * into the kernel, of course.	 */	// printk(KERN_INFO "sscape: %s\n", card->name);	/*	 * Check that we still have room for another sound card ...	 */	dev = pnp_request_card_device(pcard, pid->devs[0].id, NULL);	if (! dev)		return -ENODEV;	if (!pnp_is_active(dev)) {		if (pnp_activate_dev(dev) < 0) {			printk(KERN_INFO "sscape: device is inactive\n");			return -EBUSY;		}	}	/*	 * Create a new ALSA sound card entry, in anticipation	 * of detecting our hardware ...	 */	card = snd_card_new(index[idx], id[idx], THIS_MODULE,			    sizeof(struct soundscape));	if (!card)		return -ENOMEM;	sscape = get_card_soundscape(card);	/*	 * Identify card model ...	 */	if (!strncmp("ENS4081", pid->id, 7))		sscape->type = SSCAPE_VIVO;	else		sscape->type = SSCAPE_PNP;	/*	 * Read the correct parameters off the ISA PnP bus ...	 */	port[idx] = pnp_port_start(dev, 0);	irq[idx] = pnp_irq(dev, 0);	mpu_irq[idx] = pnp_irq(dev, 1);	dma[idx] = pnp_dma(dev, 0) & 0x03;	if (sscape->type == SSCAPE_PNP) {		dma2[idx] = dma[idx];		wss_port[idx] = CODEC_IO(port[idx]);	} else {		wss_port[idx] = pnp_port_start(dev, 1);		dma2[idx] = pnp_dma(dev, 1);	}	ret = create_sscape(idx, card);	if (ret < 0)		goto _release_card;	snd_card_set_dev(card, &pcard->card->dev);	if ((ret = snd_card_register(card)) < 0) {		printk(KERN_ERR "sscape: Failed to register sound card\n");		goto _release_card;	}	pnp_set_card_drvdata(pcard, card);	++idx;	return 0;_release_card:	snd_card_free(card);	return ret;}static void __devexit sscape_pnp_remove(struct pnp_card_link * pcard){	snd_card_free(pnp_get_card_drvdata(pcard));	pnp_set_card_drvdata(pcard, NULL);}static struct pnp_card_driver sscape_pnpc_driver = {	.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,	.name = "sscape",	.id_table = sscape_pnpids,	.probe = sscape_pnp_detect,	.remove = __devexit_p(sscape_pnp_remove),};#endif /* CONFIG_PNP */static int __init sscape_init(void){	int err;	err = isa_register_driver(&snd_sscape_driver, SNDRV_CARDS);#ifdef CONFIG_PNP	if (!err)		isa_registered = 1;	err = pnp_register_card_driver(&sscape_pnpc_driver);	if (!err)		pnp_registered = 1;	if (isa_registered)		err = 0;#endif	return err;}static void __exit sscape_exit(void){#ifdef CONFIG_PNP	if (pnp_registered)		pnp_unregister_card_driver(&sscape_pnpc_driver);	if (isa_registered)#endif		isa_unregister_driver(&snd_sscape_driver);}module_init(sscape_init);module_exit(sscape_exit);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产婷婷色一区二区三区四区 | 中文字幕的久久| 国产精品综合在线视频| 久久综合丝袜日本网| 国产成人在线观看| 亚洲欧洲日产国码二区| 日本高清成人免费播放| 亚洲bt欧美bt精品| 精品日韩99亚洲| 丰满放荡岳乱妇91ww| 亚洲精品国产一区二区三区四区在线| 日本韩国欧美在线| 琪琪久久久久日韩精品| 久久久亚洲欧洲日产国码αv| 成人一区二区三区视频| 亚洲制服丝袜在线| 精品成人免费观看| 99视频热这里只有精品免费| 亚洲网友自拍偷拍| 精品乱码亚洲一区二区不卡| 成人激情动漫在线观看| 亚洲国产精品一区二区www| 欧美不卡在线视频| av电影天堂一区二区在线| 性久久久久久久久久久久| 2023国产精品自拍| 91色乱码一区二区三区| 日本亚洲电影天堂| 国产午夜精品一区二区三区四区| 91啪亚洲精品| 另类调教123区| 中文字幕五月欧美| 欧美一区二区久久| eeuss鲁一区二区三区| 男女男精品网站| 国产精品青草综合久久久久99| 欧美色老头old∨ideo| 国产精品中文字幕一区二区三区| 亚洲欧美日韩人成在线播放| 精品久久久久av影院| 色久优优欧美色久优优| 国产一区二区精品在线观看| 一区二区三区精品视频在线| 久久久青草青青国产亚洲免观| 欧美在线你懂得| 国产suv一区二区三区88区| 亚洲午夜电影在线观看| 国产精品五月天| 欧美一级一级性生活免费录像| 91丝袜国产在线播放| 狠狠色丁香婷婷综合| 一区二区三区精品| 久久久久久97三级| 欧美精品777| 91美女在线观看| 国产成人综合在线观看| 日韩**一区毛片| 亚洲精品成人在线| 国产欧美日韩精品一区| 日韩欧美一二三| 欧美日韩黄视频| 99久久精品免费| 国产精品66部| 久久国产精品区| 午夜精品久久久久久久久久| 国产精品传媒入口麻豆| 久久精品在这里| 日韩欧美国产精品一区| 欧美网站一区二区| 91首页免费视频| 成人av免费在线观看| 国产一区二区主播在线| 视频一区二区中文字幕| 亚洲综合小说图片| 专区另类欧美日韩| 欧美激情在线看| 久久亚洲春色中文字幕久久久| 91精品国产综合久久精品app | 日韩欧美色电影| 欧美日韩国产免费一区二区 | 成人晚上爱看视频| 精品一二线国产| 日本欧美一区二区在线观看| 亚洲一区二区三区激情| 亚洲精品乱码久久久久久黑人| 成人免费在线视频| 日本一区二区在线不卡| 久久午夜免费电影| 日韩免费性生活视频播放| 这里只有精品免费| 欧美狂野另类xxxxoooo| 欧美日韩在线亚洲一区蜜芽| 在线免费观看日韩欧美| 91蜜桃在线观看| 色噜噜久久综合| 色久优优欧美色久优优| 色拍拍在线精品视频8848| 91亚洲精华国产精华精华液| www.欧美日韩国产在线| 不卡视频在线看| 99视频精品免费视频| 9久草视频在线视频精品| 不卡视频一二三四| 99精品视频在线观看| 91在线看国产| 91久久奴性调教| 欧美无砖专区一中文字| 欧美伦理视频网站| 制服丝袜中文字幕亚洲| 日韩一级高清毛片| 日韩欧美一级片| 久久女同性恋中文字幕| 国产精品网曝门| 亚洲欧美在线视频观看| 亚洲你懂的在线视频| 洋洋成人永久网站入口| 亚洲第一综合色| 日本美女一区二区三区| 99国产一区二区三精品乱码| 国产一区二区在线观看视频| 国产一区二区三区在线观看免费视频 | 久久久久综合网| 欧美国产视频在线| 国产精品久久久久久久久免费相片| 中国av一区二区三区| 亚洲男女一区二区三区| 亚洲线精品一区二区三区| 日韩国产欧美在线视频| 蜜桃视频一区二区三区在线观看| 久久国产精品露脸对白| 丰满放荡岳乱妇91ww| 色综合久久综合网欧美综合网| 在线观看av一区| 欧美肥妇bbw| 26uuu国产日韩综合| 欧美国产精品专区| 亚洲一区在线免费观看| 日韩国产欧美在线播放| 国产真实乱偷精品视频免| 不卡的av在线| 欧美日韩国产系列| 337p日本欧洲亚洲大胆精品| 国产精品少妇自拍| 亚洲一二三四区| 久久精品国产精品亚洲综合| 成人免费观看视频| 欧美在线视频你懂得| 精品国产精品一区二区夜夜嗨| 日本一区二区成人在线| 狂野欧美性猛交blacked| 黄一区二区三区| av一区二区三区在线| 欧美伦理影视网| 日本一区二区三区免费乱视频| 亚洲另类中文字| 久久精品国产99国产精品| 成人午夜视频在线| 欧美视频中文字幕| 久久婷婷国产综合精品青草| 亚洲天堂网中文字| 麻豆一区二区三| 99精品视频中文字幕| 日韩午夜激情视频| 日韩理论在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品高潮呻吟| 日韩av电影免费观看高清完整版在线观看| 国产69精品久久777的优势| 欧美日韩五月天| 国产农村妇女精品| 视频一区视频二区在线观看| jvid福利写真一区二区三区| 日韩一区二区三区四区| 日韩理论在线观看| 国产一区福利在线| 欧美老年两性高潮| 综合激情网...| 国产一区二区三区在线观看免费视频 | 在线观看三级视频欧美| 久久精品人人做人人爽97| 亚洲成年人影院| 波多野结衣中文字幕一区二区三区 | 国产一区二区三区日韩| 欧美三日本三级三级在线播放| 国产亚洲欧美日韩俺去了| 日韩中文欧美在线| 99久久久国产精品| 国产午夜亚洲精品午夜鲁丝片| 日韩不卡一二三区| 欧美优质美女网站| 国产精品久久久久婷婷二区次| 久久精品国产免费看久久精品| 欧美性大战久久| 国产精品久久三| 国产麻豆午夜三级精品| 日韩三区在线观看| 亚洲第一激情av| 色婷婷精品久久二区二区蜜臀av| 国产婷婷一区二区| 国内精品伊人久久久久av一坑|