root/drivers/media/pci/saa7134/saa7134-go7007.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. to_state
  2. gpio_write
  3. gpio_read
  4. saa7134_go7007_interface_reset
  5. saa7134_go7007_write_interrupt
  6. saa7134_go7007_read_interrupt
  7. saa7134_go7007_irq_ts_done
  8. saa7134_go7007_stream_start
  9. saa7134_go7007_stream_stop
  10. saa7134_go7007_send_firmware
  11. saa7134_go7007_s_std
  12. saa7134_go7007_init
  13. saa7134_go7007_fini
  14. saa7134_go7007_mod_init
  15. saa7134_go7007_mod_cleanup

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2005-2006 Micronas USA Inc.
   4  */
   5 
   6 #include "saa7134.h"
   7 #include "saa7134-reg.h"
   8 
   9 #include <linux/module.h>
  10 #include <linux/kernel.h>
  11 #include <linux/init.h>
  12 #include <linux/spinlock.h>
  13 #include <linux/wait.h>
  14 #include <linux/list.h>
  15 #include <linux/slab.h>
  16 #include <linux/time.h>
  17 #include <linux/mm.h>
  18 #include <linux/usb.h>
  19 #include <linux/i2c.h>
  20 #include <asm/byteorder.h>
  21 #include <media/v4l2-common.h>
  22 #include <media/v4l2-device.h>
  23 #include <media/v4l2-subdev.h>
  24 
  25 #include "go7007-priv.h"
  26 
  27 /*#define GO7007_HPI_DEBUG*/
  28 
  29 enum hpi_address {
  30         HPI_ADDR_VIDEO_BUFFER = 0xe4,
  31         HPI_ADDR_INIT_BUFFER = 0xea,
  32         HPI_ADDR_INTR_RET_VALUE = 0xee,
  33         HPI_ADDR_INTR_RET_DATA = 0xec,
  34         HPI_ADDR_INTR_STATUS = 0xf4,
  35         HPI_ADDR_INTR_WR_PARAM = 0xf6,
  36         HPI_ADDR_INTR_WR_INDEX = 0xf8,
  37 };
  38 
  39 enum gpio_command {
  40         GPIO_COMMAND_RESET = 0x00, /* 000b */
  41         GPIO_COMMAND_REQ1  = 0x04, /* 001b */
  42         GPIO_COMMAND_WRITE = 0x20, /* 010b */
  43         GPIO_COMMAND_REQ2  = 0x24, /* 011b */
  44         GPIO_COMMAND_READ  = 0x80, /* 100b */
  45         GPIO_COMMAND_VIDEO = 0x84, /* 101b */
  46         GPIO_COMMAND_IDLE  = 0xA0, /* 110b */
  47         GPIO_COMMAND_ADDR  = 0xA4, /* 111b */
  48 };
  49 
  50 struct saa7134_go7007 {
  51         struct v4l2_subdev sd;
  52         struct saa7134_dev *dev;
  53         u8 *top;
  54         u8 *bottom;
  55         dma_addr_t top_dma;
  56         dma_addr_t bottom_dma;
  57 };
  58 
  59 static inline struct saa7134_go7007 *to_state(struct v4l2_subdev *sd)
  60 {
  61         return container_of(sd, struct saa7134_go7007, sd);
  62 }
  63 
  64 static const struct go7007_board_info board_voyager = {
  65         .flags           = 0,
  66         .sensor_flags    = GO7007_SENSOR_656 |
  67                                 GO7007_SENSOR_VALID_ENABLE |
  68                                 GO7007_SENSOR_TV |
  69                                 GO7007_SENSOR_VBI,
  70         .audio_flags    = GO7007_AUDIO_I2S_MODE_1 |
  71                                 GO7007_AUDIO_WORD_16,
  72         .audio_rate      = 48000,
  73         .audio_bclk_div  = 8,
  74         .audio_main_div  = 2,
  75         .hpi_buffer_cap  = 7,
  76         .num_inputs      = 1,
  77         .inputs          = {
  78                 {
  79                         .name           = "SAA7134",
  80                 },
  81         },
  82 };
  83 
  84 /********************* Driver for GPIO HPI interface *********************/
  85 
  86 static int gpio_write(struct saa7134_dev *dev, u8 addr, u16 data)
  87 {
  88         saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
  89 
  90         /* Write HPI address */
  91         saa_writeb(SAA7134_GPIO_GPSTATUS0, addr);
  92         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
  93         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
  94 
  95         /* Write low byte */
  96         saa_writeb(SAA7134_GPIO_GPSTATUS0, data & 0xff);
  97         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
  98         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
  99 
 100         /* Write high byte */
 101         saa_writeb(SAA7134_GPIO_GPSTATUS0, data >> 8);
 102         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
 103         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 104 
 105         return 0;
 106 }
 107 
 108 static int gpio_read(struct saa7134_dev *dev, u8 addr, u16 *data)
 109 {
 110         saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
 111 
 112         /* Write HPI address */
 113         saa_writeb(SAA7134_GPIO_GPSTATUS0, addr);
 114         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
 115         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 116 
 117         saa_writeb(SAA7134_GPIO_GPMODE0, 0x00);
 118 
 119         /* Read low byte */
 120         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_READ);
 121         saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 122         saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 123         *data = saa_readb(SAA7134_GPIO_GPSTATUS0);
 124         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 125 
 126         /* Read high byte */
 127         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_READ);
 128         saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 129         saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 130         *data |= saa_readb(SAA7134_GPIO_GPSTATUS0) << 8;
 131         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 132 
 133         return 0;
 134 }
 135 
 136 static int saa7134_go7007_interface_reset(struct go7007 *go)
 137 {
 138         struct saa7134_go7007 *saa = go->hpi_context;
 139         struct saa7134_dev *dev = saa->dev;
 140         u16 intr_val, intr_data;
 141         int count = 20;
 142 
 143         saa_clearb(SAA7134_TS_PARALLEL, 0x80); /* Disable TS interface */
 144         saa_writeb(SAA7134_GPIO_GPMODE2, 0xa4);
 145         saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
 146 
 147         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
 148         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_RESET);
 149         msleep(1);
 150         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
 151         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ2);
 152         msleep(10);
 153 
 154         saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 155         saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 156 
 157         saa_readb(SAA7134_GPIO_GPSTATUS2);
 158         /*pr_debug("status is %s\n", saa_readb(SAA7134_GPIO_GPSTATUS2) & 0x40 ? "OK" : "not OK"); */
 159 
 160         /* enter command mode...(?) */
 161         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ1);
 162         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_REQ2);
 163 
 164         do {
 165                 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 166                 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
 167                 saa_readb(SAA7134_GPIO_GPSTATUS2);
 168                 /*pr_info("gpio is %08x\n", saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2)); */
 169         } while (--count > 0);
 170 
 171         /* Wait for an interrupt to indicate successful hardware reset */
 172         if (go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
 173                         (intr_val & ~0x1) != 0x55aa) {
 174                 pr_err("saa7134-go7007: unable to reset the GO7007\n");
 175                 return -1;
 176         }
 177         return 0;
 178 }
 179 
 180 static int saa7134_go7007_write_interrupt(struct go7007 *go, int addr, int data)
 181 {
 182         struct saa7134_go7007 *saa = go->hpi_context;
 183         struct saa7134_dev *dev = saa->dev;
 184         int i;
 185         u16 status_reg;
 186 
 187 #ifdef GO7007_HPI_DEBUG
 188         pr_debug("saa7134-go7007: WriteInterrupt: %04x %04x\n", addr, data);
 189 #endif
 190 
 191         for (i = 0; i < 100; ++i) {
 192                 gpio_read(dev, HPI_ADDR_INTR_STATUS, &status_reg);
 193                 if (!(status_reg & 0x0010))
 194                         break;
 195                 msleep(10);
 196         }
 197         if (i == 100) {
 198                 pr_err("saa7134-go7007: device is hung, status reg = 0x%04x\n",
 199                         status_reg);
 200                 return -1;
 201         }
 202         gpio_write(dev, HPI_ADDR_INTR_WR_PARAM, data);
 203         gpio_write(dev, HPI_ADDR_INTR_WR_INDEX, addr);
 204 
 205         return 0;
 206 }
 207 
 208 static int saa7134_go7007_read_interrupt(struct go7007 *go)
 209 {
 210         struct saa7134_go7007 *saa = go->hpi_context;
 211         struct saa7134_dev *dev = saa->dev;
 212 
 213         /* XXX we need to wait if there is no interrupt available */
 214         go->interrupt_available = 1;
 215         gpio_read(dev, HPI_ADDR_INTR_RET_VALUE, &go->interrupt_value);
 216         gpio_read(dev, HPI_ADDR_INTR_RET_DATA, &go->interrupt_data);
 217 #ifdef GO7007_HPI_DEBUG
 218         pr_debug("saa7134-go7007: ReadInterrupt: %04x %04x\n",
 219                         go->interrupt_value, go->interrupt_data);
 220 #endif
 221         return 0;
 222 }
 223 
 224 static void saa7134_go7007_irq_ts_done(struct saa7134_dev *dev,
 225                                                 unsigned long status)
 226 {
 227         struct go7007 *go = video_get_drvdata(dev->empress_dev);
 228         struct saa7134_go7007 *saa = go->hpi_context;
 229 
 230         if (!vb2_is_streaming(&go->vidq))
 231                 return;
 232         if (0 != (status & 0x000f0000))
 233                 pr_debug("saa7134-go7007: irq: lost %ld\n",
 234                                 (status >> 16) & 0x0f);
 235         if (status & 0x100000) {
 236                 dma_sync_single_for_cpu(&dev->pci->dev,
 237                                         saa->bottom_dma, PAGE_SIZE, DMA_FROM_DEVICE);
 238                 go7007_parse_video_stream(go, saa->bottom, PAGE_SIZE);
 239                 saa_writel(SAA7134_RS_BA2(5), saa->bottom_dma);
 240         } else {
 241                 dma_sync_single_for_cpu(&dev->pci->dev,
 242                                         saa->top_dma, PAGE_SIZE, DMA_FROM_DEVICE);
 243                 go7007_parse_video_stream(go, saa->top, PAGE_SIZE);
 244                 saa_writel(SAA7134_RS_BA1(5), saa->top_dma);
 245         }
 246 }
 247 
 248 static int saa7134_go7007_stream_start(struct go7007 *go)
 249 {
 250         struct saa7134_go7007 *saa = go->hpi_context;
 251         struct saa7134_dev *dev = saa->dev;
 252 
 253         saa->top_dma = dma_map_page(&dev->pci->dev, virt_to_page(saa->top),
 254                         0, PAGE_SIZE, DMA_FROM_DEVICE);
 255         if (dma_mapping_error(&dev->pci->dev, saa->top_dma))
 256                 return -ENOMEM;
 257         saa->bottom_dma = dma_map_page(&dev->pci->dev,
 258                         virt_to_page(saa->bottom),
 259                         0, PAGE_SIZE, DMA_FROM_DEVICE);
 260         if (dma_mapping_error(&dev->pci->dev, saa->bottom_dma)) {
 261                 dma_unmap_page(&dev->pci->dev, saa->top_dma, PAGE_SIZE,
 262                                 DMA_FROM_DEVICE);
 263                 return -ENOMEM;
 264         }
 265 
 266         saa_writel(SAA7134_VIDEO_PORT_CTRL0 >> 2, 0xA300B000);
 267         saa_writel(SAA7134_VIDEO_PORT_CTRL4 >> 2, 0x40000200);
 268 
 269         /* Set HPI interface for video */
 270         saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
 271         saa_writeb(SAA7134_GPIO_GPSTATUS0, HPI_ADDR_VIDEO_BUFFER);
 272         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
 273         saa_writeb(SAA7134_GPIO_GPMODE0, 0x00);
 274 
 275         /* Enable TS interface */
 276         saa_writeb(SAA7134_TS_PARALLEL, 0xe6);
 277 
 278         /* Reset TS interface */
 279         saa_setb(SAA7134_TS_SERIAL1, 0x01);
 280         saa_clearb(SAA7134_TS_SERIAL1, 0x01);
 281 
 282         /* Set up transfer block size */
 283         saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 128 - 1);
 284         saa_writeb(SAA7134_TS_DMA0, ((PAGE_SIZE >> 7) - 1) & 0xff);
 285         saa_writeb(SAA7134_TS_DMA1, (PAGE_SIZE >> 15) & 0xff);
 286         saa_writeb(SAA7134_TS_DMA2, (PAGE_SIZE >> 31) & 0x3f);
 287 
 288         /* Enable video streaming mode */
 289         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_VIDEO);
 290 
 291         saa_writel(SAA7134_RS_BA1(5), saa->top_dma);
 292         saa_writel(SAA7134_RS_BA2(5), saa->bottom_dma);
 293         saa_writel(SAA7134_RS_PITCH(5), 128);
 294         saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_MAX);
 295 
 296         /* Enable TS FIFO */
 297         saa_setl(SAA7134_MAIN_CTRL, SAA7134_MAIN_CTRL_TE5);
 298 
 299         /* Enable DMA IRQ */
 300         saa_setl(SAA7134_IRQ1,
 301                         SAA7134_IRQ1_INTE_RA2_1 | SAA7134_IRQ1_INTE_RA2_0);
 302 
 303         return 0;
 304 }
 305 
 306 static int saa7134_go7007_stream_stop(struct go7007 *go)
 307 {
 308         struct saa7134_go7007 *saa = go->hpi_context;
 309         struct saa7134_dev *dev;
 310 
 311         if (!saa)
 312                 return -EINVAL;
 313         dev = saa->dev;
 314         if (!dev)
 315                 return -EINVAL;
 316 
 317         /* Shut down TS FIFO */
 318         saa_clearl(SAA7134_MAIN_CTRL, SAA7134_MAIN_CTRL_TE5);
 319 
 320         /* Disable DMA IRQ */
 321         saa_clearl(SAA7134_IRQ1,
 322                         SAA7134_IRQ1_INTE_RA2_1 | SAA7134_IRQ1_INTE_RA2_0);
 323 
 324         /* Disable TS interface */
 325         saa_clearb(SAA7134_TS_PARALLEL, 0x80);
 326 
 327         dma_unmap_page(&dev->pci->dev, saa->top_dma, PAGE_SIZE,
 328                         DMA_FROM_DEVICE);
 329         dma_unmap_page(&dev->pci->dev, saa->bottom_dma, PAGE_SIZE,
 330                         DMA_FROM_DEVICE);
 331 
 332         return 0;
 333 }
 334 
 335 static int saa7134_go7007_send_firmware(struct go7007 *go, u8 *data, int len)
 336 {
 337         struct saa7134_go7007 *saa = go->hpi_context;
 338         struct saa7134_dev *dev = saa->dev;
 339         u16 status_reg;
 340         int i;
 341 
 342 #ifdef GO7007_HPI_DEBUG
 343         pr_debug("saa7134-go7007: DownloadBuffer sending %d bytes\n", len);
 344 #endif
 345 
 346         while (len > 0) {
 347                 i = len > 64 ? 64 : len;
 348                 saa_writeb(SAA7134_GPIO_GPMODE0, 0xff);
 349                 saa_writeb(SAA7134_GPIO_GPSTATUS0, HPI_ADDR_INIT_BUFFER);
 350                 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_ADDR);
 351                 saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 352                 while (i-- > 0) {
 353                         saa_writeb(SAA7134_GPIO_GPSTATUS0, *data);
 354                         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_WRITE);
 355                         saa_writeb(SAA7134_GPIO_GPSTATUS2, GPIO_COMMAND_IDLE);
 356                         ++data;
 357                         --len;
 358                 }
 359                 for (i = 0; i < 100; ++i) {
 360                         gpio_read(dev, HPI_ADDR_INTR_STATUS, &status_reg);
 361                         if (!(status_reg & 0x0002))
 362                                 break;
 363                 }
 364                 if (i == 100) {
 365                         pr_err("saa7134-go7007: device is hung, status reg = 0x%04x\n",
 366                                status_reg);
 367                         return -1;
 368                 }
 369         }
 370         return 0;
 371 }
 372 
 373 static const struct go7007_hpi_ops saa7134_go7007_hpi_ops = {
 374         .interface_reset        = saa7134_go7007_interface_reset,
 375         .write_interrupt        = saa7134_go7007_write_interrupt,
 376         .read_interrupt         = saa7134_go7007_read_interrupt,
 377         .stream_start           = saa7134_go7007_stream_start,
 378         .stream_stop            = saa7134_go7007_stream_stop,
 379         .send_firmware          = saa7134_go7007_send_firmware,
 380 };
 381 MODULE_FIRMWARE("go7007/go7007tv.bin");
 382 
 383 /* --------------------------------------------------------------------------*/
 384 
 385 static int saa7134_go7007_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
 386 {
 387 #if 0
 388         struct saa7134_go7007 *saa = to_state(sd);
 389         struct saa7134_dev *dev = saa->dev;
 390 
 391         return saa7134_s_std_internal(dev, NULL, norm);
 392 #else
 393         return 0;
 394 #endif
 395 }
 396 
 397 static const struct v4l2_subdev_video_ops saa7134_go7007_video_ops = {
 398         .s_std = saa7134_go7007_s_std,
 399 };
 400 
 401 static const struct v4l2_subdev_ops saa7134_go7007_sd_ops = {
 402         .video = &saa7134_go7007_video_ops,
 403 };
 404 
 405 /* --------------------------------------------------------------------------*/
 406 
 407 
 408 /********************* Add/remove functions *********************/
 409 
 410 static int saa7134_go7007_init(struct saa7134_dev *dev)
 411 {
 412         struct go7007 *go;
 413         struct saa7134_go7007 *saa;
 414         struct v4l2_subdev *sd;
 415 
 416         pr_debug("saa7134-go7007: probing new SAA713X board\n");
 417 
 418         go = go7007_alloc(&board_voyager, &dev->pci->dev);
 419         if (go == NULL)
 420                 return -ENOMEM;
 421 
 422         saa = kzalloc(sizeof(struct saa7134_go7007), GFP_KERNEL);
 423         if (saa == NULL) {
 424                 kfree(go);
 425                 return -ENOMEM;
 426         }
 427 
 428         go->board_id = GO7007_BOARDID_PCI_VOYAGER;
 429         snprintf(go->bus_info, sizeof(go->bus_info), "PCI:%s", pci_name(dev->pci));
 430         strscpy(go->name, saa7134_boards[dev->board].name, sizeof(go->name));
 431         go->hpi_ops = &saa7134_go7007_hpi_ops;
 432         go->hpi_context = saa;
 433         saa->dev = dev;
 434 
 435         /* Init the subdevice interface */
 436         sd = &saa->sd;
 437         v4l2_subdev_init(sd, &saa7134_go7007_sd_ops);
 438         v4l2_set_subdevdata(sd, saa);
 439         strscpy(sd->name, "saa7134-go7007", sizeof(sd->name));
 440 
 441         /* Allocate a couple pages for receiving the compressed stream */
 442         saa->top = (u8 *)get_zeroed_page(GFP_KERNEL);
 443         if (!saa->top)
 444                 goto allocfail;
 445         saa->bottom = (u8 *)get_zeroed_page(GFP_KERNEL);
 446         if (!saa->bottom)
 447                 goto allocfail;
 448 
 449         /* Boot the GO7007 */
 450         if (go7007_boot_encoder(go, go->board_info->flags &
 451                                         GO7007_BOARD_USE_ONBOARD_I2C) < 0)
 452                 goto allocfail;
 453 
 454         /* Do any final GO7007 initialization, then register the
 455          * V4L2 and ALSA interfaces */
 456         if (go7007_register_encoder(go, go->board_info->num_i2c_devs) < 0)
 457                 goto allocfail;
 458 
 459         /* Register the subdevice interface with the go7007 device */
 460         if (v4l2_device_register_subdev(&go->v4l2_dev, sd) < 0)
 461                 pr_info("saa7134-go7007: register subdev failed\n");
 462 
 463         dev->empress_dev = &go->vdev;
 464 
 465         go->status = STATUS_ONLINE;
 466         return 0;
 467 
 468 allocfail:
 469         if (saa->top)
 470                 free_page((unsigned long)saa->top);
 471         if (saa->bottom)
 472                 free_page((unsigned long)saa->bottom);
 473         kfree(saa);
 474         kfree(go);
 475         return -ENOMEM;
 476 }
 477 
 478 static int saa7134_go7007_fini(struct saa7134_dev *dev)
 479 {
 480         struct go7007 *go;
 481         struct saa7134_go7007 *saa;
 482 
 483         if (NULL == dev->empress_dev)
 484                 return 0;
 485 
 486         go = video_get_drvdata(dev->empress_dev);
 487         if (go->audio_enabled)
 488                 go7007_snd_remove(go);
 489 
 490         saa = go->hpi_context;
 491         go->status = STATUS_SHUTDOWN;
 492         free_page((unsigned long)saa->top);
 493         free_page((unsigned long)saa->bottom);
 494         v4l2_device_unregister_subdev(&saa->sd);
 495         kfree(saa);
 496         video_unregister_device(&go->vdev);
 497 
 498         v4l2_device_put(&go->v4l2_dev);
 499         dev->empress_dev = NULL;
 500 
 501         return 0;
 502 }
 503 
 504 static struct saa7134_mpeg_ops saa7134_go7007_ops = {
 505         .type          = SAA7134_MPEG_GO7007,
 506         .init          = saa7134_go7007_init,
 507         .fini          = saa7134_go7007_fini,
 508         .irq_ts_done   = saa7134_go7007_irq_ts_done,
 509 };
 510 
 511 static int __init saa7134_go7007_mod_init(void)
 512 {
 513         return saa7134_ts_register(&saa7134_go7007_ops);
 514 }
 515 
 516 static void __exit saa7134_go7007_mod_cleanup(void)
 517 {
 518         saa7134_ts_unregister(&saa7134_go7007_ops);
 519 }
 520 
 521 module_init(saa7134_go7007_mod_init);
 522 module_exit(saa7134_go7007_mod_cleanup);
 523 
 524 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */