0001
0002
0003
0004
0005
0006
0007
0008 #include "saa7164.h"
0009
0010 #include "tda10048.h"
0011 #include "tda18271.h"
0012 #include "s5h1411.h"
0013 #include "si2157.h"
0014 #include "si2168.h"
0015 #include "lgdt3306a.h"
0016
0017 #define DRIVER_NAME "saa7164"
0018
0019 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
0020
0021
0022 static struct tda10048_config hauppauge_hvr2200_1_config = {
0023 .demod_address = 0x10 >> 1,
0024 .output_mode = TDA10048_SERIAL_OUTPUT,
0025 .fwbulkwritelen = TDA10048_BULKWRITE_200,
0026 .inversion = TDA10048_INVERSION_ON,
0027 .dtv6_if_freq_khz = TDA10048_IF_3300,
0028 .dtv7_if_freq_khz = TDA10048_IF_3500,
0029 .dtv8_if_freq_khz = TDA10048_IF_4000,
0030 .clk_freq_khz = TDA10048_CLK_16000,
0031 };
0032 static struct tda10048_config hauppauge_hvr2200_2_config = {
0033 .demod_address = 0x12 >> 1,
0034 .output_mode = TDA10048_SERIAL_OUTPUT,
0035 .fwbulkwritelen = TDA10048_BULKWRITE_200,
0036 .inversion = TDA10048_INVERSION_ON,
0037 .dtv6_if_freq_khz = TDA10048_IF_3300,
0038 .dtv7_if_freq_khz = TDA10048_IF_3500,
0039 .dtv8_if_freq_khz = TDA10048_IF_4000,
0040 .clk_freq_khz = TDA10048_CLK_16000,
0041 };
0042
0043 static struct tda18271_std_map hauppauge_tda18271_std_map = {
0044 .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 3,
0045 .if_lvl = 6, .rfagc_top = 0x37 },
0046 .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 0,
0047 .if_lvl = 6, .rfagc_top = 0x37 },
0048 };
0049
0050 static struct tda18271_config hauppauge_hvr22x0_tuner_config = {
0051 .std_map = &hauppauge_tda18271_std_map,
0052 .gate = TDA18271_GATE_ANALOG,
0053 .role = TDA18271_MASTER,
0054 };
0055
0056 static struct tda18271_config hauppauge_hvr22x0s_tuner_config = {
0057 .std_map = &hauppauge_tda18271_std_map,
0058 .gate = TDA18271_GATE_ANALOG,
0059 .role = TDA18271_SLAVE,
0060 .output_opt = TDA18271_OUTPUT_LT_OFF,
0061 .rf_cal_on_startup = 1
0062 };
0063
0064 static struct s5h1411_config hauppauge_s5h1411_config = {
0065 .output_mode = S5H1411_SERIAL_OUTPUT,
0066 .gpio = S5H1411_GPIO_ON,
0067 .qam_if = S5H1411_IF_4000,
0068 .vsb_if = S5H1411_IF_3250,
0069 .inversion = S5H1411_INVERSION_ON,
0070 .status_mode = S5H1411_DEMODLOCKING,
0071 .mpeg_timing = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
0072 };
0073
0074 static struct lgdt3306a_config hauppauge_hvr2255a_config = {
0075 .i2c_addr = 0xb2 >> 1,
0076 .qam_if_khz = 4000,
0077 .vsb_if_khz = 3250,
0078 .deny_i2c_rptr = 1,
0079 .spectral_inversion = 0,
0080 .mpeg_mode = LGDT3306A_MPEG_SERIAL,
0081 .tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE,
0082 .tpvalid_polarity = LGDT3306A_TP_VALID_HIGH,
0083 .xtalMHz = 25,
0084 };
0085
0086 static struct lgdt3306a_config hauppauge_hvr2255b_config = {
0087 .i2c_addr = 0x1c >> 1,
0088 .qam_if_khz = 4000,
0089 .vsb_if_khz = 3250,
0090 .deny_i2c_rptr = 1,
0091 .spectral_inversion = 0,
0092 .mpeg_mode = LGDT3306A_MPEG_SERIAL,
0093 .tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE,
0094 .tpvalid_polarity = LGDT3306A_TP_VALID_HIGH,
0095 .xtalMHz = 25,
0096 };
0097
0098 static struct si2157_config hauppauge_hvr2255_tuner_config = {
0099 .inversion = 1,
0100 .if_port = 1,
0101 };
0102
0103 static int si2157_attach(struct saa7164_port *port, struct i2c_adapter *adapter,
0104 struct dvb_frontend *fe, u8 addr8bit, struct si2157_config *cfg)
0105 {
0106 struct i2c_board_info bi;
0107 struct i2c_client *tuner;
0108
0109 cfg->fe = fe;
0110
0111 memset(&bi, 0, sizeof(bi));
0112
0113 strscpy(bi.type, "si2157", I2C_NAME_SIZE);
0114 bi.platform_data = cfg;
0115 bi.addr = addr8bit >> 1;
0116
0117 request_module(bi.type);
0118
0119 tuner = i2c_new_client_device(adapter, &bi);
0120 if (!i2c_client_has_driver(tuner))
0121 return -ENODEV;
0122
0123 if (!try_module_get(tuner->dev.driver->owner)) {
0124 i2c_unregister_device(tuner);
0125 return -ENODEV;
0126 }
0127
0128 port->i2c_client_tuner = tuner;
0129
0130 return 0;
0131 }
0132
0133 static int saa7164_dvb_stop_port(struct saa7164_port *port)
0134 {
0135 struct saa7164_dev *dev = port->dev;
0136 int ret;
0137
0138 ret = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
0139 if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
0140 printk(KERN_ERR "%s() stop transition failed, ret = 0x%x\n",
0141 __func__, ret);
0142 ret = -EIO;
0143 } else {
0144 dprintk(DBGLVL_DVB, "%s() Stopped\n", __func__);
0145 ret = 0;
0146 }
0147
0148 return ret;
0149 }
0150
0151 static int saa7164_dvb_acquire_port(struct saa7164_port *port)
0152 {
0153 struct saa7164_dev *dev = port->dev;
0154 int ret;
0155
0156 ret = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
0157 if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
0158 printk(KERN_ERR "%s() acquire transition failed, ret = 0x%x\n",
0159 __func__, ret);
0160 ret = -EIO;
0161 } else {
0162 dprintk(DBGLVL_DVB, "%s() Acquired\n", __func__);
0163 ret = 0;
0164 }
0165
0166 return ret;
0167 }
0168
0169 static int saa7164_dvb_pause_port(struct saa7164_port *port)
0170 {
0171 struct saa7164_dev *dev = port->dev;
0172 int ret;
0173
0174 ret = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
0175 if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
0176 printk(KERN_ERR "%s() pause transition failed, ret = 0x%x\n",
0177 __func__, ret);
0178 ret = -EIO;
0179 } else {
0180 dprintk(DBGLVL_DVB, "%s() Paused\n", __func__);
0181 ret = 0;
0182 }
0183
0184 return ret;
0185 }
0186
0187
0188
0189
0190
0191 static int saa7164_dvb_stop_streaming(struct saa7164_port *port)
0192 {
0193 struct saa7164_dev *dev = port->dev;
0194 struct saa7164_buffer *buf;
0195 struct list_head *p, *q;
0196 int ret;
0197
0198 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
0199
0200 ret = saa7164_dvb_pause_port(port);
0201 ret = saa7164_dvb_acquire_port(port);
0202 ret = saa7164_dvb_stop_port(port);
0203
0204
0205 mutex_lock(&port->dmaqueue_lock);
0206 list_for_each_safe(p, q, &port->dmaqueue.list) {
0207 buf = list_entry(p, struct saa7164_buffer, list);
0208 buf->flags = SAA7164_BUFFER_FREE;
0209 }
0210 mutex_unlock(&port->dmaqueue_lock);
0211
0212 return ret;
0213 }
0214
0215 static int saa7164_dvb_start_port(struct saa7164_port *port)
0216 {
0217 struct saa7164_dev *dev = port->dev;
0218 int ret = 0, result;
0219
0220 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
0221
0222 saa7164_buffer_cfg_port(port);
0223
0224
0225 result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
0226 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0227 printk(KERN_ERR "%s() acquire transition failed, res = 0x%x\n",
0228 __func__, result);
0229
0230
0231 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
0232 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0233 printk(KERN_ERR "%s() acquire/forced stop transition failed, res = 0x%x\n",
0234 __func__, result);
0235 }
0236 ret = -EIO;
0237 goto out;
0238 } else
0239 dprintk(DBGLVL_DVB, "%s() Acquired\n", __func__);
0240
0241
0242 result = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
0243 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0244 printk(KERN_ERR "%s() pause transition failed, res = 0x%x\n",
0245 __func__, result);
0246
0247
0248 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
0249 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0250 printk(KERN_ERR "%s() pause/forced stop transition failed, res = 0x%x\n",
0251 __func__, result);
0252 }
0253
0254 ret = -EIO;
0255 goto out;
0256 } else
0257 dprintk(DBGLVL_DVB, "%s() Paused\n", __func__);
0258
0259
0260 result = saa7164_api_transition_port(port, SAA_DMASTATE_RUN);
0261 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0262 printk(KERN_ERR "%s() run transition failed, result = 0x%x\n",
0263 __func__, result);
0264
0265
0266 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
0267 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
0268 printk(KERN_ERR "%s() run/forced stop transition failed, res = 0x%x\n",
0269 __func__, result);
0270 }
0271
0272 ret = -EIO;
0273 } else
0274 dprintk(DBGLVL_DVB, "%s() Running\n", __func__);
0275
0276 out:
0277 return ret;
0278 }
0279
0280 static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed)
0281 {
0282 struct dvb_demux *demux = feed->demux;
0283 struct saa7164_port *port = (struct saa7164_port *) demux->priv;
0284 struct saa7164_dvb *dvb = &port->dvb;
0285 struct saa7164_dev *dev = port->dev;
0286 int ret = 0;
0287
0288 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
0289
0290 if (!demux->dmx.frontend)
0291 return -EINVAL;
0292
0293 if (dvb) {
0294 mutex_lock(&dvb->lock);
0295 if (dvb->feeding++ == 0) {
0296
0297 ret = saa7164_dvb_start_port(port);
0298 }
0299 mutex_unlock(&dvb->lock);
0300 dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n",
0301 __func__, port->nr, dvb->feeding);
0302 }
0303
0304 return ret;
0305 }
0306
0307 static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed)
0308 {
0309 struct dvb_demux *demux = feed->demux;
0310 struct saa7164_port *port = (struct saa7164_port *) demux->priv;
0311 struct saa7164_dvb *dvb = &port->dvb;
0312 struct saa7164_dev *dev = port->dev;
0313 int ret = 0;
0314
0315 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
0316
0317 if (dvb) {
0318 mutex_lock(&dvb->lock);
0319 if (--dvb->feeding == 0) {
0320
0321 ret = saa7164_dvb_stop_streaming(port);
0322 }
0323 mutex_unlock(&dvb->lock);
0324 dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n",
0325 __func__, port->nr, dvb->feeding);
0326 }
0327
0328 return ret;
0329 }
0330
0331 static int dvb_register(struct saa7164_port *port)
0332 {
0333 struct saa7164_dvb *dvb = &port->dvb;
0334 struct saa7164_dev *dev = port->dev;
0335 struct saa7164_buffer *buf;
0336 int result, i;
0337
0338 dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
0339
0340 BUG_ON(port->type != SAA7164_MPEG_DVB);
0341
0342
0343 if (port->hwcfg.BARLocation == 0) {
0344 result = -ENOMEM;
0345 printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d), NO PCI configuration\n",
0346 DRIVER_NAME, result);
0347 goto fail_adapter;
0348 }
0349
0350
0351 port->hw_streamingparams.bitspersample = 8;
0352 port->hw_streamingparams.samplesperline = 188;
0353 port->hw_streamingparams.numberoflines =
0354 (SAA7164_TS_NUMBER_OF_LINES * 188) / 188;
0355
0356 port->hw_streamingparams.pitch = 188;
0357 port->hw_streamingparams.linethreshold = 0;
0358 port->hw_streamingparams.pagetablelistvirt = NULL;
0359 port->hw_streamingparams.pagetablelistphys = NULL;
0360 port->hw_streamingparams.numpagetables = 2 +
0361 ((SAA7164_TS_NUMBER_OF_LINES * 188) / PAGE_SIZE);
0362
0363 port->hw_streamingparams.numpagetableentries = port->hwcfg.buffercount;
0364
0365
0366 for (i = 0; i < port->hwcfg.buffercount; i++) {
0367 buf = saa7164_buffer_alloc(port,
0368 port->hw_streamingparams.numberoflines *
0369 port->hw_streamingparams.pitch);
0370
0371 if (!buf) {
0372 result = -ENOMEM;
0373 printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d), unable to allocate buffers\n",
0374 DRIVER_NAME, result);
0375 goto fail_adapter;
0376 }
0377
0378 mutex_lock(&port->dmaqueue_lock);
0379 list_add_tail(&buf->list, &port->dmaqueue.list);
0380 mutex_unlock(&port->dmaqueue_lock);
0381 }
0382
0383
0384 result = dvb_register_adapter(&dvb->adapter, DRIVER_NAME, THIS_MODULE,
0385 &dev->pci->dev, adapter_nr);
0386 if (result < 0) {
0387 printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d)\n",
0388 DRIVER_NAME, result);
0389 goto fail_adapter;
0390 }
0391 dvb->adapter.priv = port;
0392
0393
0394 result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
0395 if (result < 0) {
0396 printk(KERN_ERR "%s: dvb_register_frontend failed (errno = %d)\n",
0397 DRIVER_NAME, result);
0398 goto fail_frontend;
0399 }
0400
0401
0402 dvb->demux.dmx.capabilities =
0403 DMX_TS_FILTERING | DMX_SECTION_FILTERING |
0404 DMX_MEMORY_BASED_FILTERING;
0405 dvb->demux.priv = port;
0406 dvb->demux.filternum = 256;
0407 dvb->demux.feednum = 256;
0408 dvb->demux.start_feed = saa7164_dvb_start_feed;
0409 dvb->demux.stop_feed = saa7164_dvb_stop_feed;
0410 result = dvb_dmx_init(&dvb->demux);
0411 if (result < 0) {
0412 printk(KERN_ERR "%s: dvb_dmx_init failed (errno = %d)\n",
0413 DRIVER_NAME, result);
0414 goto fail_dmx;
0415 }
0416
0417 dvb->dmxdev.filternum = 256;
0418 dvb->dmxdev.demux = &dvb->demux.dmx;
0419 dvb->dmxdev.capabilities = 0;
0420 result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
0421 if (result < 0) {
0422 printk(KERN_ERR "%s: dvb_dmxdev_init failed (errno = %d)\n",
0423 DRIVER_NAME, result);
0424 goto fail_dmxdev;
0425 }
0426
0427 dvb->fe_hw.source = DMX_FRONTEND_0;
0428 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0429 if (result < 0) {
0430 printk(KERN_ERR "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
0431 DRIVER_NAME, result);
0432 goto fail_fe_hw;
0433 }
0434
0435 dvb->fe_mem.source = DMX_MEMORY_FE;
0436 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0437 if (result < 0) {
0438 printk(KERN_ERR "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
0439 DRIVER_NAME, result);
0440 goto fail_fe_mem;
0441 }
0442
0443 result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0444 if (result < 0) {
0445 printk(KERN_ERR "%s: connect_frontend failed (errno = %d)\n",
0446 DRIVER_NAME, result);
0447 goto fail_fe_conn;
0448 }
0449
0450
0451 dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
0452 return 0;
0453
0454 fail_fe_conn:
0455 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0456 fail_fe_mem:
0457 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0458 fail_fe_hw:
0459 dvb_dmxdev_release(&dvb->dmxdev);
0460 fail_dmxdev:
0461 dvb_dmx_release(&dvb->demux);
0462 fail_dmx:
0463 dvb_unregister_frontend(dvb->frontend);
0464 fail_frontend:
0465 dvb_frontend_detach(dvb->frontend);
0466 dvb_unregister_adapter(&dvb->adapter);
0467 fail_adapter:
0468 return result;
0469 }
0470
0471 int saa7164_dvb_unregister(struct saa7164_port *port)
0472 {
0473 struct saa7164_dvb *dvb = &port->dvb;
0474 struct saa7164_dev *dev = port->dev;
0475 struct saa7164_buffer *b;
0476 struct list_head *c, *n;
0477 struct i2c_client *client;
0478
0479 dprintk(DBGLVL_DVB, "%s()\n", __func__);
0480
0481 BUG_ON(port->type != SAA7164_MPEG_DVB);
0482
0483
0484 mutex_lock(&port->dmaqueue_lock);
0485 list_for_each_safe(c, n, &port->dmaqueue.list) {
0486 b = list_entry(c, struct saa7164_buffer, list);
0487 list_del(c);
0488 saa7164_buffer_dealloc(b);
0489 }
0490 mutex_unlock(&port->dmaqueue_lock);
0491
0492 if (dvb->frontend == NULL)
0493 return 0;
0494
0495
0496 client = port->i2c_client_tuner;
0497 if (client) {
0498 module_put(client->dev.driver->owner);
0499 i2c_unregister_device(client);
0500 }
0501
0502
0503 client = port->i2c_client_demod;
0504 if (client) {
0505 module_put(client->dev.driver->owner);
0506 i2c_unregister_device(client);
0507 }
0508
0509 dvb_net_release(&dvb->net);
0510 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
0511 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
0512 dvb_dmxdev_release(&dvb->dmxdev);
0513 dvb_dmx_release(&dvb->demux);
0514 dvb_unregister_frontend(dvb->frontend);
0515 dvb_frontend_detach(dvb->frontend);
0516 dvb_unregister_adapter(&dvb->adapter);
0517 return 0;
0518 }
0519
0520
0521
0522
0523 int saa7164_dvb_register(struct saa7164_port *port)
0524 {
0525 struct saa7164_dev *dev = port->dev;
0526 struct saa7164_dvb *dvb = &port->dvb;
0527 struct saa7164_i2c *i2c_bus = NULL;
0528 struct si2168_config si2168_config;
0529 struct si2157_config si2157_config;
0530 struct i2c_adapter *adapter;
0531 struct i2c_board_info info;
0532 struct i2c_client *client_demod;
0533 struct i2c_client *client_tuner;
0534 int ret;
0535
0536 dprintk(DBGLVL_DVB, "%s()\n", __func__);
0537
0538
0539 switch (dev->board) {
0540 case SAA7164_BOARD_HAUPPAUGE_HVR2200:
0541 case SAA7164_BOARD_HAUPPAUGE_HVR2200_2:
0542 case SAA7164_BOARD_HAUPPAUGE_HVR2200_3:
0543 case SAA7164_BOARD_HAUPPAUGE_HVR2200_4:
0544 case SAA7164_BOARD_HAUPPAUGE_HVR2200_5:
0545 i2c_bus = &dev->i2c_bus[port->nr + 1];
0546 switch (port->nr) {
0547 case 0:
0548 port->dvb.frontend = dvb_attach(tda10048_attach,
0549 &hauppauge_hvr2200_1_config,
0550 &i2c_bus->i2c_adap);
0551
0552 if (port->dvb.frontend != NULL) {
0553
0554 dvb_attach(tda18271_attach, port->dvb.frontend,
0555 0xc0 >> 1, &i2c_bus->i2c_adap,
0556 &hauppauge_hvr22x0_tuner_config);
0557 }
0558
0559 break;
0560 case 1:
0561 port->dvb.frontend = dvb_attach(tda10048_attach,
0562 &hauppauge_hvr2200_2_config,
0563 &i2c_bus->i2c_adap);
0564
0565 if (port->dvb.frontend != NULL) {
0566
0567 dvb_attach(tda18271_attach, port->dvb.frontend,
0568 0xc0 >> 1, &i2c_bus->i2c_adap,
0569 &hauppauge_hvr22x0s_tuner_config);
0570 }
0571
0572 break;
0573 }
0574 break;
0575 case SAA7164_BOARD_HAUPPAUGE_HVR2250:
0576 case SAA7164_BOARD_HAUPPAUGE_HVR2250_2:
0577 case SAA7164_BOARD_HAUPPAUGE_HVR2250_3:
0578 i2c_bus = &dev->i2c_bus[port->nr + 1];
0579
0580 port->dvb.frontend = dvb_attach(s5h1411_attach,
0581 &hauppauge_s5h1411_config,
0582 &i2c_bus->i2c_adap);
0583
0584 if (port->dvb.frontend != NULL) {
0585 if (port->nr == 0) {
0586
0587
0588 dvb_attach(tda18271_attach, port->dvb.frontend,
0589 0xc0 >> 1, &i2c_bus->i2c_adap,
0590 &hauppauge_hvr22x0_tuner_config);
0591 } else {
0592
0593 dvb_attach(tda18271_attach, port->dvb.frontend,
0594 0xc0 >> 1, &i2c_bus->i2c_adap,
0595 &hauppauge_hvr22x0s_tuner_config);
0596 }
0597 }
0598
0599 break;
0600 case SAA7164_BOARD_HAUPPAUGE_HVR2255proto:
0601 case SAA7164_BOARD_HAUPPAUGE_HVR2255:
0602 i2c_bus = &dev->i2c_bus[2];
0603
0604 if (port->nr == 0) {
0605 port->dvb.frontend = dvb_attach(lgdt3306a_attach,
0606 &hauppauge_hvr2255a_config, &i2c_bus->i2c_adap);
0607 } else {
0608 port->dvb.frontend = dvb_attach(lgdt3306a_attach,
0609 &hauppauge_hvr2255b_config, &i2c_bus->i2c_adap);
0610 }
0611
0612 if (port->dvb.frontend != NULL) {
0613
0614 if (port->nr == 0) {
0615 si2157_attach(port, &dev->i2c_bus[0].i2c_adap,
0616 port->dvb.frontend, 0xc0,
0617 &hauppauge_hvr2255_tuner_config);
0618 } else {
0619 si2157_attach(port, &dev->i2c_bus[1].i2c_adap,
0620 port->dvb.frontend, 0xc0,
0621 &hauppauge_hvr2255_tuner_config);
0622 }
0623 }
0624 break;
0625 case SAA7164_BOARD_HAUPPAUGE_HVR2205:
0626
0627 if (port->nr == 0) {
0628
0629 memset(&si2168_config, 0, sizeof(si2168_config));
0630 si2168_config.i2c_adapter = &adapter;
0631 si2168_config.fe = &port->dvb.frontend;
0632 si2168_config.ts_mode = SI2168_TS_SERIAL;
0633 memset(&info, 0, sizeof(struct i2c_board_info));
0634 strscpy(info.type, "si2168", I2C_NAME_SIZE);
0635 info.addr = 0xc8 >> 1;
0636 info.platform_data = &si2168_config;
0637 request_module(info.type);
0638 client_demod = i2c_new_client_device(&dev->i2c_bus[2].i2c_adap, &info);
0639 if (!i2c_client_has_driver(client_demod))
0640 goto frontend_detach;
0641
0642 if (!try_module_get(client_demod->dev.driver->owner)) {
0643 i2c_unregister_device(client_demod);
0644 goto frontend_detach;
0645 }
0646 port->i2c_client_demod = client_demod;
0647
0648
0649 memset(&si2157_config, 0, sizeof(si2157_config));
0650 si2157_config.if_port = 1;
0651 si2157_config.fe = port->dvb.frontend;
0652 memset(&info, 0, sizeof(struct i2c_board_info));
0653 strscpy(info.type, "si2157", I2C_NAME_SIZE);
0654 info.addr = 0xc0 >> 1;
0655 info.platform_data = &si2157_config;
0656 request_module(info.type);
0657 client_tuner = i2c_new_client_device(&dev->i2c_bus[0].i2c_adap, &info);
0658 if (!i2c_client_has_driver(client_tuner)) {
0659 module_put(client_demod->dev.driver->owner);
0660 i2c_unregister_device(client_demod);
0661 goto frontend_detach;
0662 }
0663 if (!try_module_get(client_tuner->dev.driver->owner)) {
0664 i2c_unregister_device(client_tuner);
0665 module_put(client_demod->dev.driver->owner);
0666 i2c_unregister_device(client_demod);
0667 goto frontend_detach;
0668 }
0669 port->i2c_client_tuner = client_tuner;
0670 } else {
0671
0672 memset(&si2168_config, 0, sizeof(si2168_config));
0673 si2168_config.i2c_adapter = &adapter;
0674 si2168_config.fe = &port->dvb.frontend;
0675 si2168_config.ts_mode = SI2168_TS_SERIAL;
0676 memset(&info, 0, sizeof(struct i2c_board_info));
0677 strscpy(info.type, "si2168", I2C_NAME_SIZE);
0678 info.addr = 0xcc >> 1;
0679 info.platform_data = &si2168_config;
0680 request_module(info.type);
0681 client_demod = i2c_new_client_device(&dev->i2c_bus[2].i2c_adap, &info);
0682 if (!i2c_client_has_driver(client_demod))
0683 goto frontend_detach;
0684
0685 if (!try_module_get(client_demod->dev.driver->owner)) {
0686 i2c_unregister_device(client_demod);
0687 goto frontend_detach;
0688 }
0689 port->i2c_client_demod = client_demod;
0690
0691
0692 memset(&si2157_config, 0, sizeof(si2157_config));
0693 si2157_config.fe = port->dvb.frontend;
0694 si2157_config.if_port = 1;
0695 memset(&info, 0, sizeof(struct i2c_board_info));
0696 strscpy(info.type, "si2157", I2C_NAME_SIZE);
0697 info.addr = 0xc0 >> 1;
0698 info.platform_data = &si2157_config;
0699 request_module(info.type);
0700 client_tuner = i2c_new_client_device(&dev->i2c_bus[1].i2c_adap, &info);
0701 if (!i2c_client_has_driver(client_tuner)) {
0702 module_put(client_demod->dev.driver->owner);
0703 i2c_unregister_device(client_demod);
0704 goto frontend_detach;
0705 }
0706 if (!try_module_get(client_tuner->dev.driver->owner)) {
0707 i2c_unregister_device(client_tuner);
0708 module_put(client_demod->dev.driver->owner);
0709 i2c_unregister_device(client_demod);
0710 goto frontend_detach;
0711 }
0712 port->i2c_client_tuner = client_tuner;
0713 }
0714
0715 break;
0716 default:
0717 printk(KERN_ERR "%s: The frontend isn't supported\n",
0718 dev->name);
0719 break;
0720 }
0721 if (NULL == dvb->frontend) {
0722 printk(KERN_ERR "%s() Frontend initialization failed\n",
0723 __func__);
0724 return -1;
0725 }
0726
0727
0728 ret = dvb_register(port);
0729 if (ret < 0) {
0730 if (dvb->frontend->ops.release)
0731 dvb->frontend->ops.release(dvb->frontend);
0732 return ret;
0733 }
0734
0735 return 0;
0736
0737 frontend_detach:
0738 printk(KERN_ERR "%s() Frontend/I2C initialization failed\n", __func__);
0739 return -1;
0740 }