162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Driver for the NXP SAA7164 PCIe bridge 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/init.h> 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/pci.h> 1162306a36Sopenharmony_ci#include <linux/delay.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "saa7164.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* The Bridge API needs to understand register widths (in bytes) for the 1662306a36Sopenharmony_ci * attached I2C devices, so we can simplify the virtual i2c mechansms 1762306a36Sopenharmony_ci * and keep the -i2c.c implementation clean. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#define REGLEN_0bit 0 2062306a36Sopenharmony_ci#define REGLEN_8bit 1 2162306a36Sopenharmony_ci#define REGLEN_16bit 2 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct saa7164_board saa7164_boards[] = { 2462306a36Sopenharmony_ci [SAA7164_BOARD_UNKNOWN] = { 2562306a36Sopenharmony_ci /* Bridge will not load any firmware, without knowing 2662306a36Sopenharmony_ci * the rev this would be fatal. */ 2762306a36Sopenharmony_ci .name = "Unknown", 2862306a36Sopenharmony_ci }, 2962306a36Sopenharmony_ci [SAA7164_BOARD_UNKNOWN_REV2] = { 3062306a36Sopenharmony_ci /* Bridge will load the v2 f/w and dump descriptors */ 3162306a36Sopenharmony_ci /* Required during new board bringup */ 3262306a36Sopenharmony_ci .name = "Generic Rev2", 3362306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV2, 3462306a36Sopenharmony_ci }, 3562306a36Sopenharmony_ci [SAA7164_BOARD_UNKNOWN_REV3] = { 3662306a36Sopenharmony_ci /* Bridge will load the v2 f/w and dump descriptors */ 3762306a36Sopenharmony_ci /* Required during new board bringup */ 3862306a36Sopenharmony_ci .name = "Generic Rev3", 3962306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 4062306a36Sopenharmony_ci }, 4162306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2200] = { 4262306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2200", 4362306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 4462306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 4562306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 4662306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 4762306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 4862306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 4962306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 5062306a36Sopenharmony_ci .unit = {{ 5162306a36Sopenharmony_ci .id = 0x1d, 5262306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 5362306a36Sopenharmony_ci .name = "4K EEPROM", 5462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 5562306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 5662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 5762306a36Sopenharmony_ci }, { 5862306a36Sopenharmony_ci .id = 0x04, 5962306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 6062306a36Sopenharmony_ci .name = "TDA18271-1", 6162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 6262306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 6362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 6462306a36Sopenharmony_ci }, { 6562306a36Sopenharmony_ci .id = 0x1b, 6662306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 6762306a36Sopenharmony_ci .name = "TDA18271-2", 6862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 6962306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 7062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 7162306a36Sopenharmony_ci }, { 7262306a36Sopenharmony_ci .id = 0x1e, 7362306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 7462306a36Sopenharmony_ci .name = "TDA10048-1", 7562306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 7662306a36Sopenharmony_ci .i2c_bus_addr = 0x10 >> 1, 7762306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 7862306a36Sopenharmony_ci }, { 7962306a36Sopenharmony_ci .id = 0x1f, 8062306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 8162306a36Sopenharmony_ci .name = "TDA10048-2", 8262306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 8362306a36Sopenharmony_ci .i2c_bus_addr = 0x12 >> 1, 8462306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 8562306a36Sopenharmony_ci } }, 8662306a36Sopenharmony_ci }, 8762306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2200_2] = { 8862306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2200", 8962306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 9062306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 9162306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 9262306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 9362306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 9462306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 9562306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV2, 9662306a36Sopenharmony_ci .unit = {{ 9762306a36Sopenharmony_ci .id = 0x06, 9862306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 9962306a36Sopenharmony_ci .name = "4K EEPROM", 10062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 10162306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 10262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 10362306a36Sopenharmony_ci }, { 10462306a36Sopenharmony_ci .id = 0x04, 10562306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 10662306a36Sopenharmony_ci .name = "TDA18271-1", 10762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 10862306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 10962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 11062306a36Sopenharmony_ci }, { 11162306a36Sopenharmony_ci .id = 0x05, 11262306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 11362306a36Sopenharmony_ci .name = "TDA10048-1", 11462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 11562306a36Sopenharmony_ci .i2c_bus_addr = 0x10 >> 1, 11662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 11762306a36Sopenharmony_ci }, { 11862306a36Sopenharmony_ci .id = 0x1e, 11962306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 12062306a36Sopenharmony_ci .name = "TDA18271-2", 12162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 12262306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 12362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 12462306a36Sopenharmony_ci }, { 12562306a36Sopenharmony_ci .id = 0x1f, 12662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 12762306a36Sopenharmony_ci .name = "TDA10048-2", 12862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 12962306a36Sopenharmony_ci .i2c_bus_addr = 0x12 >> 1, 13062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 13162306a36Sopenharmony_ci } }, 13262306a36Sopenharmony_ci }, 13362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2200_3] = { 13462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2200", 13562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 13662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 13762306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 13862306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 13962306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 14062306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 14162306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV2, 14262306a36Sopenharmony_ci .unit = {{ 14362306a36Sopenharmony_ci .id = 0x1d, 14462306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 14562306a36Sopenharmony_ci .name = "4K EEPROM", 14662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 14762306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 14862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 14962306a36Sopenharmony_ci }, { 15062306a36Sopenharmony_ci .id = 0x04, 15162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 15262306a36Sopenharmony_ci .name = "TDA18271-1", 15362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 15462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 15562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 15662306a36Sopenharmony_ci }, { 15762306a36Sopenharmony_ci .id = 0x05, 15862306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 15962306a36Sopenharmony_ci .name = "TDA8290-1", 16062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 16162306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 16262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 16362306a36Sopenharmony_ci }, { 16462306a36Sopenharmony_ci .id = 0x1b, 16562306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 16662306a36Sopenharmony_ci .name = "TDA18271-2", 16762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 16862306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 16962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 17062306a36Sopenharmony_ci }, { 17162306a36Sopenharmony_ci .id = 0x1c, 17262306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 17362306a36Sopenharmony_ci .name = "TDA8290-2", 17462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 17562306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 17662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 17762306a36Sopenharmony_ci }, { 17862306a36Sopenharmony_ci .id = 0x1e, 17962306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 18062306a36Sopenharmony_ci .name = "TDA10048-1", 18162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 18262306a36Sopenharmony_ci .i2c_bus_addr = 0x10 >> 1, 18362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 18462306a36Sopenharmony_ci }, { 18562306a36Sopenharmony_ci .id = 0x1f, 18662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 18762306a36Sopenharmony_ci .name = "TDA10048-2", 18862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 18962306a36Sopenharmony_ci .i2c_bus_addr = 0x12 >> 1, 19062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 19162306a36Sopenharmony_ci } }, 19262306a36Sopenharmony_ci }, 19362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2200_4] = { 19462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2200", 19562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 19662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 19762306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 19862306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 19962306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 20062306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 20162306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 20262306a36Sopenharmony_ci .unit = {{ 20362306a36Sopenharmony_ci .id = 0x1d, 20462306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 20562306a36Sopenharmony_ci .name = "4K EEPROM", 20662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 20762306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 20862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 20962306a36Sopenharmony_ci }, { 21062306a36Sopenharmony_ci .id = 0x04, 21162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 21262306a36Sopenharmony_ci .name = "TDA18271-1", 21362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 21462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 21562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 21662306a36Sopenharmony_ci }, { 21762306a36Sopenharmony_ci .id = 0x05, 21862306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 21962306a36Sopenharmony_ci .name = "TDA8290-1", 22062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 22162306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 22262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 22362306a36Sopenharmony_ci }, { 22462306a36Sopenharmony_ci .id = 0x1b, 22562306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 22662306a36Sopenharmony_ci .name = "TDA18271-2", 22762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 22862306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 22962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 23062306a36Sopenharmony_ci }, { 23162306a36Sopenharmony_ci .id = 0x1c, 23262306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 23362306a36Sopenharmony_ci .name = "TDA8290-2", 23462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 23562306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 23662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 23762306a36Sopenharmony_ci }, { 23862306a36Sopenharmony_ci .id = 0x1e, 23962306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 24062306a36Sopenharmony_ci .name = "TDA10048-1", 24162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 24262306a36Sopenharmony_ci .i2c_bus_addr = 0x10 >> 1, 24362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 24462306a36Sopenharmony_ci }, { 24562306a36Sopenharmony_ci .id = 0x1f, 24662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 24762306a36Sopenharmony_ci .name = "TDA10048-2", 24862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 24962306a36Sopenharmony_ci .i2c_bus_addr = 0x12 >> 1, 25062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 25162306a36Sopenharmony_ci } }, 25262306a36Sopenharmony_ci }, 25362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2250] = { 25462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2250", 25562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 25662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 25762306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 25862306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 25962306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 26062306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 26162306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 26262306a36Sopenharmony_ci .unit = {{ 26362306a36Sopenharmony_ci .id = 0x22, 26462306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 26562306a36Sopenharmony_ci .name = "4K EEPROM", 26662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 26762306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 26862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 26962306a36Sopenharmony_ci }, { 27062306a36Sopenharmony_ci .id = 0x04, 27162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 27262306a36Sopenharmony_ci .name = "TDA18271-1", 27362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 27462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 27562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 27662306a36Sopenharmony_ci }, { 27762306a36Sopenharmony_ci .id = 0x07, 27862306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 27962306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (TOP)", 28062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 28162306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 28262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 28362306a36Sopenharmony_ci }, { 28462306a36Sopenharmony_ci .id = 0x08, 28562306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 28662306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (QAM)", 28762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 28862306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 28962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 29062306a36Sopenharmony_ci }, { 29162306a36Sopenharmony_ci .id = 0x1e, 29262306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 29362306a36Sopenharmony_ci .name = "TDA18271-2", 29462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 29562306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 29662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 29762306a36Sopenharmony_ci }, { 29862306a36Sopenharmony_ci .id = 0x20, 29962306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 30062306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (TOP)", 30162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 30262306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 30362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 30462306a36Sopenharmony_ci }, { 30562306a36Sopenharmony_ci .id = 0x23, 30662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 30762306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (QAM)", 30862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 30962306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 31062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 31162306a36Sopenharmony_ci } }, 31262306a36Sopenharmony_ci }, 31362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2250_2] = { 31462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2250", 31562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 31662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 31762306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 31862306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 31962306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 32062306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 32162306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 32262306a36Sopenharmony_ci .unit = {{ 32362306a36Sopenharmony_ci .id = 0x28, 32462306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 32562306a36Sopenharmony_ci .name = "4K EEPROM", 32662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 32762306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 32862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 32962306a36Sopenharmony_ci }, { 33062306a36Sopenharmony_ci .id = 0x04, 33162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 33262306a36Sopenharmony_ci .name = "TDA18271-1", 33362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 33462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 33562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 33662306a36Sopenharmony_ci }, { 33762306a36Sopenharmony_ci .id = 0x07, 33862306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 33962306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (TOP)", 34062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 34162306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 34262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 34362306a36Sopenharmony_ci }, { 34462306a36Sopenharmony_ci .id = 0x08, 34562306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 34662306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (QAM)", 34762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 34862306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 34962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 35062306a36Sopenharmony_ci }, { 35162306a36Sopenharmony_ci .id = 0x24, 35262306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 35362306a36Sopenharmony_ci .name = "TDA18271-2", 35462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 35562306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 35662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 35762306a36Sopenharmony_ci }, { 35862306a36Sopenharmony_ci .id = 0x26, 35962306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 36062306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (TOP)", 36162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 36262306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 36362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 36462306a36Sopenharmony_ci }, { 36562306a36Sopenharmony_ci .id = 0x29, 36662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 36762306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (QAM)", 36862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 36962306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 37062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 37162306a36Sopenharmony_ci } }, 37262306a36Sopenharmony_ci }, 37362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2250_3] = { 37462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2250", 37562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 37662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 37762306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 37862306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 37962306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 38062306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 38162306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 38262306a36Sopenharmony_ci .unit = {{ 38362306a36Sopenharmony_ci .id = 0x26, 38462306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 38562306a36Sopenharmony_ci .name = "4K EEPROM", 38662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 38762306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 38862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 38962306a36Sopenharmony_ci }, { 39062306a36Sopenharmony_ci .id = 0x04, 39162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 39262306a36Sopenharmony_ci .name = "TDA18271-1", 39362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 39462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 39562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 39662306a36Sopenharmony_ci }, { 39762306a36Sopenharmony_ci .id = 0x07, 39862306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 39962306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (TOP)", 40062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 40162306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 40262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 40362306a36Sopenharmony_ci }, { 40462306a36Sopenharmony_ci .id = 0x08, 40562306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 40662306a36Sopenharmony_ci .name = "CX24228/S5H1411-1 (QAM)", 40762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 40862306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 40962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 41062306a36Sopenharmony_ci }, { 41162306a36Sopenharmony_ci .id = 0x22, 41262306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 41362306a36Sopenharmony_ci .name = "TDA18271-2", 41462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 41562306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 41662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 41762306a36Sopenharmony_ci }, { 41862306a36Sopenharmony_ci .id = 0x24, 41962306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 42062306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (TOP)", 42162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 42262306a36Sopenharmony_ci .i2c_bus_addr = 0x32 >> 1, 42362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 42462306a36Sopenharmony_ci }, { 42562306a36Sopenharmony_ci .id = 0x27, 42662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 42762306a36Sopenharmony_ci .name = "CX24228/S5H1411-2 (QAM)", 42862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 42962306a36Sopenharmony_ci .i2c_bus_addr = 0x34 >> 1, 43062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 43162306a36Sopenharmony_ci } }, 43262306a36Sopenharmony_ci }, 43362306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2200_5] = { 43462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2200", 43562306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 43662306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 43762306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 43862306a36Sopenharmony_ci .unit = {{ 43962306a36Sopenharmony_ci .id = 0x23, 44062306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 44162306a36Sopenharmony_ci .name = "4K EEPROM", 44262306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 44362306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 44462306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 44562306a36Sopenharmony_ci }, { 44662306a36Sopenharmony_ci .id = 0x04, 44762306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 44862306a36Sopenharmony_ci .name = "TDA18271-1", 44962306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 45062306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 45162306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 45262306a36Sopenharmony_ci }, { 45362306a36Sopenharmony_ci .id = 0x05, 45462306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 45562306a36Sopenharmony_ci .name = "TDA8290-1", 45662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 45762306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 45862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 45962306a36Sopenharmony_ci }, { 46062306a36Sopenharmony_ci .id = 0x21, 46162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 46262306a36Sopenharmony_ci .name = "TDA18271-2", 46362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 46462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 46562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 46662306a36Sopenharmony_ci }, { 46762306a36Sopenharmony_ci .id = 0x22, 46862306a36Sopenharmony_ci .type = SAA7164_UNIT_ANALOG_DEMODULATOR, 46962306a36Sopenharmony_ci .name = "TDA8290-2", 47062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 47162306a36Sopenharmony_ci .i2c_bus_addr = 0x84 >> 1, 47262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 47362306a36Sopenharmony_ci }, { 47462306a36Sopenharmony_ci .id = 0x24, 47562306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 47662306a36Sopenharmony_ci .name = "TDA10048-1", 47762306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 47862306a36Sopenharmony_ci .i2c_bus_addr = 0x10 >> 1, 47962306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 48062306a36Sopenharmony_ci }, { 48162306a36Sopenharmony_ci .id = 0x25, 48262306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 48362306a36Sopenharmony_ci .name = "TDA10048-2", 48462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 48562306a36Sopenharmony_ci .i2c_bus_addr = 0x12 >> 1, 48662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 48762306a36Sopenharmony_ci } }, 48862306a36Sopenharmony_ci }, 48962306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2255proto] = { 49062306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2255(proto)", 49162306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 49262306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 49362306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 49462306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 49562306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 49662306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 49762306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 49862306a36Sopenharmony_ci .unit = {{ 49962306a36Sopenharmony_ci .id = 0x27, 50062306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 50162306a36Sopenharmony_ci .name = "4K EEPROM", 50262306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 50362306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 50462306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 50562306a36Sopenharmony_ci }, { 50662306a36Sopenharmony_ci .id = 0x04, 50762306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 50862306a36Sopenharmony_ci .name = "SI2157-1", 50962306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 51062306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 51162306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 51262306a36Sopenharmony_ci }, { 51362306a36Sopenharmony_ci .id = 0x06, 51462306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 51562306a36Sopenharmony_ci .name = "LGDT3306", 51662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 51762306a36Sopenharmony_ci .i2c_bus_addr = 0xb2 >> 1, 51862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 51962306a36Sopenharmony_ci }, { 52062306a36Sopenharmony_ci .id = 0x24, 52162306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 52262306a36Sopenharmony_ci .name = "SI2157-2", 52362306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 52462306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 52562306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 52662306a36Sopenharmony_ci }, { 52762306a36Sopenharmony_ci .id = 0x26, 52862306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 52962306a36Sopenharmony_ci .name = "LGDT3306-2", 53062306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 53162306a36Sopenharmony_ci .i2c_bus_addr = 0x1c >> 1, 53262306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 53362306a36Sopenharmony_ci } }, 53462306a36Sopenharmony_ci }, 53562306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2255] = { 53662306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2255", 53762306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 53862306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 53962306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 54062306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 54162306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 54262306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 54362306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 54462306a36Sopenharmony_ci .unit = {{ 54562306a36Sopenharmony_ci .id = 0x28, 54662306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 54762306a36Sopenharmony_ci .name = "4K EEPROM", 54862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 54962306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 55062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 55162306a36Sopenharmony_ci }, { 55262306a36Sopenharmony_ci .id = 0x04, 55362306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 55462306a36Sopenharmony_ci .name = "SI2157-1", 55562306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 55662306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 55762306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 55862306a36Sopenharmony_ci }, { 55962306a36Sopenharmony_ci .id = 0x06, 56062306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 56162306a36Sopenharmony_ci .name = "LGDT3306-1", 56262306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 56362306a36Sopenharmony_ci .i2c_bus_addr = 0xb2 >> 1, 56462306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 56562306a36Sopenharmony_ci }, { 56662306a36Sopenharmony_ci .id = 0x25, 56762306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 56862306a36Sopenharmony_ci .name = "SI2157-2", 56962306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 57062306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 57162306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 57262306a36Sopenharmony_ci }, { 57362306a36Sopenharmony_ci .id = 0x27, 57462306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 57562306a36Sopenharmony_ci .name = "LGDT3306-2", 57662306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 57762306a36Sopenharmony_ci .i2c_bus_addr = 0x1c >> 1, 57862306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 57962306a36Sopenharmony_ci } }, 58062306a36Sopenharmony_ci }, 58162306a36Sopenharmony_ci [SAA7164_BOARD_HAUPPAUGE_HVR2205] = { 58262306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR2205", 58362306a36Sopenharmony_ci .porta = SAA7164_MPEG_DVB, 58462306a36Sopenharmony_ci .portb = SAA7164_MPEG_DVB, 58562306a36Sopenharmony_ci .portc = SAA7164_MPEG_ENCODER, 58662306a36Sopenharmony_ci .portd = SAA7164_MPEG_ENCODER, 58762306a36Sopenharmony_ci .porte = SAA7164_MPEG_VBI, 58862306a36Sopenharmony_ci .portf = SAA7164_MPEG_VBI, 58962306a36Sopenharmony_ci .chiprev = SAA7164_CHIP_REV3, 59062306a36Sopenharmony_ci .unit = {{ 59162306a36Sopenharmony_ci .id = 0x28, 59262306a36Sopenharmony_ci .type = SAA7164_UNIT_EEPROM, 59362306a36Sopenharmony_ci .name = "4K EEPROM", 59462306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 59562306a36Sopenharmony_ci .i2c_bus_addr = 0xa0 >> 1, 59662306a36Sopenharmony_ci .i2c_reg_len = REGLEN_8bit, 59762306a36Sopenharmony_ci }, { 59862306a36Sopenharmony_ci .id = 0x04, 59962306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 60062306a36Sopenharmony_ci .name = "SI2157-1", 60162306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_0, 60262306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 60362306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 60462306a36Sopenharmony_ci }, { 60562306a36Sopenharmony_ci .id = 0x06, 60662306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 60762306a36Sopenharmony_ci .name = "SI2168-1", 60862306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 60962306a36Sopenharmony_ci .i2c_bus_addr = 0xc8 >> 1, 61062306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 61162306a36Sopenharmony_ci }, { 61262306a36Sopenharmony_ci .id = 0x25, 61362306a36Sopenharmony_ci .type = SAA7164_UNIT_TUNER, 61462306a36Sopenharmony_ci .name = "SI2157-2", 61562306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_1, 61662306a36Sopenharmony_ci .i2c_bus_addr = 0xc0 >> 1, 61762306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 61862306a36Sopenharmony_ci }, { 61962306a36Sopenharmony_ci .id = 0x27, 62062306a36Sopenharmony_ci .type = SAA7164_UNIT_DIGITAL_DEMODULATOR, 62162306a36Sopenharmony_ci .name = "SI2168-2", 62262306a36Sopenharmony_ci .i2c_bus_nr = SAA7164_I2C_BUS_2, 62362306a36Sopenharmony_ci .i2c_bus_addr = 0xcc >> 1, 62462306a36Sopenharmony_ci .i2c_reg_len = REGLEN_0bit, 62562306a36Sopenharmony_ci } }, 62662306a36Sopenharmony_ci }, 62762306a36Sopenharmony_ci}; 62862306a36Sopenharmony_ciconst unsigned int saa7164_bcount = ARRAY_SIZE(saa7164_boards); 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci/* ------------------------------------------------------------------ */ 63162306a36Sopenharmony_ci/* PCI subsystem IDs */ 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_cistruct saa7164_subid saa7164_subids[] = { 63462306a36Sopenharmony_ci { 63562306a36Sopenharmony_ci .subvendor = 0x0070, 63662306a36Sopenharmony_ci .subdevice = 0x8880, 63762306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2250, 63862306a36Sopenharmony_ci }, { 63962306a36Sopenharmony_ci .subvendor = 0x0070, 64062306a36Sopenharmony_ci .subdevice = 0x8810, 64162306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2250, 64262306a36Sopenharmony_ci }, { 64362306a36Sopenharmony_ci .subvendor = 0x0070, 64462306a36Sopenharmony_ci .subdevice = 0x8980, 64562306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2200, 64662306a36Sopenharmony_ci }, { 64762306a36Sopenharmony_ci .subvendor = 0x0070, 64862306a36Sopenharmony_ci .subdevice = 0x8900, 64962306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2200_2, 65062306a36Sopenharmony_ci }, { 65162306a36Sopenharmony_ci .subvendor = 0x0070, 65262306a36Sopenharmony_ci .subdevice = 0x8901, 65362306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2200_3, 65462306a36Sopenharmony_ci }, { 65562306a36Sopenharmony_ci .subvendor = 0x0070, 65662306a36Sopenharmony_ci .subdevice = 0x88A1, 65762306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2250_3, 65862306a36Sopenharmony_ci }, { 65962306a36Sopenharmony_ci .subvendor = 0x0070, 66062306a36Sopenharmony_ci .subdevice = 0x8891, 66162306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2250_2, 66262306a36Sopenharmony_ci }, { 66362306a36Sopenharmony_ci .subvendor = 0x0070, 66462306a36Sopenharmony_ci .subdevice = 0x8851, 66562306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2250_2, 66662306a36Sopenharmony_ci }, { 66762306a36Sopenharmony_ci .subvendor = 0x0070, 66862306a36Sopenharmony_ci .subdevice = 0x8940, 66962306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2200_4, 67062306a36Sopenharmony_ci }, { 67162306a36Sopenharmony_ci .subvendor = 0x0070, 67262306a36Sopenharmony_ci .subdevice = 0x8953, 67362306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2200_5, 67462306a36Sopenharmony_ci }, { 67562306a36Sopenharmony_ci .subvendor = 0x0070, 67662306a36Sopenharmony_ci .subdevice = 0xf111, 67762306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2255, 67862306a36Sopenharmony_ci /* Prototype card left here for documentation purposes. 67962306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2255proto, 68062306a36Sopenharmony_ci */ 68162306a36Sopenharmony_ci }, { 68262306a36Sopenharmony_ci .subvendor = 0x0070, 68362306a36Sopenharmony_ci .subdevice = 0xf123, 68462306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2205, 68562306a36Sopenharmony_ci }, { 68662306a36Sopenharmony_ci .subvendor = 0x0070, 68762306a36Sopenharmony_ci .subdevice = 0xf120, 68862306a36Sopenharmony_ci .card = SAA7164_BOARD_HAUPPAUGE_HVR2205, 68962306a36Sopenharmony_ci }, 69062306a36Sopenharmony_ci}; 69162306a36Sopenharmony_ciconst unsigned int saa7164_idcount = ARRAY_SIZE(saa7164_subids); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_civoid saa7164_card_list(struct saa7164_dev *dev) 69462306a36Sopenharmony_ci{ 69562306a36Sopenharmony_ci int i; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci if (0 == dev->pci->subsystem_vendor && 69862306a36Sopenharmony_ci 0 == dev->pci->subsystem_device) { 69962306a36Sopenharmony_ci printk(KERN_ERR 70062306a36Sopenharmony_ci "%s: Board has no valid PCIe Subsystem ID and can't\n" 70162306a36Sopenharmony_ci "%s: be autodetected. Pass card=<n> insmod option to\n" 70262306a36Sopenharmony_ci "%s: workaround that. Send complaints to the vendor\n" 70362306a36Sopenharmony_ci "%s: of the TV card. Best regards,\n" 70462306a36Sopenharmony_ci "%s: -- tux\n", 70562306a36Sopenharmony_ci dev->name, dev->name, dev->name, dev->name, dev->name); 70662306a36Sopenharmony_ci } else { 70762306a36Sopenharmony_ci printk(KERN_ERR 70862306a36Sopenharmony_ci "%s: Your board isn't known (yet) to the driver.\n" 70962306a36Sopenharmony_ci "%s: Try to pick one of the existing card configs via\n" 71062306a36Sopenharmony_ci "%s: card=<n> insmod option. Updating to the latest\n" 71162306a36Sopenharmony_ci "%s: version might help as well.\n", 71262306a36Sopenharmony_ci dev->name, dev->name, dev->name, dev->name); 71362306a36Sopenharmony_ci } 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci printk(KERN_ERR "%s: Here are valid choices for the card=<n> insmod option:\n", 71662306a36Sopenharmony_ci dev->name); 71762306a36Sopenharmony_ci 71862306a36Sopenharmony_ci for (i = 0; i < saa7164_bcount; i++) 71962306a36Sopenharmony_ci printk(KERN_ERR "%s: card=%d -> %s\n", 72062306a36Sopenharmony_ci dev->name, i, saa7164_boards[i].name); 72162306a36Sopenharmony_ci} 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci/* TODO: clean this define up into the -cards.c structs */ 72462306a36Sopenharmony_ci#define PCIEBRIDGE_UNITID 2 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_civoid saa7164_gpio_setup(struct saa7164_dev *dev) 72762306a36Sopenharmony_ci{ 72862306a36Sopenharmony_ci switch (dev->board) { 72962306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200: 73062306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_2: 73162306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_3: 73262306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_4: 73362306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_5: 73462306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250: 73562306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250_2: 73662306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250_3: 73762306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2255proto: 73862306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2255: 73962306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2205: 74062306a36Sopenharmony_ci /* 74162306a36Sopenharmony_ci HVR2200 / HVR2250 74262306a36Sopenharmony_ci GPIO 2: s5h1411 / tda10048-1 demod reset 74362306a36Sopenharmony_ci GPIO 3: s5h1411 / tda10048-2 demod reset 74462306a36Sopenharmony_ci GPIO 7: IRBlaster Zilog reset 74562306a36Sopenharmony_ci */ 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci /* HVR2255 74862306a36Sopenharmony_ci * GPIO 2: lgdg3306-1 demod reset 74962306a36Sopenharmony_ci * GPIO 3: lgdt3306-2 demod reset 75062306a36Sopenharmony_ci */ 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci /* HVR2205 75362306a36Sopenharmony_ci * GPIO 2: si2168-1 demod reset 75462306a36Sopenharmony_ci * GPIO 3: si2168-2 demod reset 75562306a36Sopenharmony_ci */ 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci /* Reset parts by going in and out of reset */ 75862306a36Sopenharmony_ci saa7164_api_clear_gpiobit(dev, PCIEBRIDGE_UNITID, 2); 75962306a36Sopenharmony_ci saa7164_api_clear_gpiobit(dev, PCIEBRIDGE_UNITID, 3); 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci msleep(20); 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci saa7164_api_set_gpiobit(dev, PCIEBRIDGE_UNITID, 2); 76462306a36Sopenharmony_ci saa7164_api_set_gpiobit(dev, PCIEBRIDGE_UNITID, 3); 76562306a36Sopenharmony_ci break; 76662306a36Sopenharmony_ci } 76762306a36Sopenharmony_ci} 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_cistatic void hauppauge_eeprom(struct saa7164_dev *dev, u8 *eeprom_data) 77062306a36Sopenharmony_ci{ 77162306a36Sopenharmony_ci struct tveeprom tv; 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci tveeprom_hauppauge_analog(&tv, eeprom_data); 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci /* Make sure we support the board model */ 77662306a36Sopenharmony_ci switch (tv.model) { 77762306a36Sopenharmony_ci case 88001: 77862306a36Sopenharmony_ci /* Development board - Limit circulation */ 77962306a36Sopenharmony_ci /* WinTV-HVR2250 (PCIe, Retail, full-height bracket) 78062306a36Sopenharmony_ci * ATSC/QAM (TDA18271/S5H1411) and basic analog, no IR, FM */ 78162306a36Sopenharmony_ci case 88021: 78262306a36Sopenharmony_ci /* WinTV-HVR2250 (PCIe, Retail, full-height bracket) 78362306a36Sopenharmony_ci * ATSC/QAM (TDA18271/S5H1411) and basic analog, MCE CIR, FM */ 78462306a36Sopenharmony_ci break; 78562306a36Sopenharmony_ci case 88041: 78662306a36Sopenharmony_ci /* WinTV-HVR2250 (PCIe, Retail, full-height bracket) 78762306a36Sopenharmony_ci * ATSC/QAM (TDA18271/S5H1411) and basic analog, no IR, FM */ 78862306a36Sopenharmony_ci break; 78962306a36Sopenharmony_ci case 88061: 79062306a36Sopenharmony_ci /* WinTV-HVR2250 (PCIe, Retail, full-height bracket) 79162306a36Sopenharmony_ci * ATSC/QAM (TDA18271/S5H1411) and basic analog, FM */ 79262306a36Sopenharmony_ci break; 79362306a36Sopenharmony_ci case 89519: 79462306a36Sopenharmony_ci case 89609: 79562306a36Sopenharmony_ci /* WinTV-HVR2200 (PCIe, Retail, full-height) 79662306a36Sopenharmony_ci * DVB-T (TDA18271/TDA10048) and basic analog, no IR */ 79762306a36Sopenharmony_ci break; 79862306a36Sopenharmony_ci case 89619: 79962306a36Sopenharmony_ci /* WinTV-HVR2200 (PCIe, Retail, half-height) 80062306a36Sopenharmony_ci * DVB-T (TDA18271/TDA10048) and basic analog, no IR */ 80162306a36Sopenharmony_ci break; 80262306a36Sopenharmony_ci case 151009: 80362306a36Sopenharmony_ci /* First production board rev B2I6 */ 80462306a36Sopenharmony_ci /* WinTV-HVR2205 (PCIe, Retail, full-height bracket) 80562306a36Sopenharmony_ci * DVB-T/T2/C (SI2157/SI2168) and basic analog, FM */ 80662306a36Sopenharmony_ci break; 80762306a36Sopenharmony_ci case 151609: 80862306a36Sopenharmony_ci /* First production board rev B2I6 */ 80962306a36Sopenharmony_ci /* WinTV-HVR2205 (PCIe, Retail, half-height bracket) 81062306a36Sopenharmony_ci * DVB-T/T2/C (SI2157/SI2168) and basic analog, FM */ 81162306a36Sopenharmony_ci break; 81262306a36Sopenharmony_ci case 151061: 81362306a36Sopenharmony_ci /* First production board rev B1I6 */ 81462306a36Sopenharmony_ci /* WinTV-HVR2255 (PCIe, Retail, full-height bracket) 81562306a36Sopenharmony_ci * ATSC/QAM (SI2157/LGDT3306) and basic analog, FM */ 81662306a36Sopenharmony_ci break; 81762306a36Sopenharmony_ci default: 81862306a36Sopenharmony_ci printk(KERN_ERR "%s: Warning: Unknown Hauppauge model #%d\n", 81962306a36Sopenharmony_ci dev->name, tv.model); 82062306a36Sopenharmony_ci break; 82162306a36Sopenharmony_ci } 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci printk(KERN_INFO "%s: Hauppauge eeprom: model=%d\n", dev->name, 82462306a36Sopenharmony_ci tv.model); 82562306a36Sopenharmony_ci} 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_civoid saa7164_card_setup(struct saa7164_dev *dev) 82862306a36Sopenharmony_ci{ 82962306a36Sopenharmony_ci static u8 eeprom[256]; 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci if (dev->i2c_bus[0].i2c_rc == 0) { 83262306a36Sopenharmony_ci if (saa7164_api_read_eeprom(dev, &eeprom[0], 83362306a36Sopenharmony_ci sizeof(eeprom)) < 0) 83462306a36Sopenharmony_ci return; 83562306a36Sopenharmony_ci } 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci switch (dev->board) { 83862306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200: 83962306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_2: 84062306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_3: 84162306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_4: 84262306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2200_5: 84362306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250: 84462306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250_2: 84562306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2250_3: 84662306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2255proto: 84762306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2255: 84862306a36Sopenharmony_ci case SAA7164_BOARD_HAUPPAUGE_HVR2205: 84962306a36Sopenharmony_ci hauppauge_eeprom(dev, &eeprom[0]); 85062306a36Sopenharmony_ci break; 85162306a36Sopenharmony_ci } 85262306a36Sopenharmony_ci} 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci/* With most other drivers, the kernel expects to communicate with subdrivers 85562306a36Sopenharmony_ci * through i2c. This bridge does not allow that, it does not expose any direct 85662306a36Sopenharmony_ci * access to I2C. Instead we have to communicate through the device f/w for 85762306a36Sopenharmony_ci * register access to 'processing units'. Each unit has a unique 85862306a36Sopenharmony_ci * id, regardless of how the physical implementation occurs across 85962306a36Sopenharmony_ci * the three physical i2c buses. The being said if we want leverge of 86062306a36Sopenharmony_ci * the existing kernel drivers for tuners and demods we have to 'speak i2c', 86162306a36Sopenharmony_ci * to this bridge implements 3 virtual i2c buses. This is a helper function 86262306a36Sopenharmony_ci * for those. 86362306a36Sopenharmony_ci * 86462306a36Sopenharmony_ci * Description: Translate the kernels notion of an i2c address and bus into 86562306a36Sopenharmony_ci * the appropriate unitid. 86662306a36Sopenharmony_ci */ 86762306a36Sopenharmony_ciint saa7164_i2caddr_to_unitid(struct saa7164_i2c *bus, int addr) 86862306a36Sopenharmony_ci{ 86962306a36Sopenharmony_ci /* For a given bus and i2c device address, return the saa7164 unique 87062306a36Sopenharmony_ci * unitid. < 0 on error */ 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci struct saa7164_dev *dev = bus->dev; 87362306a36Sopenharmony_ci struct saa7164_unit *unit; 87462306a36Sopenharmony_ci int i; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci for (i = 0; i < SAA7164_MAX_UNITS; i++) { 87762306a36Sopenharmony_ci unit = &saa7164_boards[dev->board].unit[i]; 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci if (unit->type == SAA7164_UNIT_UNDEFINED) 88062306a36Sopenharmony_ci continue; 88162306a36Sopenharmony_ci if ((bus->nr == unit->i2c_bus_nr) && 88262306a36Sopenharmony_ci (addr == unit->i2c_bus_addr)) 88362306a36Sopenharmony_ci return unit->id; 88462306a36Sopenharmony_ci } 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci return -1; 88762306a36Sopenharmony_ci} 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci/* The 7164 API needs to know the i2c register length in advance. 89062306a36Sopenharmony_ci * this is a helper function. Based on a specific chip addr and bus return the 89162306a36Sopenharmony_ci * reg length. 89262306a36Sopenharmony_ci */ 89362306a36Sopenharmony_ciint saa7164_i2caddr_to_reglen(struct saa7164_i2c *bus, int addr) 89462306a36Sopenharmony_ci{ 89562306a36Sopenharmony_ci /* For a given bus and i2c device address, return the 89662306a36Sopenharmony_ci * saa7164 registry address width. < 0 on error 89762306a36Sopenharmony_ci */ 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci struct saa7164_dev *dev = bus->dev; 90062306a36Sopenharmony_ci struct saa7164_unit *unit; 90162306a36Sopenharmony_ci int i; 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_ci for (i = 0; i < SAA7164_MAX_UNITS; i++) { 90462306a36Sopenharmony_ci unit = &saa7164_boards[dev->board].unit[i]; 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci if (unit->type == SAA7164_UNIT_UNDEFINED) 90762306a36Sopenharmony_ci continue; 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci if ((bus->nr == unit->i2c_bus_nr) && 91062306a36Sopenharmony_ci (addr == unit->i2c_bus_addr)) 91162306a36Sopenharmony_ci return unit->i2c_reg_len; 91262306a36Sopenharmony_ci } 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci return -1; 91562306a36Sopenharmony_ci} 91662306a36Sopenharmony_ci/* TODO: implement a 'findeeprom' functio like the above and fix any other 91762306a36Sopenharmony_ci * eeprom related todo's in -api.c. 91862306a36Sopenharmony_ci */ 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci/* Translate a unitid into a x readable device name, for display purposes. */ 92162306a36Sopenharmony_cichar *saa7164_unitid_name(struct saa7164_dev *dev, u8 unitid) 92262306a36Sopenharmony_ci{ 92362306a36Sopenharmony_ci char *undefed = "UNDEFINED"; 92462306a36Sopenharmony_ci char *bridge = "BRIDGE"; 92562306a36Sopenharmony_ci struct saa7164_unit *unit; 92662306a36Sopenharmony_ci int i; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci if (unitid == 0) 92962306a36Sopenharmony_ci return bridge; 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_ci for (i = 0; i < SAA7164_MAX_UNITS; i++) { 93262306a36Sopenharmony_ci unit = &saa7164_boards[dev->board].unit[i]; 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci if (unit->type == SAA7164_UNIT_UNDEFINED) 93562306a36Sopenharmony_ci continue; 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci if (unitid == unit->id) 93862306a36Sopenharmony_ci return unit->name; 93962306a36Sopenharmony_ci } 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_ci return undefed; 94262306a36Sopenharmony_ci} 94362306a36Sopenharmony_ci 944