1*a10e763bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 20c0d06caSMauro Carvalho Chehab /* 30c0d06caSMauro Carvalho Chehab * Driver for the ov9650 sensor 40c0d06caSMauro Carvalho Chehab * 50c0d06caSMauro Carvalho Chehab * Copyright (C) 2008 Erik Andrén 60c0d06caSMauro Carvalho Chehab * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project. 70c0d06caSMauro Carvalho Chehab * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br> 80c0d06caSMauro Carvalho Chehab * 90c0d06caSMauro Carvalho Chehab * Portions of code to USB interface and ALi driver software, 100c0d06caSMauro Carvalho Chehab * Copyright (c) 2006 Willem Duinker 110c0d06caSMauro Carvalho Chehab * v4l2 interface modeled after the V4L2 driver 120c0d06caSMauro Carvalho Chehab * for SN9C10x PC Camera Controllers 130c0d06caSMauro Carvalho Chehab */ 140c0d06caSMauro Carvalho Chehab 150c0d06caSMauro Carvalho Chehab #ifndef M5602_OV9650_H_ 160c0d06caSMauro Carvalho Chehab #define M5602_OV9650_H_ 170c0d06caSMauro Carvalho Chehab 180c0d06caSMauro Carvalho Chehab #include <linux/dmi.h> 190c0d06caSMauro Carvalho Chehab #include "m5602_sensor.h" 200c0d06caSMauro Carvalho Chehab 210c0d06caSMauro Carvalho Chehab /*****************************************************************************/ 220c0d06caSMauro Carvalho Chehab 230c0d06caSMauro Carvalho Chehab #define OV9650_GAIN 0x00 240c0d06caSMauro Carvalho Chehab #define OV9650_BLUE 0x01 250c0d06caSMauro Carvalho Chehab #define OV9650_RED 0x02 260c0d06caSMauro Carvalho Chehab #define OV9650_VREF 0x03 270c0d06caSMauro Carvalho Chehab #define OV9650_COM1 0x04 280c0d06caSMauro Carvalho Chehab #define OV9650_BAVE 0x05 290c0d06caSMauro Carvalho Chehab #define OV9650_GEAVE 0x06 300c0d06caSMauro Carvalho Chehab #define OV9650_RSVD7 0x07 310c0d06caSMauro Carvalho Chehab #define OV9650_COM2 0x09 320c0d06caSMauro Carvalho Chehab #define OV9650_PID 0x0a 330c0d06caSMauro Carvalho Chehab #define OV9650_VER 0x0b 340c0d06caSMauro Carvalho Chehab #define OV9650_COM3 0x0c 350c0d06caSMauro Carvalho Chehab #define OV9650_COM4 0x0d 360c0d06caSMauro Carvalho Chehab #define OV9650_COM5 0x0e 370c0d06caSMauro Carvalho Chehab #define OV9650_COM6 0x0f 380c0d06caSMauro Carvalho Chehab #define OV9650_AECH 0x10 390c0d06caSMauro Carvalho Chehab #define OV9650_CLKRC 0x11 400c0d06caSMauro Carvalho Chehab #define OV9650_COM7 0x12 410c0d06caSMauro Carvalho Chehab #define OV9650_COM8 0x13 420c0d06caSMauro Carvalho Chehab #define OV9650_COM9 0x14 430c0d06caSMauro Carvalho Chehab #define OV9650_COM10 0x15 440c0d06caSMauro Carvalho Chehab #define OV9650_RSVD16 0x16 450c0d06caSMauro Carvalho Chehab #define OV9650_HSTART 0x17 460c0d06caSMauro Carvalho Chehab #define OV9650_HSTOP 0x18 470c0d06caSMauro Carvalho Chehab #define OV9650_VSTRT 0x19 480c0d06caSMauro Carvalho Chehab #define OV9650_VSTOP 0x1a 490c0d06caSMauro Carvalho Chehab #define OV9650_PSHFT 0x1b 500c0d06caSMauro Carvalho Chehab #define OV9650_MVFP 0x1e 510c0d06caSMauro Carvalho Chehab #define OV9650_AEW 0x24 520c0d06caSMauro Carvalho Chehab #define OV9650_AEB 0x25 530c0d06caSMauro Carvalho Chehab #define OV9650_VPT 0x26 540c0d06caSMauro Carvalho Chehab #define OV9650_BBIAS 0x27 550c0d06caSMauro Carvalho Chehab #define OV9650_GbBIAS 0x28 560c0d06caSMauro Carvalho Chehab #define OV9650_Gr_COM 0x29 570c0d06caSMauro Carvalho Chehab #define OV9650_RBIAS 0x2c 580c0d06caSMauro Carvalho Chehab #define OV9650_HREF 0x32 590c0d06caSMauro Carvalho Chehab #define OV9650_CHLF 0x33 600c0d06caSMauro Carvalho Chehab #define OV9650_ARBLM 0x34 610c0d06caSMauro Carvalho Chehab #define OV9650_RSVD35 0x35 620c0d06caSMauro Carvalho Chehab #define OV9650_RSVD36 0x36 630c0d06caSMauro Carvalho Chehab #define OV9650_ADC 0x37 640c0d06caSMauro Carvalho Chehab #define OV9650_ACOM38 0x38 650c0d06caSMauro Carvalho Chehab #define OV9650_OFON 0x39 660c0d06caSMauro Carvalho Chehab #define OV9650_TSLB 0x3a 670c0d06caSMauro Carvalho Chehab #define OV9650_COM12 0x3c 680c0d06caSMauro Carvalho Chehab #define OV9650_COM13 0x3d 690c0d06caSMauro Carvalho Chehab #define OV9650_COM15 0x40 700c0d06caSMauro Carvalho Chehab #define OV9650_COM16 0x41 710c0d06caSMauro Carvalho Chehab #define OV9650_LCC1 0x62 720c0d06caSMauro Carvalho Chehab #define OV9650_LCC2 0x63 730c0d06caSMauro Carvalho Chehab #define OV9650_LCC3 0x64 740c0d06caSMauro Carvalho Chehab #define OV9650_LCC4 0x65 750c0d06caSMauro Carvalho Chehab #define OV9650_LCC5 0x66 760c0d06caSMauro Carvalho Chehab #define OV9650_HV 0x69 770c0d06caSMauro Carvalho Chehab #define OV9650_DBLV 0x6b 780c0d06caSMauro Carvalho Chehab #define OV9650_COM21 0x8b 790c0d06caSMauro Carvalho Chehab #define OV9650_COM22 0x8c 800c0d06caSMauro Carvalho Chehab #define OV9650_COM24 0x8e 810c0d06caSMauro Carvalho Chehab #define OV9650_DBLC1 0x8f 820c0d06caSMauro Carvalho Chehab #define OV9650_RSVD94 0x94 830c0d06caSMauro Carvalho Chehab #define OV9650_RSVD95 0x95 840c0d06caSMauro Carvalho Chehab #define OV9650_RSVD96 0x96 850c0d06caSMauro Carvalho Chehab #define OV9650_LCCFB 0x9d 860c0d06caSMauro Carvalho Chehab #define OV9650_LCCFR 0x9e 870c0d06caSMauro Carvalho Chehab #define OV9650_AECHM 0xa1 880c0d06caSMauro Carvalho Chehab #define OV9650_COM26 0xa5 890c0d06caSMauro Carvalho Chehab #define OV9650_ACOMA8 0xa8 900c0d06caSMauro Carvalho Chehab #define OV9650_ACOMA9 0xa9 910c0d06caSMauro Carvalho Chehab 920c0d06caSMauro Carvalho Chehab #define OV9650_REGISTER_RESET (1 << 7) 930c0d06caSMauro Carvalho Chehab #define OV9650_VGA_SELECT (1 << 6) 940c0d06caSMauro Carvalho Chehab #define OV9650_CIF_SELECT (1 << 5) 950c0d06caSMauro Carvalho Chehab #define OV9650_QVGA_SELECT (1 << 4) 960c0d06caSMauro Carvalho Chehab #define OV9650_QCIF_SELECT (1 << 3) 970c0d06caSMauro Carvalho Chehab #define OV9650_RGB_SELECT (1 << 2) 980c0d06caSMauro Carvalho Chehab #define OV9650_RAW_RGB_SELECT (1 << 0) 990c0d06caSMauro Carvalho Chehab 1000c0d06caSMauro Carvalho Chehab #define OV9650_FAST_AGC_AEC (1 << 7) 1010c0d06caSMauro Carvalho Chehab #define OV9650_AEC_UNLIM_STEP_SIZE (1 << 6) 1020c0d06caSMauro Carvalho Chehab #define OV9650_BANDING (1 << 5) 1030c0d06caSMauro Carvalho Chehab #define OV9650_AGC_EN (1 << 2) 1040c0d06caSMauro Carvalho Chehab #define OV9650_AWB_EN (1 << 1) 1050c0d06caSMauro Carvalho Chehab #define OV9650_AEC_EN (1 << 0) 1060c0d06caSMauro Carvalho Chehab 1070c0d06caSMauro Carvalho Chehab #define OV9650_VARIOPIXEL (1 << 2) 1080c0d06caSMauro Carvalho Chehab #define OV9650_SYSTEM_CLK_SEL (1 << 7) 1090c0d06caSMauro Carvalho Chehab #define OV9650_SLAM_MODE (1 << 4) 1100c0d06caSMauro Carvalho Chehab 1110c0d06caSMauro Carvalho Chehab #define OV9650_QVGA_VARIOPIXEL (1 << 7) 1120c0d06caSMauro Carvalho Chehab 1130c0d06caSMauro Carvalho Chehab #define OV9650_VFLIP (1 << 4) 1140c0d06caSMauro Carvalho Chehab #define OV9650_HFLIP (1 << 5) 1150c0d06caSMauro Carvalho Chehab 1160c0d06caSMauro Carvalho Chehab #define OV9650_SOFT_SLEEP (1 << 4) 1170c0d06caSMauro Carvalho Chehab #define OV9650_OUTPUT_DRIVE_2X (1 << 0) 1180c0d06caSMauro Carvalho Chehab 1190c0d06caSMauro Carvalho Chehab #define OV9650_DENOISE_ENABLE (1 << 5) 1200c0d06caSMauro Carvalho Chehab #define OV9650_WHITE_PIXEL_ENABLE (1 << 1) 1210c0d06caSMauro Carvalho Chehab #define OV9650_WHITE_PIXEL_OPTION (1 << 0) 1220c0d06caSMauro Carvalho Chehab 1230c0d06caSMauro Carvalho Chehab #define OV9650_LEFT_OFFSET 0x62 1240c0d06caSMauro Carvalho Chehab 1250c0d06caSMauro Carvalho Chehab #define GAIN_DEFAULT 0x14 1260c0d06caSMauro Carvalho Chehab #define RED_GAIN_DEFAULT 0x70 1270c0d06caSMauro Carvalho Chehab #define BLUE_GAIN_DEFAULT 0x20 1280c0d06caSMauro Carvalho Chehab #define EXPOSURE_DEFAULT 0x1ff 1290c0d06caSMauro Carvalho Chehab 1300c0d06caSMauro Carvalho Chehab /*****************************************************************************/ 1310c0d06caSMauro Carvalho Chehab 1320c0d06caSMauro Carvalho Chehab /* Kernel module parameters */ 1330c0d06caSMauro Carvalho Chehab extern int force_sensor; 1340c0d06caSMauro Carvalho Chehab extern bool dump_sensor; 1350c0d06caSMauro Carvalho Chehab 1360c0d06caSMauro Carvalho Chehab int ov9650_probe(struct sd *sd); 1370c0d06caSMauro Carvalho Chehab int ov9650_init(struct sd *sd); 138c84e412fSHans de Goede int ov9650_init_controls(struct sd *sd); 1390c0d06caSMauro Carvalho Chehab int ov9650_start(struct sd *sd); 1400c0d06caSMauro Carvalho Chehab int ov9650_stop(struct sd *sd); 1410c0d06caSMauro Carvalho Chehab void ov9650_disconnect(struct sd *sd); 1420c0d06caSMauro Carvalho Chehab 1430c0d06caSMauro Carvalho Chehab static const struct m5602_sensor ov9650 = { 1440c0d06caSMauro Carvalho Chehab .name = "OV9650", 1450c0d06caSMauro Carvalho Chehab .i2c_slave_id = 0x60, 1460c0d06caSMauro Carvalho Chehab .i2c_regW = 1, 1470c0d06caSMauro Carvalho Chehab .probe = ov9650_probe, 1480c0d06caSMauro Carvalho Chehab .init = ov9650_init, 149c84e412fSHans de Goede .init_controls = ov9650_init_controls, 1500c0d06caSMauro Carvalho Chehab .start = ov9650_start, 1510c0d06caSMauro Carvalho Chehab .stop = ov9650_stop, 1520c0d06caSMauro Carvalho Chehab .disconnect = ov9650_disconnect, 1530c0d06caSMauro Carvalho Chehab }; 1540c0d06caSMauro Carvalho Chehab 1550c0d06caSMauro Carvalho Chehab #endif 156