Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bd1b663 authored by Steven Toth's avatar Steven Toth Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (8987): cx88: Add support for the Hauppauge HVR4000 and HVR4000-LITE (S2) boards



Adding support for Hauppauge's cx88 S2 based products, based on the
cx24116 DVB-S2 demodulator.

Signed-off-by: default avatarSteven Toth <stoth@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 0d46748c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -66,3 +66,5 @@
 65 -> DViCO FusionHDTV 7 Gold                             [18ac:d610]
 66 -> Prolink Pixelview MPEG 8000GT                       [1554:4935]
 67 -> Kworld PlusTV HD PCI 120 (ATSC 120)                 [17de:08c1]
 68 -> Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid           [0070:6900,0070:6904,0070:6902]
 69 -> Hauppauge WinTV-HVR4000(Lite) DVB-S/S2              [0070:6905,0070:6906]
+79 −0
Original line number Diff line number Diff line
@@ -1664,6 +1664,51 @@ static const struct cx88_board cx88_boards[] = {
		},
		.mpeg           = CX88_MPEG_DVB,
	},
	[CX88_BOARD_HAUPPAUGE_HVR4000] = {
		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
		.radio_type     = UNSET,
		.tuner_addr     = ADDR_UNSET,
		.radio_addr     = ADDR_UNSET,
		.tda9887_conf   = TDA9887_PRESENT,
		/*
		 * GPIO0 (WINTV2000)
		 *
		 * Analogue     SAT     DVB-T
		 * Antenna      0xc4bf  0xc4bb
		 * Composite    0xc4bf  0xc4bb
		 * S-Video      0xc4bf  0xc4bb
		 * Composite1   0xc4ff  0xc4fb
		 * S-Video1     0xc4ff  0xc4fb
		 */
		.input          = {{
			.type   = CX88_VMUX_TELEVISION,
			.vmux   = 0,
			.gpio0  = 0xc4bf,
		}, {
			.type   = CX88_VMUX_COMPOSITE1,
			.vmux   = 1,
			.gpio0  = 0xc4bf,
		}, {
			.type   = CX88_VMUX_SVIDEO,
			.vmux   = 2,
			.gpio0  = 0xc4bf,
		} },
		/* fixme: Add radio support */
		.mpeg           = CX88_MPEG_DVB,
	},
	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
		.tuner_type     = UNSET,
		.radio_type     = UNSET,
		.tuner_addr     = ADDR_UNSET,
		.radio_addr     = ADDR_UNSET,
		.input          = {{
			.type   = CX88_VMUX_DVB,
			.vmux   = 0,
		} },
		.mpeg           = CX88_MPEG_DVB,
	},
};

/* ------------------------------------------------------------------ */
@@ -2013,6 +2058,26 @@ static const struct cx88_subid cx88_subids[] = {
		.subvendor = 0x17de,
		.subdevice = 0x08c1,
		.card      = CX88_BOARD_KWORLD_ATSC_120,
	}, {
		.subvendor = 0x0070,
		.subdevice = 0x6900,
		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
	}, {
		.subvendor = 0x0070,
		.subdevice = 0x6904,
		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
	}, {
		.subvendor = 0x0070,
		.subdevice = 0x6902,
		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
	}, {
		.subvendor = 0x0070,
		.subdevice = 0x6905,
		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
	}, {
		.subvendor = 0x0070,
		.subdevice = 0x6906,
		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
	},
};

@@ -2065,6 +2130,13 @@ static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
	case 34519: /* WinTV-PCI-FM */
	case 69009:
		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
	case 69559:
		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
	case 90002: /* Nova-T-PCI (9002) */
	case 92001: /* Nova-S-Plus (Video and IR) */
	case 92002: /* Nova-S-Plus (Video and IR) */
@@ -2415,6 +2487,11 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core)
		/* Enable the xc5000 tuner */
		cx_set(MO_GP0_IO, 0x00001010);
		break;
	case CX88_BOARD_HAUPPAUGE_HVR4000:
	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
		/* Init GPIO to allow tuner to attach */
		cx_write(MO_GP0_IO, 0x0000c4bf);
		udelay(1000);
	}
}

@@ -2489,6 +2566,8 @@ static void cx88_card_setup(struct cx88_core *core)
	case CX88_BOARD_HAUPPAUGE_HVR1100LP:
	case CX88_BOARD_HAUPPAUGE_HVR3000:
	case CX88_BOARD_HAUPPAUGE_HVR1300:
	case CX88_BOARD_HAUPPAUGE_HVR4000:
	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
		if (0 == core->i2c_rc)
			hauppauge_eeprom(core, eeprom);
		break;
+42 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include "tuner-simple.h"
#include "tda9887.h"
#include "s5h1411.h"
#include "cx24116.h"

MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
@@ -518,6 +519,35 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
	return 0;
}

static int cx24116_set_ts_param(struct dvb_frontend *fe,
	int is_punctured)
{
	struct cx8802_dev *dev = fe->dvb->priv;
	dev->ts_gen_cntrl = 0x2;

	return 0;
}

static int cx24116_reset_device(struct dvb_frontend *fe)
{
	struct cx8802_dev *dev = fe->dvb->priv;
	struct cx88_core *core = dev->core;

	/* Reset the part */
	cx_write(MO_SRST_IO, 0);
	msleep(10);
	cx_write(MO_SRST_IO, 1);
	msleep(10);

	return 0;
}

static struct cx24116_config hauppauge_hvr4000_config = {
	.demod_address          = 0x05,
	.set_ts_params          = cx24116_set_ts_param,
	.reset_device           = cx24116_reset_device,
};

static int dvb_register(struct cx8802_dev *dev)
{
	struct cx88_core *core = dev->core;
@@ -876,6 +906,18 @@ static int dvb_register(struct cx8802_dev *dev)
				goto frontend_detach;
		}
		break;
	case CX88_BOARD_HAUPPAUGE_HVR4000:
	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
		/* Support for DVB-S only, not DVB-T support */
		dev->dvb.frontend = dvb_attach(cx24116_attach,
			&hauppauge_hvr4000_config,
			&dev->core->i2c_adap);
		if (dev->dvb.frontend) {
			dvb_attach(isl6421_attach, dev->dvb.frontend,
				&dev->core->i2c_adap,
				0x08, 0x00, 0x00);
		}
		break;
	default:
		printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
		       core->name);
+4 −0
Original line number Diff line number Diff line
@@ -224,6 +224,8 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
	case CX88_BOARD_HAUPPAUGE_HVR1100:
	case CX88_BOARD_HAUPPAUGE_HVR3000:
	case CX88_BOARD_HAUPPAUGE_HVR4000:
	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
		ir_codes = ir_codes_hauppauge_new;
		ir_type = IR_TYPE_RC5;
		ir->sampling = 1;
@@ -462,6 +464,8 @@ void cx88_ir_irq(struct cx88_core *core)
	case CX88_BOARD_HAUPPAUGE_HVR1100:
	case CX88_BOARD_HAUPPAUGE_HVR3000:
	case CX88_BOARD_PINNACLE_PCTV_HD_800i:
	case CX88_BOARD_HAUPPAUGE_HVR4000:
	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
		ircode = ir_decode_biphase(ir->samples, ir->scount, 5, 7);
		ir_dprintk("biphase decoded: %x\n", ircode);
		if ((ircode & 0xfffff000) != 0x3000)
+2 −0
Original line number Diff line number Diff line
@@ -221,6 +221,8 @@ extern struct sram_channel cx88_sram_channels[];
#define CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD 65
#define CX88_BOARD_PROLINK_PV_8000GT       66
#define CX88_BOARD_KWORLD_ATSC_120         67
#define CX88_BOARD_HAUPPAUGE_HVR4000       68
#define CX88_BOARD_HAUPPAUGE_HVR4000LITE   69

enum cx88_itype {
	CX88_VMUX_COMPOSITE1 = 1,