diff -urN a/wis-go7007-linux-0.9.8/kernel/go7007-driver.c b/wis-go7007-linux-0.9.8/kernel/go7007-driver.c --- a/wis-go7007-linux-0.9.8/kernel/go7007-driver.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/go7007-driver.c 2006-12-17 12:56:09.000000000 -0400 @@ -18,7 +18,9 @@ #include #include #include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) #include +#endif #include #include #include diff -urN a/wis-go7007-linux-0.9.8/kernel/go7007-fw.c b/wis-go7007-linux-0.9.8/kernel/go7007-fw.c --- a/wis-go7007-linux-0.9.8/kernel/go7007-fw.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/go7007-fw.c 2006-12-17 12:56:09.000000000 -0400 @@ -26,7 +26,10 @@ #include #include +#include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) #include +#endif #include #include #include diff -urN a/wis-go7007-linux-0.9.8/kernel/go7007-i2c.c b/wis-go7007-linux-0.9.8/kernel/go7007-i2c.c --- a/wis-go7007-linux-0.9.8/kernel/go7007-i2c.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/go7007-i2c.c 2006-12-17 12:56:09.000000000 -0400 @@ -15,9 +15,11 @@ * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. */ +#include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) #include +#endif #include -#include #include #include #include diff -urN a/wis-go7007-linux-0.9.8/kernel/go7007-usb.c b/wis-go7007-linux-0.9.8/kernel/go7007-usb.c --- a/wis-go7007-linux-0.9.8/kernel/go7007-usb.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/go7007-usb.c 2006-12-17 12:56:09.000000000 -0400 @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "go7007-priv.h" #include "wis-i2c.h" @@ -225,17 +225,17 @@ .inputs = { { .video_input = 1, - .audio_input = AUDIO_EXTERN, + .audio_input = TVAUDIO_INPUT_EXTERN, .name = "Composite", }, { .video_input = 8, - .audio_input = AUDIO_EXTERN, + .audio_input = TVAUDIO_INPUT_EXTERN, .name = "S-Video", }, { .video_input = 3, - .audio_input = AUDIO_TUNER, + .audio_input = TVAUDIO_INPUT_TUNER, .name = "Tuner", }, }, diff -urN a/wis-go7007-linux-0.9.8/kernel/go7007-v4l2.c b/wis-go7007-linux-0.9.8/kernel/go7007-v4l2.c --- a/wis-go7007-linux-0.9.8/kernel/go7007-v4l2.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/go7007-v4l2.c 2006-12-17 12:56:09.000000000 -0400 @@ -17,8 +17,10 @@ #include #include -#include #include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) +#include +#endif #include #include #include @@ -939,7 +941,7 @@ if (go->i2c_adapter_online) { i2c_clients_command(&go->i2c_adapter, DECODER_SET_INPUT, &go->board_info->inputs[*input].video_input); - i2c_clients_command(&go->i2c_adapter, AUDC_SET_INPUT, + i2c_clients_command(&go->i2c_adapter, VIDIOC_S_AUDIO, &go->board_info->inputs[*input].audio_input); } return 0; diff -urN a/wis-go7007-linux-0.9.8/kernel/snd-go7007.c b/wis-go7007-linux-0.9.8/kernel/snd-go7007.c --- a/wis-go7007-linux-0.9.8/kernel/snd-go7007.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/snd-go7007.c 2006-12-17 12:56:28.000000000 -0400 @@ -20,7 +20,9 @@ #include #include #include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) #include +#endif #include #include #include @@ -305,7 +307,7 @@ struct go7007_snd *gosnd = go->snd_context; snd_card_disconnect(gosnd->card); - snd_card_free_in_thread(gosnd->card); + snd_card_free(gosnd->card); return 0; } EXPORT_SYMBOL(go7007_snd_remove); diff -urN a/wis-go7007-linux-0.9.8/kernel/snd-go7007.c~ b/wis-go7007-linux-0.9.8/kernel/snd-go7007.c~ --- a/wis-go7007-linux-0.9.8/kernel/snd-go7007.c~ 1969-12-31 20:00:00.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/snd-go7007.c~ 2006-12-17 12:56:09.000000000 -0400 @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2005-2006 Micronas USA Inc. + * + * 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., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "go7007-priv.h" + +static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; +static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; +static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) +static int index_num, id_num, enable_num; +module_param_array(index, int, index_num, 0444); +module_param_array(id, charp, id_num, 0444); +module_param_array(enable, bool, enable_num, 0444); +#else +module_param_array(index, int, NULL, 0444); +module_param_array(id, charp, NULL, 0444); +module_param_array(enable, bool, NULL, 0444); +#endif +MODULE_PARM_DESC(index, "Index value for the go7007 audio driver"); +MODULE_PARM_DESC(index, "ID string for the go7007 audio driver"); +MODULE_PARM_DESC(index, "Enable for the go7007 audio driver"); + +struct go7007_snd { + snd_card_t *card; + snd_pcm_t *pcm; + snd_pcm_substream_t *substream; + spinlock_t lock; + int w_idx; + int hw_ptr; + int avail; + int capturing; +}; + +static snd_pcm_hardware_t go7007_snd_capture_hw = { + .info = (SNDRV_PCM_INFO_MMAP | + SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_MMAP_VALID), + .formats = SNDRV_PCM_FMTBIT_S16_LE, + .rates = SNDRV_PCM_RATE_48000, + .rate_min = 48000, + .rate_max = 48000, + .channels_min = 2, + .channels_max = 2, + .buffer_bytes_max = (128*1024), + .period_bytes_min = 4096, + .period_bytes_max = (128*1024), + .periods_min = 1, + .periods_max = 32, +}; + +static void parse_audio_stream_data(struct go7007 *go, u8 *buf, int length) +{ + struct go7007_snd *gosnd = go->snd_context; + snd_pcm_runtime_t *runtime = gosnd->substream->runtime; + int frames = bytes_to_frames(runtime, length); + + spin_lock(&gosnd->lock); + gosnd->hw_ptr += frames; + if (gosnd->hw_ptr >= runtime->buffer_size) + gosnd->hw_ptr -= runtime->buffer_size; + gosnd->avail += frames; + spin_unlock(&gosnd->lock); + if (gosnd->w_idx + length > runtime->dma_bytes) { + int cpy = runtime->dma_bytes - gosnd->w_idx; + + memcpy(runtime->dma_area + gosnd->w_idx, buf, cpy); + length -= cpy; + buf += cpy; + gosnd->w_idx = 0; + } + memcpy(runtime->dma_area + gosnd->w_idx, buf, length); + gosnd->w_idx += length; + spin_lock(&gosnd->lock); + if (gosnd->avail < runtime->period_size) { + spin_unlock(&gosnd->lock); + return; + } + gosnd->avail -= runtime->period_size; + spin_unlock(&gosnd->lock); + if (gosnd->capturing) + snd_pcm_period_elapsed(gosnd->substream); +} + +static int go7007_snd_hw_params(snd_pcm_substream_t *substream, + snd_pcm_hw_params_t *hw_params) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + unsigned int bytes; + + bytes = params_buffer_bytes(hw_params); + if (substream->runtime->dma_bytes > 0) + vfree(substream->runtime->dma_area); + substream->runtime->dma_bytes = 0; + substream->runtime->dma_area = vmalloc(bytes); + if (substream->runtime->dma_area == NULL) + return -ENOMEM; + substream->runtime->dma_bytes = bytes; + go->audio_deliver = parse_audio_stream_data; + return 0; +} + +static int go7007_snd_hw_free(snd_pcm_substream_t *substream) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + + go->audio_deliver = NULL; + if (substream->runtime->dma_bytes > 0) + vfree(substream->runtime->dma_area); + substream->runtime->dma_bytes = 0; + return 0; +} + +static int go7007_snd_capture_open(snd_pcm_substream_t *substream) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + struct go7007_snd *gosnd = go->snd_context; + unsigned long flags; + int r; + + spin_lock_irqsave(&gosnd->lock, flags); + if (gosnd->substream == NULL) { + gosnd->substream = substream; + substream->runtime->hw = go7007_snd_capture_hw; + r = 0; + } else + r = -EBUSY; + spin_unlock_irqrestore(&gosnd->lock, flags); + return r; +} + +static int go7007_snd_capture_close(snd_pcm_substream_t *substream) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + struct go7007_snd *gosnd = go->snd_context; + + gosnd->substream = NULL; + return 0; +} + +static int go7007_snd_pcm_prepare(snd_pcm_substream_t *substream) +{ + return 0; +} + +static int go7007_snd_pcm_trigger(snd_pcm_substream_t *substream, int cmd) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + struct go7007_snd *gosnd = go->snd_context; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + /* Just set a flag to indicate we should signal ALSA when + * sound comes in */ + gosnd->capturing = 1; + return 0; + case SNDRV_PCM_TRIGGER_STOP: + gosnd->hw_ptr = gosnd->w_idx = gosnd->avail = 0; + gosnd->capturing = 0; + return 0; + default: + return -EINVAL; + } +} + +static snd_pcm_uframes_t go7007_snd_pcm_pointer(snd_pcm_substream_t *substream) +{ + struct go7007 *go = snd_pcm_substream_chip(substream); + struct go7007_snd *gosnd = go->snd_context; + + return gosnd->hw_ptr; +} + +static struct page *go7007_snd_pcm_page(snd_pcm_substream_t *substream, + unsigned long offset) +{ + return vmalloc_to_page(substream->runtime->dma_area + offset); +} + +static snd_pcm_ops_t go7007_snd_capture_ops = { + .open = go7007_snd_capture_open, + .close = go7007_snd_capture_close, + .ioctl = snd_pcm_lib_ioctl, + .hw_params = go7007_snd_hw_params, + .hw_free = go7007_snd_hw_free, + .prepare = go7007_snd_pcm_prepare, + .trigger = go7007_snd_pcm_trigger, + .pointer = go7007_snd_pcm_pointer, + .page = go7007_snd_pcm_page, +}; + +static int go7007_snd_free(snd_device_t *device) +{ + struct go7007 *go = device->device_data; + + kfree(go->snd_context); + go->snd_context = NULL; + if (--go->ref_count == 0) + kfree(go); + return 0; +} + +static snd_device_ops_t go7007_snd_device_ops = { + .dev_free = go7007_snd_free, +}; + +int go7007_snd_init(struct go7007 *go) +{ + static int dev = 0; + struct go7007_snd *gosnd; + int ret = 0; + + if (dev >= SNDRV_CARDS) + return -ENODEV; + if (!enable[dev]) { + dev++; + return -ENOENT; + } + gosnd = kmalloc(sizeof(struct go7007_snd), GFP_KERNEL); + if (gosnd == NULL) + return -ENOMEM; + gosnd->lock = SPIN_LOCK_UNLOCKED; + gosnd->hw_ptr = gosnd->w_idx = gosnd->avail = 0; + gosnd->capturing = 0; + gosnd->card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); + if (gosnd->card == NULL) { + kfree(gosnd); + return -ENOMEM; + } + ret = snd_device_new(gosnd->card, SNDRV_DEV_LOWLEVEL, go, + &go7007_snd_device_ops); + if (ret < 0) { + kfree(gosnd); + return ret; + } + snd_card_set_dev(gosnd->card, go->dev); + ret = snd_pcm_new(gosnd->card, "go7007", 0, 0, 1, &gosnd->pcm); + if (ret < 0) { + snd_card_free(gosnd->card); + kfree(gosnd); + return ret; + } + strncpy(gosnd->card->driver, "go7007", sizeof(gosnd->card->driver)); + strncpy(gosnd->card->shortname, go->name, sizeof(gosnd->card->driver)); + strncpy(gosnd->card->longname, gosnd->card->shortname, + sizeof(gosnd->card->longname)); + + gosnd->pcm->private_data = go; + snd_pcm_set_ops(gosnd->pcm, SNDRV_PCM_STREAM_CAPTURE, + &go7007_snd_capture_ops); + + ret = snd_card_register(gosnd->card); + if (ret < 0) { + snd_card_free(gosnd->card); + kfree(gosnd); + return ret; + } + + gosnd->substream = NULL; + go->snd_context = gosnd; + ++dev; + ++go->ref_count; + + return 0; +} +EXPORT_SYMBOL(go7007_snd_init); + +int go7007_snd_remove(struct go7007 *go) +{ + struct go7007_snd *gosnd = go->snd_context; + + snd_card_disconnect(gosnd->card); + snd_card_free_in_thread(gosnd->card); + return 0; +} +EXPORT_SYMBOL(go7007_snd_remove); + +MODULE_LICENSE("GPL v2"); diff -urN a/wis-go7007-linux-0.9.8/kernel/wis-saa7113.c b/wis-go7007-linux-0.9.8/kernel/wis-saa7113.c --- a/wis-go7007-linux-0.9.8/kernel/wis-saa7113.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/wis-saa7113.c 2006-12-17 12:56:09.000000000 -0400 @@ -21,6 +21,7 @@ #include #include #include +#include #include "wis-i2c.h" diff -urN a/wis-go7007-linux-0.9.8/kernel/wis-saa7115.c b/wis-go7007-linux-0.9.8/kernel/wis-saa7115.c --- a/wis-go7007-linux-0.9.8/kernel/wis-saa7115.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/wis-saa7115.c 2006-12-17 12:56:09.000000000 -0400 @@ -21,6 +21,7 @@ #include #include #include +#include #include "wis-i2c.h" diff -urN a/wis-go7007-linux-0.9.8/kernel/wis-tw2804.c b/wis-go7007-linux-0.9.8/kernel/wis-tw2804.c --- a/wis-go7007-linux-0.9.8/kernel/wis-tw2804.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/wis-tw2804.c 2006-12-17 12:56:09.000000000 -0400 @@ -21,6 +21,7 @@ #include #include #include +#include #include "wis-i2c.h" diff -urN a/wis-go7007-linux-0.9.8/kernel/wis-tw9903.c b/wis-go7007-linux-0.9.8/kernel/wis-tw9903.c --- a/wis-go7007-linux-0.9.8/kernel/wis-tw9903.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/wis-tw9903.c 2006-12-17 12:56:09.000000000 -0400 @@ -21,6 +21,7 @@ #include #include #include +#include #include "wis-i2c.h" diff -urN a/wis-go7007-linux-0.9.8/kernel/wis-uda1342.c b/wis-go7007-linux-0.9.8/kernel/wis-uda1342.c --- a/wis-go7007-linux-0.9.8/kernel/wis-uda1342.c 2006-12-17 12:55:44.000000000 -0400 +++ b/wis-go7007-linux-0.9.8/kernel/wis-uda1342.c 2006-12-17 12:56:09.000000000 -0400 @@ -20,7 +20,7 @@ #include #include #include -#include +#include #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) #include #endif @@ -38,15 +38,15 @@ unsigned int cmd, void *arg) { switch (cmd) { - case AUDC_SET_INPUT: + case VIDIOC_S_AUDIO: { int *inp = arg; switch (*inp) { - case AUDIO_TUNER: + case TVAUDIO_INPUT_TUNER: write_reg(client, 0x00, 0x1441); /* select input 2 */ break; - case AUDIO_EXTERN: + case TVAUDIO_INPUT_EXTERN: write_reg(client, 0x00, 0x1241); /* select input 1 */ break; default: