1d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * zoran - Iomega Buz driver 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * based on 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * zoran.0.0.3 Copyright (C) 1998 Dave Perks <dperks@ibm.net> 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bttv - Bt848 frame grabber driver 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * & Marcus Metzler (mocm@thp.uni-koeln.de) 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version. 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _BUZ_H_ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _BUZ_H_ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 340ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil#include <media/v4l2-device.h> 350ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_sync { 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long frame; /* number of buffer that has been free'd */ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long length; /* number of code bytes in buffer (capture only) */ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long seq; /* frame sequence number */ 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct timeval timestamp; /* timestamp */ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_NAME "ZORAN" /* name of the device */ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZR_DEVNAME(zr) ((zr)->name) 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MAX_WIDTH (zr->timing->Wa) 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MAX_HEIGHT (zr->timing->Ha) 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MIN_WIDTH 32 /* never display less than 32 pixels */ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MIN_HEIGHT 24 /* never display less than 24 rows */ 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_NUM_STAT_COM 4 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MASK_STAT_COM 3 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MAX_FRAME 256 /* Must be a power of 2 */ 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BUZ_MASK_FRAME 255 /* Must be BUZ_MAX_FRAME-1 */ 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 59fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson#define BUZ_MAX_INPUT 16 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if VIDEO_MAX_FRAME <= 32 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define V4L_MAX_FRAME 32 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#elif VIDEO_MAX_FRAME <= 64 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define V4L_MAX_FRAME 64 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# error "Too many video frame buffers to handle" 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define V4L_MASK_FRAME (V4L_MAX_FRAME - 1) 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 701159b7f19f324db0c61d1277987374865690ec06Trent Piepho#define MAX_FRAME (BUZ_MAX_FRAME > VIDEO_MAX_FRAME ? BUZ_MAX_FRAME : VIDEO_MAX_FRAME) 711159b7f19f324db0c61d1277987374865690ec06Trent Piepho 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "zr36057.h" 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum card_type { 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds UNKNOWN = -1, 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Pinnacle/Miro */ 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DC10_old, /* DC30 like */ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DC10_new, /* DC10plus like */ 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DC10plus, 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DC30, 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds DC30plus, 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Linux Media Labs */ 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LML33, 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds LML33R10, 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Iomega */ 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ, 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson /* AverMedia */ 92fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson AVS6EYES, 93fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* total number of cards */ 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds NUM_CARDS 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum zoran_codec_mode { 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_MODE_IDLE, /* nothing going on */ 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_MODE_MOTION_COMPRESS, /* grabbing frames */ 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_MODE_MOTION_DECOMPRESS, /* playing frames */ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_MODE_STILL_COMPRESS, /* still frame conversion */ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_MODE_STILL_DECOMPRESS /* still frame conversion */ 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum zoran_buffer_state { 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_STATE_USER, /* buffer is owned by application */ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_STATE_PEND, /* buffer is queued in pend[] ready to feed to I/O */ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_STATE_DMA, /* buffer is queued in dma[] for I/O */ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUZ_STATE_DONE /* buffer is ready to return to application */ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum zoran_map_mode { 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_MAP_MODE_RAW, 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_MAP_MODE_JPG_REC, 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_MAP_MODE_JPG ZORAN_MAP_MODE_JPG_REC 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_MAP_MODE_JPG_PLAY, 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum gpio_type { 1216165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_JPEG_SLEEP = 0, 1226165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_JPEG_RESET, 1236165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_JPEG_FRAME, 1246165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_VID_DIR, 1256165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_VID_EN, 1266165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_VID_RESET, 1276165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_CLK_SEL1, 1286165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_CLK_SEL2, 1296165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab ZR_GPIO_MAX, 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum gpcs_type { 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPCS_JPEG_RESET = 0, 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPCS_JPEG_START, 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GPCS_MAX, 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_format { 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *name; 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u32 fourcc; 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int colorspace; 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int depth; 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __u32 flags; 144603d6f2c8f9f3604f9c6c1f8903efc2df30a000fTrent Piepho __u32 vfespfr; 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* flags */ 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_FORMAT_COMPRESSED 1<<0 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_FORMAT_OVERLAY 1<<1 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_FORMAT_CAPTURE 1<<2 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZORAN_FORMAT_PLAYBACK 1<<3 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* overlay-settings */ 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_overlay_settings { 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int is_set; 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int x, y, width, height; /* position */ 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int clipcount; /* position and number of clips */ 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct zoran_format *format; /* overlay format */ 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* v4l-capture settings */ 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_v4l_settings { 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int width, height, bytesperline; /* capture size */ 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct zoran_format *format; /* capture format */ 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* jpg-capture/-playback settings */ 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_jpg_settings { 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int decimation; /* this bit is used to set everything to default */ 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int HorDcm, VerDcm, TmpDcm; /* capture decimation settings (TmpDcm=1 means both fields) */ 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int field_per_buff, odd_even; /* field-settings (odd_even=1 (+TmpDcm=1) means top-field-first) */ 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int img_x, img_y, img_width, img_height; /* crop settings (subframe capture) */ 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct v4l2_jpegcompression jpg_comp; /* JPEG-specific capture settings */ 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1753b6456d2c3fc9d0c4ec1db5d6594f40098ff0a6fAl Virostruct zoran_fh; 1763b6456d2c3fc9d0c4ec1db5d6594f40098ff0a6fAl Viro 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_mapping { 1783b6456d2c3fc9d0c4ec1db5d6594f40098ff0a6fAl Viro struct zoran_fh *fh; 1794ad1f70ebcdb69393ce083f514bf4a4a3a3e65cbAl Viro atomic_t count; 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821159b7f19f324db0c61d1277987374865690ec06Trent Piephostruct zoran_buffer { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_mapping *map; 1841159b7f19f324db0c61d1277987374865690ec06Trent Piepho enum zoran_buffer_state state; /* state: unused/pending/dma/done */ 1851159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_sync bs; /* DONE: info to return to application */ 1861159b7f19f324db0c61d1277987374865690ec06Trent Piepho union { 1871159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct { 1881159b7f19f324db0c61d1277987374865690ec06Trent Piepho __le32 *frag_tab; /* addresses of frag table */ 1891159b7f19f324db0c61d1277987374865690ec06Trent Piepho u32 frag_tab_bus; /* same value cached to save time in ISR */ 1901159b7f19f324db0c61d1277987374865690ec06Trent Piepho } jpg; 1911159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct { 1921159b7f19f324db0c61d1277987374865690ec06Trent Piepho char *fbuffer; /* virtual address of frame buffer */ 1931159b7f19f324db0c61d1277987374865690ec06Trent Piepho unsigned long fbuffer_phys;/* physical address of frame buffer */ 1941159b7f19f324db0c61d1277987374865690ec06Trent Piepho unsigned long fbuffer_bus;/* bus address of frame buffer */ 1951159b7f19f324db0c61d1277987374865690ec06Trent Piepho } v4l; 1961159b7f19f324db0c61d1277987374865690ec06Trent Piepho }; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum zoran_lock_activity { 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_FREE, /* free for use */ 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_ACTIVE, /* active but unlocked */ 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ZORAN_LOCKED, /* locked */ 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* buffer collections */ 2061159b7f19f324db0c61d1277987374865690ec06Trent Piephostruct zoran_buffer_col { 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum zoran_lock_activity active; /* feature currently in use? */ 2081159b7f19f324db0c61d1277987374865690ec06Trent Piepho unsigned int num_buffers, buffer_size; 2091159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_buffer buffer[MAX_FRAME]; /* buffers */ 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 allocated; /* Flag if buffers are allocated */ 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 need_contiguous; /* Flag if contiguous buffers are needed */ 2121159b7f19f324db0c61d1277987374865690ec06Trent Piepho /* only applies to jpg buffers, raw buffers are always contiguous */ 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* zoran_fh contains per-open() settings */ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran_fh { 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran *zr; 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2211159b7f19f324db0c61d1277987374865690ec06Trent Piepho enum zoran_map_mode map_mode; /* Flag which bufferset will map by next mmap() */ 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_overlay_settings overlay_settings; 2241159b7f19f324db0c61d1277987374865690ec06Trent Piepho u32 *overlay_mask; /* overlay mask */ 2251159b7f19f324db0c61d1277987374865690ec06Trent Piepho enum zoran_lock_activity overlay_active;/* feature currently in use? */ 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2271159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_buffer_col buffers; /* buffers' info */ 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2291159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */ 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct card_info { 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum card_type type; 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char name[32]; 2360ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil const char *i2c_decoder; /* i2c decoder device */ 2370ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil const unsigned short *addrs_decoder; 2380ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil const char *i2c_encoder; /* i2c encoder device */ 2390ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil const unsigned short *addrs_encoder; 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 video_vfe, video_codec; /* videocodec types */ 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u16 audio_chip; /* audio type */ 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int inputs; /* number of video inputs */ 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct input { 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int muxsel; 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char name[32]; 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } input[BUZ_MAX_INPUT]; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 249107063c6156a0cbf055e771baafc28a3e3c0fb9bHans Verkuil v4l2_std_id norms; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct tvnorm *tvn[3]; /* supported TV norms */ 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 jpeg_int; /* JPEG interrupt */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 vsync_int; /* VSYNC interrupt */ 2546165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab s8 gpio[ZR_GPIO_MAX]; 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 gpcs[GPCS_MAX]; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct vfe_polarity vfe_pol; 2586165894fb6293072848e5699f3fcbe88b7c60815Mauro Carvalho Chehab u8 gpio_pol[ZR_GPIO_MAX]; 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 26025985edcedea6396277003854657b5f3cb31a628Lucas De Marchi /* is the /GWS line connected? */ 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 gws_not_connected; 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 263fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson /* avs6eyes mux setting */ 264fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson u8 input_mux; 265fbe60daac4c34e39d1ca69684bcb76e62461ac21Martin Samuelsson 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void (*init) (struct zoran * zr); 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct zoran { 2700ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil struct v4l2_device v4l2_dev; 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct video_device *video_dev; 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_adapter i2c_adapter; /* */ 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct i2c_algo_bit_data i2c_algo; /* */ 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 i2cbr; 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2770ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil struct v4l2_subdev *decoder; /* video decoder sub-device */ 2780ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil struct v4l2_subdev *encoder; /* video encoder sub-device */ 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct videocodec *codec; /* video codec */ 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct videocodec *vfe; /* video front end */ 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 283384c36893f94e0e2145832cf2f20684ae372aee5Ingo Molnar struct mutex resource_lock; /* prevent evil stuff */ 2840edf2e5e2bd0ae7689ce8a57ae3c87cc1f0c6548Arnd Bergmann struct mutex other_lock; /* please merge with above */ 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 286421f91d21ad6f799dc7b489bb33cc560ccc56f98Uwe Kleine-König u8 initialized; /* flag if zoran has been correctly initialized */ 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int user; /* number of current users */ 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct card_info card; 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct tvnorm *timing; 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned short id; /* number of this device */ 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char name[32]; /* name of this device */ 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct pci_dev *pci_dev; /* PCI device */ 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char revision; /* revision of zr36057 */ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */ 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t spinlock; /* Spinlock */ 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Video for Linux parameters */ 300debff5a79595356b1d10063c5f5a7bcdf1b54becHans Verkuil int input; /* card's norm and input */ 301107063c6156a0cbf055e771baafc28a3e3c0fb9bHans Verkuil v4l2_std_id norm; 3027f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil 3037f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil /* Current buffer params */ 3047f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil void *vbuf_base; 3057f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil int vbuf_height, vbuf_width; 3067f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil int vbuf_depth; 3077f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil int vbuf_bytesperline; 3087f6adeaf2d8800b66c5dd6c2cf2622dfdd68bd31Hans Verkuil 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_overlay_settings overlay_settings; 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 *overlay_mask; /* overlay mask */ 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum zoran_lock_activity overlay_active; /* feature currently in use? */ 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wait_queue_head_t v4l_capq; 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int v4l_overlay_active; /* Overlay grab is activated */ 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int v4l_memgrab_active; /* Memory grab is activated */ 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int v4l_grab_frame; /* Frame number being currently grabbed */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NO_GRAB_ACTIVE (-1) 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long v4l_grab_seq; /* Number of frames grabbed */ 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */ 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* V4L grab queue of frames pending */ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long v4l_pend_head; 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long v4l_pend_tail; 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long v4l_sync_tail; 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int v4l_pend[V4L_MAX_FRAME]; 3281159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_buffer_col v4l_buffers; /* V4L buffers' info */ 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Buz MJPEG parameters */ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum zoran_codec_mode codec_mode; /* status of codec */ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */ 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wait_queue_head_t jpg_capq; /* wait here for grab to finish */ 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* grab queue counts/indices, mask with BUZ_MASK_STAT_COM before using as index */ 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* (dma_head - dma_tail) is number active in DMA, must be <= BUZ_NUM_STAT_COM */ 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* (value & BUZ_MASK_STAT_COM) corresponds to index in stat_com table */ 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_que_head; /* Index where to put next buffer which is queued */ 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_dma_head; /* Index of next buffer which goes into stat_com */ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_dma_tail; /* Index of last buffer in stat_com */ 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_que_tail; /* Index of last buffer in queue */ 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_seq_num; /* count of frames since grab/play started */ 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_err_seq; /* last seq_num before error */ 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_err_shift; 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long jpg_queued_num; /* count of frames queued since grab/play started */ 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* zr36057's code buffer table */ 349581a7f1a2ddedbc27ad76f518b861ce1e60ff5abAl Viro __le32 *stat_com; /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */ 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */ 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int jpg_pend[BUZ_MAX_FRAME]; 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* array indexed by frame number */ 3551159b7f19f324db0c61d1277987374865690ec06Trent Piepho struct zoran_buffer_col jpg_buffers; /* MJPEG buffers' info */ 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Additional stuff for testing */ 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_PROC_FS 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct proc_dir_entry *zoran_proc; 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds void *zoran_proc; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int testing; 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int jpeg_error; 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int intr_counter_GIRQ1; 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int intr_counter_GIRQ0; 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int intr_counter_CodRepIRQ; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int intr_counter_JPEGRepIRQ; 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int field_counter; 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int IRQ1_in; 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int IRQ1_out; 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_in; 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_out; 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_0; 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_1; 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int END_event_missed; 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_missed; 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_error; 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int num_errors; 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_max_missed; 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int JPEG_min_missed; 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 last_isr; 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long frame_num; 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wait_queue_head_t test_q; 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3890ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuilstatic inline struct zoran *to_zoran(struct v4l2_device *v4l2_dev) 3900ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil{ 3910ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil return container_of(v4l2_dev, struct zoran, v4l2_dev); 3920ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil} 3930ab6e1c38d80ab586e3a1ca9e71844131d9f51dcHans Verkuil 3945e098b668977c85838af09005bd96c2e987654f0Trent Piepho/* There was something called _ALPHA_BUZ that used the PCI address instead of 3955e098b668977c85838af09005bd96c2e987654f0Trent Piepho * the kernel iomapped address for btread/btwrite. */ 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define btwrite(dat,adr) writel((dat), zr->zr36057_mem+(adr)) 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define btread(adr) readl(zr->zr36057_mem+(adr)) 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define btand(dat,adr) btwrite((dat) & btread(adr), adr) 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define btor(dat,adr) btwrite((dat) | btread(adr), adr) 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define btaor(dat,mask,adr) btwrite((dat) | ((mask) & btread(adr)), adr) 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 404