/* Copyright (C) 2003 Cherry George Mathew This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include /* We'll upgrade to V4L2, once we're * up and include. */ #include /* Just for extra safety. We're writing into \ reserved vga io space. Don't want any funny\ stuff there. */ /* Functional level debugging */ #define dprintk(fmt, args...) if (debug>=1) printk(KERN_DEBUG "pvcl-debug: " fmt, ## args); /* Debugging single functions */ #define tprintk(fmt, args...) if (debug>=2) printk(KERN_DEBUG "pvcl-debug: " fmt, ## args); /* Warning - too verbose. Debugging port conversations. */ #define vprintk(fmt, args...) if (debug>=3) printk(KERN_DEBUG "pvcl-debug:" fmt, ## args); #define MAX_CARDS 2 #define GD_SR_OFFSET 0x3c4 #define GD_GR_OFFSET 0x3ce #define GD_CR_OFFSET 0x3d4 #define GD_CHROMA_KEY 0x80 struct gd_status_t { struct video_buffer * vbuf_p; struct video_window * vwin_p; struct video_tuner * vtun_p; struct video_channel *vchan_p; struct video_picture *vpict_p; struct i2c_adapter * adapter_p; unsigned long freq; }; /* Card structure below holds info about the adapter card on which the \ * I2C bus sits on. */ struct clgd54xx_card{ unsigned short clgd54xx_pci_dev_id; int vram; int model; unsigned long gd_io_base; struct pci_dev *clgd54xx_pci_dev_p; long spinflags; spinlock_t spun_lock; unsigned long i2c_state; struct i2c_adapter *clgd54xx_adapter_p; struct i2c_algo_bit_data *clgd54xx_bitbang_adapter_p; struct gd_status_t * drv_stat_p; }; /* Function Definitions. */ /* Register level functions. */ static inline unsigned io_readb (unsigned); static inline void io_writeb (unsigned, unsigned); static inline void gd_write_sr(struct clgd54xx_card *, unsigned char ,unsigned ); static inline void gd_write_gr(struct clgd54xx_card *, unsigned char ,unsigned ); static inline void gd_write_cr(struct clgd54xx_card *, unsigned char ,unsigned ); static inline unsigned gd_read_sr(struct clgd54xx_card *, unsigned ); static inline unsigned gd_read_gr(struct clgd54xx_card *, unsigned reg); static inline unsigned gd_read_cr(struct clgd54xx_card *, unsigned reg); /* VGA Wrapper functions */ static void gd_bit_copy(unsigned long * dest, int dest_start, unsigned long * src, int src_start, int src_stop); static long gd_window_init(struct clgd54xx_card *); /* VGA hardware video programming functions. */ static void gd_enable_window(struct clgd54xx_card *); static void gd_disable_window(struct clgd54xx_card *); static void gd_set_vbuf1(struct clgd54xx_card *, unsigned long ); static void gd_set_vbuf2(struct clgd54xx_card *, unsigned long ); static unsigned long gd_get_vbuf1(struct clgd54xx_card *); static unsigned long gd_get_vbuf2(struct clgd54xx_card *); static void gd_set_pitch(struct clgd54xx_card * card_p, unsigned long ); static unsigned long gd_get_pitch(struct clgd54xx_card *); /* VGA video window functions */ static void gd_set_window(struct clgd54xx_card *, struct video_window *, struct video_window *, struct video_buffer *); static void gd_get_window(struct clgd54xx_card *, struct video_window *, struct video_buffer *); /* I2C bus bit level functions. */ static void gd54xx_setsda (void *bit_adap_dat, int state); static void gd54xx_setscl (void *bit_adap_dat, int state); static int gd54xx_getsda (void *bit_adap_dat); static int gd54xx_getscl (void *bit_adap_dat); /* I2C callbacks. */ static int i2c_clgd54xx_init_adapter(struct clgd54xx_card *, struct i2c_adapter *, struct i2c_algo_bit_data *); static int i2c_clgd54xx_cleanup_adapter(struct clgd54xx_card *); static int i2c_clgd54xx_probe_card(struct clgd54xx_card *); static int i2c_clgd54xx_find_card(struct clgd54xx_card *); static int __init i2c_clgd54xx_init(struct clgd54xx_card *, struct i2c_adapter *, struct i2c_algo_bit_data *); static int __init i2c_clgd54xx_cleanup(struct clgd54xx_card *); /* Generic VGA Routines */ static int gd_count_ram(struct clgd54xx_card *card_p); /* V4L Callbacks */ static void do_client_ioctl(struct file*, unsigned int cmd, void *arg);