summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2006-03-28 21:54:25 -0600
committerMike Isely <isely@pobox.com>2006-03-28 21:54:25 -0600
commit867f09ddc4c765a136402a0bd10a54ec45b7d820 (patch)
tree64fe137c2c3ac2eee361ae8f4b7b6814719d2b8c /linux/drivers/media/video/saa7134
parentda1de2e42e2a5c0290c15edbbd4017176ff0b1c2 (diff)
parentfe57e9e343b68651e0666447d96d2db4fbb0a83d (diff)
downloadmediapointer-dvb-s2-867f09ddc4c765a136402a0bd10a54ec45b7d820.tar.gz
mediapointer-dvb-s2-867f09ddc4c765a136402a0bd10a54ec45b7d820.tar.bz2
Merge from master
From: Mike Isely <isely@pobox.com> Signed-off-by: Mike Isely <isely@pobox.com>
Diffstat (limited to 'linux/drivers/media/video/saa7134')
-rw-r--r--linux/drivers/media/video/saa7134/Kconfig2
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-alsa.c120
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-cards.c66
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-dvb.c4
-rw-r--r--linux/drivers/media/video/saa7134/saa7134.h7
5 files changed, 194 insertions, 5 deletions
diff --git a/linux/drivers/media/video/saa7134/Kconfig b/linux/drivers/media/video/saa7134/Kconfig
index 263498660..e1c1805df 100644
--- a/linux/drivers/media/video/saa7134/Kconfig
+++ b/linux/drivers/media/video/saa7134/Kconfig
@@ -5,7 +5,6 @@ config VIDEO_SAA7134
select VIDEO_IR
select VIDEO_TUNER
select CRC32
- select FW_LOADER
---help---
This is a video4linux driver for Philips SAA713x based
TV cards.
@@ -40,6 +39,7 @@ config VIDEO_SAA7134_DVB
tristate "DVB/ATSC Support for saa7134 based TV cards"
depends on VIDEO_SAA7134 && DVB_CORE
select VIDEO_BUF_DVB
+ select FW_LOADER
---help---
This adds support for DVB cards based on the
Philips saa7134 chip.
diff --git a/linux/drivers/media/video/saa7134/saa7134-alsa.c b/linux/drivers/media/video/saa7134/saa7134-alsa.c
index 393a3a3bd..54fc877ba 100644
--- a/linux/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/linux/drivers/media/video/saa7134/saa7134-alsa.c
@@ -80,7 +80,11 @@ MODULE_PARM_DESC(enable, "Enable (or not) the SAA7134 capture interface(s).");
*/
typedef struct snd_card_saa7134 {
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_card_t *card;
+#else
+ struct snd_card *card;
+#endif
spinlock_t mixer_lock;
int mixer_volume[MIXER_ADDR_LAST+1][2];
int capture_source[MIXER_ADDR_LAST+1][2];
@@ -107,10 +111,18 @@ typedef struct snd_card_saa7134_pcm {
spinlock_t lock;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_substream_t *substream;
+#else
+ struct snd_pcm_substream *substream;
+#endif
} snd_card_saa7134_pcm_t;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static snd_card_t *snd_saa7134_cards[SNDRV_CARDS];
+#else
+static struct snd_card *snd_saa7134_cards[SNDRV_CARDS];
+#endif
/*
@@ -263,10 +275,18 @@ out:
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
+#else
+static int snd_card_saa7134_capture_trigger(struct snd_pcm_substream * substream,
+#endif
int cmd)
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_runtime_t *runtime = substream->runtime;
+#else
+ struct snd_pcm_runtime *runtime = substream->runtime;
+#endif
snd_card_saa7134_pcm_t *pcm = runtime->private_data;
struct saa7134_dev *dev=pcm->dev;
int err = 0;
@@ -344,9 +364,17 @@ static int dsp_buffer_free(struct saa7134_dev *dev)
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
+#else
+static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream)
+#endif
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_runtime_t *runtime = substream->runtime;
+#else
+ struct snd_pcm_runtime *runtime = substream->runtime;
+#endif
int bswap, sign;
u32 fmt, control;
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
@@ -433,9 +461,18 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream)
+#else
+static snd_pcm_uframes_t
+snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream)
+#endif
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_runtime_t *runtime = substream->runtime;
+#else
+ struct snd_pcm_runtime *runtime = substream->runtime;
+#endif
snd_card_saa7134_pcm_t *pcm = runtime->private_data;
struct saa7134_dev *dev=pcm->dev;
@@ -453,7 +490,11 @@ static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t *
* ALSA hardware capabilities definition
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static snd_pcm_hardware_t snd_card_saa7134_capture =
+#else
+static struct snd_pcm_hardware snd_card_saa7134_capture =
+#endif
{
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
@@ -476,7 +517,11 @@ static snd_pcm_hardware_t snd_card_saa7134_capture =
.periods_max = 1024,
};
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
+#else
+static void snd_card_saa7134_runtime_free(struct snd_pcm_runtime *runtime)
+#endif
{
snd_card_saa7134_pcm_t *pcm = runtime->private_data;
@@ -493,8 +538,13 @@ static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
snd_pcm_hw_params_t * hw_params)
+#else
+static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
+ struct snd_pcm_hw_params * hw_params)
+#endif
{
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
struct saa7134_dev *dev;
@@ -573,7 +623,11 @@ static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
+#else
+static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream)
+#endif
{
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
struct saa7134_dev *dev;
@@ -599,7 +653,11 @@ static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
+#else
+static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream)
+#endif
{
return 0;
}
@@ -614,9 +672,17 @@ static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
*
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
+#else
+static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
+#endif
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_runtime_t *runtime = substream->runtime;
+#else
+ struct snd_pcm_runtime *runtime = substream->runtime;
+#endif
snd_card_saa7134_pcm_t *pcm;
snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
struct saa7134_dev *dev = saa7134->dev;
@@ -652,7 +718,11 @@ static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
* ALSA capture callbacks definition
*/
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static snd_pcm_ops_t snd_card_saa7134_capture_ops = {
+#else
+static struct snd_pcm_ops snd_card_saa7134_capture_ops = {
+#endif
.open = snd_card_saa7134_capture_open,
.close = snd_card_saa7134_capture_close,
.ioctl = snd_pcm_lib_ioctl,
@@ -673,7 +743,11 @@ static snd_pcm_ops_t snd_card_saa7134_capture_ops = {
static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_pcm_t *pcm;
+#else
+ struct snd_pcm *pcm;
+#endif
int err;
if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0)
@@ -691,7 +765,12 @@ static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
.get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \
.private_value = addr }
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
+#else
+static int snd_saa7134_volume_info(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_info * uinfo)
+#endif
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 2;
@@ -700,7 +779,12 @@ static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_
return 0;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+#else
+static int snd_saa7134_volume_get(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_value * ucontrol)
+#endif
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
int addr = kcontrol->private_value;
@@ -710,7 +794,12 @@ static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
return 0;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+#else
+static int snd_saa7134_volume_put(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_value * ucontrol)
+#endif
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
int change, addr = kcontrol->private_value;
@@ -741,7 +830,12 @@ static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
.get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \
.private_value = addr }
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
+#else
+static int snd_saa7134_capsrc_info(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_info * uinfo)
+#endif
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
uinfo->count = 2;
@@ -750,7 +844,12 @@ static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_
return 0;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+#else
+static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_value * ucontrol)
+#endif
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
int addr = kcontrol->private_value;
@@ -763,7 +862,12 @@ static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
return 0;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+#else
+static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol,
+ struct snd_ctl_elem_value * ucontrol)
+#endif
{
snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
int change, addr = kcontrol->private_value;
@@ -840,7 +944,11 @@ static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
return change;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static snd_kcontrol_new_t snd_saa7134_controls[] = {
+#else
+static struct snd_kcontrol_new snd_saa7134_controls[] = {
+#endif
SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
@@ -859,7 +967,11 @@ SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_card_t *card = chip->card;
+#else
+ struct snd_card *card = chip->card;
+#endif
unsigned int idx;
int err;
@@ -873,7 +985,11 @@ static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
return 0;
}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
static void snd_saa7134_free(snd_card_t * card)
+#else
+static void snd_saa7134_free(struct snd_card * card)
+#endif
{
snd_card_saa7134_t *chip = card->private_data;
@@ -900,7 +1016,11 @@ static void snd_saa7134_free(snd_card_t * card)
static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
{
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
snd_card_t *card;
+#else
+ struct snd_card *card;
+#endif
snd_card_saa7134_t *chip;
int err;
diff --git a/linux/drivers/media/video/saa7134/saa7134-cards.c b/linux/drivers/media/video/saa7134/saa7134-cards.c
index 45eef4148..20d0327c4 100644
--- a/linux/drivers/media/video/saa7134/saa7134-cards.c
+++ b/linux/drivers/media/video/saa7134/saa7134-cards.c
@@ -210,7 +210,7 @@ struct saa7134_board saa7134_boards[] = {
[SAA7134_BOARD_FLYTVPLATINUM_FM] = {
/* LifeView FlyTV Platinum FM (LR214WF) */
/* "Peter Missel <peter.missel@onlinehome.de> */
- .name = "LifeView FlyTV Platinum FM",
+ .name = "LifeView FlyTV Platinum FM / Gold",
.audio_clock = 0x00200000,
.tuner_type = TUNER_PHILIPS_TDA8290,
.radio_type = UNSET,
@@ -2662,7 +2662,7 @@ struct saa7134_board saa7134_boards[] = {
.mpeg = SAA7134_MPEG_DVB,
.inputs = {{
.name = name_comp1,
- .vmux = 0,
+ .vmux = 1,
.amux = LINE1,
},{
.name = name_svideo,
@@ -2673,7 +2673,7 @@ struct saa7134_board saa7134_boards[] = {
[SAA7134_BOARD_FLYDVBT_LR301] = {
/* LifeView FlyDVB-T */
/* Giampiero Giancipoli <gianci@libero.it> */
- .name = "LifeView FlyDVB-T",
+ .name = "LifeView FlyDVB-T / Genius VideoWonder DVB-T",
.audio_clock = 0x00200000,
.tuner_type = TUNER_ABSENT,
.radio_type = UNSET,
@@ -2849,6 +2849,40 @@ struct saa7134_board saa7134_boards[] = {
.tuner_addr = ADDR_UNSET,
.radio_addr = ADDR_UNSET,
},
+ [SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS] = {
+ .name = "LifeView FlyDVB-T Hybrid Cardbus",
+ .audio_clock = 0x00200000,
+ .tuner_type = TUNER_PHILIPS_TDA8290,
+ .radio_type = UNSET,
+ .tuner_addr = ADDR_UNSET,
+ .radio_addr = ADDR_UNSET,
+ .mpeg = SAA7134_MPEG_DVB,
+ .gpiomask = 0x00600000, /* Bit 21 0=Radio, Bit 22 0=TV */
+ .inputs = {{
+ .name = name_tv,
+ .vmux = 1,
+ .amux = TV,
+ .gpio = 0x200000, /* GPIO21=High for TV input */
+ .tv = 1,
+ },{
+ .name = name_svideo, /* S-Video signal on S-Video input */
+ .vmux = 8,
+ .amux = LINE2,
+ },{
+ .name = name_comp1, /* Composite signal on S-Video input */
+ .vmux = 0,
+ .amux = LINE2,
+ },{
+ .name = name_comp2, /* Composite input */
+ .vmux = 3,
+ .amux = LINE2,
+ }},
+ .radio = {
+ .name = name_radio,
+ .amux = TV,
+ .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
+ },
+ },
};
const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -3374,6 +3408,30 @@ struct pci_device_id saa7134_pci_tbl[] = {
.subdevice = 0x0005,
.driver_data = SAA7134_BOARD_MD7134_BRIDGE_2,
},{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
+ .subvendor = 0x1489,
+ .subdevice = 0x0301,
+ .driver_data = SAA7134_BOARD_FLYDVBT_LR301,
+ },{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
+ .subvendor = 0x5168, /* Animation Technologies (LifeView) */
+ .subdevice = 0x0304,
+ .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
+ },{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
+ .subvendor = 0x5168,
+ .subdevice = 0x3306,
+ .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
+ },{
+ .vendor = PCI_VENDOR_ID_PHILIPS,
+ .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
+ .subvendor = 0x5168,
+ .subdevice = 0x3502, /* whats the difference to 0x3306 ?*/
+ .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
+ },{
/* --- boards without eeprom + subsystem ID --- */
.vendor = PCI_VENDOR_ID_PHILIPS,
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -3540,6 +3598,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06);
break;
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
+ case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
saa_writeb(SAA7134_GPIO_GPMODE3, 0x08);
saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00);
break;
@@ -3711,6 +3770,7 @@ int saa7134_board_init2(struct saa7134_dev *dev)
}
break;
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
+ case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
/* make the tda10046 find its eeprom */
{
u8 data[] = { 0x3c, 0x33, 0x62};
diff --git a/linux/drivers/media/video/saa7134/saa7134-dvb.c b/linux/drivers/media/video/saa7134/saa7134-dvb.c
index 1697fe6f8..9cbc8343d 100644
--- a/linux/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/linux/drivers/media/video/saa7134/saa7134-dvb.c
@@ -1066,6 +1066,10 @@ static int dvb_init(struct saa7134_dev *dev)
dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config,
&dev->i2c_adap);
break;
+ case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
+ dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
+ &dev->i2c_adap);
+ break;
#endif
#ifdef HAVE_NXT200X
case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
diff --git a/linux/drivers/media/video/saa7134/saa7134.h b/linux/drivers/media/video/saa7134/saa7134.h
index cbcf9adf7..8600c57b1 100644
--- a/linux/drivers/media/video/saa7134/saa7134.h
+++ b/linux/drivers/media/video/saa7134/saa7134.h
@@ -230,6 +230,7 @@ struct saa7134_format {
#define SAA7134_BOARD_AVERMEDIA_A169_B 91
#define SAA7134_BOARD_AVERMEDIA_A169_B1 92
#define SAA7134_BOARD_MD7134_BRIDGE_2 93
+#define SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS 94
#define SAA7134_MAXBOARDS 8
#define SAA7134_INPUT_MAX 8
@@ -411,7 +412,11 @@ struct saa7134_dmasound {
unsigned int read_count;
void * priv_data;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- snd_pcm_substream_t *substream;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,16)
+ snd_pcm_substream_t *substream;
+#else
+ struct snd_pcm_substream *substream;
+#endif
#endif
};