0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #include <linux/pci.h>
0034 #include <linux/i2c.h>
0035 #include <linux/kdev_t.h>
0036 #include <linux/mutex.h>
0037 #include <linux/crc32.h>
0038 #include <linux/kthread.h>
0039 #include <linux/freezer.h>
0040
0041 #include <media/tuner.h>
0042 #include <media/tveeprom.h>
0043 #include <media/dvb_demux.h>
0044 #include <media/dvb_frontend.h>
0045 #include <media/dvb_net.h>
0046 #include <media/dvbdev.h>
0047 #include <media/dmxdev.h>
0048 #include <media/v4l2-common.h>
0049 #include <media/v4l2-ioctl.h>
0050 #include <media/v4l2-device.h>
0051 #include <media/v4l2-ctrls.h>
0052 #include <media/v4l2-event.h>
0053
0054 #include "saa7164-reg.h"
0055 #include "saa7164-types.h"
0056
0057 #define SAA7164_MAXBOARDS 8
0058
0059 #define UNSET (-1U)
0060 #define SAA7164_BOARD_NOAUTO UNSET
0061 #define SAA7164_BOARD_UNKNOWN 0
0062 #define SAA7164_BOARD_UNKNOWN_REV2 1
0063 #define SAA7164_BOARD_UNKNOWN_REV3 2
0064 #define SAA7164_BOARD_HAUPPAUGE_HVR2250 3
0065 #define SAA7164_BOARD_HAUPPAUGE_HVR2200 4
0066 #define SAA7164_BOARD_HAUPPAUGE_HVR2200_2 5
0067 #define SAA7164_BOARD_HAUPPAUGE_HVR2200_3 6
0068 #define SAA7164_BOARD_HAUPPAUGE_HVR2250_2 7
0069 #define SAA7164_BOARD_HAUPPAUGE_HVR2250_3 8
0070 #define SAA7164_BOARD_HAUPPAUGE_HVR2200_4 9
0071 #define SAA7164_BOARD_HAUPPAUGE_HVR2200_5 10
0072 #define SAA7164_BOARD_HAUPPAUGE_HVR2255proto 11
0073 #define SAA7164_BOARD_HAUPPAUGE_HVR2255 12
0074 #define SAA7164_BOARD_HAUPPAUGE_HVR2205 13
0075
0076 #define SAA7164_MAX_UNITS 8
0077 #define SAA7164_TS_NUMBER_OF_LINES 312
0078 #define SAA7164_PS_NUMBER_OF_LINES 256
0079 #define SAA7164_PT_ENTRIES 16
0080 #define SAA7164_MAX_ENCODER_BUFFERS 64
0081 #define SAA7164_MAX_VBI_BUFFERS 64
0082
0083
0084 #define SAA7164_PORT_TS1 (0)
0085 #define SAA7164_PORT_TS2 (SAA7164_PORT_TS1 + 1)
0086 #define SAA7164_PORT_ENC1 (SAA7164_PORT_TS2 + 1)
0087 #define SAA7164_PORT_ENC2 (SAA7164_PORT_ENC1 + 1)
0088 #define SAA7164_PORT_VBI1 (SAA7164_PORT_ENC2 + 1)
0089 #define SAA7164_PORT_VBI2 (SAA7164_PORT_VBI1 + 1)
0090 #define SAA7164_MAX_PORTS (SAA7164_PORT_VBI2 + 1)
0091
0092 #define DBGLVL_FW 4
0093 #define DBGLVL_DVB 8
0094 #define DBGLVL_I2C 16
0095 #define DBGLVL_API 32
0096 #define DBGLVL_CMD 64
0097 #define DBGLVL_BUS 128
0098 #define DBGLVL_IRQ 256
0099 #define DBGLVL_BUF 512
0100 #define DBGLVL_ENC 1024
0101 #define DBGLVL_VBI 2048
0102 #define DBGLVL_THR 4096
0103 #define DBGLVL_CPU 8192
0104
0105 #define SAA7164_NORMS \
0106 (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP)
0107
0108
0109 #define SAA7164_TV_MIN_FREQ (44U * 16U)
0110 #define SAA7164_TV_MAX_FREQ (958U * 16U)
0111
0112 enum port_t {
0113 SAA7164_MPEG_UNDEFINED = 0,
0114 SAA7164_MPEG_DVB,
0115 SAA7164_MPEG_ENCODER,
0116 SAA7164_MPEG_VBI,
0117 };
0118
0119 enum saa7164_i2c_bus_nr {
0120 SAA7164_I2C_BUS_0 = 0,
0121 SAA7164_I2C_BUS_1,
0122 SAA7164_I2C_BUS_2,
0123 };
0124
0125 enum saa7164_buffer_flags {
0126 SAA7164_BUFFER_UNDEFINED = 0,
0127 SAA7164_BUFFER_FREE,
0128 SAA7164_BUFFER_BUSY,
0129 SAA7164_BUFFER_FULL
0130 };
0131
0132 enum saa7164_unit_type {
0133 SAA7164_UNIT_UNDEFINED = 0,
0134 SAA7164_UNIT_DIGITAL_DEMODULATOR,
0135 SAA7164_UNIT_ANALOG_DEMODULATOR,
0136 SAA7164_UNIT_TUNER,
0137 SAA7164_UNIT_EEPROM,
0138 SAA7164_UNIT_ZILOG_IRBLASTER,
0139 SAA7164_UNIT_ENCODER,
0140 };
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 struct saa7164_unit {
0151 enum saa7164_unit_type type;
0152 u8 id;
0153 char *name;
0154 enum saa7164_i2c_bus_nr i2c_bus_nr;
0155 u8 i2c_bus_addr;
0156 u8 i2c_reg_len;
0157 };
0158
0159 struct saa7164_board {
0160 char *name;
0161 enum port_t porta, portb, portc,
0162 portd, porte, portf;
0163 enum {
0164 SAA7164_CHIP_UNDEFINED = 0,
0165 SAA7164_CHIP_REV2,
0166 SAA7164_CHIP_REV3,
0167 } chiprev;
0168 struct saa7164_unit unit[SAA7164_MAX_UNITS];
0169 };
0170
0171 struct saa7164_subid {
0172 u16 subvendor;
0173 u16 subdevice;
0174 u32 card;
0175 };
0176
0177 struct saa7164_encoder_fh {
0178 struct v4l2_fh fh;
0179 struct saa7164_port *port;
0180 atomic_t v4l_reading;
0181 };
0182
0183 struct saa7164_vbi_fh {
0184 struct v4l2_fh fh;
0185 struct saa7164_port *port;
0186 atomic_t v4l_reading;
0187 };
0188
0189 struct saa7164_histogram_bucket {
0190 u32 val;
0191 u32 count;
0192 u64 update_time;
0193 };
0194
0195 struct saa7164_histogram {
0196 char name[32];
0197 struct saa7164_histogram_bucket counter1[64];
0198 };
0199
0200 struct saa7164_user_buffer {
0201 struct list_head list;
0202
0203
0204 u8 *data;
0205 u32 pos;
0206 u32 actual_size;
0207
0208 u32 crc;
0209 };
0210
0211 struct saa7164_fw_status {
0212
0213
0214 u32 status;
0215 u32 mode;
0216 u32 spec;
0217 u32 inst;
0218 u32 cpuload;
0219 u32 remainheap;
0220
0221
0222 u32 version;
0223 u32 major;
0224 u32 sub;
0225 u32 rel;
0226 u32 buildnr;
0227 };
0228
0229 struct saa7164_dvb {
0230 struct mutex lock;
0231 struct dvb_adapter adapter;
0232 struct dvb_frontend *frontend;
0233 struct dvb_demux demux;
0234 struct dmxdev dmxdev;
0235 struct dmx_frontend fe_hw;
0236 struct dmx_frontend fe_mem;
0237 struct dvb_net net;
0238 int feeding;
0239 };
0240
0241 struct saa7164_i2c {
0242 struct saa7164_dev *dev;
0243
0244 enum saa7164_i2c_bus_nr nr;
0245
0246
0247 struct i2c_adapter i2c_adap;
0248 struct i2c_client i2c_client;
0249 u32 i2c_rc;
0250 };
0251
0252 struct saa7164_tvnorm {
0253 char *name;
0254 v4l2_std_id id;
0255 };
0256
0257 struct saa7164_encoder_params {
0258 struct saa7164_tvnorm encodernorm;
0259 u32 height;
0260 u32 width;
0261 u32 is_50hz;
0262 u32 bitrate;
0263 u32 bitrate_peak;
0264 u32 bitrate_mode;
0265 u32 stream_type;
0266
0267 u32 audio_sampling_freq;
0268 u32 ctl_mute;
0269 u32 ctl_aspect;
0270 u32 refdist;
0271 u32 gop_size;
0272 };
0273
0274 struct saa7164_vbi_params {
0275 struct saa7164_tvnorm encodernorm;
0276 u32 height;
0277 u32 width;
0278 u32 is_50hz;
0279 u32 bitrate;
0280 u32 bitrate_peak;
0281 u32 bitrate_mode;
0282 u32 stream_type;
0283
0284 u32 audio_sampling_freq;
0285 u32 ctl_mute;
0286 u32 ctl_aspect;
0287 u32 refdist;
0288 u32 gop_size;
0289 };
0290
0291 struct saa7164_port;
0292
0293 struct saa7164_buffer {
0294 struct list_head list;
0295
0296
0297 int idx;
0298
0299 struct saa7164_port *port;
0300
0301
0302
0303 enum saa7164_buffer_flags flags;
0304
0305
0306 u32 pci_size;
0307 u64 *cpu;
0308 dma_addr_t dma;
0309 u32 crc;
0310
0311
0312 u32 pt_size;
0313 u64 *pt_cpu;
0314 dma_addr_t pt_dma;
0315
0316
0317 u32 pos;
0318 u32 actual_size;
0319 };
0320
0321 struct saa7164_port {
0322
0323 struct saa7164_dev *dev;
0324 enum port_t type;
0325 int nr;
0326
0327
0328
0329
0330 struct tmHWStreamParameters hw_streamingparams;
0331
0332
0333 struct tmComResDMATermDescrHeader hwcfg;
0334
0335
0336 u32 bufcounter;
0337 u32 pitch;
0338 u32 bufsize;
0339 u32 bufoffset;
0340 u32 bufptr32l;
0341 u32 bufptr32h;
0342 u64 bufptr64;
0343
0344 u32 numpte;
0345
0346 struct mutex dmaqueue_lock;
0347 struct saa7164_buffer dmaqueue;
0348
0349 u64 last_irq_msecs, last_svc_msecs;
0350 u64 last_irq_msecs_diff, last_svc_msecs_diff;
0351 u32 last_svc_wp;
0352 u32 last_svc_rp;
0353 u64 last_irq_svc_msecs_diff;
0354 u64 last_read_msecs, last_read_msecs_diff;
0355 u64 last_poll_msecs, last_poll_msecs_diff;
0356
0357 struct saa7164_histogram irq_interval;
0358 struct saa7164_histogram svc_interval;
0359 struct saa7164_histogram irq_svc_interval;
0360 struct saa7164_histogram read_interval;
0361 struct saa7164_histogram poll_interval;
0362
0363
0364 struct saa7164_dvb dvb;
0365 struct i2c_client *i2c_client_demod;
0366 struct i2c_client *i2c_client_tuner;
0367
0368
0369
0370
0371 struct saa7164_tvnorm encodernorm;
0372 struct v4l2_ctrl_handler ctrl_handler;
0373 v4l2_std_id std;
0374 u32 height;
0375 u32 width;
0376 u32 freq;
0377 u8 mux_input;
0378 u8 encoder_profile;
0379 u8 video_format;
0380 u8 audio_format;
0381 u8 video_resolution;
0382 u16 ctl_brightness;
0383 u16 ctl_contrast;
0384 u16 ctl_hue;
0385 u16 ctl_saturation;
0386 u16 ctl_sharpness;
0387 s8 ctl_volume;
0388
0389 struct tmComResAFeatureDescrHeader audfeat;
0390 struct tmComResEncoderDescrHeader encunit;
0391 struct tmComResProcDescrHeader vidproc;
0392 struct tmComResExtDevDescrHeader ifunit;
0393 struct tmComResTunerDescrHeader tunerunit;
0394
0395 struct work_struct workenc;
0396
0397
0398 struct saa7164_encoder_params encoder_params;
0399 struct video_device *v4l_device;
0400 atomic_t v4l_reader_count;
0401
0402 struct saa7164_buffer list_buf_used;
0403 struct saa7164_buffer list_buf_free;
0404 wait_queue_head_t wait_read;
0405
0406
0407 struct tmComResVBIFormatDescrHeader vbi_fmt_ntsc;
0408 struct saa7164_vbi_params vbi_params;
0409 struct saa7164_port *enc_port;
0410
0411
0412 u32 sync_errors;
0413 u32 v_cc_errors;
0414 u32 a_cc_errors;
0415 u8 last_v_cc;
0416 u8 last_a_cc;
0417 u32 done_first_interrupt;
0418 };
0419
0420 struct saa7164_dev {
0421 struct list_head devlist;
0422 atomic_t refcount;
0423
0424 struct v4l2_device v4l2_dev;
0425
0426
0427 struct pci_dev *pci;
0428 unsigned char pci_rev, pci_lat;
0429 int pci_bus, pci_slot;
0430 u32 __iomem *lmmio;
0431 u8 __iomem *bmmio;
0432 u32 __iomem *lmmio2;
0433 u8 __iomem *bmmio2;
0434 int pci_irqmask;
0435
0436
0437 int nr;
0438 int hwrevision;
0439 u32 board;
0440 char name[16];
0441
0442
0443 struct saa7164_fw_status fw_status;
0444 u32 firmwareloaded;
0445
0446 struct tmComResHWDescr hwdesc;
0447 struct tmComResInterfaceDescr intfdesc;
0448 struct tmComResBusDescr busdesc;
0449
0450 struct tmComResBusInfo bus;
0451
0452
0453 u32 int_status;
0454 u32 int_ack;
0455 bool msi;
0456
0457 struct cmd cmds[SAA_CMD_MAX_MSG_UNITS];
0458 struct mutex lock;
0459
0460
0461 struct saa7164_i2c i2c_bus[3];
0462
0463
0464 struct saa7164_port ports[SAA7164_MAX_PORTS];
0465
0466
0467 struct work_struct workcmd;
0468
0469
0470
0471
0472 struct task_struct *kthread;
0473
0474 };
0475
0476 extern struct list_head saa7164_devlist;
0477 extern unsigned int waitsecs;
0478 extern unsigned int encoder_buffers;
0479 extern unsigned int vbi_buffers;
0480
0481
0482
0483 void saa7164_dumpregs(struct saa7164_dev *dev, u32 addr);
0484 void saa7164_getfirmwarestatus(struct saa7164_dev *dev);
0485 u32 saa7164_getcurrentfirmwareversion(struct saa7164_dev *dev);
0486 void saa7164_histogram_update(struct saa7164_histogram *hg, u32 val);
0487
0488
0489
0490 int saa7164_downloadfirmware(struct saa7164_dev *dev);
0491
0492
0493
0494 extern int saa7164_i2c_register(struct saa7164_i2c *bus);
0495 extern int saa7164_i2c_unregister(struct saa7164_i2c *bus);
0496 extern void saa7164_call_i2c_clients(struct saa7164_i2c *bus,
0497 unsigned int cmd, void *arg);
0498
0499
0500
0501 int saa7164_bus_setup(struct saa7164_dev *dev);
0502 void saa7164_bus_dump(struct saa7164_dev *dev);
0503 int saa7164_bus_set(struct saa7164_dev *dev, struct tmComResInfo* msg,
0504 void *buf);
0505 int saa7164_bus_get(struct saa7164_dev *dev, struct tmComResInfo* msg,
0506 void *buf, int peekonly);
0507
0508
0509
0510 int saa7164_cmd_send(struct saa7164_dev *dev,
0511 u8 id, enum tmComResCmd command, u16 controlselector,
0512 u16 size, void *buf);
0513 void saa7164_cmd_signal(struct saa7164_dev *dev, u8 seqno);
0514 int saa7164_irq_dequeue(struct saa7164_dev *dev);
0515
0516
0517
0518 int saa7164_api_get_fw_version(struct saa7164_dev *dev, u32 *version);
0519 int saa7164_api_enum_subdevs(struct saa7164_dev *dev);
0520 int saa7164_api_i2c_read(struct saa7164_i2c *bus, u8 addr, u32 reglen, u8 *reg,
0521 u32 datalen, u8 *data);
0522 int saa7164_api_i2c_write(struct saa7164_i2c *bus, u8 addr,
0523 u32 datalen, u8 *data);
0524 int saa7164_api_dif_write(struct saa7164_i2c *bus, u8 addr,
0525 u32 datalen, u8 *data);
0526 int saa7164_api_read_eeprom(struct saa7164_dev *dev, u8 *buf, int buflen);
0527 int saa7164_api_set_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin);
0528 int saa7164_api_clear_gpiobit(struct saa7164_dev *dev, u8 unitid, u8 pin);
0529 int saa7164_api_transition_port(struct saa7164_port *port, u8 mode);
0530 int saa7164_api_initialize_dif(struct saa7164_port *port);
0531 int saa7164_api_configure_dif(struct saa7164_port *port, u32 std);
0532 int saa7164_api_set_encoder(struct saa7164_port *port);
0533 int saa7164_api_get_encoder(struct saa7164_port *port);
0534 int saa7164_api_set_aspect_ratio(struct saa7164_port *port);
0535 int saa7164_api_set_usercontrol(struct saa7164_port *port, u8 ctl);
0536 int saa7164_api_get_usercontrol(struct saa7164_port *port, u8 ctl);
0537 int saa7164_api_set_videomux(struct saa7164_port *port);
0538 int saa7164_api_audio_mute(struct saa7164_port *port, int mute);
0539 int saa7164_api_set_audio_volume(struct saa7164_port *port, s8 level);
0540 int saa7164_api_set_audio_std(struct saa7164_port *port);
0541 int saa7164_api_set_audio_detection(struct saa7164_port *port, int autodetect);
0542 int saa7164_api_get_videomux(struct saa7164_port *port);
0543 int saa7164_api_set_vbi_format(struct saa7164_port *port);
0544 int saa7164_api_set_debug(struct saa7164_dev *dev, u8 level);
0545 int saa7164_api_collect_debug(struct saa7164_dev *dev);
0546 int saa7164_api_get_load_info(struct saa7164_dev *dev,
0547 struct tmFwInfoStruct *i);
0548
0549
0550
0551 extern struct saa7164_board saa7164_boards[];
0552 extern const unsigned int saa7164_bcount;
0553
0554 extern struct saa7164_subid saa7164_subids[];
0555 extern const unsigned int saa7164_idcount;
0556
0557 extern void saa7164_card_list(struct saa7164_dev *dev);
0558 extern void saa7164_gpio_setup(struct saa7164_dev *dev);
0559 extern void saa7164_card_setup(struct saa7164_dev *dev);
0560
0561 extern int saa7164_i2caddr_to_reglen(struct saa7164_i2c *bus, int addr);
0562 extern int saa7164_i2caddr_to_unitid(struct saa7164_i2c *bus, int addr);
0563 extern char *saa7164_unitid_name(struct saa7164_dev *dev, u8 unitid);
0564
0565
0566
0567 extern int saa7164_dvb_register(struct saa7164_port *port);
0568 extern int saa7164_dvb_unregister(struct saa7164_port *port);
0569
0570
0571
0572 extern struct saa7164_buffer *saa7164_buffer_alloc(
0573 struct saa7164_port *port, u32 len);
0574 extern int saa7164_buffer_dealloc(struct saa7164_buffer *buf);
0575 extern void saa7164_buffer_display(struct saa7164_buffer *buf);
0576 extern int saa7164_buffer_activate(struct saa7164_buffer *buf, int i);
0577 extern int saa7164_buffer_cfg_port(struct saa7164_port *port);
0578 extern struct saa7164_user_buffer *saa7164_buffer_alloc_user(
0579 struct saa7164_dev *dev, u32 len);
0580 extern void saa7164_buffer_dealloc_user(struct saa7164_user_buffer *buf);
0581 extern int saa7164_buffer_zero_offsets(struct saa7164_port *port, int i);
0582
0583
0584
0585 int saa7164_s_std(struct saa7164_port *port, v4l2_std_id id);
0586 int saa7164_g_std(struct saa7164_port *port, v4l2_std_id *id);
0587 int saa7164_enum_input(struct file *file, void *priv, struct v4l2_input *i);
0588 int saa7164_g_input(struct saa7164_port *port, unsigned int *i);
0589 int saa7164_s_input(struct saa7164_port *port, unsigned int i);
0590 int saa7164_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t);
0591 int saa7164_s_tuner(struct file *file, void *priv, const struct v4l2_tuner *t);
0592 int saa7164_g_frequency(struct saa7164_port *port, struct v4l2_frequency *f);
0593 int saa7164_s_frequency(struct saa7164_port *port,
0594 const struct v4l2_frequency *f);
0595 int saa7164_encoder_register(struct saa7164_port *port);
0596 void saa7164_encoder_unregister(struct saa7164_port *port);
0597
0598
0599
0600 int saa7164_vbi_register(struct saa7164_port *port);
0601 void saa7164_vbi_unregister(struct saa7164_port *port);
0602
0603
0604
0605 extern unsigned int crc_checking;
0606
0607 extern unsigned int saa_debug;
0608 #define dprintk(level, fmt, arg...)\
0609 do { if (saa_debug & level)\
0610 printk(KERN_DEBUG "%s: " fmt, dev->name, ## arg);\
0611 } while (0)
0612
0613 #define log_warn(fmt, arg...)\
0614 do { \
0615 printk(KERN_WARNING "%s: " fmt, dev->name, ## arg);\
0616 } while (0)
0617
0618 #define saa7164_readl(reg) readl(dev->lmmio + ((reg) >> 2))
0619 #define saa7164_writel(reg, value) writel((value), dev->lmmio + ((reg) >> 2))
0620
0621 #define saa7164_readb(reg) readl(dev->bmmio + (reg))
0622 #define saa7164_writeb(reg, value) writel((value), dev->bmmio + (reg))
0623