brintos

brintos / linux-shallow public Read only

0
0
Text · 9.3 KiB · d7d9cd0 Raw
380 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * ddbridge-hw.c: Digital Devices bridge hardware maps4 *5 * Copyright (C) 2010-2017 Digital Devices GmbH6 *                         Ralph Metzler <rjkm@metzlerbros.de>7 *                         Marcus Metzler <mocm@metzlerbros.de>8 */9 10#include "ddbridge.h"11#include "ddbridge-hw.h"12 13/******************************************************************************/14 15static const struct ddb_regset octopus_input = {16	.base = 0x200,17	.num  = 0x08,18	.size = 0x10,19};20 21static const struct ddb_regset octopus_output = {22	.base = 0x280,23	.num  = 0x08,24	.size = 0x10,25};26 27static const struct ddb_regset octopus_idma = {28	.base = 0x300,29	.num  = 0x08,30	.size = 0x10,31};32 33static const struct ddb_regset octopus_idma_buf = {34	.base = 0x2000,35	.num  = 0x08,36	.size = 0x100,37};38 39static const struct ddb_regset octopus_odma = {40	.base = 0x380,41	.num  = 0x04,42	.size = 0x10,43};44 45static const struct ddb_regset octopus_odma_buf = {46	.base = 0x2800,47	.num  = 0x04,48	.size = 0x100,49};50 51static const struct ddb_regset octopus_i2c = {52	.base = 0x80,53	.num  = 0x04,54	.size = 0x20,55};56 57static const struct ddb_regset octopus_i2c_buf = {58	.base = 0x1000,59	.num  = 0x04,60	.size = 0x200,61};62 63/****************************************************************************/64 65static const struct ddb_regmap octopus_map = {66	.irq_base_i2c = 0,67	.irq_base_idma = 8,68	.irq_base_odma = 16,69	.i2c = &octopus_i2c,70	.i2c_buf = &octopus_i2c_buf,71	.idma = &octopus_idma,72	.idma_buf = &octopus_idma_buf,73	.odma = &octopus_odma,74	.odma_buf = &octopus_odma_buf,75	.input = &octopus_input,76	.output = &octopus_output,77};78 79/****************************************************************************/80 81static const struct ddb_info ddb_none = {82	.type     = DDB_NONE,83	.name     = "unknown Digital Devices PCIe card, install newer driver",84	.regmap   = &octopus_map,85};86 87static const struct ddb_info ddb_octopus = {88	.type     = DDB_OCTOPUS,89	.name     = "Digital Devices Octopus DVB adapter",90	.regmap   = &octopus_map,91	.port_num = 4,92	.i2c_mask = 0x0f,93};94 95static const struct ddb_info ddb_octopusv3 = {96	.type     = DDB_OCTOPUS,97	.name     = "Digital Devices Octopus V3 DVB adapter",98	.regmap   = &octopus_map,99	.port_num = 4,100	.i2c_mask = 0x0f,101};102 103static const struct ddb_info ddb_octopus_le = {104	.type     = DDB_OCTOPUS,105	.name     = "Digital Devices Octopus LE DVB adapter",106	.regmap   = &octopus_map,107	.port_num = 2,108	.i2c_mask = 0x03,109};110 111static const struct ddb_info ddb_octopus_oem = {112	.type     = DDB_OCTOPUS,113	.name     = "Digital Devices Octopus OEM",114	.regmap   = &octopus_map,115	.port_num = 4,116	.i2c_mask = 0x0f,117	.led_num  = 1,118	.fan_num  = 1,119	.temp_num = 1,120	.temp_bus = 0,121};122 123static const struct ddb_info ddb_octopus_mini = {124	.type     = DDB_OCTOPUS,125	.name     = "Digital Devices Octopus Mini",126	.regmap   = &octopus_map,127	.port_num = 4,128	.i2c_mask = 0x0f,129};130 131static const struct ddb_info ddb_v6 = {132	.type     = DDB_OCTOPUS,133	.name     = "Digital Devices Cine S2 V6 DVB adapter",134	.regmap   = &octopus_map,135	.port_num = 3,136	.i2c_mask = 0x07,137};138 139static const struct ddb_info ddb_v6_5 = {140	.type     = DDB_OCTOPUS,141	.name     = "Digital Devices Cine S2 V6.5 DVB adapter",142	.regmap   = &octopus_map,143	.port_num = 4,144	.i2c_mask = 0x0f,145};146 147static const struct ddb_info ddb_v7 = {148	.type     = DDB_OCTOPUS,149	.name     = "Digital Devices Cine S2 V7 DVB adapter",150	.regmap   = &octopus_map,151	.port_num = 4,152	.i2c_mask = 0x0f,153	.board_control   = 2,154	.board_control_2 = 4,155	.ts_quirks = TS_QUIRK_REVERSED,156};157 158static const struct ddb_info ddb_v7a = {159	.type     = DDB_OCTOPUS,160	.name     = "Digital Devices Cine S2 V7 Advanced DVB adapter",161	.regmap   = &octopus_map,162	.port_num = 4,163	.i2c_mask = 0x0f,164	.board_control   = 2,165	.board_control_2 = 4,166	.ts_quirks = TS_QUIRK_REVERSED,167};168 169static const struct ddb_info ddb_ctv7 = {170	.type     = DDB_OCTOPUS,171	.name     = "Digital Devices Cine CT V7 DVB adapter",172	.regmap   = &octopus_map,173	.port_num = 4,174	.i2c_mask = 0x0f,175	.board_control   = 3,176	.board_control_2 = 4,177};178 179static const struct ddb_info ddb_satixs2v3 = {180	.type     = DDB_OCTOPUS,181	.name     = "Mystique SaTiX-S2 V3 DVB adapter",182	.regmap   = &octopus_map,183	.port_num = 3,184	.i2c_mask = 0x07,185};186 187static const struct ddb_info ddb_ci = {188	.type     = DDB_OCTOPUS_CI,189	.name     = "Digital Devices Octopus CI",190	.regmap   = &octopus_map,191	.port_num = 4,192	.i2c_mask = 0x03,193};194 195static const struct ddb_info ddb_cis = {196	.type     = DDB_OCTOPUS_CI,197	.name     = "Digital Devices Octopus CI single",198	.regmap   = &octopus_map,199	.port_num = 3,200	.i2c_mask = 0x03,201};202 203static const struct ddb_info ddb_ci_s2_pro = {204	.type     = DDB_OCTOPUS_CI,205	.name     = "Digital Devices Octopus CI S2 Pro",206	.regmap   = &octopus_map,207	.port_num = 4,208	.i2c_mask = 0x01,209	.board_control   = 2,210	.board_control_2 = 4,211};212 213static const struct ddb_info ddb_ci_s2_pro_a = {214	.type     = DDB_OCTOPUS_CI,215	.name     = "Digital Devices Octopus CI S2 Pro Advanced",216	.regmap   = &octopus_map,217	.port_num = 4,218	.i2c_mask = 0x01,219	.board_control   = 2,220	.board_control_2 = 4,221};222 223static const struct ddb_info ddb_dvbct = {224	.type     = DDB_OCTOPUS,225	.name     = "Digital Devices DVBCT V6.1 DVB adapter",226	.regmap   = &octopus_map,227	.port_num = 3,228	.i2c_mask = 0x07,229};230 231/****************************************************************************/232 233static const struct ddb_info ddb_ct2_8 = {234	.type     = DDB_OCTOPUS_MAX_CT,235	.name     = "Digital Devices MAX A8 CT2",236	.regmap   = &octopus_map,237	.port_num = 4,238	.i2c_mask = 0x0f,239	.board_control   = 0x0ff,240	.board_control_2 = 0xf00,241	.ts_quirks = TS_QUIRK_SERIAL,242	.tempmon_irq = 24,243};244 245static const struct ddb_info ddb_c2t2_8 = {246	.type     = DDB_OCTOPUS_MAX_CT,247	.name     = "Digital Devices MAX A8 C2T2",248	.regmap   = &octopus_map,249	.port_num = 4,250	.i2c_mask = 0x0f,251	.board_control   = 0x0ff,252	.board_control_2 = 0xf00,253	.ts_quirks = TS_QUIRK_SERIAL,254	.tempmon_irq = 24,255};256 257static const struct ddb_info ddb_isdbt_8 = {258	.type     = DDB_OCTOPUS_MAX_CT,259	.name     = "Digital Devices MAX A8 ISDBT",260	.regmap   = &octopus_map,261	.port_num = 4,262	.i2c_mask = 0x0f,263	.board_control   = 0x0ff,264	.board_control_2 = 0xf00,265	.ts_quirks = TS_QUIRK_SERIAL,266	.tempmon_irq = 24,267};268 269static const struct ddb_info ddb_c2t2i_v0_8 = {270	.type     = DDB_OCTOPUS_MAX_CT,271	.name     = "Digital Devices MAX A8 C2T2I V0",272	.regmap   = &octopus_map,273	.port_num = 4,274	.i2c_mask = 0x0f,275	.board_control   = 0x0ff,276	.board_control_2 = 0xf00,277	.ts_quirks = TS_QUIRK_SERIAL | TS_QUIRK_ALT_OSC,278	.tempmon_irq = 24,279};280 281static const struct ddb_info ddb_c2t2i_8 = {282	.type     = DDB_OCTOPUS_MAX_CT,283	.name     = "Digital Devices MAX A8 C2T2I",284	.regmap   = &octopus_map,285	.port_num = 4,286	.i2c_mask = 0x0f,287	.board_control   = 0x0ff,288	.board_control_2 = 0xf00,289	.ts_quirks = TS_QUIRK_SERIAL,290	.tempmon_irq = 24,291};292 293/****************************************************************************/294 295static const struct ddb_info ddb_s2_48 = {296	.type     = DDB_OCTOPUS_MAX,297	.name     = "Digital Devices MAX S8 4/8",298	.regmap   = &octopus_map,299	.port_num = 4,300	.i2c_mask = 0x01,301	.board_control = 1,302	.tempmon_irq = 24,303};304 305static const struct ddb_info ddb_s2x_48 = {306	.type     = DDB_OCTOPUS_MCI,307	.name     = "Digital Devices MAX SX8",308	.regmap   = &octopus_map,309	.port_num = 4,310	.i2c_mask = 0x00,311	.tempmon_irq = 24,312	.mci_ports = 4,313	.mci_type = 0,314};315 316/****************************************************************************/317/****************************************************************************/318/****************************************************************************/319 320#define DDB_DEVID(_device, _subdevice, _info) { \321	.vendor = DDVID, \322	.device = _device, \323	.subvendor = DDVID, \324	.subdevice = _subdevice, \325	.info = &_info }326 327static const struct ddb_device_id ddb_device_ids[] = {328	/* PCIe devices */329	DDB_DEVID(0x0002, 0x0001, ddb_octopus),330	DDB_DEVID(0x0003, 0x0001, ddb_octopus),331	DDB_DEVID(0x0005, 0x0004, ddb_octopusv3),332	DDB_DEVID(0x0003, 0x0002, ddb_octopus_le),333	DDB_DEVID(0x0003, 0x0003, ddb_octopus_oem),334	DDB_DEVID(0x0003, 0x0010, ddb_octopus_mini),335	DDB_DEVID(0x0005, 0x0011, ddb_octopus_mini),336	DDB_DEVID(0x0003, 0x0020, ddb_v6),337	DDB_DEVID(0x0003, 0x0021, ddb_v6_5),338	DDB_DEVID(0x0006, 0x0022, ddb_v7),339	DDB_DEVID(0x0006, 0x0024, ddb_v7a),340	DDB_DEVID(0x0003, 0x0030, ddb_dvbct),341	DDB_DEVID(0x0003, 0xdb03, ddb_satixs2v3),342	DDB_DEVID(0x0006, 0x0031, ddb_ctv7),343	DDB_DEVID(0x0006, 0x0032, ddb_ctv7),344	DDB_DEVID(0x0006, 0x0033, ddb_ctv7),345	DDB_DEVID(0x0007, 0x0023, ddb_s2_48),346	DDB_DEVID(0x0008, 0x0034, ddb_ct2_8),347	DDB_DEVID(0x0008, 0x0035, ddb_c2t2_8),348	DDB_DEVID(0x0008, 0x0036, ddb_isdbt_8),349	DDB_DEVID(0x0008, 0x0037, ddb_c2t2i_v0_8),350	DDB_DEVID(0x0008, 0x0038, ddb_c2t2i_8),351	DDB_DEVID(0x0009, 0x0025, ddb_s2x_48),352	DDB_DEVID(0x0006, 0x0039, ddb_ctv7),353	DDB_DEVID(0x0011, 0x0040, ddb_ci),354	DDB_DEVID(0x0011, 0x0041, ddb_cis),355	DDB_DEVID(0x0012, 0x0042, ddb_ci),356	DDB_DEVID(0x0013, 0x0043, ddb_ci_s2_pro),357	DDB_DEVID(0x0013, 0x0044, ddb_ci_s2_pro_a),358};359 360/****************************************************************************/361 362const struct ddb_info *get_ddb_info(u16 vendor, u16 device,363				    u16 subvendor, u16 subdevice)364{365	int i;366 367	for (i = 0; i < ARRAY_SIZE(ddb_device_ids); i++) {368		const struct ddb_device_id *id = &ddb_device_ids[i];369 370		if (vendor == id->vendor &&371		    device == id->device &&372		    subvendor == id->subvendor &&373		    (subdevice == id->subdevice ||374		     id->subdevice == 0xffff))375			return id->info;376	}377 378	return &ddb_none;379}380