0001
0002
0003
0004
0005
0006 #include "saa7134.h"
0007 #include "saa7134-reg.h"
0008
0009 #include <linux/module.h>
0010 #include <linux/kernel.h>
0011 #include <linux/init.h>
0012 #include <linux/spinlock.h>
0013 #include <linux/wait.h>
0014 #include <linux/list.h>
0015 #include <linux/slab.h>
0016 #include <linux/time.h>
0017 #include <linux/mm.h>
0018 #include <linux/usb.h>
0019 #include <linux/i2c.h>
0020 #include <asm/byteorder.h>
0021 #include <media/v4l2-common.h>
0022 #include <media/v4l2-device.h>
0023 #include <media/v4l2-subdev.h>
0024
0025 #include "go7007-priv.h"
0026
0027
0028
0029 enum hpi_address {
0030 HPI_ADDR_VIDEO_BUFFER = 0xe4,
0031 HPI_ADDR_INIT_BUFFER = 0xea,
0032 HPI_ADDR_INTR_RET_VALUE = 0xee,
0033 HPI_ADDR_INTR_RET_DATA = 0xec,
0034 HPI_ADDR_INTR_STATUS = 0xf4,
0035 HPI_ADDR_INTR_WR_PARAM = 0xf6,
0036 HPI_ADDR_INTR_WR_INDEX = 0xf8,
0037 };
0038
0039 enum gpio_command {
0040 GPIO_COMMAND_RESET = 0x00,
0041 GPIO_COMMAND_REQ1 = 0x04,
0042 GPIO_COMMAND_WRITE = 0x20,
0043 GPIO_COMMAND_REQ2 = 0x24,
0044 GPIO_COMMAND_READ = 0x80,
0045 GPIO_COMMAND_VIDEO = 0x84,
0046 GPIO_COMMAND_IDLE = 0xA0,
0047 GPIO_COMMAND_ADDR = 0xA4,
0048 };
0049
0050 struct saa7134_go7007 {
0051 struct v4l2_subdev sd;
0052 struct saa7134_dev *dev;
0053 u8 *top;
0054 u8 *bottom;
0055 dma_addr_t top_dma;
0056 dma_addr_t bottom_dma;
0057 };
0058
0059 static const struct go7007_board_info board_voyager = {
0060 .flags = 0,
0061 .sensor_flags = GO7007_SENSOR_656 |
0062 GO7007_SENSOR_VALID_ENABLE |
0063 GO7007_SENSOR_TV |
0064 GO7007_SENSOR_VBI,
0065 .audio_flags = GO7007_AUDIO_I2S_MODE_1 |
0066 GO7007_AUDIO_WORD_16,
0067 .audio_rate = 48000,
0068 .audio_bclk_div = 8,
0069 .audio_main_div = 2,
0070 .hpi_buffer_cap = 7,
0071 .num_inputs = 1,
0072 .inputs = {
0073 {
0074 .name = "SAA7134",
0075 },
0076 },
0077 };
0078
0079
0080
0081 static int gpio_write(struct saa7134_dev *dev, u8 addr, u16 data)
0082 {
0083 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
0084
0085
0086 saa_writeb(SAA7134_GPIO_GPSTATUS0, addr);
0087 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
0088 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0089
0090
0091 saa_writeb(SAA7134_GPIO_GPSTATUS0, data & 0xff);
0092 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
0093 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0094
0095
0096 saa_writeb(SAA7134_GPIO_GPSTATUS0, data >> 8);
0097 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
0098 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0099
0100 return 0;
0101 }
0102
0103 static int gpio_read(struct saa7134_dev *dev, u8 addr, u16 *data)
0104 {
0105 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
0106
0107
0108 saa_writeb(SAA7134_GPIO_GPSTATUS0, addr);
0109 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
0110 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0111
0112 saa_writeb(SAA7134_GPIO_GPMODE0, 0x00);
0113
0114
0115 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_READ);
0116 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0117 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0118 *data = saa_readb(SAA7134_GPIO_GPSTATUS0);
0119 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0120
0121
0122 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_READ);
0123 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0124 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0125 *data |= saa_readb(SAA7134_GPIO_GPSTATUS0) << 8;
0126 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0127
0128 return 0;
0129 }
0130
0131 static int saa7134_go7007_interface_reset(struct go7007 *go)
0132 {
0133 struct saa7134_go7007 *saa = go->hpi_context;
0134 struct saa7134_dev *dev = saa->dev;
0135 u16 intr_val, intr_data;
0136 int count = 20;
0137
0138 saa_clearb(SAA7134_TS_PARALLEL, 0x80);
0139 saa_writeb(SAA7134_GPIO_GPMODE2, 0xa4);
0140 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
0141
0142 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
0143 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_RESET);
0144 msleep(1);
0145 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
0146 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ2);
0147 msleep(10);
0148
0149 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0150 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0151
0152 saa_readb(SAA7134_GPIO_GPSTATUS2);
0153
0154
0155
0156 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
0157 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ2);
0158
0159 do {
0160 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0161 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
0162 saa_readb(SAA7134_GPIO_GPSTATUS2);
0163
0164 } while (--count > 0);
0165
0166
0167 if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
0168 (intr_val & ~0x1) != 0x55aa) {
0169 pr_err("saa7134-go7007: unable to reset the GO7007\n");
0170 return -1;
0171 }
0172 return 0;
0173 }
0174
0175 static int saa7134_go7007_write_interrupt(struct go7007 *go, int addr, int data)
0176 {
0177 struct saa7134_go7007 *saa = go->hpi_context;
0178 struct saa7134_dev *dev = saa->dev;
0179 int i;
0180 u16 status_reg;
0181
0182 #ifdef GO7007_HPI_DEBUG
0183 pr_debug("saa7134-go7007: WriteInterrupt: %04x %04x\n", addr, data);
0184 #endif
0185
0186 for (i = 0; i < 100; ++i) {
0187 gpio_read(dev, HPI_ADDR_INTR_STATUS, &status_reg);
0188 if (!(status_reg & 0x0010))
0189 break;
0190 msleep(10);
0191 }
0192 if (i == 100) {
0193 pr_err("saa7134-go7007: device is hung, status reg = 0x%04x\n",
0194 status_reg);
0195 return -1;
0196 }
0197 gpio_write(dev, HPI_ADDR_INTR_WR_PARAM, data);
0198 gpio_write(dev, HPI_ADDR_INTR_WR_INDEX, addr);
0199
0200 return 0;
0201 }
0202
0203 static int saa7134_go7007_read_interrupt(struct go7007 *go)
0204 {
0205 struct saa7134_go7007 *saa = go->hpi_context;
0206 struct saa7134_dev *dev = saa->dev;
0207
0208
0209 go->interrupt_available = 1;
0210 gpio_read(dev, HPI_ADDR_INTR_RET_VALUE, &go->interrupt_value);
0211 gpio_read(dev, HPI_ADDR_INTR_RET_DATA, &go->interrupt_data);
0212 #ifdef GO7007_HPI_DEBUG
0213 pr_debug("saa7134-go7007: ReadInterrupt: %04x %04x\n",
0214 go->interrupt_value, go->interrupt_data);
0215 #endif
0216 return 0;
0217 }
0218
0219 static void saa7134_go7007_irq_ts_done(struct saa7134_dev *dev,
0220 unsigned long status)
0221 {
0222 struct go7007 *go = video_get_drvdata(dev->empress_dev);
0223 struct saa7134_go7007 *saa = go->hpi_context;
0224
0225 if (!vb2_is_streaming(&go->vidq))
0226 return;
0227 if (0 != (status & 0x000f0000))
0228 pr_debug("saa7134-go7007: irq: lost %ld\n",
0229 (status >> 16) & 0x0f);
0230 if (status & 0x100000) {
0231 dma_sync_single_for_cpu(&dev->pci->dev,
0232 saa->bottom_dma, PAGE_SIZE, DMA_FROM_DEVICE);
0233 go7007_parse_video_stream(go, saa->bottom, PAGE_SIZE);
0234 saa_writel(SAA7134_RS_BA2(5), saa->bottom_dma);
0235 } else {
0236 dma_sync_single_for_cpu(&dev->pci->dev,
0237 saa->top_dma, PAGE_SIZE, DMA_FROM_DEVICE);
0238 go7007_parse_video_stream(go, saa->top, PAGE_SIZE);
0239 saa_writel(SAA7134_RS_BA1(5), saa->top_dma);
0240 }
0241 }
0242
0243 static int saa7134_go7007_stream_start(struct go7007 *go)
0244 {
0245 struct saa7134_go7007 *saa = go->hpi_context;
0246 struct saa7134_dev *dev = saa->dev;
0247
0248 saa->top_dma = dma_map_page(&dev->pci->dev, virt_to_page(saa->top),
0249 0, PAGE_SIZE, DMA_FROM_DEVICE);
0250 if (dma_mapping_error(&dev->pci->dev, saa->top_dma))
0251 return -ENOMEM;
0252 saa->bottom_dma = dma_map_page(&dev->pci->dev,
0253 virt_to_page(saa->bottom),
0254 0, PAGE_SIZE, DMA_FROM_DEVICE);
0255 if (dma_mapping_error(&dev->pci->dev, saa->bottom_dma)) {
0256 dma_unmap_page(&dev->pci->dev, saa->top_dma, PAGE_SIZE,
0257 DMA_FROM_DEVICE);
0258 return -ENOMEM;
0259 }
0260
0261 saa_writel(SAA7134_VIDEO_PORT_CTRL0 >> 2, 0xA300B000);
0262 saa_writel(SAA7134_VIDEO_PORT_CTRL4 >> 2, 0x40000200);
0263
0264
0265 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
0266 saa_writeb(SAA7134_GPIO_GPSTATUS0, HPI_ADDR_VIDEO_BUFFER);
0267 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
0268 saa_writeb(SAA7134_GPIO_GPMODE0, 0x00);
0269
0270
0271 saa_writeb(SAA7134_TS_PARALLEL, 0xe6);
0272
0273
0274 saa_setb(SAA7134_TS_SERIAL1, 0x01);
0275 saa_clearb(SAA7134_TS_SERIAL1, 0x01);
0276
0277
0278 saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 128 - 1);
0279 saa_writeb(SAA7134_TS_DMA0, ((PAGE_SIZE >> 7) - 1) & 0xff);
0280 saa_writeb(SAA7134_TS_DMA1, (PAGE_SIZE >> 15) & 0xff);
0281 saa_writeb(SAA7134_TS_DMA2, (PAGE_SIZE >> 31) & 0x3f);
0282
0283
0284 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_VIDEO);
0285
0286 saa_writel(SAA7134_RS_BA1(5), saa->top_dma);
0287 saa_writel(SAA7134_RS_BA2(5), saa->bottom_dma);
0288 saa_writel(SAA7134_RS_PITCH(5), 128);
0289 saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_MAX);
0290
0291
0292 saa_setl(SAA7134_MAIN_CTRL, SAA7134_MAIN_CTRL_TE5);
0293
0294
0295 saa_setl(SAA7134_IRQ1,
0296 SAA7134_IRQ1_INTE_RA2_1 | SAA7134_IRQ1_INTE_RA2_0);
0297
0298 return 0;
0299 }
0300
0301 static int saa7134_go7007_stream_stop(struct go7007 *go)
0302 {
0303 struct saa7134_go7007 *saa = go->hpi_context;
0304 struct saa7134_dev *dev;
0305
0306 if (!saa)
0307 return -EINVAL;
0308 dev = saa->dev;
0309 if (!dev)
0310 return -EINVAL;
0311
0312
0313 saa_clearl(SAA7134_MAIN_CTRL, SAA7134_MAIN_CTRL_TE5);
0314
0315
0316 saa_clearl(SAA7134_IRQ1,
0317 SAA7134_IRQ1_INTE_RA2_1 | SAA7134_IRQ1_INTE_RA2_0);
0318
0319
0320 saa_clearb(SAA7134_TS_PARALLEL, 0x80);
0321
0322 dma_unmap_page(&dev->pci->dev, saa->top_dma, PAGE_SIZE,
0323 DMA_FROM_DEVICE);
0324 dma_unmap_page(&dev->pci->dev, saa->bottom_dma, PAGE_SIZE,
0325 DMA_FROM_DEVICE);
0326
0327 return 0;
0328 }
0329
0330 static int saa7134_go7007_send_firmware(struct go7007 *go, u8 *data, int len)
0331 {
0332 struct saa7134_go7007 *saa = go->hpi_context;
0333 struct saa7134_dev *dev = saa->dev;
0334 u16 status_reg;
0335 int i;
0336
0337 #ifdef GO7007_HPI_DEBUG
0338 pr_debug("saa7134-go7007: DownloadBuffer sending %d bytes\n", len);
0339 #endif
0340
0341 while (len > 0) {
0342 i = len > 64 ? 64 : len;
0343 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
0344 saa_writeb(SAA7134_GPIO_GPSTATUS0, HPI_ADDR_INIT_BUFFER);
0345 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
0346 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0347 while (i-- > 0) {
0348 saa_writeb(SAA7134_GPIO_GPSTATUS0, *data);
0349 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
0350 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
0351 ++data;
0352 --len;
0353 }
0354 for (i = 0; i < 100; ++i) {
0355 gpio_read(dev, HPI_ADDR_INTR_STATUS, &status_reg);
0356 if (!(status_reg & 0x0002))
0357 break;
0358 }
0359 if (i == 100) {
0360 pr_err("saa7134-go7007: device is hung, status reg = 0x%04x\n",
0361 status_reg);
0362 return -1;
0363 }
0364 }
0365 return 0;
0366 }
0367
0368 static const struct go7007_hpi_ops saa7134_go7007_hpi_ops = {
0369 .interface_reset = saa7134_go7007_interface_reset,
0370 .write_interrupt = saa7134_go7007_write_interrupt,
0371 .read_interrupt = saa7134_go7007_read_interrupt,
0372 .stream_start = saa7134_go7007_stream_start,
0373 .stream_stop = saa7134_go7007_stream_stop,
0374 .send_firmware = saa7134_go7007_send_firmware,
0375 };
0376 MODULE_FIRMWARE("go7007/go7007tv.bin");
0377
0378
0379
0380 static int saa7134_go7007_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
0381 {
0382 #if 0
0383 struct saa7134_go7007 *saa = container_of(sd, struct saa7134_go7007, sd);
0384 struct saa7134_dev *dev = saa->dev;
0385
0386 return saa7134_s_std_internal(dev, NULL, norm);
0387 #else
0388 return 0;
0389 #endif
0390 }
0391
0392 static const struct v4l2_subdev_video_ops saa7134_go7007_video_ops = {
0393 .s_std = saa7134_go7007_s_std,
0394 };
0395
0396 static const struct v4l2_subdev_ops saa7134_go7007_sd_ops = {
0397 .video = &saa7134_go7007_video_ops,
0398 };
0399
0400
0401
0402
0403
0404
0405 static int saa7134_go7007_init(struct saa7134_dev *dev)
0406 {
0407 struct go7007 *go;
0408 struct saa7134_go7007 *saa;
0409 struct v4l2_subdev *sd;
0410
0411 pr_debug("saa7134-go7007: probing new SAA713X board\n");
0412
0413 go = go7007_alloc(&board_voyager, &dev->pci->dev);
0414 if (go == NULL)
0415 return -ENOMEM;
0416
0417 saa = kzalloc(sizeof(struct saa7134_go7007), GFP_KERNEL);
0418 if (saa == NULL) {
0419 kfree(go);
0420 return -ENOMEM;
0421 }
0422
0423 go->board_id = GO7007_BOARDID_PCI_VOYAGER;
0424 snprintf(go->bus_info, sizeof(go->bus_info), "PCI:%s", pci_name(dev->pci));
0425 strscpy(go->name, saa7134_boards[dev->board].name, sizeof(go->name));
0426 go->hpi_ops = &saa7134_go7007_hpi_ops;
0427 go->hpi_context = saa;
0428 saa->dev = dev;
0429
0430
0431 sd = &saa->sd;
0432 v4l2_subdev_init(sd, &saa7134_go7007_sd_ops);
0433 v4l2_set_subdevdata(sd, saa);
0434 strscpy(sd->name, "saa7134-go7007", sizeof(sd->name));
0435
0436
0437 saa->top = (u8 *)get_zeroed_page(GFP_KERNEL);
0438 if (!saa->top)
0439 goto allocfail;
0440 saa->bottom = (u8 *)get_zeroed_page(GFP_KERNEL);
0441 if (!saa->bottom)
0442 goto allocfail;
0443
0444
0445 if (go7007_boot_encoder(go, go->board_info->flags &
0446 GO7007_BOARD_USE_ONBOARD_I2C) < 0)
0447 goto allocfail;
0448
0449
0450
0451 if (go7007_register_encoder(go, go->board_info->num_i2c_devs) < 0)
0452 goto allocfail;
0453
0454
0455 if (v4l2_device_register_subdev(&go->v4l2_dev, sd) < 0)
0456 pr_info("saa7134-go7007: register subdev failed\n");
0457
0458 dev->empress_dev = &go->vdev;
0459
0460 go->status = STATUS_ONLINE;
0461 return 0;
0462
0463 allocfail:
0464 if (saa->top)
0465 free_page((unsigned long)saa->top);
0466 if (saa->bottom)
0467 free_page((unsigned long)saa->bottom);
0468 kfree(saa);
0469 kfree(go);
0470 return -ENOMEM;
0471 }
0472
0473 static int saa7134_go7007_fini(struct saa7134_dev *dev)
0474 {
0475 struct go7007 *go;
0476 struct saa7134_go7007 *saa;
0477
0478 if (NULL == dev->empress_dev)
0479 return 0;
0480
0481 go = video_get_drvdata(dev->empress_dev);
0482 if (go->audio_enabled)
0483 go7007_snd_remove(go);
0484
0485 saa = go->hpi_context;
0486 go->status = STATUS_SHUTDOWN;
0487 free_page((unsigned long)saa->top);
0488 free_page((unsigned long)saa->bottom);
0489 v4l2_device_unregister_subdev(&saa->sd);
0490 kfree(saa);
0491 vb2_video_unregister_device(&go->vdev);
0492
0493 v4l2_device_put(&go->v4l2_dev);
0494 dev->empress_dev = NULL;
0495
0496 return 0;
0497 }
0498
0499 static struct saa7134_mpeg_ops saa7134_go7007_ops = {
0500 .type = SAA7134_MPEG_GO7007,
0501 .init = saa7134_go7007_init,
0502 .fini = saa7134_go7007_fini,
0503 .irq_ts_done = saa7134_go7007_irq_ts_done,
0504 };
0505
0506 static int __init saa7134_go7007_mod_init(void)
0507 {
0508 return saa7134_ts_register(&saa7134_go7007_ops);
0509 }
0510
0511 static void __exit saa7134_go7007_mod_cleanup(void)
0512 {
0513 saa7134_ts_unregister(&saa7134_go7007_ops);
0514 }
0515
0516 module_init(saa7134_go7007_mod_init);
0517 module_exit(saa7134_go7007_mod_cleanup);
0518
0519 MODULE_LICENSE("GPL v2");