-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
V4L/DVB (6150): Add CX23885/CX23887 PCIe bridge driver
This is a new framework to support boards based on the CX23885/7 PCIe bridge. The framework supports digital (no analog yet) Signed-off-by: Steven Toth <stoth@hauppauge.com> Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
- Loading branch information
Steven Toth
authored and
Mauro Carvalho Chehab
committed
Oct 10, 2007
1 parent
275511a
commit d19770e
Showing
9 changed files
with
3,124 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
config VIDEO_CX23885 | ||
tristate "Conexant cx23885 (2388x successor) support" | ||
depends on VIDEO_DEV && PCI && I2C | ||
select I2C_ALGOBIT | ||
select FW_LOADER | ||
select VIDEO_BTCX | ||
select VIDEO_BUF | ||
select VIDEO_TUNER | ||
select VIDEO_TVEEPROM | ||
select VIDEO_IR | ||
---help--- | ||
This is a video4linux driver for Conexant 23885 based | ||
TV cards. | ||
|
||
To compile this driver as a module, choose M here: the | ||
module will be called cx23885 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
cx23885-objs := cx23885-cards.o cx23885-core.o cx23885-i2c.o cx23885-dvb.o | ||
|
||
obj-$(CONFIG_VIDEO_CX23885) += cx23885.o | ||
|
||
EXTRA_CFLAGS += -Idrivers/media/video | ||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core | ||
EXTRA_CFLAGS += -Idrivers/media/dvb/frontends | ||
|
||
EXTRA_CFLAGS += $(extra-cflags-y) $(extra-cflags-m) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
/* | ||
* Driver for the Conexant CX23885 PCIe bridge | ||
* | ||
* Copyright (c) 2006 Steven Toth <stoth@hauppauge.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* 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. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/pci.h> | ||
#include <linux/delay.h> | ||
|
||
#include "cx23885.h" | ||
|
||
/* ------------------------------------------------------------------ */ | ||
/* board config info */ | ||
|
||
struct cx23885_board cx23885_boards[] = { | ||
[CX23885_BOARD_UNKNOWN] = { | ||
.name = "UNKNOWN/GENERIC", | ||
.bridge = CX23885_BRIDGE_UNDEFINED, | ||
.input = {{ | ||
.type = CX23885_VMUX_COMPOSITE1, | ||
.vmux = 0, | ||
},{ | ||
.type = CX23885_VMUX_COMPOSITE2, | ||
.vmux = 1, | ||
},{ | ||
.type = CX23885_VMUX_COMPOSITE3, | ||
.vmux = 2, | ||
},{ | ||
.type = CX23885_VMUX_COMPOSITE4, | ||
.vmux = 3, | ||
}}, | ||
}, | ||
[CX23885_BOARD_HAUPPAUGE_HVR1800lp] = { | ||
.name = "Hauppauge WinTV-HVR1800lp", | ||
.bridge = CX23885_BRIDGE_885, | ||
.portc = CX23885_MPEG_DVB, | ||
.input = {{ | ||
.type = CX23885_VMUX_TELEVISION, | ||
.vmux = 0, | ||
.gpio0 = 0xff00, | ||
},{ | ||
.type = CX23885_VMUX_DEBUG, | ||
.vmux = 0, | ||
.gpio0 = 0xff01, | ||
},{ | ||
.type = CX23885_VMUX_COMPOSITE1, | ||
.vmux = 1, | ||
.gpio0 = 0xff02, | ||
},{ | ||
.type = CX23885_VMUX_SVIDEO, | ||
.vmux = 2, | ||
.gpio0 = 0xff02, | ||
}}, | ||
}, | ||
[CX23885_BOARD_HAUPPAUGE_HVR1800] = { | ||
.name = "Hauppauge WinTV-HVR1800", | ||
.bridge = CX23885_BRIDGE_887, | ||
.portc = CX23885_MPEG_DVB, | ||
.input = {{ | ||
.type = CX23885_VMUX_TELEVISION, | ||
.vmux = 0, | ||
.gpio0 = 0xff00, | ||
},{ | ||
.type = CX23885_VMUX_DEBUG, | ||
.vmux = 0, | ||
.gpio0 = 0xff01, | ||
},{ | ||
.type = CX23885_VMUX_COMPOSITE1, | ||
.vmux = 1, | ||
.gpio0 = 0xff02, | ||
},{ | ||
.type = CX23885_VMUX_SVIDEO, | ||
.vmux = 2, | ||
.gpio0 = 0xff02, | ||
}}, | ||
}, | ||
}; | ||
const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards); | ||
|
||
/* ------------------------------------------------------------------ */ | ||
/* PCI subsystem IDs */ | ||
|
||
struct cx23885_subid cx23885_subids[] = { | ||
{ | ||
.subvendor = 0x0070, | ||
.subdevice = 0x3400, | ||
.card = CX23885_BOARD_UNKNOWN, | ||
},{ | ||
.subvendor = 0x0070, | ||
.subdevice = 0x7600, | ||
.card = CX23885_BOARD_HAUPPAUGE_HVR1800lp, | ||
},{ | ||
.subvendor = 0x0070, | ||
.subdevice = 0x7800, | ||
.card = CX23885_BOARD_HAUPPAUGE_HVR1800, | ||
},{ | ||
.subvendor = 0x0070, | ||
.subdevice = 0x7801, | ||
.card = CX23885_BOARD_HAUPPAUGE_HVR1800, | ||
}, | ||
}; | ||
const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids); | ||
|
||
void cx23885_card_list(struct cx23885_dev *dev) | ||
{ | ||
int i; | ||
|
||
if (0 == dev->pci->subsystem_vendor && | ||
0 == dev->pci->subsystem_device) { | ||
printk("%s: Your board has no valid PCIe Subsystem ID and thus can't\n" | ||
"%s: be autodetected. Please pass card=<n> insmod option to\n" | ||
"%s: workaround that. Redirect complaints to the vendor of\n" | ||
"%s: the TV card. Best regards,\n" | ||
"%s: -- tux\n", | ||
dev->name, dev->name, dev->name, dev->name, dev->name); | ||
} else { | ||
printk("%s: Your board isn't known (yet) to the driver. You can\n" | ||
"%s: try to pick one of the existing card configs via\n" | ||
"%s: card=<n> insmod option. Updating to the latest\n" | ||
"%s: version might help as well.\n", | ||
dev->name, dev->name, dev->name, dev->name); | ||
} | ||
printk("%s: Here is a list of valid choices for the card=<n> insmod option:\n", | ||
dev->name); | ||
for (i = 0; i < cx23885_bcount; i++) | ||
printk("%s: card=%d -> %s\n", | ||
dev->name, i, cx23885_boards[i].name); | ||
} | ||
|
||
static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data) | ||
{ | ||
struct tveeprom tv; | ||
|
||
tveeprom_hauppauge_analog(&dev->i2c_bus[0].i2c_client, &tv, eeprom_data); | ||
|
||
|
||
/* Make sure we support the board model */ | ||
switch (tv.model) | ||
{ | ||
case 76601: /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual channel ATSC and MPEG2 HW Encoder */ | ||
case 77001: /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC and Basic analog */ | ||
case 78501: /* WinTV-HVR1800 (PCIe, Retail, IR, Dual channel ATSC and MPEG2 HW Encoder */ | ||
case 78521: /* WinTV-HVR1800 (PCIe, Retail, IR, Dual channel ATSC and MPEG2 HW Encoder */ | ||
break; | ||
default: | ||
printk("%s: warning: unknown hauppauge model #%d\n", dev->name, tv.model); | ||
break; | ||
} | ||
|
||
printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n", | ||
dev->name, tv.model); | ||
} | ||
|
||
void cx23885_card_setup(struct cx23885_dev *dev) | ||
{ | ||
static u8 eeprom[256]; | ||
|
||
if (dev->i2c_bus[0].i2c_rc == 0) { | ||
dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1; | ||
tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom)); | ||
} | ||
|
||
switch (dev->board) { | ||
case CX23885_BOARD_HAUPPAUGE_HVR1800: | ||
case CX23885_BOARD_HAUPPAUGE_HVR1800lp: | ||
if (dev->i2c_bus[0].i2c_rc == 0) | ||
hauppauge_eeprom(dev, eeprom+0x80); | ||
break; | ||
} | ||
} | ||
|
||
/* ------------------------------------------------------------------ */ | ||
|
||
EXPORT_SYMBOL(cx23885_boards); | ||
|
||
/* | ||
* Local variables: | ||
* c-basic-offset: 8 | ||
* End: | ||
* kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off | ||
*/ |
Oops, something went wrong.