saa7134-empress.c revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * $Id: saa7134-empress.c,v 1.10 2005/02/03 10:24:33 kraxel Exp $ 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h> 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/moduleparam.h> 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h> 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h> 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "saa7134-reg.h" 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "saa7134.h" 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <media/saa6752hs.h> 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------ */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int empress_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(empress_nr, int, NULL, 0444); 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(empress_nr,"ts device number"); 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int debug = 0; 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(debug, int, 0644); 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(debug,"enable debug messages"); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define dprintk(fmt, arg...) if (debug) \ 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_DEBUG "%s/empress: " fmt, dev->name , ## arg) 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------ */ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ts_reset_encoder(struct saa7134_dev* dev) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dev->empress_started) 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa_writeb(SAA7134_SPECIAL_MODE, 0x00); 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(10); 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa_writeb(SAA7134_SPECIAL_MODE, 0x01); 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(100); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_started = 0; 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ts_init_encoder(struct saa7134_dev* dev) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_reset_encoder(dev); 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL); 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_started = 1; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------ */ 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ts_open(struct inode *inode, struct file *file) 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int minor = iminor(inode); 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *h,*dev = NULL; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *list; 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each(list,&saa7134_devlist) { 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds h = list_entry(list, struct saa7134_dev, devlist); 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (h->empress_dev && h->empress_dev->minor == minor) 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev = h; 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (NULL == dev) 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENODEV; 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk("open minor=%d\n",minor); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = -EBUSY; 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (down_trylock(&dev->empress_tsq.lock)) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto done; 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dev->empress_users) 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto done_up; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_users++; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds file->private_data = dev; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = 0; 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdone_up: 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds up(&dev->empress_tsq.lock); 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdone: 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ts_release(struct inode *inode, struct file *file) 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *dev = file->private_data; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dev->empress_tsq.streaming) 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds videobuf_streamoff(&dev->empress_tsq); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds down(&dev->empress_tsq.lock); 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dev->empress_tsq.reading) 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds videobuf_read_stop(&dev->empress_tsq); 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds videobuf_mmap_free(&dev->empress_tsq); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_users--; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* stop the encoder */ 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_reset_encoder(dev); 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds up(&dev->empress_tsq.lock); 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsts_read(struct file *file, char __user *data, size_t count, loff_t *ppos) 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *dev = file->private_data; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dev->empress_started) 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_init_encoder(dev); 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_read_stream(&dev->empress_tsq, 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds data, count, ppos, 0, 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds file->f_flags & O_NONBLOCK); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsts_poll(struct file *file, struct poll_table_struct *wait) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *dev = file->private_data; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_poll_stream(file, &dev->empress_tsq, wait); 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsts_mmap(struct file *file, struct vm_area_struct * vma) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *dev = file->private_data; 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_mmap_mapper(&dev->empress_tsq, vma); 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This function is _not_ called directly, but from 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * video_generic_ioctl (and maybe others). userspace 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * copying is done already, arg is a kernel pointer. 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ts_do_ioctl(struct inode *inode, struct file *file, 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int cmd, void *arg) 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev *dev = file->private_data; 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (debug > 1) 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_print_ioctl(dev->name,cmd); 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (cmd) { 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_QUERYCAP: 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_capability *cap = arg; 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset(cap,0,sizeof(*cap)); 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(cap->driver, "saa7134"); 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(cap->card, saa7134_boards[dev->board].name, 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sizeof(cap->card)); 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cap->version = SAA7134_VERSION_CODE; 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds cap->capabilities = 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds V4L2_CAP_VIDEO_CAPTURE | 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds V4L2_CAP_READWRITE | 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds V4L2_CAP_STREAMING; 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* --- input switching --------------------------------------- */ 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_ENUMINPUT: 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_input *i = arg; 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (i->index != 0) 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds i->type = V4L2_INPUT_TYPE_CAMERA; 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(i->name,"CCIR656"); 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_G_INPUT: 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int *i = arg; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *i = 0; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_S_INPUT: 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int *i = arg; 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (*i != 0) 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* --- capture ioctls ---------------------------------------- */ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_ENUM_FMT: 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_fmtdesc *f = arg; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int index; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds index = f->index; 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (index != 0) 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset(f,0,sizeof(*f)); 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->index = index; 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strlcpy(f->description, "MPEG TS", sizeof(f->description)); 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->pixelformat = V4L2_PIX_FMT_MPEG; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_G_FMT: 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_format *f = arg; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset(f,0,sizeof(*f)); 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* FIXME: translate subsampling type EMPRESS into 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * width/height: */ 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.width = 720; /* D1 */ 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.height = 576; 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets; 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_S_FMT: 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_format *f = arg; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EINVAL; 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FIXME: translate and round width/height into EMPRESS 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds subsample type: 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds type | PAL | NTSC 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds --------------------------- 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SIF | 352x288 | 352x240 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1/2 D1 | 352x576 | 352x480 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2/3 D1 | 480x576 | 480x480 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds D1 | 720x576 | 720x480 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.width = 720; /* D1 */ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.height = 576; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds f->fmt.pix.sizeimage = TS_PACKET_SIZE* dev->ts.nr_packets; 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_REQBUFS: 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_reqbufs(&dev->empress_tsq,arg); 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_QUERYBUF: 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_querybuf(&dev->empress_tsq,arg); 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_QBUF: 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_qbuf(&dev->empress_tsq,arg); 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_DQBUF: 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_dqbuf(&dev->empress_tsq,arg, 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds file->f_flags & O_NONBLOCK); 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_STREAMON: 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_streamon(&dev->empress_tsq); 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_STREAMOFF: 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return videobuf_streamoff(&dev->empress_tsq); 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_QUERYCTRL: 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_G_CTRL: 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_S_CTRL: 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7134_common_ioctl(dev, cmd, arg); 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_S_MPEGCOMP: 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, arg); 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_init_encoder(dev); 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case VIDIOC_G_MPEGCOMP: 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_i2c_call_clients(dev, VIDIOC_G_MPEGCOMP, arg); 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOIOCTLCMD; 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ts_ioctl(struct inode *inode, struct file *file, 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int cmd, unsigned long arg) 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return video_usercopy(inode, file, cmd, arg, ts_do_ioctl); 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct file_operations ts_fops = 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .open = ts_open, 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .release = ts_release, 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .read = ts_read, 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .poll = ts_poll, 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .mmap = ts_mmap, 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .ioctl = ts_ioctl, 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .llseek = no_llseek, 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ----------------------------------------------------------- */ 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct video_device saa7134_empress_template = 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "saa7134-empress", 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = 0 /* FIXME */, 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type2 = 0 /* FIXME */, 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .hardware = 0, 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fops = &ts_fops, 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .minor = -1, 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void empress_signal_update(void* data) 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct saa7134_dev* dev = (struct saa7134_dev*) data; 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dev->nosignal) { 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk("no video signal\n"); 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_reset_encoder(dev); 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk("video signal acquired\n"); 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dev->empress_users) 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ts_init_encoder(dev); 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void empress_signal_change(struct saa7134_dev *dev) 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds schedule_work(&dev->empress_workqueue); 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int empress_init(struct saa7134_dev *dev) 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int err; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk("%s: %s\n",dev->name,__FUNCTION__); 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_dev = video_device_alloc(); 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (NULL == dev->empress_dev) 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *(dev->empress_dev) = saa7134_empress_template; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_dev->dev = &dev->pci->dev; 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_dev->release = video_device_release; 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name), 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "%s empress (%s)", dev->name, 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_boards[dev->board].name); 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds INIT_WORK(&dev->empress_workqueue, empress_signal_update, (void*) dev); 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER, 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds empress_nr[dev->nr]); 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (err < 0) { 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "%s: can't register video device\n", 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->name); 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds video_device_release(dev->empress_dev); 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_dev = NULL; 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return err; 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds printk(KERN_INFO "%s: registered device video%d [mpeg]\n", 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->name,dev->empress_dev->minor & 0x1f); 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds videobuf_queue_init(&dev->empress_tsq, &saa7134_ts_qops, 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->pci, &dev->slock, 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds V4L2_BUF_TYPE_VIDEO_CAPTURE, 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds V4L2_FIELD_ALTERNATE, 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sizeof(struct saa7134_buf), 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev); 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds empress_signal_update(dev); 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int empress_fini(struct saa7134_dev *dev) 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dprintk("%s: %s\n",dev->name,__FUNCTION__); 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (NULL == dev->empress_dev) 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds flush_scheduled_work(); 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds video_unregister_device(dev->empress_dev); 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dev->empress_dev = NULL; 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct saa7134_mpeg_ops empress_ops = { 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = SAA7134_MPEG_EMPRESS, 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .init = empress_init, 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .fini = empress_fini, 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .signal_change = empress_signal_change, 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init empress_register(void) 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return saa7134_ts_register(&empress_ops); 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit empress_unregister(void) 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds saa7134_ts_unregister(&empress_ops); 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(empress_register); 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(empress_unregister); 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ----------------------------------------------------------- */ 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Local variables: 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * c-basic-offset: 8 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * End: 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 437