17ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/***************************************************************************
27ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * API for image sensors connected to ET61X[12]51 PC Camera Controllers    *
37ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia *                                                                         *
42656312724d97ebc2e267e0a9740d51ad7aa9a04Luca Risolia * Copyright (C) 2006-2007 by Luca Risolia <luca.risolia@studio.unibo.it>  *
57ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia *                                                                         *
67ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * This program is free software; you can redistribute it and/or modify    *
77ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * it under the terms of the GNU General Public License as published by    *
87ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * the Free Software Foundation; either version 2 of the License, or       *
97ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * (at your option) any later version.                                     *
107ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia *                                                                         *
117ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * This program is distributed in the hope that it will be useful,         *
127ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
137ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
147ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * GNU General Public License for more details.                            *
157ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia *                                                                         *
167ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * You should have received a copy of the GNU General Public License       *
177ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * along with this program; if not, write to the Free Software             *
187ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
197ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia ***************************************************************************/
207ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
217ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#ifndef _ET61X251_SENSOR_H_
227ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#define _ET61X251_SENSOR_H_
237ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
247ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#include <linux/usb.h>
253b2ae0be9e246974db65a5bf4ccd2de328f3dedeLuca Risolia#include <linux/videodev2.h>
267ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#include <linux/device.h>
277ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#include <linux/stddef.h>
287ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#include <linux/errno.h>
297ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#include <asm/types.h>
307ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
317ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliastruct et61x251_device;
327ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliastruct et61x251_sensor;
337ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
347ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/*****************************************************************************/
357ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
367ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaextern int et61x251_probe_tas5130d1b(struct et61x251_device* cam);
377ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
387ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#define ET61X251_SENSOR_TABLE                                                 \
397ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/* Weak detections must go at the end of the list */                          \
407ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliastatic int (*et61x251_sensor_table[])(struct et61x251_device*) = {            \
417ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	&et61x251_probe_tas5130d1b,                                           \
427ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	NULL,                                                                 \
437ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia};
447ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
45ccad7789d5e557644d1c866b018394872af0ec5bLuca Risoliaextern struct et61x251_device*
46ccad7789d5e557644d1c866b018394872af0ec5bLuca Risoliaet61x251_match_id(struct et61x251_device* cam, const struct usb_device_id *id);
47ccad7789d5e557644d1c866b018394872af0ec5bLuca Risolia
487ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaextern void
497ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaet61x251_attach_sensor(struct et61x251_device* cam,
503b2ae0be9e246974db65a5bf4ccd2de328f3dedeLuca Risolia		       const struct et61x251_sensor* sensor);
517ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
527ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/*****************************************************************************/
537ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
547ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaextern int et61x251_write_reg(struct et61x251_device*, u8 value, u16 index);
557ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaextern int et61x251_i2c_raw_write(struct et61x251_device*, u8 n, u8 data1,
56d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab				  u8 data2, u8 data3, u8 data4, u8 data5,
57d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab				  u8 data6, u8 data7, u8 data8, u8 address);
587ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
597ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/*****************************************************************************/
607ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
617ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaenum et61x251_i2c_sysfs_ops {
627ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_READ = 0x01,
637ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_WRITE = 0x02,
647ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia};
657ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
667ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaenum et61x251_i2c_interface {
677ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_2WIRES,
687ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_3WIRES,
697ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia};
707ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
717ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia/* Repeat start condition when RSTA is high */
727ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliaenum et61x251_i2c_rsta {
737ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_RSTA_STOP = 0x00, /* stop then start */
747ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	ET61X251_I2C_RSTA_REPEAT = 0x01, /* repeat start */
757ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia};
767ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
772656312724d97ebc2e267e0a9740d51ad7aa9a04Luca Risolia#define ET61X251_MAX_CTRLS (V4L2_CID_LASTP1-V4L2_CID_BASE+10)
787ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
797ce08c93e388922e25a96a7d9895784182e4c72cLuca Risoliastruct et61x251_sensor {
807ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	char name[32];
817ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
827ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	enum et61x251_i2c_sysfs_ops sysfs_ops;
837ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
847ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	enum et61x251_i2c_interface interface;
857ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	u8 i2c_slave_id;
867ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	enum et61x251_i2c_rsta rsta;
877ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_rect active_pixel; /* left and top define FVSX and FVSY */
887ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
897ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_queryctrl qctrl[ET61X251_MAX_CTRLS];
907ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_cropcap cropcap;
917ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_pix_format pix_format;
927ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
937ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	int (*init)(struct et61x251_device* cam);
947ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	int (*get_ctrl)(struct et61x251_device* cam,
95d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab			struct v4l2_control* ctrl);
967ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	int (*set_ctrl)(struct et61x251_device* cam,
97d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab			const struct v4l2_control* ctrl);
987ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	int (*set_crop)(struct et61x251_device* cam,
99d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab			const struct v4l2_rect* rect);
1007ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	int (*set_pix_format)(struct et61x251_device* cam,
101d56410e0a594150c5ca06319da7bc8901c4d455eMauro Carvalho Chehab			      const struct v4l2_pix_format* pix);
1027ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
1037ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	/* Private */
1047ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_queryctrl _qctrl[ET61X251_MAX_CTRLS];
1057ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia	struct v4l2_rect _rect;
1067ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia};
1077ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia
1087ce08c93e388922e25a96a7d9895784182e4c72cLuca Risolia#endif /* _ET61X251_SENSOR_H_ */
109