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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? harmony.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Hewlett-Packard Harmony audio driver * *   This is a driver for the Harmony audio chipset found *   on the LASI ASIC of various early HP PA-RISC workstations. * *   Copyright (C) 2004, Kyle McMartin <kyle@{debian.org,parisc-linux.org}> * *     Based on the previous Harmony incarnations by, *       Copyright 2000 (c) Linuxcare Canada, Alex deVries *       Copyright 2000-2003 (c) Helge Deller *       Copyright 2001 (c) Matthieu Delahaye *       Copyright 2001 (c) Jean-Christophe Vaugeois *       Copyright 2003 (c) Laurent Canet *       Copyright 2004 (c) Stuart Brady * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License, version 2, as *   published by the Free Software Foundation. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Notes: *   - graveyard and silence buffers last for lifetime of *     the driver. playback and capture buffers are allocated *     per _open()/_close(). *  * TODO: * */#include <linux/init.h>#include <linux/slab.h>#include <linux/time.h>#include <linux/wait.h>#include <linux/delay.h>#include <linux/module.h>#include <linux/interrupt.h>#include <linux/spinlock.h>#include <linux/dma-mapping.h>#include <sound/driver.h>#include <sound/core.h>#include <sound/pcm.h>#include <sound/control.h>#include <sound/rawmidi.h>#include <sound/initval.h>#include <sound/info.h>#include <asm/io.h>#include <asm/hardware.h>#include <asm/parisc-device.h>#include "harmony.h"static int index = SNDRV_DEFAULT_IDX1;	/* Index 0-MAX */static char *id = SNDRV_DEFAULT_STR1;	/* ID for this card */module_param(index, int, 0444);MODULE_PARM_DESC(index, "Index value for Harmony driver.");module_param(id, charp, 0444);MODULE_PARM_DESC(id, "ID string for Harmony driver.");static struct parisc_device_id snd_harmony_devtable[] = {	/* bushmaster / flounder */	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, 	/* 712 / 715 */	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, 	/* pace */	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, 	/* outfield / coral II */	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F },	{ 0, }};MODULE_DEVICE_TABLE(parisc, snd_harmony_devtable);#define NAME "harmony"#define PFX  NAME ": "static unsigned int snd_harmony_rates[] = {	5512, 6615, 8000, 9600,	11025, 16000, 18900, 22050,	27428, 32000, 33075, 37800,	44100, 48000};static unsigned int rate_bits[14] = {	HARMONY_SR_5KHZ, HARMONY_SR_6KHZ, HARMONY_SR_8KHZ,	HARMONY_SR_9KHZ, HARMONY_SR_11KHZ, HARMONY_SR_16KHZ,	HARMONY_SR_18KHZ, HARMONY_SR_22KHZ, HARMONY_SR_27KHZ,	HARMONY_SR_32KHZ, HARMONY_SR_33KHZ, HARMONY_SR_37KHZ,	HARMONY_SR_44KHZ, HARMONY_SR_48KHZ};static struct snd_pcm_hw_constraint_list hw_constraint_rates = {	.count = ARRAY_SIZE(snd_harmony_rates),	.list = snd_harmony_rates,	.mask = 0,};static inline unsigned longharmony_read(struct snd_harmony *h, unsigned r){	return __raw_readl(h->iobase + r);}static inline voidharmony_write(struct snd_harmony *h, unsigned r, unsigned long v){	__raw_writel(v, h->iobase + r);}static inline voidharmony_wait_for_control(struct snd_harmony *h){	while (harmony_read(h, HARMONY_CNTL) & HARMONY_CNTL_C) ;}static inline voidharmony_reset(struct snd_harmony *h){	harmony_write(h, HARMONY_RESET, 1);	mdelay(50);	harmony_write(h, HARMONY_RESET, 0);}static voidharmony_disable_interrupts(struct snd_harmony *h){	u32 dstatus;	harmony_wait_for_control(h);	dstatus = harmony_read(h, HARMONY_DSTATUS);	dstatus &= ~HARMONY_DSTATUS_IE;	harmony_write(h, HARMONY_DSTATUS, dstatus);}static voidharmony_enable_interrupts(struct snd_harmony *h){	u32 dstatus;	harmony_wait_for_control(h);	dstatus = harmony_read(h, HARMONY_DSTATUS);	dstatus |= HARMONY_DSTATUS_IE;	harmony_write(h, HARMONY_DSTATUS, dstatus);}static voidharmony_mute(struct snd_harmony *h){	unsigned long flags;	spin_lock_irqsave(&h->mixer_lock, flags);	harmony_wait_for_control(h);	harmony_write(h, HARMONY_GAINCTL, HARMONY_GAIN_SILENCE);	spin_unlock_irqrestore(&h->mixer_lock, flags);}static voidharmony_unmute(struct snd_harmony *h){	unsigned long flags;	spin_lock_irqsave(&h->mixer_lock, flags);	harmony_wait_for_control(h);	harmony_write(h, HARMONY_GAINCTL, h->st.gain);	spin_unlock_irqrestore(&h->mixer_lock, flags);}static voidharmony_set_control(struct snd_harmony *h){	u32 ctrl;	unsigned long flags;	spin_lock_irqsave(&h->lock, flags);	ctrl = (HARMONY_CNTL_C      |		(h->st.format << 6) |		(h->st.stereo << 5) |		(h->st.rate));	harmony_wait_for_control(h);	harmony_write(h, HARMONY_CNTL, ctrl);	spin_unlock_irqrestore(&h->lock, flags);}static irqreturn_tsnd_harmony_interrupt(int irq, void *dev){	u32 dstatus;	struct snd_harmony *h = dev;	spin_lock(&h->lock);	harmony_disable_interrupts(h);	harmony_wait_for_control(h);	dstatus = harmony_read(h, HARMONY_DSTATUS);	spin_unlock(&h->lock);	if (dstatus & HARMONY_DSTATUS_PN) {		if (h->psubs && h->st.playing) {			spin_lock(&h->lock);			h->pbuf.buf += h->pbuf.count; /* PAGE_SIZE */			h->pbuf.buf %= h->pbuf.size; /* MAX_BUFS*PAGE_SIZE */			harmony_write(h, HARMONY_PNXTADD, 				      h->pbuf.addr + h->pbuf.buf);			h->stats.play_intr++;			spin_unlock(&h->lock);                        snd_pcm_period_elapsed(h->psubs);		} else {			spin_lock(&h->lock);			harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);			h->stats.silence_intr++;			spin_unlock(&h->lock);		}	}	if (dstatus & HARMONY_DSTATUS_RN) {		if (h->csubs && h->st.capturing) {			spin_lock(&h->lock);			h->cbuf.buf += h->cbuf.count;			h->cbuf.buf %= h->cbuf.size;			harmony_write(h, HARMONY_RNXTADD,				      h->cbuf.addr + h->cbuf.buf);			h->stats.rec_intr++;			spin_unlock(&h->lock);                        snd_pcm_period_elapsed(h->csubs);		} else {			spin_lock(&h->lock);			harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);			h->stats.graveyard_intr++;			spin_unlock(&h->lock);		}	}	spin_lock(&h->lock);	harmony_enable_interrupts(h);	spin_unlock(&h->lock);	return IRQ_HANDLED;}static unsigned int snd_harmony_rate_bits(int rate){	unsigned int i;		for (i = 0; i < ARRAY_SIZE(snd_harmony_rates); i++)		if (snd_harmony_rates[i] == rate)			return rate_bits[i];	return HARMONY_SR_44KHZ;}static struct snd_pcm_hardware snd_harmony_playback ={	.info =	(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 		 SNDRV_PCM_INFO_JOINT_DUPLEX | SNDRV_PCM_INFO_MMAP_VALID |		 SNDRV_PCM_INFO_BLOCK_TRANSFER),	.formats = (SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_MU_LAW |		    SNDRV_PCM_FMTBIT_A_LAW),	.rates = (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_48000 |		  SNDRV_PCM_RATE_KNOT),	.rate_min = 5512,	.rate_max = 48000,	.channels_min =	1,	.channels_max =	2,	.buffer_bytes_max = MAX_BUF_SIZE,	.period_bytes_min = BUF_SIZE,	.period_bytes_max = BUF_SIZE,	.periods_min = 1,	.periods_max = MAX_BUFS,	.fifo_size = 0,};static struct snd_pcm_hardware snd_harmony_capture ={        .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |                 SNDRV_PCM_INFO_JOINT_DUPLEX | SNDRV_PCM_INFO_MMAP_VALID |                 SNDRV_PCM_INFO_BLOCK_TRANSFER),        .formats = (SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_MU_LAW |                    SNDRV_PCM_FMTBIT_A_LAW),        .rates = (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_48000 |		  SNDRV_PCM_RATE_KNOT),        .rate_min = 5512,        .rate_max = 48000,        .channels_min = 1,        .channels_max = 2,        .buffer_bytes_max = MAX_BUF_SIZE,        .period_bytes_min = BUF_SIZE,        .period_bytes_max = BUF_SIZE,        .periods_min = 1,        .periods_max = MAX_BUFS,        .fifo_size = 0,};static intsnd_harmony_playback_trigger(struct snd_pcm_substream *ss, int cmd){	struct snd_harmony *h = snd_pcm_substream_chip(ss);	if (h->st.capturing)		return -EBUSY;	spin_lock(&h->lock);	switch (cmd) {	case SNDRV_PCM_TRIGGER_START:		h->st.playing = 1;		harmony_write(h, HARMONY_PNXTADD, h->pbuf.addr);		harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);		harmony_unmute(h);		harmony_enable_interrupts(h);		break;	case SNDRV_PCM_TRIGGER_STOP:		h->st.playing = 0;		harmony_mute(h);		harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);		harmony_disable_interrupts(h);		break;	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:	case SNDRV_PCM_TRIGGER_SUSPEND:	default:		spin_unlock(&h->lock);		snd_BUG();		return -EINVAL;	}	spin_unlock(&h->lock);		return 0;}static intsnd_harmony_capture_trigger(struct snd_pcm_substream *ss, int cmd){        struct snd_harmony *h = snd_pcm_substream_chip(ss);	if (h->st.playing)		return -EBUSY;	spin_lock(&h->lock);        switch (cmd) {        case SNDRV_PCM_TRIGGER_START:		h->st.capturing = 1;                harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);                harmony_write(h, HARMONY_RNXTADD, h->cbuf.addr);		harmony_unmute(h);                harmony_enable_interrupts(h);		break;        case SNDRV_PCM_TRIGGER_STOP:		h->st.capturing = 0;		harmony_mute(h);		harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);		harmony_disable_interrupts(h);		break;        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:        case SNDRV_PCM_TRIGGER_SUSPEND:	default:		spin_unlock(&h->lock);		snd_BUG();                return -EINVAL;        }	spin_unlock(&h->lock);		        return 0;}static intsnd_harmony_set_data_format(struct snd_harmony *h, int fmt, int force){	int o = h->st.format;	int n;	switch(fmt) {	case SNDRV_PCM_FORMAT_S16_BE:		n = HARMONY_DF_16BIT_LINEAR;		break;	case SNDRV_PCM_FORMAT_A_LAW:		n = HARMONY_DF_8BIT_ALAW;		break;	case SNDRV_PCM_FORMAT_MU_LAW:		n = HARMONY_DF_8BIT_ULAW;		break;	default:		n = HARMONY_DF_16BIT_LINEAR;		break;	}	if (force || o != n) {		snd_pcm_format_set_silence(fmt, h->sdma.area, SILENCE_BUFSZ / 					   (snd_pcm_format_physical_width(fmt)					    / 8));	}	return n;}static intsnd_harmony_playback_prepare(struct snd_pcm_substream *ss){	struct snd_harmony *h = snd_pcm_substream_chip(ss);	struct snd_pcm_runtime *rt = ss->runtime;		if (h->st.capturing)		return -EBUSY;		h->pbuf.size = snd_pcm_lib_buffer_bytes(ss);	h->pbuf.count = snd_pcm_lib_period_bytes(ss);	if (h->pbuf.buf >= h->pbuf.size)		h->pbuf.buf = 0;	h->st.playing = 0;	h->st.rate = snd_harmony_rate_bits(rt->rate);	h->st.format = snd_harmony_set_data_format(h, rt->format, 0);		if (rt->channels == 2)		h->st.stereo = HARMONY_SS_STEREO;	else		h->st.stereo = HARMONY_SS_MONO;	harmony_set_control(h);	h->pbuf.addr = rt->dma_addr;	return 0;}static intsnd_harmony_capture_prepare(struct snd_pcm_substream *ss){        struct snd_harmony *h = snd_pcm_substream_chip(ss);        struct snd_pcm_runtime *rt = ss->runtime;	if (h->st.playing)		return -EBUSY;        h->cbuf.size = snd_pcm_lib_buffer_bytes(ss);        h->cbuf.count = snd_pcm_lib_period_bytes(ss);	if (h->cbuf.buf >= h->cbuf.size)	        h->cbuf.buf = 0;	h->st.capturing = 0;        h->st.rate = snd_harmony_rate_bits(rt->rate);        h->st.format = snd_harmony_set_data_format(h, rt->format, 0);        if (rt->channels == 2)                h->st.stereo = HARMONY_SS_STEREO;        else                h->st.stereo = HARMONY_SS_MONO;        harmony_set_control(h);        h->cbuf.addr = rt->dma_addr;        return 0;}static snd_pcm_uframes_t snd_harmony_playback_pointer(struct snd_pcm_substream *ss){	struct snd_pcm_runtime *rt = ss->runtime;	struct snd_harmony *h = snd_pcm_substream_chip(ss);	unsigned long pcuradd;	unsigned long played;	if (!(h->st.playing) || (h->psubs == NULL)) 		return 0;	if ((h->pbuf.addr == 0) || (h->pbuf.size == 0))		return 0;		pcuradd = harmony_read(h, HARMONY_PCURADD);	played = pcuradd - h->pbuf.addr;#ifdef HARMONY_DEBUG	printk(KERN_DEBUG PFX "playback_pointer is 0x%lx-0x%lx = %d bytes\n", 	       pcuradd, h->pbuf.addr, played);	#endif	if (pcuradd > h->pbuf.addr + h->pbuf.size) {		return 0;	}	return bytes_to_frames(rt, played);}static snd_pcm_uframes_tsnd_harmony_capture_pointer(struct snd_pcm_substream *ss){        struct snd_pcm_runtime *rt = ss->runtime;        struct snd_harmony *h = snd_pcm_substream_chip(ss);        unsigned long rcuradd;        unsigned long caught;        if (!(h->st.capturing) || (h->csubs == NULL))                return 0;        if ((h->cbuf.addr == 0) || (h->cbuf.size == 0))                return 0;        rcuradd = harmony_read(h, HARMONY_RCURADD);        caught = rcuradd - h->cbuf.addr;#ifdef HARMONY_DEBUG        printk(KERN_DEBUG PFX "capture_pointer is 0x%lx-0x%lx = %d bytes\n",               rcuradd, h->cbuf.addr, caught);#endif        if (rcuradd > h->cbuf.addr + h->cbuf.size) {		return 0;	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区不卡| 全部av―极品视觉盛宴亚洲| 不卡高清视频专区| ...中文天堂在线一区| 成人黄色综合网站| **欧美大码日韩| 欧美在线观看一二区| 亚洲国产视频在线| 欧美日韩一区二区电影| 欧美96一区二区免费视频| 精品三级av在线| 粉嫩av亚洲一区二区图片| 国产精品免费人成网站| 欧美亚男人的天堂| 精品一区二区三区免费| 国产日产欧美精品一区二区三区| 不卡av在线免费观看| 天天免费综合色| 国产精品网曝门| 日韩欧美中文一区| av在线一区二区三区| 毛片av一区二区三区| 国产精品传媒在线| 欧美一区二区免费视频| 欧美一区二区三区思思人| 99久久久久久99| 韩国v欧美v日本v亚洲v| 亚洲一区二区三区在线| 国产清纯美女被跳蛋高潮一区二区久久w| www.久久久久久久久| 黄色日韩网站视频| 午夜影院久久久| 亚洲人成影院在线观看| 国产欧美日韩不卡| 久久一日本道色综合| 日韩欧美亚洲另类制服综合在线| 色婷婷国产精品久久包臀| 国产不卡高清在线观看视频| 极品少妇xxxx精品少妇| 五月天丁香久久| 亚洲国产精品一区二区久久| 国产精品嫩草影院com| 久久综合给合久久狠狠狠97色69| 欧美色网一区二区| 91啪亚洲精品| 91高清视频免费看| 精品视频色一区| 777亚洲妇女| 欧美日韩夫妻久久| 欧美精品在线一区二区三区| 欧美日韩激情一区二区三区| 3d动漫精品啪啪| 欧美一区二区三区思思人| 26uuu亚洲综合色欧美| 精品国产乱码久久久久久免费| 精品国产3级a| 日韩毛片高清在线播放| 亚洲高清视频中文字幕| 日韩国产精品久久久久久亚洲| 亚洲国产成人av网| 激情成人午夜视频| 91蜜桃免费观看视频| 欧美日韩国产一区二区三区地区| 欧美日韩一二区| 久久人人爽爽爽人久久久| 亚洲免费在线视频| 秋霞av亚洲一区二区三| 成+人+亚洲+综合天堂| 欧美亚洲自拍偷拍| 国产午夜精品美女毛片视频| 亚洲精品ww久久久久久p站| 日韩二区三区四区| 99久久99久久免费精品蜜臀| 日韩精品一区二区三区在线观看 | 一区二区免费视频| 看电影不卡的网站| 欧美美女喷水视频| 中文字幕在线不卡| 国产麻豆精品在线观看| 911精品国产一区二区在线| 国产欧美精品一区二区三区四区 | 成人黄色在线网站| 久久午夜色播影院免费高清| 亚洲第一成人在线| 99国产欧美另类久久久精品| 久久精品一区二区三区不卡 | 综合网在线视频| 国产一区福利在线| 欧美精品 日韩| 亚洲成人在线免费| 91久久一区二区| 一区二区三区欧美| 91福利国产成人精品照片| 国产精品久久网站| 91影视在线播放| 亚洲视频在线一区二区| 91丨porny丨国产| 综合激情成人伊人| 欧美又粗又大又爽| 亚洲国产成人高清精品| 91精品综合久久久久久| 捆绑调教美女网站视频一区| 日韩精品一区二区三区四区视频| 国内精品第一页| 国产欧美日韩另类一区| 97精品国产露脸对白| 亚洲二区在线视频| 精品女同一区二区| 国产一区二区在线电影| 国产欧美日韩精品在线| 欧美视频日韩视频| 韩国在线一区二区| 成人免费在线观看入口| 91国在线观看| 国产一区二区久久| 亚洲激情av在线| 欧美大片国产精品| 91国产精品成人| 青青草国产成人99久久| 中文成人av在线| 精品免费日韩av| 欧美亚洲综合色| 99久久er热在这里只有精品15| 日韩av一区二区三区| 日韩理论片在线| 欧美电影免费观看高清完整版 | 中文字幕一区视频| 91精品国产乱码久久蜜臀| av在线不卡观看免费观看| 欧美aⅴ一区二区三区视频| 亚洲黄色免费网站| 国产精品不卡视频| 亚洲国产精品99久久久久久久久| 678五月天丁香亚洲综合网| 91黄色免费版| 99久久婷婷国产精品综合| 成人黄色av电影| 成人国产精品免费网站| 国产成人精品影视| 国产精品一二三区| 国产精品白丝jk白祙喷水网站| 日韩国产一区二| 日本不卡视频在线观看| 人人狠狠综合久久亚洲| 日韩精品欧美精品| 蓝色福利精品导航| 国产一区二区免费看| 国产成人在线观看| 不卡的电影网站| 色偷偷久久一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃 | 久久99久久久欧美国产| 精品无码三级在线观看视频| 精品在线播放免费| 激情综合五月婷婷| 99精品视频在线免费观看| 91免费版在线| 91精品国产综合久久婷婷香蕉| 精品久久五月天| 国产精品高潮呻吟| 性做久久久久久久久| 国产成人免费在线视频| 欧美性色aⅴ视频一区日韩精品| 69久久99精品久久久久婷婷| 欧美韩日一区二区三区四区| 一区二区在线观看不卡| 久久精品国产亚洲5555| 色综合久久天天综合网| 亚洲精品在线三区| 亚洲一卡二卡三卡四卡| 国产综合色在线| 欧美一区二区三级| 一二三区精品视频| 国产一区二区在线观看视频| 欧美色视频在线观看| 国产精品激情偷乱一区二区∴| 天天亚洲美女在线视频| 色94色欧美sute亚洲线路一久| 久久久三级国产网站| 蜜桃传媒麻豆第一区在线观看| 91丨porny丨中文| 亚洲欧洲精品天堂一级| 国产99久久久国产精品潘金 | 欧美一区二区三区免费观看视频| 亚洲视频你懂的| 成人网在线播放| 国产农村妇女精品| 久久国产尿小便嘘嘘尿| 日韩视频一区二区三区| 午夜视频一区在线观看| 欧美日韩国产成人在线免费| 亚洲高清视频的网址| 欧美丰满嫩嫩电影| 日本中文在线一区| 欧美变态凌虐bdsm| 国产精品1区2区3区在线观看| 久久一日本道色综合| 成人激情校园春色| 伊人色综合久久天天人手人婷| 在线看一区二区|