0001
0002 #ifndef __SAA7146__
0003 #define __SAA7146__
0004
0005 #include <linux/delay.h> /* for delay-stuff */
0006 #include <linux/slab.h> /* for kmalloc/kfree */
0007 #include <linux/pci.h> /* for pci-config-stuff, vendor ids etc. */
0008 #include <linux/init.h> /* for "__init" */
0009 #include <linux/interrupt.h> /* for IMMEDIATE_BH */
0010 #include <linux/kmod.h> /* for kernel module loader */
0011 #include <linux/i2c.h> /* for i2c subsystem */
0012 #include <asm/io.h> /* for accessing devices */
0013 #include <linux/stringify.h>
0014 #include <linux/mutex.h>
0015 #include <linux/scatterlist.h>
0016 #include <media/v4l2-device.h>
0017 #include <media/v4l2-ctrls.h>
0018
0019 #include <linux/vmalloc.h> /* for vmalloc() */
0020 #include <linux/mm.h> /* for vmalloc_to_page() */
0021
0022 #define saa7146_write(sxy,adr,dat) writel((dat),(sxy->mem+(adr)))
0023 #define saa7146_read(sxy,adr) readl(sxy->mem+(adr))
0024
0025 extern unsigned int saa7146_debug;
0026
0027 #ifndef DEBUG_VARIABLE
0028 #define DEBUG_VARIABLE saa7146_debug
0029 #endif
0030
0031 #define ERR(fmt, ...) pr_err("%s: " fmt, __func__, ##__VA_ARGS__)
0032
0033 #define _DBG(mask, fmt, ...) \
0034 do { \
0035 if (DEBUG_VARIABLE & mask) \
0036 pr_debug("%s(): " fmt, __func__, ##__VA_ARGS__); \
0037 } while (0)
0038
0039
0040 #define DEB_S(fmt, ...) _DBG(0x01, fmt, ##__VA_ARGS__)
0041
0042 #define DEB_D(fmt, ...) _DBG(0x02, fmt, ##__VA_ARGS__)
0043
0044 #define DEB_EE(fmt, ...) _DBG(0x04, fmt, ##__VA_ARGS__)
0045
0046 #define DEB_I2C(fmt, ...) _DBG(0x08, fmt, ##__VA_ARGS__)
0047
0048 #define DEB_VBI(fmt, ...) _DBG(0x10, fmt, ##__VA_ARGS__)
0049
0050 #define DEB_INT(fmt, ...) _DBG(0x20, fmt, ##__VA_ARGS__)
0051
0052 #define DEB_CAP(fmt, ...) _DBG(0x40, fmt, ##__VA_ARGS__)
0053
0054 #define SAA7146_ISR_CLEAR(x,y) \
0055 saa7146_write(x, ISR, (y));
0056
0057 struct module;
0058
0059 struct saa7146_dev;
0060 struct saa7146_extension;
0061 struct saa7146_vv;
0062
0063
0064 struct saa7146_pgtable {
0065 unsigned int size;
0066 __le32 *cpu;
0067 dma_addr_t dma;
0068
0069 unsigned long offset;
0070
0071 struct scatterlist *slist;
0072 int nents;
0073 };
0074
0075 struct saa7146_pci_extension_data {
0076 struct saa7146_extension *ext;
0077 void *ext_priv;
0078 };
0079
0080 #define MAKE_EXTENSION_PCI(x_var, x_vendor, x_device) \
0081 { \
0082 .vendor = PCI_VENDOR_ID_PHILIPS, \
0083 .device = PCI_DEVICE_ID_PHILIPS_SAA7146, \
0084 .subvendor = x_vendor, \
0085 .subdevice = x_device, \
0086 .driver_data = (unsigned long)& x_var, \
0087 }
0088
0089 struct saa7146_extension
0090 {
0091 char name[32];
0092 #define SAA7146_USE_I2C_IRQ 0x1
0093 #define SAA7146_I2C_SHORT_DELAY 0x2
0094 int flags;
0095
0096
0097
0098 struct module *module;
0099 struct pci_driver driver;
0100 const struct pci_device_id *pci_tbl;
0101
0102
0103 int (*probe)(struct saa7146_dev *);
0104 int (*attach)(struct saa7146_dev *, struct saa7146_pci_extension_data *);
0105 int (*detach)(struct saa7146_dev*);
0106
0107 u32 irq_mask;
0108 void (*irq_func)(struct saa7146_dev*, u32* irq_mask);
0109 };
0110
0111 struct saa7146_dma
0112 {
0113 dma_addr_t dma_handle;
0114 __le32 *cpu_addr;
0115 };
0116
0117 struct saa7146_dev
0118 {
0119 struct module *module;
0120
0121 struct v4l2_device v4l2_dev;
0122 struct v4l2_ctrl_handler ctrl_handler;
0123
0124
0125 spinlock_t slock;
0126 struct mutex v4l2_lock;
0127
0128 unsigned char __iomem *mem;
0129 u32 revision;
0130
0131
0132 char name[32];
0133 struct pci_dev *pci;
0134 u32 int_todo;
0135 spinlock_t int_slock;
0136
0137
0138 struct saa7146_extension *ext;
0139 void *ext_priv;
0140 struct saa7146_ext_vv *ext_vv_data;
0141
0142
0143 struct saa7146_vv *vv_data;
0144 void (*vv_callback)(struct saa7146_dev *dev, unsigned long status);
0145
0146
0147 struct mutex i2c_lock;
0148
0149 u32 i2c_bitrate;
0150 struct saa7146_dma d_i2c;
0151 wait_queue_head_t i2c_wq;
0152 int i2c_op;
0153
0154
0155 struct saa7146_dma d_rps0;
0156 struct saa7146_dma d_rps1;
0157 };
0158
0159 static inline struct saa7146_dev *to_saa7146_dev(struct v4l2_device *v4l2_dev)
0160 {
0161 return container_of(v4l2_dev, struct saa7146_dev, v4l2_dev);
0162 }
0163
0164
0165 int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate);
0166
0167
0168 int saa7146_register_extension(struct saa7146_extension*);
0169 int saa7146_unregister_extension(struct saa7146_extension*);
0170 struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc);
0171 int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt);
0172 void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt);
0173 int saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length );
0174 void *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt);
0175 void saa7146_vfree_destroy_pgtable(struct pci_dev *pci, void *mem, struct saa7146_pgtable *pt);
0176 void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data);
0177 int saa7146_wait_for_debi_done(struct saa7146_dev *dev, int nobusyloop);
0178
0179
0180 #define SAA7146_I2C_MEM ( 1*PAGE_SIZE)
0181 #define SAA7146_RPS_MEM ( 1*PAGE_SIZE)
0182
0183
0184 #define SAA7146_I2C_TIMEOUT 100
0185 #define SAA7146_I2C_RETRIES 3
0186 #define SAA7146_I2C_DELAY 5
0187
0188
0189 #define ME1 0x0000000800
0190 #define PV1 0x0000000008
0191
0192
0193 #define SAA7146_GPIO_INPUT 0x00
0194 #define SAA7146_GPIO_IRQHI 0x10
0195 #define SAA7146_GPIO_IRQLO 0x20
0196 #define SAA7146_GPIO_IRQHL 0x30
0197 #define SAA7146_GPIO_OUTLO 0x40
0198 #define SAA7146_GPIO_OUTHI 0x50
0199
0200
0201 #define DEBINOSWAP 0x000e0000
0202
0203
0204 #define CMD_NOP 0x00000000
0205 #define CMD_CLR_EVENT 0x00000000
0206 #define CMD_SET_EVENT 0x10000000
0207 #define CMD_PAUSE 0x20000000
0208 #define CMD_CHECK_LATE 0x30000000
0209 #define CMD_UPLOAD 0x40000000
0210 #define CMD_STOP 0x50000000
0211 #define CMD_INTERRUPT 0x60000000
0212 #define CMD_JUMP 0x80000000
0213 #define CMD_WR_REG 0x90000000
0214 #define CMD_RD_REG 0xa0000000
0215 #define CMD_WR_REG_MASK 0xc0000000
0216
0217 #define CMD_OAN MASK_27
0218 #define CMD_INV MASK_26
0219 #define CMD_SIG4 MASK_25
0220 #define CMD_SIG3 MASK_24
0221 #define CMD_SIG2 MASK_23
0222 #define CMD_SIG1 MASK_22
0223 #define CMD_SIG0 MASK_21
0224 #define CMD_O_FID_B MASK_14
0225 #define CMD_E_FID_B MASK_13
0226 #define CMD_O_FID_A MASK_12
0227 #define CMD_E_FID_A MASK_11
0228
0229
0230 #define EVT_HS (1<<15)
0231 #define EVT_VBI_B (1<<9)
0232 #define RPS_OAN (1<<27)
0233 #define RPS_INV (1<<26)
0234 #define GPIO3_MSK 0xFF000000
0235
0236
0237 #define MASK_00 0x00000001
0238 #define MASK_01 0x00000002
0239 #define MASK_02 0x00000004
0240 #define MASK_03 0x00000008
0241 #define MASK_04 0x00000010
0242 #define MASK_05 0x00000020
0243 #define MASK_06 0x00000040
0244 #define MASK_07 0x00000080
0245 #define MASK_08 0x00000100
0246 #define MASK_09 0x00000200
0247 #define MASK_10 0x00000400
0248 #define MASK_11 0x00000800
0249 #define MASK_12 0x00001000
0250 #define MASK_13 0x00002000
0251 #define MASK_14 0x00004000
0252 #define MASK_15 0x00008000
0253 #define MASK_16 0x00010000
0254 #define MASK_17 0x00020000
0255 #define MASK_18 0x00040000
0256 #define MASK_19 0x00080000
0257 #define MASK_20 0x00100000
0258 #define MASK_21 0x00200000
0259 #define MASK_22 0x00400000
0260 #define MASK_23 0x00800000
0261 #define MASK_24 0x01000000
0262 #define MASK_25 0x02000000
0263 #define MASK_26 0x04000000
0264 #define MASK_27 0x08000000
0265 #define MASK_28 0x10000000
0266 #define MASK_29 0x20000000
0267 #define MASK_30 0x40000000
0268 #define MASK_31 0x80000000
0269
0270 #define MASK_B0 0x000000ff
0271 #define MASK_B1 0x0000ff00
0272 #define MASK_B2 0x00ff0000
0273 #define MASK_B3 0xff000000
0274
0275 #define MASK_W0 0x0000ffff
0276 #define MASK_W1 0xffff0000
0277
0278 #define MASK_PA 0xfffffffc
0279 #define MASK_PR 0xfffffffe
0280 #define MASK_ER 0xffffffff
0281
0282 #define MASK_NONE 0x00000000
0283
0284
0285 #define BASE_ODD1 0x00
0286 #define BASE_EVEN1 0x04
0287 #define PROT_ADDR1 0x08
0288 #define PITCH1 0x0C
0289 #define BASE_PAGE1 0x10
0290 #define NUM_LINE_BYTE1 0x14
0291
0292 #define BASE_ODD2 0x18
0293 #define BASE_EVEN2 0x1C
0294 #define PROT_ADDR2 0x20
0295 #define PITCH2 0x24
0296 #define BASE_PAGE2 0x28
0297 #define NUM_LINE_BYTE2 0x2C
0298
0299 #define BASE_ODD3 0x30
0300 #define BASE_EVEN3 0x34
0301 #define PROT_ADDR3 0x38
0302 #define PITCH3 0x3C
0303 #define BASE_PAGE3 0x40
0304 #define NUM_LINE_BYTE3 0x44
0305
0306 #define PCI_BT_V1 0x48
0307 #define PCI_BT_V2 0x49
0308 #define PCI_BT_V3 0x4A
0309 #define PCI_BT_DEBI 0x4B
0310 #define PCI_BT_A 0x4C
0311
0312 #define DD1_INIT 0x50
0313
0314 #define DD1_STREAM_B 0x54
0315 #define DD1_STREAM_A 0x56
0316
0317 #define BRS_CTRL 0x58
0318 #define HPS_CTRL 0x5C
0319 #define HPS_V_SCALE 0x60
0320 #define HPS_V_GAIN 0x64
0321 #define HPS_H_PRESCALE 0x68
0322 #define HPS_H_SCALE 0x6C
0323 #define BCS_CTRL 0x70
0324 #define CHROMA_KEY_RANGE 0x74
0325 #define CLIP_FORMAT_CTRL 0x78
0326
0327 #define DEBI_CONFIG 0x7C
0328 #define DEBI_COMMAND 0x80
0329 #define DEBI_PAGE 0x84
0330 #define DEBI_AD 0x88
0331
0332 #define I2C_TRANSFER 0x8C
0333 #define I2C_STATUS 0x90
0334
0335 #define BASE_A1_IN 0x94
0336 #define PROT_A1_IN 0x98
0337 #define PAGE_A1_IN 0x9C
0338
0339 #define BASE_A1_OUT 0xA0
0340 #define PROT_A1_OUT 0xA4
0341 #define PAGE_A1_OUT 0xA8
0342
0343 #define BASE_A2_IN 0xAC
0344 #define PROT_A2_IN 0xB0
0345 #define PAGE_A2_IN 0xB4
0346
0347 #define BASE_A2_OUT 0xB8
0348 #define PROT_A2_OUT 0xBC
0349 #define PAGE_A2_OUT 0xC0
0350
0351 #define RPS_PAGE0 0xC4
0352 #define RPS_PAGE1 0xC8
0353
0354 #define RPS_THRESH0 0xCC
0355 #define RPS_THRESH1 0xD0
0356
0357 #define RPS_TOV0 0xD4
0358 #define RPS_TOV1 0xD8
0359
0360 #define IER 0xDC
0361
0362 #define GPIO_CTRL 0xE0
0363
0364 #define EC1SSR 0xE4
0365 #define EC2SSR 0xE8
0366 #define ECT1R 0xEC
0367 #define ECT2R 0xF0
0368
0369 #define ACON1 0xF4
0370 #define ACON2 0xF8
0371
0372 #define MC1 0xFC
0373 #define MC2 0x100
0374
0375 #define RPS_ADDR0 0x104
0376 #define RPS_ADDR1 0x108
0377
0378 #define ISR 0x10C
0379 #define PSR 0x110
0380 #define SSR 0x114
0381
0382 #define EC1R 0x118
0383 #define EC2R 0x11C
0384
0385 #define PCI_VDP1 0x120
0386 #define PCI_VDP2 0x124
0387 #define PCI_VDP3 0x128
0388 #define PCI_ADP1 0x12C
0389 #define PCI_ADP2 0x130
0390 #define PCI_ADP3 0x134
0391 #define PCI_ADP4 0x138
0392 #define PCI_DMA_DDP 0x13C
0393
0394 #define LEVEL_REP 0x140,
0395 #define A_TIME_SLOT1 0x180,
0396 #define A_TIME_SLOT2 0x1C0,
0397
0398
0399 #define SPCI_PPEF 0x80000000
0400 #define SPCI_PABO 0x40000000
0401 #define SPCI_PPED 0x20000000
0402 #define SPCI_RPS_I1 0x10000000
0403 #define SPCI_RPS_I0 0x08000000
0404 #define SPCI_RPS_LATE1 0x04000000
0405 #define SPCI_RPS_LATE0 0x02000000
0406 #define SPCI_RPS_E1 0x01000000
0407 #define SPCI_RPS_E0 0x00800000
0408 #define SPCI_RPS_TO1 0x00400000
0409 #define SPCI_RPS_TO0 0x00200000
0410 #define SPCI_UPLD 0x00100000
0411 #define SPCI_DEBI_S 0x00080000
0412 #define SPCI_DEBI_E 0x00040000
0413 #define SPCI_IIC_S 0x00020000
0414 #define SPCI_IIC_E 0x00010000
0415 #define SPCI_A2_IN 0x00008000
0416 #define SPCI_A2_OUT 0x00004000
0417 #define SPCI_A1_IN 0x00002000
0418 #define SPCI_A1_OUT 0x00001000
0419 #define SPCI_AFOU 0x00000800
0420 #define SPCI_V_PE 0x00000400
0421 #define SPCI_VFOU 0x00000200
0422 #define SPCI_FIDA 0x00000100
0423 #define SPCI_FIDB 0x00000080
0424 #define SPCI_PIN3 0x00000040
0425 #define SPCI_PIN2 0x00000020
0426 #define SPCI_PIN1 0x00000010
0427 #define SPCI_PIN0 0x00000008
0428 #define SPCI_ECS 0x00000004
0429 #define SPCI_EC3S 0x00000002
0430 #define SPCI_EC0S 0x00000001
0431
0432
0433 #define SAA7146_I2C_ABORT (1<<7)
0434 #define SAA7146_I2C_SPERR (1<<6)
0435 #define SAA7146_I2C_APERR (1<<5)
0436 #define SAA7146_I2C_DTERR (1<<4)
0437 #define SAA7146_I2C_DRERR (1<<3)
0438 #define SAA7146_I2C_AL (1<<2)
0439 #define SAA7146_I2C_ERR (1<<1)
0440 #define SAA7146_I2C_BUSY (1<<0)
0441
0442 #define SAA7146_I2C_START (0x3)
0443 #define SAA7146_I2C_CONT (0x2)
0444 #define SAA7146_I2C_STOP (0x1)
0445 #define SAA7146_I2C_NOP (0x0)
0446
0447 #define SAA7146_I2C_BUS_BIT_RATE_6400 (0x500)
0448 #define SAA7146_I2C_BUS_BIT_RATE_3200 (0x100)
0449 #define SAA7146_I2C_BUS_BIT_RATE_480 (0x400)
0450 #define SAA7146_I2C_BUS_BIT_RATE_320 (0x600)
0451 #define SAA7146_I2C_BUS_BIT_RATE_240 (0x700)
0452 #define SAA7146_I2C_BUS_BIT_RATE_120 (0x000)
0453 #define SAA7146_I2C_BUS_BIT_RATE_80 (0x200)
0454 #define SAA7146_I2C_BUS_BIT_RATE_60 (0x300)
0455
0456 static inline void SAA7146_IER_DISABLE(struct saa7146_dev *x, unsigned y)
0457 {
0458 unsigned long flags;
0459 spin_lock_irqsave(&x->int_slock, flags);
0460 saa7146_write(x, IER, saa7146_read(x, IER) & ~y);
0461 spin_unlock_irqrestore(&x->int_slock, flags);
0462 }
0463
0464 static inline void SAA7146_IER_ENABLE(struct saa7146_dev *x, unsigned y)
0465 {
0466 unsigned long flags;
0467 spin_lock_irqsave(&x->int_slock, flags);
0468 saa7146_write(x, IER, saa7146_read(x, IER) | y);
0469 spin_unlock_irqrestore(&x->int_slock, flags);
0470 }
0471
0472 #endif