From faced1822d20d8c45da7864595230c5857b9463e Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Mon, 27 Apr 2015 01:14:01 +0300 Subject: media: s5k8aa: Move driver to drivers/media/i2c/ The driver doesn't depend on soc-camera anymore, move it to the media I2C drivers directory. Signed-off-by: Laurent Pinchart Acked-By: Vaibhav Hiremath --- drivers/media/i2c/Kconfig | 7 + drivers/media/i2c/Makefile | 1 + drivers/media/i2c/s5k8aa.c | 3196 +++++++++++++++++++++++++++++++++ drivers/media/i2c/soc_camera/Kconfig | 6 - drivers/media/i2c/soc_camera/Makefile | 3 +- drivers/media/i2c/soc_camera/s5k8aa.c | 3196 --------------------------------- 6 files changed, 3205 insertions(+), 3204 deletions(-) create mode 100644 drivers/media/i2c/s5k8aa.c delete mode 100644 drivers/media/i2c/soc_camera/s5k8aa.c diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig index a0e5a949811c..f3c583245663 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -555,6 +555,13 @@ config VIDEO_S5K4ECGX This is a V4L2 sensor-level driver for Samsung S5K4ECGX 5M camera sensor with an embedded SoC image signal processor. +config VIDEO_S5K8AA + tristate "Samsung S5K8AA sensor support" + depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API + ---help--- + This is a V4L2 sensor-level driver for Samsung S5K8AA 1.2M + camera sensor with an embedded SoC image signal processor. + source "drivers/media/i2c/smiapp/Kconfig" config VIDEO_S5C73M3 diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile index e86e07871466..a439689a9ca1 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -66,6 +66,7 @@ obj-$(CONFIG_VIDEO_SR030PC30) += sr030pc30.o obj-$(CONFIG_VIDEO_NOON010PC30) += noon010pc30.o obj-$(CONFIG_VIDEO_S5K6AA) += s5k6aa.o obj-$(CONFIG_VIDEO_S5K4ECGX) += s5k4ecgx.o +obj-$(CONFIG_VIDEO_S5K8AA) += s5k8aa.o obj-$(CONFIG_VIDEO_S5C73M3) += s5c73m3/ obj-$(CONFIG_VIDEO_ADP1653) += adp1653.o obj-$(CONFIG_VIDEO_AS3645A) += as3645a.o diff --git a/drivers/media/i2c/s5k8aa.c b/drivers/media/i2c/s5k8aa.c new file mode 100644 index 000000000000..4fabfdd80c79 --- /dev/null +++ b/drivers/media/i2c/s5k8aa.c @@ -0,0 +1,3196 @@ +/* + * s5k8aa Camera Driver + * + * Copyright (c) 2013 Marvell Ltd. + * Libin Yang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static int debug; +module_param(debug, int, 0644); + +#define S5K8AA_PIXEL_ARRAY_WIDTH 1280 +#define S5K8AA_PIXEL_ARRAY_HEIGHT 920 +#define S5K8AA_OUT_WIDTH_DEF 640 +#define S5K8AA_OUT_HEIGHT_DEF 480 + +/* The token to indicate array termination */ +#define S5K8AA_TERM 0xffff + +/* + * H/W register Interface (0xD0000000 - 0xD0000FFF) + */ +#define AHB_MSB_ADDR_PTR 0xfcfc +#define GEN_REG_OFFSH 0xd000 +#define REG_CMDWR_ADDRH 0x0028 +#define REG_CMDWR_ADDRL 0x002a +#define REG_CMDRD_ADDRH 0x002c +#define REG_CMDRD_ADDRL 0x002e +#define REG_CMDBUF0_ADDR 0x0f12 +#define REG_CMDBUF1_ADDR 0x0f10 + +/* + * Host S/W Register interface (0x70000000 - 0x70002000) + * The value of the two most significant address bytes is 0x7000, + * (HOST_SWIF_OFFS_H). The register addresses below specify 2 LSBs. + */ +#define HOST_SWIF_OFFSH 0x7000 + +struct s5k8aa_regval { + u16 addr; + u16 val; +}; + +/* s5k8aa has only one fixed colorspace per pixelcode */ +struct s5k8aa_datafmt { + enum v4l2_mbus_pixelcode code; + u16 reg; +}; + +struct s5k8aa { + struct i2c_client *client; + + struct v4l2_subdev subdev; + struct media_pad pad; + + struct v4l2_mbus_framefmt format; + struct v4l2_rect crop; + u16 fmt_reg; + + struct clk *clk; + struct regulator_bulk_data supplies[3]; + int reset_gpio; + int pwdn_gpio; + + struct mutex power_lock; /* lock to protect power_count */ + int power_count; +}; + +static const struct s5k8aa_regval regs_start_setting[] = { + /* 01. Start Setting */ + {0xfcfc, 0xd000}, + {0x0010, 0x0001}, + {0xfcfc, 0x0000}, + {0x0000, 0x0000}, + {0xfcfc, 0xd000}, + {0x1030, 0x0000}, + {0x0014, 0x0001}, + {S5K8AA_TERM, 0}, + /* p10 Delay 1ms */ +}; + +static const struct s5k8aa_regval regs_trap_patch[] = { + /* 03. Trap and Patch */ + {0x0028, 0x7000}, + {0x002a, 0x2470}, + {0x0f12, 0xb510}, + {0x0F12, 0x4910}, + {0x0F12, 0x4810}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA41}, + {0x0F12, 0x4910}, + {0x0F12, 0x4810}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA3D}, + {0x0F12, 0x4910}, + {0x0F12, 0x4810}, + {0x0F12, 0x6341}, + {0x0F12, 0x4910}, + {0x0F12, 0x4811}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA36}, + {0x0F12, 0x4910}, + {0x0F12, 0x4811}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA32}, + {0x0F12, 0x4910}, + {0x0F12, 0x4811}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA2E}, + {0x0F12, 0x4810}, + {0x0F12, 0x4911}, + {0x0F12, 0x6448}, + {0x0F12, 0x4911}, + {0x0F12, 0x4811}, + {0x0F12, 0xF000}, + {0x0F12, 0xFA27}, + {0x0F12, 0xBC10}, + {0x0F12, 0xBC08}, + {0x0F12, 0x4718}, + {0x0F12, 0x2870}, + {0x0F12, 0x7000}, + {0x0F12, 0x8EDD}, + {0x0F12, 0x0000}, + {0x0F12, 0x27E8}, + {0x0F12, 0x7000}, + {0x0F12, 0x8725}, + {0x0F12, 0x0000}, + {0x0F12, 0x2788}, + {0x0F12, 0x7000}, + {0x0F12, 0x0080}, + {0x0F12, 0x7000}, + {0x0F12, 0x26DC}, + {0x0F12, 0x7000}, + {0x0F12, 0xA6EF}, + {0x0F12, 0x0000}, + {0x0F12, 0x26A8}, + {0x0F12, 0x7000}, + {0x0F12, 0xA0F1}, + {0x0F12, 0x0000}, + {0x0F12, 0x2674}, + {0x0F12, 0x7000}, + {0x0F12, 0x058F}, + {0x0F12, 0x0000}, + {0x0F12, 0x2568}, + {0x0F12, 0x7000}, + {0x0F12, 0x0000}, + {0x0F12, 0x7000}, + {0x0F12, 0x24F4}, + {0x0F12, 0x7000}, + {0x0F12, 0xAC79}, + {0x0F12, 0x0000}, + {0x0F12, 0x4070}, + {0x0F12, 0xE92D}, + {0x0F12, 0x5000}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x23BC}, + {0x0F12, 0xE59F}, + {0x0F12, 0x00BE}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0100}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x10BC}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0000}, + {0x0F12, 0xE351}, + {0x0F12, 0x000E}, + {0x0F12, 0x0A00}, + {0x0F12, 0x33A8}, + {0x0F12, 0xE59F}, + {0x0F12, 0x14BC}, + {0x0F12, 0xE1D3}, + {0x0F12, 0x0000}, + {0x0F12, 0xE151}, + {0x0F12, 0x000A}, + {0x0F12, 0x9A00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE041}, + {0x0F12, 0x11B0}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0091}, + {0x0F12, 0xE000}, + {0x0F12, 0x1034}, + {0x0F12, 0xE593}, + {0x0F12, 0x0520}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0091}, + {0x0F12, 0xE000}, + {0x0F12, 0x1384}, + {0x0F12, 0xE59F}, + {0x0F12, 0x1008}, + {0x0F12, 0xE591}, + {0x0F12, 0x00F0}, + {0x0F12, 0xEB00}, + {0x0F12, 0x4000}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0000}, + {0x0F12, 0xEA00}, + {0x0F12, 0x4000}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x00EE}, + {0x0F12, 0xEB00}, + {0x0F12, 0x0004}, + {0x0F12, 0xE080}, + {0x0F12, 0x0000}, + {0x0F12, 0xE585}, + {0x0F12, 0x4070}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x401F}, + {0x0F12, 0xE92D}, + {0x0F12, 0x00EB}, + {0x0F12, 0xEB00}, + {0x0F12, 0x2000}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x1002}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0F86}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x00EA}, + {0x0F12, 0xEB00}, + {0x0F12, 0x2010}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x1000}, + {0x0F12, 0xE28D}, + {0x0F12, 0x0E3F}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x00E9}, + {0x0F12, 0xEB00}, + {0x0F12, 0x2001}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x1002}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0F86}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x00E2}, + {0x0F12, 0xEB00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE5DD}, + {0x0F12, 0x00C3}, + {0x0F12, 0xE350}, + {0x0F12, 0x002F}, + {0x0F12, 0x1A00}, + {0x0F12, 0x0001}, + {0x0F12, 0xE5DD}, + {0x0F12, 0x003C}, + {0x0F12, 0xE350}, + {0x0F12, 0x002C}, + {0x0F12, 0x1A00}, + {0x0F12, 0x000E}, + {0x0F12, 0xE5DD}, + {0x0F12, 0x0011}, + {0x0F12, 0xE350}, + {0x0F12, 0x0029}, + {0x0F12, 0x1A00}, + {0x0F12, 0x000F}, + {0x0F12, 0xE5DD}, + {0x0F12, 0x0011}, + {0x0F12, 0xE350}, + {0x0F12, 0x0026}, + {0x0F12, 0x1A00}, + {0x0F12, 0x02E8}, + {0x0F12, 0xE59F}, + {0x0F12, 0x10BA}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE351}, + {0x0F12, 0x0022}, + {0x0F12, 0x0A00}, + {0x0F12, 0x12E4}, + {0x0F12, 0xE59F}, + {0x0F12, 0x2000}, + {0x0F12, 0xE5D1}, + {0x0F12, 0x0000}, + {0x0F12, 0xE352}, + {0x0F12, 0x0002}, + {0x0F12, 0x1A00}, + {0x0F12, 0x00B8}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x001B}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE5C1}, + {0x0F12, 0x1002}, + {0x0F12, 0xE28D}, + {0x0F12, 0x0015}, + {0x0F12, 0xEA00}, + {0x0F12, 0x2000}, + {0x0F12, 0xE5D1}, + {0x0F12, 0x3001}, + {0x0F12, 0xE5D1}, + {0x0F12, 0x3403}, + {0x0F12, 0xE182}, + {0x0F12, 0xC2B0}, + {0x0F12, 0xE59F}, + {0x0F12, 0x2080}, + {0x0F12, 0xE08C}, + {0x0F12, 0xE7B4}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x039E}, + {0x0F12, 0xE004}, + {0x0F12, 0xE80F}, + {0x0F12, 0xE3E0}, + {0x0F12, 0x4624}, + {0x0F12, 0xE00E}, + {0x0F12, 0x47B4}, + {0x0F12, 0xE1C2}, + {0x0F12, 0x4004}, + {0x0F12, 0xE280}, + {0x0F12, 0xC084}, + {0x0F12, 0xE08C}, + {0x0F12, 0x47B4}, + {0x0F12, 0xE1DC}, + {0x0F12, 0x0493}, + {0x0F12, 0xE004}, + {0x0F12, 0x4624}, + {0x0F12, 0xE00E}, + {0x0F12, 0x47B4}, + {0x0F12, 0xE1CC}, + {0x0F12, 0xC8B4}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x039C}, + {0x0F12, 0xE003}, + {0x0F12, 0x3623}, + {0x0F12, 0xE00E}, + {0x0F12, 0x38B4}, + {0x0F12, 0xE1C2}, + {0x0F12, 0x0001}, + {0x0F12, 0xE280}, + {0x0F12, 0x1002}, + {0x0F12, 0xE281}, + {0x0F12, 0x0004}, + {0x0F12, 0xE350}, + {0x0F12, 0xFFE7}, + {0x0F12, 0xBAFF}, + {0x0F12, 0x401F}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x4010}, + {0x0F12, 0xE92D}, + {0x0F12, 0x00B1}, + {0x0F12, 0xEB00}, + {0x0F12, 0x0250}, + {0x0F12, 0xE59F}, + {0x0F12, 0x00B2}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x0004}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0080}, + {0x0F12, 0xE310}, + {0x0F12, 0x0002}, + {0x0F12, 0x1A00}, + {0x0F12, 0x123C}, + {0x0F12, 0xE59F}, + {0x0F12, 0x0001}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0DB2}, + {0x0F12, 0xE1C1}, + {0x0F12, 0x4010}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x4010}, + {0x0F12, 0xE92D}, + {0x0F12, 0x4000}, + {0x0F12, 0xE590}, + {0x0F12, 0x0004}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x00A5}, + {0x0F12, 0xEB00}, + {0x0F12, 0x021C}, + {0x0F12, 0xE59F}, + {0x0F12, 0x0000}, + {0x0F12, 0xE5D0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x0002}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0004}, + {0x0F12, 0xE594}, + {0x0F12, 0x00A0}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0004}, + {0x0F12, 0xE584}, + {0x0F12, 0x4010}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x4070}, + {0x0F12, 0xE92D}, + {0x0F12, 0x0000}, + {0x0F12, 0xE590}, + {0x0F12, 0x0800}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0820}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x4041}, + {0x0F12, 0xE280}, + {0x0F12, 0x01E8}, + {0x0F12, 0xE59F}, + {0x0F12, 0x11B8}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x51B6}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0005}, + {0x0F12, 0xE041}, + {0x0F12, 0x0094}, + {0x0F12, 0xE000}, + {0x0F12, 0x1D11}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x007F}, + {0x0F12, 0xEB00}, + {0x0F12, 0x11C8}, + {0x0F12, 0xE59F}, + {0x0F12, 0x1000}, + {0x0F12, 0xE5D1}, + {0x0F12, 0x0000}, + {0x0F12, 0xE351}, + {0x0F12, 0x0000}, + {0x0F12, 0x0A00}, + {0x0F12, 0x00A0}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x21B0}, + {0x0F12, 0xE59F}, + {0x0F12, 0x3FB0}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0000}, + {0x0F12, 0xE353}, + {0x0F12, 0x0003}, + {0x0F12, 0x0A00}, + {0x0F12, 0x31AC}, + {0x0F12, 0xE59F}, + {0x0F12, 0x5BB2}, + {0x0F12, 0xE1C3}, + {0x0F12, 0xC000}, + {0x0F12, 0xE085}, + {0x0F12, 0xCBB4}, + {0x0F12, 0xE1C3}, + {0x0F12, 0x0000}, + {0x0F12, 0xE351}, + {0x0F12, 0x0000}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0080}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x1DBC}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x3EB4}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x2EB2}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0193}, + {0x0F12, 0xE001}, + {0x0F12, 0x0092}, + {0x0F12, 0xE000}, + {0x0F12, 0x2811}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0194}, + {0x0F12, 0xE001}, + {0x0F12, 0x0092}, + {0x0F12, 0xE000}, + {0x0F12, 0x11A1}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x01A0}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0064}, + {0x0F12, 0xEB00}, + {0x0F12, 0x1168}, + {0x0F12, 0xE59F}, + {0x0F12, 0x02B4}, + {0x0F12, 0xE1C1}, + {0x0F12, 0x4070}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x4010}, + {0x0F12, 0xE92D}, + {0x0F12, 0x0072}, + {0x0F12, 0xEB00}, + {0x0F12, 0x2150}, + {0x0F12, 0xE59F}, + {0x0F12, 0x14B0}, + {0x0F12, 0xE1D2}, + {0x0F12, 0x0080}, + {0x0F12, 0xE311}, + {0x0F12, 0x0005}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0144}, + {0x0F12, 0xE59F}, + {0x0F12, 0x00B0}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0001}, + {0x0F12, 0xE350}, + {0x0F12, 0x0001}, + {0x0F12, 0x9A00}, + {0x0F12, 0x0001}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0000}, + {0x0F12, 0xEA00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x3118}, + {0x0F12, 0xE59F}, + {0x0F12, 0x0000}, + {0x0F12, 0xE5C3}, + {0x0F12, 0x0000}, + {0x0F12, 0xE5D3}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x0003}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0080}, + {0x0F12, 0xE3C1}, + {0x0F12, 0x1114}, + {0x0F12, 0xE59F}, + {0x0F12, 0x04B0}, + {0x0F12, 0xE1C2}, + {0x0F12, 0x00B2}, + {0x0F12, 0xE1C1}, + {0x0F12, 0x4010}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x41F0}, + {0x0F12, 0xE92D}, + {0x0F12, 0x1000}, + {0x0F12, 0xE590}, + {0x0F12, 0xC801}, + {0x0F12, 0xE1A0}, + {0x0F12, 0xC82C}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x1004}, + {0x0F12, 0xE590}, + {0x0F12, 0x1801}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x1821}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x4008}, + {0x0F12, 0xE590}, + {0x0F12, 0x500C}, + {0x0F12, 0xE590}, + {0x0F12, 0x2004}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x3005}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x000C}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x0052}, + {0x0F12, 0xEB00}, + {0x0F12, 0x609C}, + {0x0F12, 0xE59F}, + {0x0F12, 0x00B2}, + {0x0F12, 0xE1D6}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x000E}, + {0x0F12, 0x0A00}, + {0x0F12, 0x00C0}, + {0x0F12, 0xE59F}, + {0x0F12, 0x05B4}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0002}, + {0x0F12, 0xE350}, + {0x0F12, 0x000A}, + {0x0F12, 0x1A00}, + {0x0F12, 0x7080}, + {0x0F12, 0xE59F}, + {0x0F12, 0x10F4}, + {0x0F12, 0xE1D6}, + {0x0F12, 0x26B0}, + {0x0F12, 0xE1D7}, + {0x0F12, 0x00F0}, + {0x0F12, 0xE1D4}, + {0x0F12, 0x0048}, + {0x0F12, 0xEB00}, + {0x0F12, 0x00B0}, + {0x0F12, 0xE1C4}, + {0x0F12, 0x26B0}, + {0x0F12, 0xE1D7}, + {0x0F12, 0x10F6}, + {0x0F12, 0xE1D6}, + {0x0F12, 0x00F0}, + {0x0F12, 0xE1D5}, + {0x0F12, 0x0043}, + {0x0F12, 0xEB00}, + {0x0F12, 0x00B0}, + {0x0F12, 0xE1C5}, + {0x0F12, 0x41F0}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x4010}, + {0x0F12, 0xE92D}, + {0x0F12, 0x4000}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x1004}, + {0x0F12, 0xE594}, + {0x0F12, 0x003C}, + {0x0F12, 0xE59F}, + {0x0F12, 0x00B0}, + {0x0F12, 0xE1D0}, + {0x0F12, 0x0000}, + {0x0F12, 0xE350}, + {0x0F12, 0x0008}, + {0x0F12, 0x0A00}, + {0x0F12, 0x0030}, + {0x0F12, 0xE59F}, + {0x0F12, 0x3001}, + {0x0F12, 0xE1A0}, + {0x0F12, 0x2068}, + {0x0F12, 0xE590}, + {0x0F12, 0x0058}, + {0x0F12, 0xE59F}, + {0x0F12, 0x1005}, + {0x0F12, 0xE3A0}, + {0x0F12, 0x0036}, + {0x0F12, 0xEB00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE584}, + {0x0F12, 0x4010}, + {0x0F12, 0xE8BD}, + {0x0F12, 0xFF1E}, + {0x0F12, 0xE12F}, + {0x0F12, 0x0000}, + {0x0F12, 0xE594}, + {0x0F12, 0x0034}, + {0x0F12, 0xEB00}, + {0x0F12, 0x0000}, + {0x0F12, 0xE584}, + {0x0F12, 0xFFF9}, + {0x0F12, 0xEAFF}, + {0x0F12, 0x3360}, + {0x0F12, 0x7000}, + {0x0F12, 0x20D4}, + {0x0F12, 0x7000}, + {0x0F12, 0x16C8}, + {0x0F12, 0x7000}, + {0x0F12, 0x299C}, + {0x0F12, 0x7000}, + {0x0F12, 0x1272}, + {0x0F12, 0x7000}, + {0x0F12, 0x1728}, + {0x0F12, 0x7000}, + {0x0F12, 0x112C}, + {0x0F12, 0x7000}, + {0x0F12, 0x29A0}, + {0x0F12, 0x7000}, + {0x0F12, 0x122C}, + {0x0F12, 0x7000}, + {0x0F12, 0xF200}, + {0x0F12, 0xD000}, + {0x0F12, 0x2340}, + {0x0F12, 0x7000}, + {0x0F12, 0x0E2C}, + {0x0F12, 0x7000}, + {0x0F12, 0xF400}, + {0x0F12, 0xD000}, + {0x0F12, 0x0CDC}, + {0x0F12, 0x7000}, + {0x0F12, 0x06D4}, + {0x0F12, 0x7000}, + {0x0F12, 0x4778}, + {0x0F12, 0x46C0}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0xC091}, + {0x0F12, 0x0000}, + {0x0F12, 0xF004}, + {0x0F12, 0xE51F}, + {0x0F12, 0xD14C}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0xAC79}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x0467}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x2FA7}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0xCB1F}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x058F}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0xA0F1}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x2B43}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x8725}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x6777}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x8E49}, + {0x0F12, 0x0000}, + {0x0F12, 0xC000}, + {0x0F12, 0xE59F}, + {0x0F12, 0xFF1C}, + {0x0F12, 0xE12F}, + {0x0F12, 0x8EDD}, + {0x0F12, 0x0000}, + {0x0F12, 0xA4B6}, + {0x0F12, 0x0000}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_analog_setting[] = { + /* 04. Analog Setting & APS Control */ + {0x0028, 0x7000}, + {0x002A, 0x0E38}, + {0x0F12, 0x0476}, /* senHal_RegCompBiasNormSf //CDS bias */ + {0x0F12, 0x0476}, /* senHal_RegCompBiasYAv //CDS bias */ + {0x002A, 0x0AA0}, + {0x0F12, 0x0001}, /* 1-Digital, 0-Analog */ + {0x002A, 0x0E2C}, + {0x0F12, 0x0001}, /* 2-Adding/averaging, 1-Y-Avg, 0-PLA */ + {0x002A, 0x0E66}, + {0x0F12, 0x0001}, /* senHal_RegBlstEnNorm */ + {0x002A, 0x1250}, + {0x0F12, 0xFFFF}, /* senHal_Bls_nSpExpLines */ + {0x002A, 0x1202}, + {0x0F12, 0x0010}, /* senHal_Dblr_VcoFreqMHZ */ + /* ADLC Filter */ + {0x002A, 0x1288}, + {0x0F12, 0x020F}, /* gisp_dadlc_ResetFilterValue */ + {0x0F12, 0x1C02}, /* gisp_dadlc_SteadyFilterValue */ + {0x0F12, 0x0006}, /* gisp_dadlc_NResetIIrFrames */ + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_otp_control[] = { + /* 05.OTP Control */ + {0x002A, 0x3368}, + {0x0F12, 0x0000}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_gas_setting[] = { + /* 06.GAS (Grid Anti-Shading) */ + {0x002A, 0x1326}, + {0x0F12, 0x0000}, /* gisp_gos_Enable */ + {0x002A, 0x063A}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x00E8}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x00C8}, + {0x0F12, 0x00F8}, + {0x0F12, 0x00F8}, + {0x0F12, 0x0100}, + {0x0F12, 0x00F0}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x00F0}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x002A, 0x067A}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x002A, 0x06BA}, + {0x0F12, 0x0001}, + {0x002A, 0x0632}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x002A, 0x0672}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x0F12, 0x0100}, + {0x002A, 0x06B2}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x002A, 0x06D0}, + {0x0F12, 0x000D}, + {0x0F12, 0x000F}, + {0x002A, 0x06CC}, + {0x0F12, 0x0280}, + {0x0F12, 0x01E0}, + {0x002A, 0x06C6}, + {0x0F12, 0x0001}, + {0x002A, 0x0624}, + {0x0F12, 0x009D}, + {0x0F12, 0x00D5}, + {0x0F12, 0x0103}, + {0x0F12, 0x0128}, + {0x0F12, 0x0166}, + {0x0F12, 0x0193}, + {0x0F12, 0x01A0}, + + {0x002A, 0x347C}, + {0x0F12, 0x013B}, + {0x0F12, 0x0116}, + {0x0F12, 0x00D9}, + {0x0F12, 0x00A6}, + {0x0F12, 0x0082}, + {0x0F12, 0x006C}, + {0x0F12, 0x0065}, + {0x0F12, 0x006C}, + {0x0F12, 0x0080}, + {0x0F12, 0x00A3}, + {0x0F12, 0x00D4}, + {0x0F12, 0x010D}, + {0x0F12, 0x012E}, + {0x0F12, 0x0138}, + {0x0F12, 0x0104}, + {0x0F12, 0x00BE}, + {0x0F12, 0x0088}, + {0x0F12, 0x0062}, + {0x0F12, 0x004D}, + {0x0F12, 0x0046}, + {0x0F12, 0x004C}, + {0x0F12, 0x0060}, + {0x0F12, 0x0084}, + {0x0F12, 0x00B8}, + {0x0F12, 0x00F9}, + {0x0F12, 0x012C}, + {0x0F12, 0x011A}, + {0x0F12, 0x00DB}, + {0x0F12, 0x0093}, + {0x0F12, 0x005F}, + {0x0F12, 0x003C}, + {0x0F12, 0x0027}, + {0x0F12, 0x0020}, + {0x0F12, 0x0026}, + {0x0F12, 0x003A}, + {0x0F12, 0x005C}, + {0x0F12, 0x008E}, + {0x0F12, 0x00D2}, + {0x0F12, 0x010E}, + {0x0F12, 0x0101}, + {0x0F12, 0x00BF}, + {0x0F12, 0x0077}, + {0x0F12, 0x0044}, + {0x0F12, 0x0023}, + {0x0F12, 0x0011}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x0022}, + {0x0F12, 0x0043}, + {0x0F12, 0x0074}, + {0x0F12, 0x00B7}, + {0x0F12, 0x00F7}, + {0x0F12, 0x00FC}, + {0x0F12, 0x00B7}, + {0x0F12, 0x006F}, + {0x0F12, 0x003C}, + {0x0F12, 0x001C}, + {0x0F12, 0x000A}, + {0x0F12, 0x0004}, + {0x0F12, 0x000A}, + {0x0F12, 0x001B}, + {0x0F12, 0x003B}, + {0x0F12, 0x006C}, + {0x0F12, 0x00B0}, + {0x0F12, 0x00F2}, + {0x0F12, 0x00EF}, + {0x0F12, 0x00AB}, + {0x0F12, 0x0065}, + {0x0F12, 0x0034}, + {0x0F12, 0x0015}, + {0x0F12, 0x0004}, + {0x0F12, 0x0000}, + {0x0F12, 0x0004}, + {0x0F12, 0x0013}, + {0x0F12, 0x0033}, + {0x0F12, 0x0063}, + {0x0F12, 0x00A5}, + {0x0F12, 0x00E5}, + {0x0F12, 0x00F7}, + {0x0F12, 0x00B4}, + {0x0F12, 0x006D}, + {0x0F12, 0x003C}, + {0x0F12, 0x001C}, + {0x0F12, 0x000B}, + {0x0F12, 0x0005}, + {0x0F12, 0x000A}, + {0x0F12, 0x001B}, + {0x0F12, 0x003B}, + {0x0F12, 0x006B}, + {0x0F12, 0x00AD}, + {0x0F12, 0x00ED}, + {0x0F12, 0x010B}, + {0x0F12, 0x00CB}, + {0x0F12, 0x0085}, + {0x0F12, 0x0051}, + {0x0F12, 0x002F}, + {0x0F12, 0x001C}, + {0x0F12, 0x0016}, + {0x0F12, 0x001C}, + {0x0F12, 0x002E}, + {0x0F12, 0x004F}, + {0x0F12, 0x0081}, + {0x0F12, 0x00C4}, + {0x0F12, 0x0102}, + {0x0F12, 0x0119}, + {0x0F12, 0x00DF}, + {0x0F12, 0x009B}, + {0x0F12, 0x0067}, + {0x0F12, 0x0045}, + {0x0F12, 0x0030}, + {0x0F12, 0x0029}, + {0x0F12, 0x002F}, + {0x0F12, 0x0043}, + {0x0F12, 0x0066}, + {0x0F12, 0x0098}, + {0x0F12, 0x00D9}, + {0x0F12, 0x010F}, + {0x0F12, 0x0138}, + {0x0F12, 0x010C}, + {0x0F12, 0x00CB}, + {0x0F12, 0x0097}, + {0x0F12, 0x0073}, + {0x0F12, 0x005C}, + {0x0F12, 0x0054}, + {0x0F12, 0x005B}, + {0x0F12, 0x0070}, + {0x0F12, 0x0096}, + {0x0F12, 0x00C9}, + {0x0F12, 0x0106}, + {0x0F12, 0x012D}, + {0x0F12, 0x0147}, + {0x0F12, 0x012F}, + {0x0F12, 0x00F8}, + {0x0F12, 0x00C5}, + {0x0F12, 0x00A1}, + {0x0F12, 0x008B}, + {0x0F12, 0x0083}, + {0x0F12, 0x008B}, + {0x0F12, 0x00A0}, + {0x0F12, 0x00C2}, + {0x0F12, 0x00F3}, + {0x0F12, 0x0124}, + {0x0F12, 0x0139}, + {0x0F12, 0x0093}, + {0x0F12, 0x007E}, + {0x0F12, 0x0062}, + {0x0F12, 0x004D}, + {0x0F12, 0x003E}, + {0x0F12, 0x0034}, + {0x0F12, 0x0030}, + {0x0F12, 0x0032}, + {0x0F12, 0x003B}, + {0x0F12, 0x0049}, + {0x0F12, 0x005C}, + {0x0F12, 0x0077}, + {0x0F12, 0x008A}, + {0x0F12, 0x0093}, + {0x0F12, 0x0077}, + {0x0F12, 0x0059}, + {0x0F12, 0x0042}, + {0x0F12, 0x0032}, + {0x0F12, 0x0027}, + {0x0F12, 0x0024}, + {0x0F12, 0x0026}, + {0x0F12, 0x002F}, + {0x0F12, 0x003D}, + {0x0F12, 0x0052}, + {0x0F12, 0x006E}, + {0x0F12, 0x008B}, + {0x0F12, 0x0083}, + {0x0F12, 0x0064}, + {0x0F12, 0x0046}, + {0x0F12, 0x0030}, + {0x0F12, 0x0020}, + {0x0F12, 0x0016}, + {0x0F12, 0x0011}, + {0x0F12, 0x0014}, + {0x0F12, 0x001E}, + {0x0F12, 0x002D}, + {0x0F12, 0x0041}, + {0x0F12, 0x005D}, + {0x0F12, 0x007C}, + {0x0F12, 0x0077}, + {0x0F12, 0x0057}, + {0x0F12, 0x0039}, + {0x0F12, 0x0024}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0007}, + {0x0F12, 0x0009}, + {0x0F12, 0x0012}, + {0x0F12, 0x0021}, + {0x0F12, 0x0036}, + {0x0F12, 0x0051}, + {0x0F12, 0x0070}, + {0x0F12, 0x0077}, + {0x0F12, 0x0056}, + {0x0F12, 0x0038}, + {0x0F12, 0x0022}, + {0x0F12, 0x0013}, + {0x0F12, 0x0009}, + {0x0F12, 0x0005}, + {0x0F12, 0x0008}, + {0x0F12, 0x0011}, + {0x0F12, 0x0020}, + {0x0F12, 0x0035}, + {0x0F12, 0x0051}, + {0x0F12, 0x0071}, + {0x0F12, 0x006E}, + {0x0F12, 0x004E}, + {0x0F12, 0x0032}, + {0x0F12, 0x001C}, + {0x0F12, 0x000D}, + {0x0F12, 0x0004}, + {0x0F12, 0x0000}, + {0x0F12, 0x0003}, + {0x0F12, 0x000B}, + {0x0F12, 0x001A}, + {0x0F12, 0x002F}, + {0x0F12, 0x0049}, + {0x0F12, 0x0068}, + {0x0F12, 0x0072}, + {0x0F12, 0x0053}, + {0x0F12, 0x0037}, + {0x0F12, 0x0021}, + {0x0F12, 0x0012}, + {0x0F12, 0x0009}, + {0x0F12, 0x0005}, + {0x0F12, 0x0008}, + {0x0F12, 0x0010}, + {0x0F12, 0x001F}, + {0x0F12, 0x0034}, + {0x0F12, 0x004E}, + {0x0F12, 0x006C}, + {0x0F12, 0x007F}, + {0x0F12, 0x0060}, + {0x0F12, 0x0043}, + {0x0F12, 0x002D}, + {0x0F12, 0x001D}, + {0x0F12, 0x0013}, + {0x0F12, 0x0010}, + {0x0F12, 0x0013}, + {0x0F12, 0x001C}, + {0x0F12, 0x002B}, + {0x0F12, 0x0040}, + {0x0F12, 0x005A}, + {0x0F12, 0x0079}, + {0x0F12, 0x0082}, + {0x0F12, 0x0066}, + {0x0F12, 0x0049}, + {0x0F12, 0x0035}, + {0x0F12, 0x0025}, + {0x0F12, 0x001B}, + {0x0F12, 0x0017}, + {0x0F12, 0x0019}, + {0x0F12, 0x0023}, + {0x0F12, 0x0033}, + {0x0F12, 0x0046}, + {0x0F12, 0x0060}, + {0x0F12, 0x007B}, + {0x0F12, 0x0092}, + {0x0F12, 0x007C}, + {0x0F12, 0x0060}, + {0x0F12, 0x004B}, + {0x0F12, 0x003C}, + {0x0F12, 0x0032}, + {0x0F12, 0x002D}, + {0x0F12, 0x0030}, + {0x0F12, 0x0039}, + {0x0F12, 0x0049}, + {0x0F12, 0x005D}, + {0x0F12, 0x0076}, + {0x0F12, 0x008C}, + {0x0F12, 0x009F}, + {0x0F12, 0x008F}, + {0x0F12, 0x0077}, + {0x0F12, 0x0061}, + {0x0F12, 0x0052}, + {0x0F12, 0x0048}, + {0x0F12, 0x0043}, + {0x0F12, 0x0047}, + {0x0F12, 0x0050}, + {0x0F12, 0x005E}, + {0x0F12, 0x0071}, + {0x0F12, 0x0086}, + {0x0F12, 0x0097}, + {0x0F12, 0x0093}, + {0x0F12, 0x007C}, + {0x0F12, 0x005F}, + {0x0F12, 0x0049}, + {0x0F12, 0x003A}, + {0x0F12, 0x0030}, + {0x0F12, 0x002C}, + {0x0F12, 0x002F}, + {0x0F12, 0x0037}, + {0x0F12, 0x0045}, + {0x0F12, 0x005A}, + {0x0F12, 0x0075}, + {0x0F12, 0x008A}, + {0x0F12, 0x0094}, + {0x0F12, 0x0077}, + {0x0F12, 0x0057}, + {0x0F12, 0x0040}, + {0x0F12, 0x002F}, + {0x0F12, 0x0024}, + {0x0F12, 0x0020}, + {0x0F12, 0x0023}, + {0x0F12, 0x002D}, + {0x0F12, 0x003B}, + {0x0F12, 0x0051}, + {0x0F12, 0x006E}, + {0x0F12, 0x008C}, + {0x0F12, 0x0085}, + {0x0F12, 0x0066}, + {0x0F12, 0x0046}, + {0x0F12, 0x002F}, + {0x0F12, 0x001F}, + {0x0F12, 0x0014}, + {0x0F12, 0x000F}, + {0x0F12, 0x0012}, + {0x0F12, 0x001C}, + {0x0F12, 0x002B}, + {0x0F12, 0x0040}, + {0x0F12, 0x005C}, + {0x0F12, 0x007D}, + {0x0F12, 0x007A}, + {0x0F12, 0x005A}, + {0x0F12, 0x003A}, + {0x0F12, 0x0024}, + {0x0F12, 0x0014}, + {0x0F12, 0x0009}, + {0x0F12, 0x0006}, + {0x0F12, 0x0008}, + {0x0F12, 0x0011}, + {0x0F12, 0x0020}, + {0x0F12, 0x0036}, + {0x0F12, 0x0051}, + {0x0F12, 0x0072}, + {0x0F12, 0x007B}, + {0x0F12, 0x0059}, + {0x0F12, 0x003A}, + {0x0F12, 0x0023}, + {0x0F12, 0x0012}, + {0x0F12, 0x0008}, + {0x0F12, 0x0004}, + {0x0F12, 0x0007}, + {0x0F12, 0x000F}, + {0x0F12, 0x001F}, + {0x0F12, 0x0035}, + {0x0F12, 0x0051}, + {0x0F12, 0x0072}, + {0x0F12, 0x0073}, + {0x0F12, 0x0053}, + {0x0F12, 0x0034}, + {0x0F12, 0x001D}, + {0x0F12, 0x000E}, + {0x0F12, 0x0004}, + {0x0F12, 0x0000}, + {0x0F12, 0x0002}, + {0x0F12, 0x000A}, + {0x0F12, 0x001A}, + {0x0F12, 0x002F}, + {0x0F12, 0x004A}, + {0x0F12, 0x006A}, + {0x0F12, 0x0077}, + {0x0F12, 0x0058}, + {0x0F12, 0x0039}, + {0x0F12, 0x0022}, + {0x0F12, 0x0012}, + {0x0F12, 0x0008}, + {0x0F12, 0x0004}, + {0x0F12, 0x0007}, + {0x0F12, 0x000F}, + {0x0F12, 0x001E}, + {0x0F12, 0x0034}, + {0x0F12, 0x004F}, + {0x0F12, 0x006F}, + {0x0F12, 0x0083}, + {0x0F12, 0x0064}, + {0x0F12, 0x0045}, + {0x0F12, 0x002E}, + {0x0F12, 0x001D}, + {0x0F12, 0x0012}, + {0x0F12, 0x000F}, + {0x0F12, 0x0011}, + {0x0F12, 0x001A}, + {0x0F12, 0x002A}, + {0x0F12, 0x003F}, + {0x0F12, 0x005B}, + {0x0F12, 0x007B}, + {0x0F12, 0x0087}, + {0x0F12, 0x006A}, + {0x0F12, 0x004B}, + {0x0F12, 0x0036}, + {0x0F12, 0x0025}, + {0x0F12, 0x0019}, + {0x0F12, 0x0015}, + {0x0F12, 0x0017}, + {0x0F12, 0x0022}, + {0x0F12, 0x0031}, + {0x0F12, 0x0045}, + {0x0F12, 0x0060}, + {0x0F12, 0x007D}, + {0x0F12, 0x0096}, + {0x0F12, 0x007F}, + {0x0F12, 0x0061}, + {0x0F12, 0x004B}, + {0x0F12, 0x003B}, + {0x0F12, 0x002F}, + {0x0F12, 0x002A}, + {0x0F12, 0x002D}, + {0x0F12, 0x0036}, + {0x0F12, 0x0046}, + {0x0F12, 0x005B}, + {0x0F12, 0x0075}, + {0x0F12, 0x008D}, + {0x0F12, 0x00A1}, + {0x0F12, 0x0091}, + {0x0F12, 0x0077}, + {0x0F12, 0x0060}, + {0x0F12, 0x0050}, + {0x0F12, 0x0044}, + {0x0F12, 0x0040}, + {0x0F12, 0x0043}, + {0x0F12, 0x004C}, + {0x0F12, 0x005A}, + {0x0F12, 0x006D}, + {0x0F12, 0x0084}, + {0x0F12, 0x0094}, + {0x0F12, 0x0072}, + {0x0F12, 0x0063}, + {0x0F12, 0x004C}, + {0x0F12, 0x003A}, + {0x0F12, 0x002D}, + {0x0F12, 0x0025}, + {0x0F12, 0x0023}, + {0x0F12, 0x0025}, + {0x0F12, 0x002C}, + {0x0F12, 0x0038}, + {0x0F12, 0x004A}, + {0x0F12, 0x005F}, + {0x0F12, 0x006B}, + {0x0F12, 0x0079}, + {0x0F12, 0x0065}, + {0x0F12, 0x004A}, + {0x0F12, 0x0037}, + {0x0F12, 0x0029}, + {0x0F12, 0x0021}, + {0x0F12, 0x001D}, + {0x0F12, 0x001F}, + {0x0F12, 0x0027}, + {0x0F12, 0x0033}, + {0x0F12, 0x0044}, + {0x0F12, 0x005E}, + {0x0F12, 0x006E}, + {0x0F12, 0x006A}, + {0x0F12, 0x0055}, + {0x0F12, 0x003A}, + {0x0F12, 0x0028}, + {0x0F12, 0x001A}, + {0x0F12, 0x0011}, + {0x0F12, 0x000D}, + {0x0F12, 0x000F}, + {0x0F12, 0x0017}, + {0x0F12, 0x0024}, + {0x0F12, 0x0035}, + {0x0F12, 0x004E}, + {0x0F12, 0x0061}, + {0x0F12, 0x0061}, + {0x0F12, 0x004A}, + {0x0F12, 0x0031}, + {0x0F12, 0x001E}, + {0x0F12, 0x0011}, + {0x0F12, 0x0008}, + {0x0F12, 0x0005}, + {0x0F12, 0x0007}, + {0x0F12, 0x000E}, + {0x0F12, 0x001B}, + {0x0F12, 0x002D}, + {0x0F12, 0x0045}, + {0x0F12, 0x0059}, + {0x0F12, 0x0062}, + {0x0F12, 0x004B}, + {0x0F12, 0x0031}, + {0x0F12, 0x001E}, + {0x0F12, 0x0010}, + {0x0F12, 0x0008}, + {0x0F12, 0x0004}, + {0x0F12, 0x0006}, + {0x0F12, 0x000E}, + {0x0F12, 0x001B}, + {0x0F12, 0x002E}, + {0x0F12, 0x0046}, + {0x0F12, 0x005A}, + {0x0F12, 0x005B}, + {0x0F12, 0x0045}, + {0x0F12, 0x002C}, + {0x0F12, 0x001A}, + {0x0F12, 0x000C}, + {0x0F12, 0x0003}, + {0x0F12, 0x0000}, + {0x0F12, 0x0002}, + {0x0F12, 0x0009}, + {0x0F12, 0x0016}, + {0x0F12, 0x0029}, + {0x0F12, 0x0040}, + {0x0F12, 0x0054}, + {0x0F12, 0x005F}, + {0x0F12, 0x004A}, + {0x0F12, 0x0031}, + {0x0F12, 0x001F}, + {0x0F12, 0x0010}, + {0x0F12, 0x0008}, + {0x0F12, 0x0004}, + {0x0F12, 0x0007}, + {0x0F12, 0x000E}, + {0x0F12, 0x001B}, + {0x0F12, 0x002E}, + {0x0F12, 0x0045}, + {0x0F12, 0x0059}, + {0x0F12, 0x006C}, + {0x0F12, 0x0057}, + {0x0F12, 0x003E}, + {0x0F12, 0x002A}, + {0x0F12, 0x001B}, + {0x0F12, 0x0012}, + {0x0F12, 0x000F}, + {0x0F12, 0x0011}, + {0x0F12, 0x0019}, + {0x0F12, 0x0027}, + {0x0F12, 0x0039}, + {0x0F12, 0x0050}, + {0x0F12, 0x0063}, + {0x0F12, 0x006F}, + {0x0F12, 0x005C}, + {0x0F12, 0x0044}, + {0x0F12, 0x0031}, + {0x0F12, 0x0023}, + {0x0F12, 0x0019}, + {0x0F12, 0x0016}, + {0x0F12, 0x0017}, + {0x0F12, 0x0020}, + {0x0F12, 0x002E}, + {0x0F12, 0x0040}, + {0x0F12, 0x0055}, + {0x0F12, 0x0064}, + {0x0F12, 0x007E}, + {0x0F12, 0x0071}, + {0x0F12, 0x0059}, + {0x0F12, 0x0046}, + {0x0F12, 0x0039}, + {0x0F12, 0x002F}, + {0x0F12, 0x002A}, + {0x0F12, 0x002D}, + {0x0F12, 0x0035}, + {0x0F12, 0x0043}, + {0x0F12, 0x0054}, + {0x0F12, 0x0069}, + {0x0F12, 0x0074}, + {0x0F12, 0x0083}, + {0x0F12, 0x007D}, + {0x0F12, 0x0068}, + {0x0F12, 0x0055}, + {0x0F12, 0x0048}, + {0x0F12, 0x003E}, + {0x0F12, 0x003A}, + {0x0F12, 0x003D}, + {0x0F12, 0x0045}, + {0x0F12, 0x0051}, + {0x0F12, 0x0061}, + {0x0F12, 0x0072}, + {0x0F12, 0x0077}, + {0x002A, 0x1348}, + {0x0F12, 0x0001}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_analog_setting2[] = { + /* Analog Setting 2 */ + {0x002A, 0x1278}, + {0x0F12, 0xAAF0}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_awb_basic_setting[] = { + /* 09.AWB-BASIC setting */ + {0x002A, 0x0B36}, + {0x0F12, 0x0005}, + {0x002A, 0x0B3A}, + {0x0F12, 0x00F3}, + {0x0F12, 0x02CB}, + {0x002A, 0x0B38}, + {0x0F12, 0x0010}, + {0x002A, 0x0AE6}, + {0x0F12, 0x0385}, + {0x0F12, 0x03D8}, + {0x0F12, 0x032A}, + {0x0F12, 0x03C5}, + {0x0F12, 0x02F5}, + {0x0F12, 0x039D}, + {0x0F12, 0x02D3}, + {0x0F12, 0x0372}, + {0x0F12, 0x02B1}, + {0x0F12, 0x033E}, + {0x0F12, 0x028A}, + {0x0F12, 0x0322}, + {0x0F12, 0x0268}, + {0x0F12, 0x02FD}, + {0x0F12, 0x0248}, + {0x0F12, 0x02EF}, + {0x0F12, 0x022F}, + {0x0F12, 0x02D5}, + {0x0F12, 0x0219}, + {0x0F12, 0x02C2}, + {0x0F12, 0x0206}, + {0x0F12, 0x02A3}, + {0x0F12, 0x01F0}, + {0x0F12, 0x0286}, + {0x0F12, 0x01E3}, + {0x0F12, 0x0268}, + {0x0F12, 0x01D6}, + {0x0F12, 0x024E}, + {0x0F12, 0x01DD}, + {0x0F12, 0x022A}, + {0x0F12, 0x0210}, + {0x0F12, 0x01F2}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + + {0x002A, 0x0BAA}, + {0x0F12, 0x0006}, + {0x002A, 0x0BAE}, + {0x0F12, 0x00CC}, + {0x0F12, 0x02F3}, + {0x002A, 0x0BAC}, + {0x0F12, 0x000A}, + {0x002A, 0x0B7A}, + {0x0F12, 0x036C}, + {0x0F12, 0x03C6}, + {0x0F12, 0x02EE}, + {0x0F12, 0x03F9}, + {0x0F12, 0x02BE}, + {0x0F12, 0x03DF}, + {0x0F12, 0x027A}, + {0x0F12, 0x03AE}, + {0x0F12, 0x0234}, + {0x0F12, 0x0376}, + {0x0F12, 0x0204}, + {0x0F12, 0x033E}, + {0x0F12, 0x01E0}, + {0x0F12, 0x02CD}, + {0x0F12, 0x01C3}, + {0x0F12, 0x027A}, + {0x0F12, 0x01B7}, + {0x0F12, 0x0244}, + {0x0F12, 0x01FE}, + {0x0F12, 0x01DD}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x002A, 0x0B70}, + {0x0F12, 0x0005}, + {0x002A, 0x0B74}, + {0x0F12, 0x01E3}, + {0x0F12, 0x0270}, + {0x002A, 0x0B72}, + {0x0F12, 0x0006}, + {0x002A, 0x0B40}, + {0x0F12, 0x028A}, + {0x0F12, 0x02A1}, + {0x0F12, 0x0263}, + {0x0F12, 0x02C0}, + {0x0F12, 0x024C}, + {0x0F12, 0x02BE}, + {0x0F12, 0x023D}, + {0x0F12, 0x02A6}, + {0x0F12, 0x0243}, + {0x0F12, 0x0289}, + {0x0F12, 0x026F}, + {0x0F12, 0x025D}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x002A, 0x0BC8}, + {0x0F12, 0x0005}, + {0x002A, 0x0BCC}, + {0x0F12, 0x010F}, + {0x0F12, 0x018F}, + {0x002A, 0x0BCA}, + {0x0F12, 0x0005}, + {0x002A, 0x0BB4}, + {0x0F12, 0x03E7}, + {0x0F12, 0x03F8}, + {0x0F12, 0x03A7}, + {0x0F12, 0x03FC}, + {0x0F12, 0x0352}, + {0x0F12, 0x03D0}, + {0x0F12, 0x0322}, + {0x0F12, 0x039E}, + {0x0F12, 0x032B}, + {0x0F12, 0x034D}, + {0x002A, 0x0BE6}, + {0x0F12, 0x0006}, + {0x002A, 0x0BEA}, + {0x0F12, 0x019E}, + {0x0F12, 0x0257}, + {0x002A, 0x0BE8}, + {0x0F12, 0x0004}, + {0x002A, 0x0BD2}, + {0x0F12, 0x030B}, + {0x0F12, 0x0323}, + {0x0F12, 0x02C3}, + {0x0F12, 0x030F}, + {0x0F12, 0x0288}, + {0x0F12, 0x02E5}, + {0x0F12, 0x026A}, + {0x0F12, 0x02A2}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x002A, 0x0C2C}, + {0x0F12, 0x0139}, + {0x0F12, 0x0122}, + {0x002A, 0x0BFC}, + {0x0F12, 0x0378}, + {0x0F12, 0x011E}, + {0x0F12, 0x02F0}, + {0x0F12, 0x0184}, + {0x0F12, 0x0313}, + {0x0F12, 0x0158}, + {0x0F12, 0x02BA}, + {0x0F12, 0x01BA}, + {0x0F12, 0x0231}, + {0x0F12, 0x0252}, + {0x0F12, 0x0237}, + {0x0F12, 0x024C}, + {0x0F12, 0x020F}, + {0x0F12, 0x0279}, + {0x0F12, 0x0268}, + {0x0F12, 0x021A}, + {0x002A, 0x0C4C}, + {0x0F12, 0x0450}, + {0x002A, 0x0C58}, + {0x0F12, 0x059C}, + {0x002A, 0x0BF8}, + {0x0F12, 0x01AE}, + {0x002A, 0x0C28}, + {0x0F12, 0x0000}, + {0x002A, 0x0CAC}, + {0x0F12, 0x0050}, + {0x002A, 0x0C28}, + {0x0F12, 0x0000}, + + {0x002A, 0x20BA}, + {0x0F12, 0x0006}, + + {0x002A, 0x0D0E}, + {0x0F12, 0x00B8}, + {0x0F12, 0x00B2}, + {0x002A, 0x0CFE}, + {0x0F12, 0x0FAB}, + {0x0F12, 0x0FF5}, + {0x0F12, 0x10BB}, + {0x0F12, 0x1117}, + {0x0F12, 0x116D}, + {0x0F12, 0x11D5}, + {0x0F12, 0x00A9}, + {0x0F12, 0x00C0}, + {0x002A, 0x0CF8}, + {0x0F12, 0x02CC}, + {0x0F12, 0x031E}, + {0x0F12, 0x0359}, + + {0x002A, 0x0CB0}, + {0x0F12, 0x0030}, + {0x0F12, 0x0040}, + {0x0F12, 0x0060}, + {0x0F12, 0x0040}, + {0x0F12, 0x0008}, + {0x0F12, 0x0008}, + + {0x0F12, 0x0030}, + {0x0F12, 0x0040}, + {0x0F12, 0x0060}, + {0x0F12, 0x0040}, + {0x0F12, 0x0008}, + {0x0F12, 0x0008}, + + {0x0F12, 0x0030}, + {0x0F12, 0x0040}, + {0x0F12, 0x0060}, + {0x0F12, 0x0040}, + {0x0F12, 0x0008}, + {0x0F12, 0x0008}, + + {0x0F12, 0x0018}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFF80}, + {0x0F12, 0xFEC0}, + + {0x0F12, 0x0018}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFF80}, + {0x0F12, 0xFEC0}, + + {0x0F12, 0x0018}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFF80}, + {0x0F12, 0xFEC0}, + + {0x002A, 0x0D30}, + {0x0F12, 0x0002}, + + {0x002A, 0x3362}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + + /* For Outdoor Detector */ + {0x002A, 0x0C86}, + {0x0F12, 0x0005}, + {0x002A, 0x0C70}, + {0x0F12, 0xFF7B}, + {0x0F12, 0x00CE}, + {0x0F12, 0xFF23}, + {0x0F12, 0x010D}, + {0x0F12, 0xFEF3}, + {0x0F12, 0x012C}, + {0x0F12, 0xFED7}, + {0x0F12, 0x014E}, + {0x0F12, 0xFEBB}, + {0x0F12, 0x0162}, + {0x0F12, 0x1388}, + {0x002A, 0x0C8A}, + {0x0F12, 0x4ACB}, + {0x002A, 0x0C88}, + {0x0F12, 0x0A7C}, + + {0x002A, 0x0CA0}, + {0x0F12, 0x0030}, + + {0x002A, 0x0CA4}, + {0x0F12, 0x0030}, + {0x0F12, 0x0180}, + {0x0F12, 0x0002}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_clk_setting[] = { + /* 10.Clock Setting */ + {0x002A, 0x012E}, + {0x0F12, 0x5DC0}, + {0x0F12, 0x0000}, + {0x002A, 0x0146}, + {0x0F12, 0x0000}, + {0x0F12, 0x0001}, + + /* System Clock & Output clock (Pclk) */ + {0x002A, 0x014C}, + {0x0F12, 0x2AF8}, + {0x002A, 0x0152}, + {0x0F12, 0x55F0}, + {0x002A, 0x014E}, + {0x0F12, 0x55F0}, + {0x0F12, 0x00FA}, + + {0x002A, 0x0164}, + {0x0F12, 0x0001}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_flicker_detection[] = { + /* 11.Auto Flicker Detection */ + {0x0028, 0x7000}, + {0x002A, 0x0408}, + {0x0F12, 0x067F}, + {0x002A, 0x0ABC}, + {0x0F12, 0x0000}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_ae_setting[] = { + /* 12.AE Setting */ + {0x002A, 0x0D40}, + {0x0F12, 0x0036}, + + /* For LT Calibration */ + {0x002A, 0x0D46}, + {0x0F12, 0x000F}, + + {0x002A, 0x0440}, + {0x0F12, 0x3410}, + {0x002A, 0x0444}, + {0x0F12, 0x6820}, + {0x002A, 0x0448}, + {0x0F12, 0x8227}, + {0x002A, 0x044C}, + {0x0F12, 0xC350}, + {0x002A, 0x0450}, + {0x0F12, 0x3410}, + {0x002A, 0x0454}, + {0x0F12, 0x6820}, + {0x002A, 0x0458}, + {0x0F12, 0x8227}, + {0x002A, 0x045C}, + {0x0F12, 0xC350}, + {0x002A, 0x0460}, + {0x0F12, 0x01B0}, + {0x0F12, 0x01B0}, + {0x0F12, 0x0280}, + {0x0F12, 0x0600}, + {0x0F12, 0x0100}, + {0x0F12, 0x3000}, + {0x002A, 0x042E}, + {0x0F12, 0x012E}, + {0x0F12, 0x00D5}, + {0x002A, 0x0DE0}, + {0x0F12, 0x0002}, + + {0x002A, 0x0D38}, + {0x0F12, 0x019C}, + {0x002A, 0x0D3E}, + {0x0F12, 0x02A0}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_ae_weight[] = { + /* 13.AE Weight (Normal) */ + {0x002A, 0x0D4E}, + {0x0F12, 0x0100}, + {0x0F12, 0x0001}, + {0x0F12, 0x0100}, + {0x0F12, 0x0001}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0201}, + {0x0F12, 0x0202}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0303}, + {0x0F12, 0x0303}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0503}, + {0x0F12, 0x0305}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0402}, + {0x0F12, 0x0204}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0201}, + {0x0F12, 0x0102}, + {0x0F12, 0x0101}, + {0x0F12, 0x0100}, + {0x0F12, 0x0101}, + {0x0F12, 0x0101}, + {0x0F12, 0x0001}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_ccm_setting[] = { + /* 15.CCM Setting */ + {0x002A, 0x33A4}, + {0x0F12, 0x01D0}, + {0x0F12, 0xFFA1}, + {0x0F12, 0xFFFA}, + {0x0F12, 0xFF6F}, + {0x0F12, 0x0140}, + {0x0F12, 0xFF49}, + {0x0F12, 0xFFC1}, + {0x0F12, 0x001F}, + {0x0F12, 0x01BD}, + {0x0F12, 0x013F}, + {0x0F12, 0x00E1}, + {0x0F12, 0xFF43}, + {0x0F12, 0x0191}, + {0x0F12, 0xFFC0}, + {0x0F12, 0x01B7}, + {0x0F12, 0xFF30}, + {0x0F12, 0x015F}, + {0x0F12, 0x0106}, + {0x0F12, 0x01D0}, + {0x0F12, 0xFFA1}, + {0x0F12, 0xFFFA}, + {0x0F12, 0xFF6F}, + {0x0F12, 0x0140}, + {0x0F12, 0xFF49}, + {0x0F12, 0xFFC1}, + {0x0F12, 0x001F}, + {0x0F12, 0x01BD}, + {0x0F12, 0x013F}, + {0x0F12, 0x00E1}, + {0x0F12, 0xFF43}, + {0x0F12, 0x0191}, + {0x0F12, 0xFFC0}, + {0x0F12, 0x01B7}, + {0x0F12, 0xFF30}, + {0x0F12, 0x015F}, + {0x0F12, 0x0106}, + {0x0F12, 0x01C4}, + {0x0F12, 0xFFAB}, + {0x0F12, 0xFFFC}, + {0x0F12, 0xFF6E}, + {0x0F12, 0x0145}, + {0x0F12, 0xFF4A}, + {0x0F12, 0xFFE1}, + {0x0F12, 0xFFF6}, + {0x0F12, 0x01BD}, + {0x0F12, 0x013E}, + {0x0F12, 0x00E4}, + {0x0F12, 0xFF46}, + {0x0F12, 0x0190}, + {0x0F12, 0xFFBC}, + {0x0F12, 0x01B5}, + {0x0F12, 0xFF30}, + {0x0F12, 0x015E}, + {0x0F12, 0x0103}, + {0x0F12, 0x01C4}, + {0x0F12, 0xFFAB}, + {0x0F12, 0xFFFC}, + {0x0F12, 0xFF6E}, + {0x0F12, 0x0145}, + {0x0F12, 0xFF4A}, + {0x0F12, 0xFFE1}, + {0x0F12, 0xFFF6}, + {0x0F12, 0x01BD}, + {0x0F12, 0x013E}, + {0x0F12, 0x00E4}, + {0x0F12, 0xFF46}, + {0x0F12, 0x0190}, + {0x0F12, 0xFFBC}, + {0x0F12, 0x01B5}, + {0x0F12, 0xFF30}, + {0x0F12, 0x015E}, + {0x0F12, 0x0103}, + {0x0F12, 0x01C6}, + {0x0F12, 0xFFC2}, + {0x0F12, 0x0004}, + {0x0F12, 0xFF6F}, + {0x0F12, 0x01C9}, + {0x0F12, 0xFF4F}, + {0x0F12, 0xFFDB}, + {0x0F12, 0xFFC0}, + {0x0F12, 0x019D}, + {0x0F12, 0x0136}, + {0x0F12, 0x0132}, + {0x0F12, 0xFF85}, + {0x0F12, 0x018B}, + {0x0F12, 0xFF73}, + {0x0F12, 0x0191}, + {0x0F12, 0xFF3F}, + {0x0F12, 0x015B}, + {0x0F12, 0x00D0}, + + {0x0F12, 0x01C6}, + {0x0F12, 0xFFC2}, + {0x0F12, 0x0004}, + {0x0F12, 0xFF56}, + {0x0F12, 0x01C9}, + {0x0F12, 0xFF68}, + {0x0F12, 0xFFDB}, + {0x0F12, 0xFFC0}, + {0x0F12, 0x019D}, + {0x0F12, 0x0140}, + {0x0F12, 0x012C}, + {0x0F12, 0xFF97}, + {0x0F12, 0x018B}, + {0x0F12, 0xFF73}, + {0x0F12, 0x0191}, + {0x0F12, 0xFF3F}, + {0x0F12, 0x015B}, + {0x0F12, 0x00D0}, + + {0x002A, 0x3380}, + {0x0F12, 0x01D6}, + {0x0F12, 0xFF94}, + {0x0F12, 0xFFCC}, + {0x0F12, 0xFF1F}, + {0x0F12, 0x021F}, + {0x0F12, 0xFF1F}, + {0x0F12, 0xFFE4}, + {0x0F12, 0xFFED}, + {0x0F12, 0x01C8}, + {0x0F12, 0x0112}, + {0x0F12, 0x0125}, + {0x0F12, 0xFF3E}, + {0x0F12, 0x0210}, + {0x0F12, 0xFF5D}, + {0x0F12, 0x0244}, + {0x0F12, 0xFF10}, + {0x0F12, 0x0190}, + {0x0F12, 0x0145}, + {0x002A, 0x0612}, + {0x0F12, 0x009D}, + {0x0F12, 0x00D5}, + {0x0F12, 0x0103}, + {0x0F12, 0x0128}, + {0x0F12, 0x0166}, + {0x0F12, 0x0193}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_gamma_setting[] = { + /* 17.GAMMA */ + {0x002A, 0x0538}, + {0x0F12, 0x0000}, + {0x0F12, 0x001F}, + {0x0F12, 0x0035}, + {0x0F12, 0x005A}, + {0x0F12, 0x0095}, + {0x0F12, 0x00E6}, + {0x0F12, 0x0121}, + {0x0F12, 0x0139}, + {0x0F12, 0x0150}, + {0x0F12, 0x0177}, + {0x0F12, 0x019A}, + {0x0F12, 0x01BB}, + {0x0F12, 0x01DC}, + {0x0F12, 0x0219}, + {0x0F12, 0x0251}, + {0x0F12, 0x02B3}, + {0x0F12, 0x030A}, + {0x0F12, 0x035F}, + {0x0F12, 0x03B1}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0000}, + {0x0F12, 0x0001}, + {0x0F12, 0x0001}, + {0x0F12, 0x0002}, + {0x0F12, 0x0004}, + {0x0F12, 0x000A}, + {0x0F12, 0x0012}, + {0x0F12, 0x0016}, + {0x0F12, 0x001A}, + {0x0F12, 0x0024}, + {0x0F12, 0x0031}, + {0x0F12, 0x003E}, + {0x0F12, 0x004E}, + {0x0F12, 0x0075}, + {0x0F12, 0x00A8}, + {0x0F12, 0x0126}, + {0x0F12, 0x01BE}, + {0x0F12, 0x0272}, + {0x0F12, 0x0334}, + {0x0F12, 0x03FF}, + + /* For Gamma Calibration */ + + {0x002A, 0x0498}, + {0x0F12, 0x0000}, + {0x0F12, 0x0002}, + {0x0F12, 0x0007}, + {0x0F12, 0x001D}, + {0x0F12, 0x006E}, + {0x0F12, 0x00D3}, + {0x0F12, 0x0127}, + {0x0F12, 0x014C}, + {0x0F12, 0x016E}, + {0x0F12, 0x01A5}, + {0x0F12, 0x01D3}, + {0x0F12, 0x01FB}, + {0x0F12, 0x021F}, + {0x0F12, 0x0260}, + {0x0F12, 0x029A}, + {0x0F12, 0x02F7}, + {0x0F12, 0x034D}, + {0x0F12, 0x0395}, + {0x0F12, 0x03CE}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0000}, + {0x0F12, 0x0004}, + {0x0F12, 0x000C}, + {0x0F12, 0x0024}, + {0x0F12, 0x006E}, + {0x0F12, 0x00D1}, + {0x0F12, 0x0119}, + {0x0F12, 0x0139}, + {0x0F12, 0x0157}, + {0x0F12, 0x018E}, + {0x0F12, 0x01C3}, + {0x0F12, 0x01F3}, + {0x0F12, 0x021F}, + {0x0F12, 0x0269}, + {0x0F12, 0x02A6}, + {0x0F12, 0x02FF}, + {0x0F12, 0x0351}, + {0x0F12, 0x0395}, + {0x0F12, 0x03CE}, + {0x0F12, 0x03FF}, + + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_afit_setting[] = { + /* 16.AFIT */ + {0x002A, 0x3360}, + {0x0F12, 0x0000}, + + {0x002A, 0x06D4}, + {0x0F12, 0x0032}, + {0x0F12, 0x0078}, + {0x0F12, 0x00C8}, + {0x0F12, 0x0190}, + {0x0F12, 0x028C}, + + {0x002A, 0x0734}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0078}, + {0x0F12, 0x012C}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0014}, + {0x0F12, 0x0064}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x01E6}, + {0x0F12, 0x0000}, + {0x0F12, 0x0070}, + {0x0F12, 0x01FF}, + {0x0F12, 0x0144}, + {0x0F12, 0x000F}, + {0x0F12, 0x000A}, + {0x0F12, 0x0073}, + {0x0F12, 0x0087}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0023}, + {0x0F12, 0x001E}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0023}, + {0x0F12, 0x0046}, + {0x0F12, 0x2B32}, + {0x0F12, 0x0601}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x00FF}, + {0x0F12, 0x07FF}, + {0x0F12, 0xFFFF}, + {0x0F12, 0x0000}, + {0x0F12, 0x050D}, + {0x0F12, 0x1E80}, + {0x0F12, 0x0000}, + {0x0F12, 0x1408}, + {0x0F12, 0x0214}, + {0x0F12, 0xFF01}, + {0x0F12, 0x180F}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {0x0F12, 0x8003}, + {0x0F12, 0x0094}, + {0x0F12, 0x0580}, + {0x0F12, 0x0280}, + {0x0F12, 0x0308}, + {0x0F12, 0x3186}, + {0x0F12, 0x707E}, + {0x0F12, 0x0A02}, + {0x0F12, 0x080A}, + {0x0F12, 0x0500}, + {0x0F12, 0x032D}, + {0x0F12, 0x324E}, + {0x0F12, 0x001E}, + {0x0F12, 0x0200}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x4646}, + {0x0F12, 0x0802}, + {0x0F12, 0x0802}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3202}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x4646}, + {0x0F12, 0x0802}, + {0x0F12, 0x0802}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3202}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0003}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x006A}, + {0x0F12, 0x012C}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0014}, + {0x0F12, 0x0064}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x01E6}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0070}, + {0x0F12, 0x007D}, + {0x0F12, 0x0064}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0073}, + {0x0F12, 0x0087}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0023}, + {0x0F12, 0x001E}, + {0x0F12, 0x0014}, + {0x0F12, 0x000A}, + {0x0F12, 0x0023}, + {0x0F12, 0x001E}, + {0x0F12, 0x2B32}, + {0x0F12, 0x0601}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x00FF}, + {0x0F12, 0x07FF}, + {0x0F12, 0xFFFF}, + {0x0F12, 0x0000}, + {0x0F12, 0x050D}, + {0x0F12, 0x1E80}, + {0x0F12, 0x0000}, + {0x0F12, 0x1403}, + {0x0F12, 0x0214}, + {0x0F12, 0xFF01}, + {0x0F12, 0x180F}, + {0x0F12, 0x0002}, + {0x0F12, 0x0000}, + {0x0F12, 0x8003}, + {0x0F12, 0x0080}, + {0x0F12, 0x0080}, + {0x0F12, 0x0280}, + {0x0F12, 0x0308}, + {0x0F12, 0x1E65}, + {0x0F12, 0x1A24}, + {0x0F12, 0x0A03}, + {0x0F12, 0x080A}, + {0x0F12, 0x0500}, + {0x0F12, 0x032D}, + {0x0F12, 0x324D}, + {0x0F12, 0x001E}, + {0x0F12, 0x0200}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x2F34}, + {0x0F12, 0x0504}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x1414}, + {0x0F12, 0x0504}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0003}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFFFC}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0064}, + {0x0F12, 0x012C}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0014}, + {0x0F12, 0x0064}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x01E6}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0070}, + {0x0F12, 0x007D}, + {0x0F12, 0x0064}, + {0x0F12, 0x0032}, + {0x0F12, 0x003C}, + {0x0F12, 0x0073}, + {0x0F12, 0x0087}, + {0x0F12, 0x0014}, + {0x0F12, 0x0019}, + {0x0F12, 0x0023}, + {0x0F12, 0x001E}, + {0x0F12, 0x0014}, + {0x0F12, 0x0019}, + {0x0F12, 0x0023}, + {0x0F12, 0x001E}, + {0x0F12, 0x2B32}, + {0x0F12, 0x0601}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x00FF}, + {0x0F12, 0x07FF}, + {0x0F12, 0xFFFF}, + {0x0F12, 0x0000}, + {0x0F12, 0x050D}, + {0x0F12, 0x1E80}, + {0x0F12, 0x0000}, + {0x0F12, 0x0A03}, + {0x0F12, 0x0200}, + {0x0F12, 0xFF01}, + {0x0F12, 0x180F}, + {0x0F12, 0x0002}, + {0x0F12, 0x0000}, + {0x0F12, 0x8003}, + {0x0F12, 0x0080}, + {0x0F12, 0x0080}, + {0x0F12, 0x0280}, + {0x0F12, 0x0208}, + {0x0F12, 0x1E4B}, + {0x0F12, 0x1A24}, + {0x0F12, 0x0A05}, + {0x0F12, 0x080A}, + {0x0F12, 0x0500}, + {0x0F12, 0x032D}, + {0x0F12, 0x324D}, + {0x0F12, 0x001E}, + {0x0F12, 0x0200}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x1E23}, + {0x0F12, 0x0505}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x1E23}, + {0x0F12, 0x0505}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0003}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFFFA}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0064}, + {0x0F12, 0x012C}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0014}, + {0x0F12, 0x0064}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x01E6}, + {0x0F12, 0x0000}, + {0x0F12, 0x0070}, + {0x0F12, 0x007D}, + {0x0F12, 0x0064}, + {0x0F12, 0x0032}, + {0x0F12, 0x003C}, + {0x0F12, 0x0073}, + {0x0F12, 0x009F}, + {0x0F12, 0x0028}, + {0x0F12, 0x0028}, + {0x0F12, 0x0023}, + {0x0F12, 0x0037}, + {0x0F12, 0x0028}, + {0x0F12, 0x0028}, + {0x0F12, 0x0023}, + {0x0F12, 0x0037}, + {0x0F12, 0x2B32}, + {0x0F12, 0x0601}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x00FF}, + {0x0F12, 0x07A0}, + {0x0F12, 0xFFFF}, + {0x0F12, 0x0000}, + {0x0F12, 0x050D}, + {0x0F12, 0x1E80}, + {0x0F12, 0x0000}, + {0x0F12, 0x0A03}, + {0x0F12, 0x0200}, + {0x0F12, 0xFF01}, + {0x0F12, 0x180F}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {0x0F12, 0x8003}, + {0x0F12, 0x0080}, + {0x0F12, 0x0080}, + {0x0F12, 0x0280}, + {0x0F12, 0x0108}, + {0x0F12, 0x1E32}, + {0x0F12, 0x1A24}, + {0x0F12, 0x0A05}, + {0x0F12, 0x080A}, + {0x0F12, 0x0000}, + {0x0F12, 0x0328}, + {0x0F12, 0x324C}, + {0x0F12, 0x001E}, + {0x0F12, 0x0200}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x0F0F}, + {0x0F12, 0x0307}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x9696}, + {0x0F12, 0x0F0F}, + {0x0F12, 0x0307}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0003}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0xFFF8}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0028}, + {0x0F12, 0x012C}, + {0x0F12, 0x03FF}, + {0x0F12, 0x0014}, + {0x0F12, 0x0064}, + {0x0F12, 0x000C}, + {0x0F12, 0x0010}, + {0x0F12, 0x01E6}, + {0x0F12, 0x0000}, + {0x0F12, 0x0070}, + {0x0F12, 0x0087}, + {0x0F12, 0x0073}, + {0x0F12, 0x0032}, + {0x0F12, 0x003C}, + {0x0F12, 0x0073}, + {0x0F12, 0x00B4}, + {0x0F12, 0x0028}, + {0x0F12, 0x0028}, + {0x0F12, 0x0023}, + {0x0F12, 0x0046}, + {0x0F12, 0x0028}, + {0x0F12, 0x0028}, + {0x0F12, 0x0023}, + {0x0F12, 0x0046}, + {0x0F12, 0x2B23}, + {0x0F12, 0x0601}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + {0x0F12, 0x00FF}, + {0x0F12, 0x0B84}, + {0x0F12, 0xFFFF}, + {0x0F12, 0x0000}, + {0x0F12, 0x050D}, + {0x0F12, 0x1E80}, + {0x0F12, 0x0000}, + {0x0F12, 0x0A03}, + {0x0F12, 0x0200}, + {0x0F12, 0xFF01}, + {0x0F12, 0x180F}, + {0x0F12, 0x0001}, + {0x0F12, 0x0000}, + {0x0F12, 0x8003}, + {0x0F12, 0x0080}, + {0x0F12, 0x0080}, + {0x0F12, 0x0280}, + {0x0F12, 0x0108}, + {0x0F12, 0x1E1E}, + {0x0F12, 0x1419}, + {0x0F12, 0x0A0A}, + {0x0F12, 0x0800}, + {0x0F12, 0x0000}, + {0x0F12, 0x0328}, + {0x0F12, 0x324C}, + {0x0F12, 0x001E}, + {0x0F12, 0x0200}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x6464}, + {0x0F12, 0x0F0F}, + {0x0F12, 0x0307}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0103}, + {0x0F12, 0x010C}, + {0x0F12, 0x6464}, + {0x0F12, 0x0F0F}, + {0x0F12, 0x0307}, + {0x0F12, 0x080F}, + {0x0F12, 0x0000}, + {0x0F12, 0x030F}, + {0x0F12, 0x3208}, + {0x0F12, 0x0F1E}, + {0x0F12, 0x020F}, + {0x0F12, 0x0003}, + {0x0F12, 0x7F5E}, + {0x0F12, 0xFEEE}, + {0x0F12, 0xD9B7}, + {0x0F12, 0x0472}, + {0x0F12, 0x0001}, + + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_display_setting[] = { + /* 20.Preview & Capture Configration Setting */ + {0x002A, 0x01BE}, + {0x0F12, 0x0280}, + {0x0F12, 0x01e0}, + {0x0F12, 0x0005}, + {0x002A, 0x01C8}, + {0x0F12, 0x0000}, + {0x002A, 0x01C4}, + {0x0F12, 0x0042}, + {0x002A, 0x01D4}, + {0x0F12, 0x0002}, + {0x002A, 0x01D2}, + {0x0F12, 0x0000}, + {0x002A, 0x01D8}, + {0x0F12, 0x014D}, + {0x002A, 0x01D6}, + {0x0F12, 0x014D}, + {0x002A, 0x01E8}, + {0x0F12, 0x0000}, + {0x0F12, 0x0000}, + + /* Capture config[0] 1280x960 7.5fps */ + {0x002A, 0x02AE}, + {0x0F12, 0x0001}, + {0x002A, 0x02B0}, + {0x0F12, 0x0500}, + {0x0F12, 0x03C0}, + {0x0F12, 0x0005}, + {0x002A, 0x02BA}, + {0x0F12, 0x0000}, + {0x002A, 0x02B6}, + {0x0F12, 0x0042}, + {0x002A, 0x02C6}, + {0x0F12, 0x0002}, + {0x002A, 0x02C4}, + {0x0F12, 0x0002}, + {0x002A, 0x02CA}, + {0x0F12, 0x014D}, + {0x002A, 0x02C8}, + {0x0F12, 0x0000}, + + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_stop_stream[] = { + /* {0x0028, 0x7000}, */ + {0x002a, 0x040c}, + {0x0f12, 0x0001}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_start_stream[] = { + /* {0x0028, 0x7000}, */ + {0x002a, 0x040c}, + {0x0f12, 0x0000}, + {S5K8AA_TERM, 0}, +}; + +static const struct s5k8aa_regval regs_select_display[] = { + /* 21.Select Cofigration Display */ + {0x002A, 0x01A8}, + {0x0F12, 0x0000}, + {0x002A, 0x01AA}, + {0x0F12, 0x0001}, + {0x002A, 0x019E}, + {0x0F12, 0x0001}, + {0x0F12, 0x0001}, + + {0x0028, 0xD000}, + {0x002A, 0x1000}, + {0x0F12, 0x0001}, /* Set host interrupt */ + {0x0028, 0x7000}, /* Set 0x7000 as page */ + + {S5K8AA_TERM, 0}, + /* p150 //delay 150ms */ +}; + +/* The next two tables must be kept in sync. */ +static const struct v4l2_frmsize_discrete s5k8aa_resolutions[] = { + { 176, 144 }, /* QCIF */ + { 240, 160 }, /* 240 x 160 */ + { 320, 240 }, /* QVGA */ + { 352, 288 }, /* CIF */ + { 640, 480 }, /* VGA */ + { 720, 480 }, /* 720 x 480 */ + { 800, 480 }, /* WVGA */ + { 1280, 720 }, /* 720P */ +}; + +static const struct v4l2_rect s5k8aa_crops[] = { + { 0, 0, 1280, 920 }, /* QCIF */ + { 40, 80, 1200, 800 }, /* 240 x 160 */ + { 0, 0, 1280, 920 }, /* QVGA */ + { 0, 0, 1280, 920 }, /* CIF */ + { 0, 0, 1280, 920 }, /* VGA */ + { 280, 240, 720, 480 }, /* 720 x 480 */ + { 240, 240, 800, 480 }, /* WVGA */ + { 0, 120, 1280, 720 }, /* 720P */ +}; + +static const struct s5k8aa_datafmt s5k8aa_colour_fmts[] = { + { .code = V4L2_MBUS_FMT_UYVY8_2X8, .reg = 0x0052 }, + { .code = V4L2_MBUS_FMT_VYUY8_2X8, .reg = 0x0072 }, + { .code = V4L2_MBUS_FMT_YUYV8_2X8, .reg = 0x0042 }, + { .code = V4L2_MBUS_FMT_YVYU8_2X8, .reg = 0x0062 }, +}; + +static struct s5k8aa *to_s5k8aa(struct v4l2_subdev *sd) +{ + return container_of(sd, struct s5k8aa, subdev); +} + +static int s5k8aa_i2c_read(struct i2c_client *client, u16 addr, u16 *val) +{ + u8 wbuf[2] = {addr >> 8, addr & 0xFF}; + struct i2c_msg msg[2]; + u8 rbuf[2]; + int ret; + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = 2; + msg[0].buf = wbuf; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].len = 2; + msg[1].buf = rbuf; + + ret = i2c_transfer(client->adapter, msg, 2); + *val = be16_to_cpu(*((u16 *)rbuf)); + + v4l2_dbg(3, debug, client, "i2c_read: 0x%04X : 0x%04x\n", addr, *val); + + return ret == 2 ? 0 : ret; +} + +static int s5k8aa_i2c_write(struct i2c_client *client, u16 addr, u16 val) +{ + u8 buf[4] = {addr >> 8, addr & 0xFF, val >> 8, val & 0xFF}; + + int ret = i2c_master_send(client, buf, 4); + v4l2_dbg(3, debug, client, "i2c_write: 0x%04X : 0x%04x\n", addr, val); + + return ret == 4 ? 0 : ret; +} + +/* The command register write, assumes Command_Wr_addH = 0x7000. */ +static int s5k8aa_write(struct i2c_client *c, u16 addr, u16 val) +{ + int ret = s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, addr); + if (ret) + return ret; + return s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, val); +} + +/* The command register read, assumes Command_Rd_addH = 0x7000. */ +static int s5k8aa_read(struct i2c_client *client, u16 addr, u16 *val) +{ + int ret = s5k8aa_i2c_write(client, REG_CMDRD_ADDRL, addr); + if (ret) + return ret; + + return s5k8aa_i2c_read(client, REG_CMDBUF0_ADDR, val); +} + +static int s5k8aa_write_raw_array(struct v4l2_subdev *sd, + const struct s5k8aa_regval *msg) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + int ret = 0; + + while (msg->addr != S5K8AA_TERM) { + ret = s5k8aa_i2c_write(client, msg->addr, msg->val); + if (ret) + break; + /* Assume that msg->addr is always less than 0xfffc */ + msg++; + } + + return ret; +} + +static int s5k8aa_power_on(struct s5k8aa *s5k8aa) +{ + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(s5k8aa->supplies), + s5k8aa->supplies); + if (ret) + return ret; + + usleep_range(5000, 10000); + + if (gpio_is_valid(s5k8aa->pwdn_gpio)) { + gpio_direction_output(s5k8aa->pwdn_gpio, 1); + usleep_range(5000, 10000); + } + + if (gpio_is_valid(s5k8aa->reset_gpio)) { + gpio_direction_output(s5k8aa->reset_gpio, 1); + usleep_range(5000, 10000); + } + + clk_set_rate(s5k8aa->clk, 26000000); + clk_prepare_enable(s5k8aa->clk); + + return 0; +} + +static void s5k8aa_power_off(struct s5k8aa *s5k8aa) +{ + clk_disable_unprepare(s5k8aa->clk); + + if (gpio_is_valid(s5k8aa->reset_gpio)) + gpio_direction_output(s5k8aa->reset_gpio, 0); + + if (gpio_is_valid(s5k8aa->pwdn_gpio)) + gpio_direction_output(s5k8aa->pwdn_gpio, 0); + + regulator_bulk_disable(ARRAY_SIZE(s5k8aa->supplies), + s5k8aa->supplies); +} + +static int __s5k8aa_set_power(struct s5k8aa *s5k8aa, bool on) +{ + if (!on) { + s5k8aa_power_off(s5k8aa); + return 0; + } + + return s5k8aa_power_on(s5k8aa); +} + +static int s5k8aa_s_power(struct v4l2_subdev *sd, int on) +{ + struct s5k8aa *s5k8aa = to_s5k8aa(sd); + int ret = 0; + + mutex_lock(&s5k8aa->power_lock); + + /* If the power count is modified from 0 to != 0 or from != 0 to 0, + * update the power state. + */ + if (s5k8aa->power_count == !on) { + ret = __s5k8aa_set_power(s5k8aa, !!on); + if (ret < 0) + goto out; + } + + /* Update the power count. */ + s5k8aa->power_count += on ? 1 : -1; + WARN_ON(s5k8aa->power_count < 0); + +out: + mutex_unlock(&s5k8aa->power_lock); + return ret; +} + +#ifdef CONFIG_VIDEO_ADV_DEBUG +static int s5k8aa_g_register(struct v4l2_subdev *sd, + struct v4l2_dbg_register *reg) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + return s5k8aa_read(client, (u16) reg->reg, + (u16 *)&(reg->val)); +} + +static int s5k8aa_s_register(struct v4l2_subdev *sd, + const struct v4l2_dbg_register *reg) +{ + struct i2c_client *client = v4l2_get_subdevdata(sd); + return s5k8aa_write(client, (u16) reg->reg, + (u16)reg->val); +} +#endif + +static int s5k8aa_s_stream(struct v4l2_subdev *sd, int enable) +{ + struct s5k8aa *s5k8aa = to_s5k8aa(sd); + const struct v4l2_mbus_framefmt *format = &s5k8aa->format; + const struct v4l2_rect *crop = &s5k8aa->crop; + struct i2c_client *c = s5k8aa->client; + int ret; + + if (!enable) + return s5k8aa_write_raw_array(sd, regs_stop_stream); + + msleep(150); + ret = s5k8aa_write_raw_array(sd, regs_start_setting); + msleep(20); + ret |= s5k8aa_write_raw_array(sd, regs_trap_patch); + ret |= s5k8aa_write_raw_array(sd, regs_stop_stream); + ret |= s5k8aa_write_raw_array(sd, regs_analog_setting); + ret |= s5k8aa_write_raw_array(sd, regs_otp_control); + ret |= s5k8aa_write_raw_array(sd, regs_gas_setting); + ret |= s5k8aa_write_raw_array(sd, regs_analog_setting2); + ret |= s5k8aa_write_raw_array(sd, regs_awb_basic_setting); + ret |= s5k8aa_write_raw_array(sd, regs_clk_setting); + ret |= s5k8aa_write_raw_array(sd, regs_flicker_detection); + ret |= s5k8aa_write_raw_array(sd, regs_ae_setting); + ret |= s5k8aa_write_raw_array(sd, regs_ae_weight); + ret |= s5k8aa_write_raw_array(sd, regs_ccm_setting); + ret |= s5k8aa_write_raw_array(sd, regs_gamma_setting); + ret |= s5k8aa_write_raw_array(sd, regs_afit_setting); + ret |= s5k8aa_write_raw_array(sd, regs_display_setting); + + /* Format */ + ret |= s5k8aa_write(c, 0x01c4, s5k8aa->fmt_reg); + + /* Crop */ + ret |= s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, 0x01ca); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->width); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->height); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->left); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->top); + + /* Output resolution */ + ret |= s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, 0x01be); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, format->width); + ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, format->height); + + ret |= s5k8aa_write(c, 0x01aa, 0x0001); + + ret |= s5k8aa_write_raw_array(sd, regs_start_stream); + ret |= s5k8aa_write_raw_array(sd, regs_select_display); + + return ret; +} + +static void s5k8aa_init_format(struct v4l2_mbus_framefmt *format) +{ + format->width = S5K8AA_OUT_WIDTH_DEF; + format->height = S5K8AA_OUT_HEIGHT_DEF; + format->code = V4L2_MBUS_FMT_UYVY8_2X8; + format->field = V4L2_FIELD_NONE; + format->colorspace = V4L2_COLORSPACE_JPEG; +} + +static void s5k8aa_init_cfg(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg) +{ + struct s5k8aa *s5k8aa = to_s5k8aa(sd); + struct v4l2_mbus_framefmt *format; + + format = v4l2_subdev_get_try_format(&s5k8aa->subdev, cfg, 0); + s5k8aa_init_format(format); +} + +static int s5k8aa_enum_mbus_code(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_mbus_code_enum *code) +{ + if (code->index >= ARRAY_SIZE(s5k8aa_colour_fmts)) + return -EINVAL; + + code->code = s5k8aa_colour_fmts[code->index].code; + return 0; +} + +static int s5k8aa_enum_frame_size(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_frame_size_enum *fse) +{ + unsigned int i; + + if (fse->index >= ARRAY_SIZE(s5k8aa_resolutions)) + return -EINVAL; + + for (i = 0; i < ARRAY_SIZE(s5k8aa_colour_fmts); ++i) { + if (s5k8aa_colour_fmts[i].code == fse->code) + break; + } + + if (i == ARRAY_SIZE(s5k8aa_colour_fmts)) + return -EINVAL; + + fse->min_width = s5k8aa_resolutions[fse->index].width; + fse->max_width = s5k8aa_resolutions[fse->index].width; + fse->min_height = s5k8aa_resolutions[fse->index].height; + fse->max_height = s5k8aa_resolutions[fse->index].height; + + return 0; +} + +static struct v4l2_mbus_framefmt * +s5k8aa_get_pad_format(struct s5k8aa *s5k8aa, + struct v4l2_subdev_pad_config *cfg, + unsigned int pad, u32 which) +{ + switch (which) { + case V4L2_SUBDEV_FORMAT_TRY: + default: + return v4l2_subdev_get_try_format(&s5k8aa->subdev, cfg, pad); + case V4L2_SUBDEV_FORMAT_ACTIVE: + return &s5k8aa->format; + } +} + +static int s5k8aa_get_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *format) +{ + struct s5k8aa *s5k8aa = to_s5k8aa(sd); + + format->format = *s5k8aa_get_pad_format(s5k8aa, cfg, format->pad, + format->which); + + return 0; +} + +static int s5k8aa_set_fmt(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_format *format) +{ + static const struct v4l2_discrete_probe sizes = { + .sizes = s5k8aa_resolutions, + .num_sizes = ARRAY_SIZE(s5k8aa_resolutions), + }; + + struct s5k8aa *s5k8aa = to_s5k8aa(sd); + const struct v4l2_frmsize_discrete *size; + unsigned int i; + u16 fmt_reg; + + for (i = 0; i < ARRAY_SIZE(s5k8aa_colour_fmts); ++i) { + if (s5k8aa_colour_fmts[i].code == format->format.code) { + fmt_reg = s5k8aa_colour_fmts[i].reg; + break; + } + } + + if (i == ARRAY_SIZE(s5k8aa_colour_fmts)) { + format->format.code = s5k8aa_colour_fmts[0].code; + fmt_reg = s5k8aa_colour_fmts[0].reg; + } + + size = v4l2_find_nearest_format(&sizes, format->format.width, + format->format.height); + + format->format.width = size->width; + format->format.height = size->height; + format->format.field = V4L2_FIELD_NONE; + format->format.colorspace = V4L2_COLORSPACE_JPEG; + + *s5k8aa_get_pad_format(s5k8aa, cfg, format->pad, format->which) = + format->format; + + if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { + s5k8aa->fmt_reg = fmt_reg; + s5k8aa->crop = s5k8aa_crops[size - s5k8aa_resolutions]; + } + + return 0; +} + +static struct v4l2_subdev_core_ops s5k8aa_subdev_core_ops = { + .s_power = s5k8aa_s_power, +#ifdef CONFIG_VIDEO_ADV_DEBUG + .g_register = s5k8aa_g_register, + .s_register = s5k8aa_s_register, +#endif +}; + +static struct v4l2_subdev_video_ops s5k8aa_subdev_video_ops = { + .s_stream = s5k8aa_s_stream, +}; + +static struct v4l2_subdev_pad_ops s5k8aa_subdev_pad_ops = { + .init_cfg = s5k8aa_init_cfg, + .enum_mbus_code = s5k8aa_enum_mbus_code, + .enum_frame_size = s5k8aa_enum_frame_size, + .get_fmt = s5k8aa_get_fmt, + .set_fmt = s5k8aa_set_fmt, +}; + +static struct v4l2_subdev_ops s5k8aa_subdev_ops = { + .core = &s5k8aa_subdev_core_ops, + .video = &s5k8aa_subdev_video_ops, + .pad = &s5k8aa_subdev_pad_ops, +}; + +static int s5k8aa_detect(struct s5k8aa *s5k8aa) +{ + int ret; + u16 val; + + ret = s5k8aa_power_on(s5k8aa); + if (ret) + return ret; + + ret = s5k8aa_i2c_write(s5k8aa->client, 0xfcfc, 0xd000); + if (ret) + goto done; + + ret = s5k8aa_i2c_write(s5k8aa->client, 0x002c, 0x0000); + if (ret) + goto done; + + /* revision */ + /* s5k8aa_read(s5k8aa->client, 0x0042, &val); */ + ret = s5k8aa_read(s5k8aa->client, 0x0040, &val); + if (ret) + goto done; + + if (val != 0x8aa) + ret = -ENODEV; + +done: + s5k8aa_power_off(s5k8aa); + return ret; +} + +static int s5k8aa_probe(struct i2c_client *client, + const struct i2c_device_id *did) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct device_node *np = client->dev.of_node; + struct s5k8aa *s5k8aa; + int ret = 0; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) { + dev_warn(&adapter->dev, + "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n"); + return -EIO; + } + + s5k8aa = devm_kzalloc(&client->dev, sizeof(*s5k8aa), GFP_KERNEL); + if (!s5k8aa) + return -ENOMEM; + + mutex_init(&s5k8aa->power_lock); + s5k8aa->client = client; + + /* Get power supplies, clocks and GPIOs. */ + s5k8aa->supplies[0].supply = "avdd"; + s5k8aa->supplies[1].supply = "dvdd"; + s5k8aa->supplies[2].supply = "dovdd"; + + ret = devm_regulator_bulk_get(&client->dev, + ARRAY_SIZE(s5k8aa->supplies), + s5k8aa->supplies); + if (ret) { + dev_err(&client->dev, "failed to get power supplies\n"); + return ret; + } + + regulator_set_voltage(s5k8aa->supplies[0].consumer, 2800000, 2800000); + regulator_set_voltage(s5k8aa->supplies[1].consumer, 1200000, 1200000); + regulator_set_voltage(s5k8aa->supplies[2].consumer, 1800000, 1800000); + + s5k8aa->clk = devm_clk_get(&client->dev, NULL); + if (IS_ERR(s5k8aa->clk)) + return PTR_ERR(s5k8aa->clk); + + s5k8aa->pwdn_gpio = of_get_named_gpio(np, "pwdn-gpios", 0); + s5k8aa->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0); + + if (gpio_is_valid(s5k8aa->reset_gpio)) { + ret = devm_gpio_request_one(&client->dev, s5k8aa->reset_gpio, + GPIOF_OUT_INIT_LOW, "reset"); + if (ret) { + dev_err(&client->dev, "failed to request reset GPIO\n"); + return ret; + } + + usleep_range(5000, 20000); + } + + if (gpio_is_valid(s5k8aa->pwdn_gpio)) { + ret = devm_gpio_request_one(&client->dev, s5k8aa->pwdn_gpio, + GPIOF_OUT_INIT_LOW, "pwdn"); + if (ret) { + dev_err(&client->dev, "failed to request pwdn GPIO\n"); + return ret; + } + } + + ret = s5k8aa_detect(s5k8aa); + if (ret) { + dev_err(&client->dev, "sensor detection failed\n"); + return ret; + } + + v4l2_i2c_subdev_init(&s5k8aa->subdev, client, &s5k8aa_subdev_ops); + + s5k8aa->pad.flags = MEDIA_PAD_FL_SOURCE; + ret = media_entity_init(&s5k8aa->subdev.entity, 1, &s5k8aa->pad, 0); + if (ret < 0) + return ret; + + s5k8aa_init_format(&s5k8aa->format); + + ret = v4l2_async_register_subdev(&s5k8aa->subdev); + if (ret < 0) { + media_entity_cleanup(&s5k8aa->subdev.entity); + return ret; + } + + return 0; +} + +static int s5k8aa_remove(struct i2c_client *client) +{ + struct v4l2_subdev *subdev = i2c_get_clientdata(client); + + v4l2_async_unregister_subdev(subdev); + media_entity_cleanup(&subdev->entity); + + return 0; +} + +static const struct i2c_device_id s5k8aa_idtable[] = { + {"s5k8aay", 0}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, s5k8aa_idtable); + +static struct i2c_driver s5k8aa_driver = { + .driver = { + .name = "s5k8aay", + }, + .probe = s5k8aa_probe, + .remove = s5k8aa_remove, + .id_table = s5k8aa_idtable, +}; + +module_i2c_driver(s5k8aa_driver); + +MODULE_DESCRIPTION("Samsumg S5K8AA Camera Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/media/i2c/soc_camera/Kconfig b/drivers/media/i2c/soc_camera/Kconfig index 1ef49491a703..4ca63c896e89 100644 --- a/drivers/media/i2c/soc_camera/Kconfig +++ b/drivers/media/i2c/soc_camera/Kconfig @@ -86,12 +86,6 @@ config SOC_CAMERA_TW9910 help This is a tw9910 video driver -config SOC_CAMERA_S5K8AA - tristate "S5K8AA camera support" - depends on SOC_CAMERA && I2C - help - This is a V4L2 camera driver for the s5k8aa sensor - config SOC_CAMERA_SP1628 tristate "sp1628 support based on ECS" depends on SOC_CAMERA && I2C diff --git a/drivers/media/i2c/soc_camera/Makefile b/drivers/media/i2c/soc_camera/Makefile index 00bfbe23836f..7031f49ca72d 100644 --- a/drivers/media/i2c/soc_camera/Makefile +++ b/drivers/media/i2c/soc_camera/Makefile @@ -12,5 +12,4 @@ obj-$(CONFIG_SOC_CAMERA_OV9640) += ov9640.o obj-$(CONFIG_SOC_CAMERA_OV9740) += ov9740.o obj-$(CONFIG_SOC_CAMERA_RJ54N1) += rj54n1cb0c.o obj-$(CONFIG_SOC_CAMERA_TW9910) += tw9910.o -obj-$(CONFIG_SOC_CAMERA_S5K8AA) += s5k8aa.o -obj-$(CONFIG_SOC_CAMERA_SP1628) += sp1628.o \ No newline at end of file +obj-$(CONFIG_SOC_CAMERA_SP1628) += sp1628.o diff --git a/drivers/media/i2c/soc_camera/s5k8aa.c b/drivers/media/i2c/soc_camera/s5k8aa.c deleted file mode 100644 index 4fabfdd80c79..000000000000 --- a/drivers/media/i2c/soc_camera/s5k8aa.c +++ /dev/null @@ -1,3196 +0,0 @@ -/* - * s5k8aa Camera Driver - * - * Copyright (c) 2013 Marvell Ltd. - * Libin Yang - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -static int debug; -module_param(debug, int, 0644); - -#define S5K8AA_PIXEL_ARRAY_WIDTH 1280 -#define S5K8AA_PIXEL_ARRAY_HEIGHT 920 -#define S5K8AA_OUT_WIDTH_DEF 640 -#define S5K8AA_OUT_HEIGHT_DEF 480 - -/* The token to indicate array termination */ -#define S5K8AA_TERM 0xffff - -/* - * H/W register Interface (0xD0000000 - 0xD0000FFF) - */ -#define AHB_MSB_ADDR_PTR 0xfcfc -#define GEN_REG_OFFSH 0xd000 -#define REG_CMDWR_ADDRH 0x0028 -#define REG_CMDWR_ADDRL 0x002a -#define REG_CMDRD_ADDRH 0x002c -#define REG_CMDRD_ADDRL 0x002e -#define REG_CMDBUF0_ADDR 0x0f12 -#define REG_CMDBUF1_ADDR 0x0f10 - -/* - * Host S/W Register interface (0x70000000 - 0x70002000) - * The value of the two most significant address bytes is 0x7000, - * (HOST_SWIF_OFFS_H). The register addresses below specify 2 LSBs. - */ -#define HOST_SWIF_OFFSH 0x7000 - -struct s5k8aa_regval { - u16 addr; - u16 val; -}; - -/* s5k8aa has only one fixed colorspace per pixelcode */ -struct s5k8aa_datafmt { - enum v4l2_mbus_pixelcode code; - u16 reg; -}; - -struct s5k8aa { - struct i2c_client *client; - - struct v4l2_subdev subdev; - struct media_pad pad; - - struct v4l2_mbus_framefmt format; - struct v4l2_rect crop; - u16 fmt_reg; - - struct clk *clk; - struct regulator_bulk_data supplies[3]; - int reset_gpio; - int pwdn_gpio; - - struct mutex power_lock; /* lock to protect power_count */ - int power_count; -}; - -static const struct s5k8aa_regval regs_start_setting[] = { - /* 01. Start Setting */ - {0xfcfc, 0xd000}, - {0x0010, 0x0001}, - {0xfcfc, 0x0000}, - {0x0000, 0x0000}, - {0xfcfc, 0xd000}, - {0x1030, 0x0000}, - {0x0014, 0x0001}, - {S5K8AA_TERM, 0}, - /* p10 Delay 1ms */ -}; - -static const struct s5k8aa_regval regs_trap_patch[] = { - /* 03. Trap and Patch */ - {0x0028, 0x7000}, - {0x002a, 0x2470}, - {0x0f12, 0xb510}, - {0x0F12, 0x4910}, - {0x0F12, 0x4810}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA41}, - {0x0F12, 0x4910}, - {0x0F12, 0x4810}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA3D}, - {0x0F12, 0x4910}, - {0x0F12, 0x4810}, - {0x0F12, 0x6341}, - {0x0F12, 0x4910}, - {0x0F12, 0x4811}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA36}, - {0x0F12, 0x4910}, - {0x0F12, 0x4811}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA32}, - {0x0F12, 0x4910}, - {0x0F12, 0x4811}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA2E}, - {0x0F12, 0x4810}, - {0x0F12, 0x4911}, - {0x0F12, 0x6448}, - {0x0F12, 0x4911}, - {0x0F12, 0x4811}, - {0x0F12, 0xF000}, - {0x0F12, 0xFA27}, - {0x0F12, 0xBC10}, - {0x0F12, 0xBC08}, - {0x0F12, 0x4718}, - {0x0F12, 0x2870}, - {0x0F12, 0x7000}, - {0x0F12, 0x8EDD}, - {0x0F12, 0x0000}, - {0x0F12, 0x27E8}, - {0x0F12, 0x7000}, - {0x0F12, 0x8725}, - {0x0F12, 0x0000}, - {0x0F12, 0x2788}, - {0x0F12, 0x7000}, - {0x0F12, 0x0080}, - {0x0F12, 0x7000}, - {0x0F12, 0x26DC}, - {0x0F12, 0x7000}, - {0x0F12, 0xA6EF}, - {0x0F12, 0x0000}, - {0x0F12, 0x26A8}, - {0x0F12, 0x7000}, - {0x0F12, 0xA0F1}, - {0x0F12, 0x0000}, - {0x0F12, 0x2674}, - {0x0F12, 0x7000}, - {0x0F12, 0x058F}, - {0x0F12, 0x0000}, - {0x0F12, 0x2568}, - {0x0F12, 0x7000}, - {0x0F12, 0x0000}, - {0x0F12, 0x7000}, - {0x0F12, 0x24F4}, - {0x0F12, 0x7000}, - {0x0F12, 0xAC79}, - {0x0F12, 0x0000}, - {0x0F12, 0x4070}, - {0x0F12, 0xE92D}, - {0x0F12, 0x5000}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x23BC}, - {0x0F12, 0xE59F}, - {0x0F12, 0x00BE}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0100}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x10BC}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0000}, - {0x0F12, 0xE351}, - {0x0F12, 0x000E}, - {0x0F12, 0x0A00}, - {0x0F12, 0x33A8}, - {0x0F12, 0xE59F}, - {0x0F12, 0x14BC}, - {0x0F12, 0xE1D3}, - {0x0F12, 0x0000}, - {0x0F12, 0xE151}, - {0x0F12, 0x000A}, - {0x0F12, 0x9A00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE041}, - {0x0F12, 0x11B0}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0091}, - {0x0F12, 0xE000}, - {0x0F12, 0x1034}, - {0x0F12, 0xE593}, - {0x0F12, 0x0520}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0091}, - {0x0F12, 0xE000}, - {0x0F12, 0x1384}, - {0x0F12, 0xE59F}, - {0x0F12, 0x1008}, - {0x0F12, 0xE591}, - {0x0F12, 0x00F0}, - {0x0F12, 0xEB00}, - {0x0F12, 0x4000}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0000}, - {0x0F12, 0xEA00}, - {0x0F12, 0x4000}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x00EE}, - {0x0F12, 0xEB00}, - {0x0F12, 0x0004}, - {0x0F12, 0xE080}, - {0x0F12, 0x0000}, - {0x0F12, 0xE585}, - {0x0F12, 0x4070}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x401F}, - {0x0F12, 0xE92D}, - {0x0F12, 0x00EB}, - {0x0F12, 0xEB00}, - {0x0F12, 0x2000}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x1002}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0F86}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x00EA}, - {0x0F12, 0xEB00}, - {0x0F12, 0x2010}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x1000}, - {0x0F12, 0xE28D}, - {0x0F12, 0x0E3F}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x00E9}, - {0x0F12, 0xEB00}, - {0x0F12, 0x2001}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x1002}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0F86}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x00E2}, - {0x0F12, 0xEB00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE5DD}, - {0x0F12, 0x00C3}, - {0x0F12, 0xE350}, - {0x0F12, 0x002F}, - {0x0F12, 0x1A00}, - {0x0F12, 0x0001}, - {0x0F12, 0xE5DD}, - {0x0F12, 0x003C}, - {0x0F12, 0xE350}, - {0x0F12, 0x002C}, - {0x0F12, 0x1A00}, - {0x0F12, 0x000E}, - {0x0F12, 0xE5DD}, - {0x0F12, 0x0011}, - {0x0F12, 0xE350}, - {0x0F12, 0x0029}, - {0x0F12, 0x1A00}, - {0x0F12, 0x000F}, - {0x0F12, 0xE5DD}, - {0x0F12, 0x0011}, - {0x0F12, 0xE350}, - {0x0F12, 0x0026}, - {0x0F12, 0x1A00}, - {0x0F12, 0x02E8}, - {0x0F12, 0xE59F}, - {0x0F12, 0x10BA}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE351}, - {0x0F12, 0x0022}, - {0x0F12, 0x0A00}, - {0x0F12, 0x12E4}, - {0x0F12, 0xE59F}, - {0x0F12, 0x2000}, - {0x0F12, 0xE5D1}, - {0x0F12, 0x0000}, - {0x0F12, 0xE352}, - {0x0F12, 0x0002}, - {0x0F12, 0x1A00}, - {0x0F12, 0x00B8}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x001B}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE5C1}, - {0x0F12, 0x1002}, - {0x0F12, 0xE28D}, - {0x0F12, 0x0015}, - {0x0F12, 0xEA00}, - {0x0F12, 0x2000}, - {0x0F12, 0xE5D1}, - {0x0F12, 0x3001}, - {0x0F12, 0xE5D1}, - {0x0F12, 0x3403}, - {0x0F12, 0xE182}, - {0x0F12, 0xC2B0}, - {0x0F12, 0xE59F}, - {0x0F12, 0x2080}, - {0x0F12, 0xE08C}, - {0x0F12, 0xE7B4}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x039E}, - {0x0F12, 0xE004}, - {0x0F12, 0xE80F}, - {0x0F12, 0xE3E0}, - {0x0F12, 0x4624}, - {0x0F12, 0xE00E}, - {0x0F12, 0x47B4}, - {0x0F12, 0xE1C2}, - {0x0F12, 0x4004}, - {0x0F12, 0xE280}, - {0x0F12, 0xC084}, - {0x0F12, 0xE08C}, - {0x0F12, 0x47B4}, - {0x0F12, 0xE1DC}, - {0x0F12, 0x0493}, - {0x0F12, 0xE004}, - {0x0F12, 0x4624}, - {0x0F12, 0xE00E}, - {0x0F12, 0x47B4}, - {0x0F12, 0xE1CC}, - {0x0F12, 0xC8B4}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x039C}, - {0x0F12, 0xE003}, - {0x0F12, 0x3623}, - {0x0F12, 0xE00E}, - {0x0F12, 0x38B4}, - {0x0F12, 0xE1C2}, - {0x0F12, 0x0001}, - {0x0F12, 0xE280}, - {0x0F12, 0x1002}, - {0x0F12, 0xE281}, - {0x0F12, 0x0004}, - {0x0F12, 0xE350}, - {0x0F12, 0xFFE7}, - {0x0F12, 0xBAFF}, - {0x0F12, 0x401F}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x4010}, - {0x0F12, 0xE92D}, - {0x0F12, 0x00B1}, - {0x0F12, 0xEB00}, - {0x0F12, 0x0250}, - {0x0F12, 0xE59F}, - {0x0F12, 0x00B2}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x0004}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0080}, - {0x0F12, 0xE310}, - {0x0F12, 0x0002}, - {0x0F12, 0x1A00}, - {0x0F12, 0x123C}, - {0x0F12, 0xE59F}, - {0x0F12, 0x0001}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0DB2}, - {0x0F12, 0xE1C1}, - {0x0F12, 0x4010}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x4010}, - {0x0F12, 0xE92D}, - {0x0F12, 0x4000}, - {0x0F12, 0xE590}, - {0x0F12, 0x0004}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x00A5}, - {0x0F12, 0xEB00}, - {0x0F12, 0x021C}, - {0x0F12, 0xE59F}, - {0x0F12, 0x0000}, - {0x0F12, 0xE5D0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x0002}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0004}, - {0x0F12, 0xE594}, - {0x0F12, 0x00A0}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0004}, - {0x0F12, 0xE584}, - {0x0F12, 0x4010}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x4070}, - {0x0F12, 0xE92D}, - {0x0F12, 0x0000}, - {0x0F12, 0xE590}, - {0x0F12, 0x0800}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0820}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x4041}, - {0x0F12, 0xE280}, - {0x0F12, 0x01E8}, - {0x0F12, 0xE59F}, - {0x0F12, 0x11B8}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x51B6}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0005}, - {0x0F12, 0xE041}, - {0x0F12, 0x0094}, - {0x0F12, 0xE000}, - {0x0F12, 0x1D11}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x007F}, - {0x0F12, 0xEB00}, - {0x0F12, 0x11C8}, - {0x0F12, 0xE59F}, - {0x0F12, 0x1000}, - {0x0F12, 0xE5D1}, - {0x0F12, 0x0000}, - {0x0F12, 0xE351}, - {0x0F12, 0x0000}, - {0x0F12, 0x0A00}, - {0x0F12, 0x00A0}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x21B0}, - {0x0F12, 0xE59F}, - {0x0F12, 0x3FB0}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0000}, - {0x0F12, 0xE353}, - {0x0F12, 0x0003}, - {0x0F12, 0x0A00}, - {0x0F12, 0x31AC}, - {0x0F12, 0xE59F}, - {0x0F12, 0x5BB2}, - {0x0F12, 0xE1C3}, - {0x0F12, 0xC000}, - {0x0F12, 0xE085}, - {0x0F12, 0xCBB4}, - {0x0F12, 0xE1C3}, - {0x0F12, 0x0000}, - {0x0F12, 0xE351}, - {0x0F12, 0x0000}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0080}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x1DBC}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x3EB4}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x2EB2}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0193}, - {0x0F12, 0xE001}, - {0x0F12, 0x0092}, - {0x0F12, 0xE000}, - {0x0F12, 0x2811}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0194}, - {0x0F12, 0xE001}, - {0x0F12, 0x0092}, - {0x0F12, 0xE000}, - {0x0F12, 0x11A1}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x01A0}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0064}, - {0x0F12, 0xEB00}, - {0x0F12, 0x1168}, - {0x0F12, 0xE59F}, - {0x0F12, 0x02B4}, - {0x0F12, 0xE1C1}, - {0x0F12, 0x4070}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x4010}, - {0x0F12, 0xE92D}, - {0x0F12, 0x0072}, - {0x0F12, 0xEB00}, - {0x0F12, 0x2150}, - {0x0F12, 0xE59F}, - {0x0F12, 0x14B0}, - {0x0F12, 0xE1D2}, - {0x0F12, 0x0080}, - {0x0F12, 0xE311}, - {0x0F12, 0x0005}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0144}, - {0x0F12, 0xE59F}, - {0x0F12, 0x00B0}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0001}, - {0x0F12, 0xE350}, - {0x0F12, 0x0001}, - {0x0F12, 0x9A00}, - {0x0F12, 0x0001}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0000}, - {0x0F12, 0xEA00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x3118}, - {0x0F12, 0xE59F}, - {0x0F12, 0x0000}, - {0x0F12, 0xE5C3}, - {0x0F12, 0x0000}, - {0x0F12, 0xE5D3}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x0003}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0080}, - {0x0F12, 0xE3C1}, - {0x0F12, 0x1114}, - {0x0F12, 0xE59F}, - {0x0F12, 0x04B0}, - {0x0F12, 0xE1C2}, - {0x0F12, 0x00B2}, - {0x0F12, 0xE1C1}, - {0x0F12, 0x4010}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x41F0}, - {0x0F12, 0xE92D}, - {0x0F12, 0x1000}, - {0x0F12, 0xE590}, - {0x0F12, 0xC801}, - {0x0F12, 0xE1A0}, - {0x0F12, 0xC82C}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x1004}, - {0x0F12, 0xE590}, - {0x0F12, 0x1801}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x1821}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x4008}, - {0x0F12, 0xE590}, - {0x0F12, 0x500C}, - {0x0F12, 0xE590}, - {0x0F12, 0x2004}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x3005}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x000C}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x0052}, - {0x0F12, 0xEB00}, - {0x0F12, 0x609C}, - {0x0F12, 0xE59F}, - {0x0F12, 0x00B2}, - {0x0F12, 0xE1D6}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x000E}, - {0x0F12, 0x0A00}, - {0x0F12, 0x00C0}, - {0x0F12, 0xE59F}, - {0x0F12, 0x05B4}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0002}, - {0x0F12, 0xE350}, - {0x0F12, 0x000A}, - {0x0F12, 0x1A00}, - {0x0F12, 0x7080}, - {0x0F12, 0xE59F}, - {0x0F12, 0x10F4}, - {0x0F12, 0xE1D6}, - {0x0F12, 0x26B0}, - {0x0F12, 0xE1D7}, - {0x0F12, 0x00F0}, - {0x0F12, 0xE1D4}, - {0x0F12, 0x0048}, - {0x0F12, 0xEB00}, - {0x0F12, 0x00B0}, - {0x0F12, 0xE1C4}, - {0x0F12, 0x26B0}, - {0x0F12, 0xE1D7}, - {0x0F12, 0x10F6}, - {0x0F12, 0xE1D6}, - {0x0F12, 0x00F0}, - {0x0F12, 0xE1D5}, - {0x0F12, 0x0043}, - {0x0F12, 0xEB00}, - {0x0F12, 0x00B0}, - {0x0F12, 0xE1C5}, - {0x0F12, 0x41F0}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x4010}, - {0x0F12, 0xE92D}, - {0x0F12, 0x4000}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x1004}, - {0x0F12, 0xE594}, - {0x0F12, 0x003C}, - {0x0F12, 0xE59F}, - {0x0F12, 0x00B0}, - {0x0F12, 0xE1D0}, - {0x0F12, 0x0000}, - {0x0F12, 0xE350}, - {0x0F12, 0x0008}, - {0x0F12, 0x0A00}, - {0x0F12, 0x0030}, - {0x0F12, 0xE59F}, - {0x0F12, 0x3001}, - {0x0F12, 0xE1A0}, - {0x0F12, 0x2068}, - {0x0F12, 0xE590}, - {0x0F12, 0x0058}, - {0x0F12, 0xE59F}, - {0x0F12, 0x1005}, - {0x0F12, 0xE3A0}, - {0x0F12, 0x0036}, - {0x0F12, 0xEB00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE584}, - {0x0F12, 0x4010}, - {0x0F12, 0xE8BD}, - {0x0F12, 0xFF1E}, - {0x0F12, 0xE12F}, - {0x0F12, 0x0000}, - {0x0F12, 0xE594}, - {0x0F12, 0x0034}, - {0x0F12, 0xEB00}, - {0x0F12, 0x0000}, - {0x0F12, 0xE584}, - {0x0F12, 0xFFF9}, - {0x0F12, 0xEAFF}, - {0x0F12, 0x3360}, - {0x0F12, 0x7000}, - {0x0F12, 0x20D4}, - {0x0F12, 0x7000}, - {0x0F12, 0x16C8}, - {0x0F12, 0x7000}, - {0x0F12, 0x299C}, - {0x0F12, 0x7000}, - {0x0F12, 0x1272}, - {0x0F12, 0x7000}, - {0x0F12, 0x1728}, - {0x0F12, 0x7000}, - {0x0F12, 0x112C}, - {0x0F12, 0x7000}, - {0x0F12, 0x29A0}, - {0x0F12, 0x7000}, - {0x0F12, 0x122C}, - {0x0F12, 0x7000}, - {0x0F12, 0xF200}, - {0x0F12, 0xD000}, - {0x0F12, 0x2340}, - {0x0F12, 0x7000}, - {0x0F12, 0x0E2C}, - {0x0F12, 0x7000}, - {0x0F12, 0xF400}, - {0x0F12, 0xD000}, - {0x0F12, 0x0CDC}, - {0x0F12, 0x7000}, - {0x0F12, 0x06D4}, - {0x0F12, 0x7000}, - {0x0F12, 0x4778}, - {0x0F12, 0x46C0}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0xC091}, - {0x0F12, 0x0000}, - {0x0F12, 0xF004}, - {0x0F12, 0xE51F}, - {0x0F12, 0xD14C}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0xAC79}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x0467}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x2FA7}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0xCB1F}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x058F}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0xA0F1}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x2B43}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x8725}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x6777}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x8E49}, - {0x0F12, 0x0000}, - {0x0F12, 0xC000}, - {0x0F12, 0xE59F}, - {0x0F12, 0xFF1C}, - {0x0F12, 0xE12F}, - {0x0F12, 0x8EDD}, - {0x0F12, 0x0000}, - {0x0F12, 0xA4B6}, - {0x0F12, 0x0000}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_analog_setting[] = { - /* 04. Analog Setting & APS Control */ - {0x0028, 0x7000}, - {0x002A, 0x0E38}, - {0x0F12, 0x0476}, /* senHal_RegCompBiasNormSf //CDS bias */ - {0x0F12, 0x0476}, /* senHal_RegCompBiasYAv //CDS bias */ - {0x002A, 0x0AA0}, - {0x0F12, 0x0001}, /* 1-Digital, 0-Analog */ - {0x002A, 0x0E2C}, - {0x0F12, 0x0001}, /* 2-Adding/averaging, 1-Y-Avg, 0-PLA */ - {0x002A, 0x0E66}, - {0x0F12, 0x0001}, /* senHal_RegBlstEnNorm */ - {0x002A, 0x1250}, - {0x0F12, 0xFFFF}, /* senHal_Bls_nSpExpLines */ - {0x002A, 0x1202}, - {0x0F12, 0x0010}, /* senHal_Dblr_VcoFreqMHZ */ - /* ADLC Filter */ - {0x002A, 0x1288}, - {0x0F12, 0x020F}, /* gisp_dadlc_ResetFilterValue */ - {0x0F12, 0x1C02}, /* gisp_dadlc_SteadyFilterValue */ - {0x0F12, 0x0006}, /* gisp_dadlc_NResetIIrFrames */ - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_otp_control[] = { - /* 05.OTP Control */ - {0x002A, 0x3368}, - {0x0F12, 0x0000}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_gas_setting[] = { - /* 06.GAS (Grid Anti-Shading) */ - {0x002A, 0x1326}, - {0x0F12, 0x0000}, /* gisp_gos_Enable */ - {0x002A, 0x063A}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x00E8}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x00C8}, - {0x0F12, 0x00F8}, - {0x0F12, 0x00F8}, - {0x0F12, 0x0100}, - {0x0F12, 0x00F0}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x00F0}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x002A, 0x067A}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x002A, 0x06BA}, - {0x0F12, 0x0001}, - {0x002A, 0x0632}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x002A, 0x0672}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x0F12, 0x0100}, - {0x002A, 0x06B2}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x002A, 0x06D0}, - {0x0F12, 0x000D}, - {0x0F12, 0x000F}, - {0x002A, 0x06CC}, - {0x0F12, 0x0280}, - {0x0F12, 0x01E0}, - {0x002A, 0x06C6}, - {0x0F12, 0x0001}, - {0x002A, 0x0624}, - {0x0F12, 0x009D}, - {0x0F12, 0x00D5}, - {0x0F12, 0x0103}, - {0x0F12, 0x0128}, - {0x0F12, 0x0166}, - {0x0F12, 0x0193}, - {0x0F12, 0x01A0}, - - {0x002A, 0x347C}, - {0x0F12, 0x013B}, - {0x0F12, 0x0116}, - {0x0F12, 0x00D9}, - {0x0F12, 0x00A6}, - {0x0F12, 0x0082}, - {0x0F12, 0x006C}, - {0x0F12, 0x0065}, - {0x0F12, 0x006C}, - {0x0F12, 0x0080}, - {0x0F12, 0x00A3}, - {0x0F12, 0x00D4}, - {0x0F12, 0x010D}, - {0x0F12, 0x012E}, - {0x0F12, 0x0138}, - {0x0F12, 0x0104}, - {0x0F12, 0x00BE}, - {0x0F12, 0x0088}, - {0x0F12, 0x0062}, - {0x0F12, 0x004D}, - {0x0F12, 0x0046}, - {0x0F12, 0x004C}, - {0x0F12, 0x0060}, - {0x0F12, 0x0084}, - {0x0F12, 0x00B8}, - {0x0F12, 0x00F9}, - {0x0F12, 0x012C}, - {0x0F12, 0x011A}, - {0x0F12, 0x00DB}, - {0x0F12, 0x0093}, - {0x0F12, 0x005F}, - {0x0F12, 0x003C}, - {0x0F12, 0x0027}, - {0x0F12, 0x0020}, - {0x0F12, 0x0026}, - {0x0F12, 0x003A}, - {0x0F12, 0x005C}, - {0x0F12, 0x008E}, - {0x0F12, 0x00D2}, - {0x0F12, 0x010E}, - {0x0F12, 0x0101}, - {0x0F12, 0x00BF}, - {0x0F12, 0x0077}, - {0x0F12, 0x0044}, - {0x0F12, 0x0023}, - {0x0F12, 0x0011}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x0022}, - {0x0F12, 0x0043}, - {0x0F12, 0x0074}, - {0x0F12, 0x00B7}, - {0x0F12, 0x00F7}, - {0x0F12, 0x00FC}, - {0x0F12, 0x00B7}, - {0x0F12, 0x006F}, - {0x0F12, 0x003C}, - {0x0F12, 0x001C}, - {0x0F12, 0x000A}, - {0x0F12, 0x0004}, - {0x0F12, 0x000A}, - {0x0F12, 0x001B}, - {0x0F12, 0x003B}, - {0x0F12, 0x006C}, - {0x0F12, 0x00B0}, - {0x0F12, 0x00F2}, - {0x0F12, 0x00EF}, - {0x0F12, 0x00AB}, - {0x0F12, 0x0065}, - {0x0F12, 0x0034}, - {0x0F12, 0x0015}, - {0x0F12, 0x0004}, - {0x0F12, 0x0000}, - {0x0F12, 0x0004}, - {0x0F12, 0x0013}, - {0x0F12, 0x0033}, - {0x0F12, 0x0063}, - {0x0F12, 0x00A5}, - {0x0F12, 0x00E5}, - {0x0F12, 0x00F7}, - {0x0F12, 0x00B4}, - {0x0F12, 0x006D}, - {0x0F12, 0x003C}, - {0x0F12, 0x001C}, - {0x0F12, 0x000B}, - {0x0F12, 0x0005}, - {0x0F12, 0x000A}, - {0x0F12, 0x001B}, - {0x0F12, 0x003B}, - {0x0F12, 0x006B}, - {0x0F12, 0x00AD}, - {0x0F12, 0x00ED}, - {0x0F12, 0x010B}, - {0x0F12, 0x00CB}, - {0x0F12, 0x0085}, - {0x0F12, 0x0051}, - {0x0F12, 0x002F}, - {0x0F12, 0x001C}, - {0x0F12, 0x0016}, - {0x0F12, 0x001C}, - {0x0F12, 0x002E}, - {0x0F12, 0x004F}, - {0x0F12, 0x0081}, - {0x0F12, 0x00C4}, - {0x0F12, 0x0102}, - {0x0F12, 0x0119}, - {0x0F12, 0x00DF}, - {0x0F12, 0x009B}, - {0x0F12, 0x0067}, - {0x0F12, 0x0045}, - {0x0F12, 0x0030}, - {0x0F12, 0x0029}, - {0x0F12, 0x002F}, - {0x0F12, 0x0043}, - {0x0F12, 0x0066}, - {0x0F12, 0x0098}, - {0x0F12, 0x00D9}, - {0x0F12, 0x010F}, - {0x0F12, 0x0138}, - {0x0F12, 0x010C}, - {0x0F12, 0x00CB}, - {0x0F12, 0x0097}, - {0x0F12, 0x0073}, - {0x0F12, 0x005C}, - {0x0F12, 0x0054}, - {0x0F12, 0x005B}, - {0x0F12, 0x0070}, - {0x0F12, 0x0096}, - {0x0F12, 0x00C9}, - {0x0F12, 0x0106}, - {0x0F12, 0x012D}, - {0x0F12, 0x0147}, - {0x0F12, 0x012F}, - {0x0F12, 0x00F8}, - {0x0F12, 0x00C5}, - {0x0F12, 0x00A1}, - {0x0F12, 0x008B}, - {0x0F12, 0x0083}, - {0x0F12, 0x008B}, - {0x0F12, 0x00A0}, - {0x0F12, 0x00C2}, - {0x0F12, 0x00F3}, - {0x0F12, 0x0124}, - {0x0F12, 0x0139}, - {0x0F12, 0x0093}, - {0x0F12, 0x007E}, - {0x0F12, 0x0062}, - {0x0F12, 0x004D}, - {0x0F12, 0x003E}, - {0x0F12, 0x0034}, - {0x0F12, 0x0030}, - {0x0F12, 0x0032}, - {0x0F12, 0x003B}, - {0x0F12, 0x0049}, - {0x0F12, 0x005C}, - {0x0F12, 0x0077}, - {0x0F12, 0x008A}, - {0x0F12, 0x0093}, - {0x0F12, 0x0077}, - {0x0F12, 0x0059}, - {0x0F12, 0x0042}, - {0x0F12, 0x0032}, - {0x0F12, 0x0027}, - {0x0F12, 0x0024}, - {0x0F12, 0x0026}, - {0x0F12, 0x002F}, - {0x0F12, 0x003D}, - {0x0F12, 0x0052}, - {0x0F12, 0x006E}, - {0x0F12, 0x008B}, - {0x0F12, 0x0083}, - {0x0F12, 0x0064}, - {0x0F12, 0x0046}, - {0x0F12, 0x0030}, - {0x0F12, 0x0020}, - {0x0F12, 0x0016}, - {0x0F12, 0x0011}, - {0x0F12, 0x0014}, - {0x0F12, 0x001E}, - {0x0F12, 0x002D}, - {0x0F12, 0x0041}, - {0x0F12, 0x005D}, - {0x0F12, 0x007C}, - {0x0F12, 0x0077}, - {0x0F12, 0x0057}, - {0x0F12, 0x0039}, - {0x0F12, 0x0024}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0007}, - {0x0F12, 0x0009}, - {0x0F12, 0x0012}, - {0x0F12, 0x0021}, - {0x0F12, 0x0036}, - {0x0F12, 0x0051}, - {0x0F12, 0x0070}, - {0x0F12, 0x0077}, - {0x0F12, 0x0056}, - {0x0F12, 0x0038}, - {0x0F12, 0x0022}, - {0x0F12, 0x0013}, - {0x0F12, 0x0009}, - {0x0F12, 0x0005}, - {0x0F12, 0x0008}, - {0x0F12, 0x0011}, - {0x0F12, 0x0020}, - {0x0F12, 0x0035}, - {0x0F12, 0x0051}, - {0x0F12, 0x0071}, - {0x0F12, 0x006E}, - {0x0F12, 0x004E}, - {0x0F12, 0x0032}, - {0x0F12, 0x001C}, - {0x0F12, 0x000D}, - {0x0F12, 0x0004}, - {0x0F12, 0x0000}, - {0x0F12, 0x0003}, - {0x0F12, 0x000B}, - {0x0F12, 0x001A}, - {0x0F12, 0x002F}, - {0x0F12, 0x0049}, - {0x0F12, 0x0068}, - {0x0F12, 0x0072}, - {0x0F12, 0x0053}, - {0x0F12, 0x0037}, - {0x0F12, 0x0021}, - {0x0F12, 0x0012}, - {0x0F12, 0x0009}, - {0x0F12, 0x0005}, - {0x0F12, 0x0008}, - {0x0F12, 0x0010}, - {0x0F12, 0x001F}, - {0x0F12, 0x0034}, - {0x0F12, 0x004E}, - {0x0F12, 0x006C}, - {0x0F12, 0x007F}, - {0x0F12, 0x0060}, - {0x0F12, 0x0043}, - {0x0F12, 0x002D}, - {0x0F12, 0x001D}, - {0x0F12, 0x0013}, - {0x0F12, 0x0010}, - {0x0F12, 0x0013}, - {0x0F12, 0x001C}, - {0x0F12, 0x002B}, - {0x0F12, 0x0040}, - {0x0F12, 0x005A}, - {0x0F12, 0x0079}, - {0x0F12, 0x0082}, - {0x0F12, 0x0066}, - {0x0F12, 0x0049}, - {0x0F12, 0x0035}, - {0x0F12, 0x0025}, - {0x0F12, 0x001B}, - {0x0F12, 0x0017}, - {0x0F12, 0x0019}, - {0x0F12, 0x0023}, - {0x0F12, 0x0033}, - {0x0F12, 0x0046}, - {0x0F12, 0x0060}, - {0x0F12, 0x007B}, - {0x0F12, 0x0092}, - {0x0F12, 0x007C}, - {0x0F12, 0x0060}, - {0x0F12, 0x004B}, - {0x0F12, 0x003C}, - {0x0F12, 0x0032}, - {0x0F12, 0x002D}, - {0x0F12, 0x0030}, - {0x0F12, 0x0039}, - {0x0F12, 0x0049}, - {0x0F12, 0x005D}, - {0x0F12, 0x0076}, - {0x0F12, 0x008C}, - {0x0F12, 0x009F}, - {0x0F12, 0x008F}, - {0x0F12, 0x0077}, - {0x0F12, 0x0061}, - {0x0F12, 0x0052}, - {0x0F12, 0x0048}, - {0x0F12, 0x0043}, - {0x0F12, 0x0047}, - {0x0F12, 0x0050}, - {0x0F12, 0x005E}, - {0x0F12, 0x0071}, - {0x0F12, 0x0086}, - {0x0F12, 0x0097}, - {0x0F12, 0x0093}, - {0x0F12, 0x007C}, - {0x0F12, 0x005F}, - {0x0F12, 0x0049}, - {0x0F12, 0x003A}, - {0x0F12, 0x0030}, - {0x0F12, 0x002C}, - {0x0F12, 0x002F}, - {0x0F12, 0x0037}, - {0x0F12, 0x0045}, - {0x0F12, 0x005A}, - {0x0F12, 0x0075}, - {0x0F12, 0x008A}, - {0x0F12, 0x0094}, - {0x0F12, 0x0077}, - {0x0F12, 0x0057}, - {0x0F12, 0x0040}, - {0x0F12, 0x002F}, - {0x0F12, 0x0024}, - {0x0F12, 0x0020}, - {0x0F12, 0x0023}, - {0x0F12, 0x002D}, - {0x0F12, 0x003B}, - {0x0F12, 0x0051}, - {0x0F12, 0x006E}, - {0x0F12, 0x008C}, - {0x0F12, 0x0085}, - {0x0F12, 0x0066}, - {0x0F12, 0x0046}, - {0x0F12, 0x002F}, - {0x0F12, 0x001F}, - {0x0F12, 0x0014}, - {0x0F12, 0x000F}, - {0x0F12, 0x0012}, - {0x0F12, 0x001C}, - {0x0F12, 0x002B}, - {0x0F12, 0x0040}, - {0x0F12, 0x005C}, - {0x0F12, 0x007D}, - {0x0F12, 0x007A}, - {0x0F12, 0x005A}, - {0x0F12, 0x003A}, - {0x0F12, 0x0024}, - {0x0F12, 0x0014}, - {0x0F12, 0x0009}, - {0x0F12, 0x0006}, - {0x0F12, 0x0008}, - {0x0F12, 0x0011}, - {0x0F12, 0x0020}, - {0x0F12, 0x0036}, - {0x0F12, 0x0051}, - {0x0F12, 0x0072}, - {0x0F12, 0x007B}, - {0x0F12, 0x0059}, - {0x0F12, 0x003A}, - {0x0F12, 0x0023}, - {0x0F12, 0x0012}, - {0x0F12, 0x0008}, - {0x0F12, 0x0004}, - {0x0F12, 0x0007}, - {0x0F12, 0x000F}, - {0x0F12, 0x001F}, - {0x0F12, 0x0035}, - {0x0F12, 0x0051}, - {0x0F12, 0x0072}, - {0x0F12, 0x0073}, - {0x0F12, 0x0053}, - {0x0F12, 0x0034}, - {0x0F12, 0x001D}, - {0x0F12, 0x000E}, - {0x0F12, 0x0004}, - {0x0F12, 0x0000}, - {0x0F12, 0x0002}, - {0x0F12, 0x000A}, - {0x0F12, 0x001A}, - {0x0F12, 0x002F}, - {0x0F12, 0x004A}, - {0x0F12, 0x006A}, - {0x0F12, 0x0077}, - {0x0F12, 0x0058}, - {0x0F12, 0x0039}, - {0x0F12, 0x0022}, - {0x0F12, 0x0012}, - {0x0F12, 0x0008}, - {0x0F12, 0x0004}, - {0x0F12, 0x0007}, - {0x0F12, 0x000F}, - {0x0F12, 0x001E}, - {0x0F12, 0x0034}, - {0x0F12, 0x004F}, - {0x0F12, 0x006F}, - {0x0F12, 0x0083}, - {0x0F12, 0x0064}, - {0x0F12, 0x0045}, - {0x0F12, 0x002E}, - {0x0F12, 0x001D}, - {0x0F12, 0x0012}, - {0x0F12, 0x000F}, - {0x0F12, 0x0011}, - {0x0F12, 0x001A}, - {0x0F12, 0x002A}, - {0x0F12, 0x003F}, - {0x0F12, 0x005B}, - {0x0F12, 0x007B}, - {0x0F12, 0x0087}, - {0x0F12, 0x006A}, - {0x0F12, 0x004B}, - {0x0F12, 0x0036}, - {0x0F12, 0x0025}, - {0x0F12, 0x0019}, - {0x0F12, 0x0015}, - {0x0F12, 0x0017}, - {0x0F12, 0x0022}, - {0x0F12, 0x0031}, - {0x0F12, 0x0045}, - {0x0F12, 0x0060}, - {0x0F12, 0x007D}, - {0x0F12, 0x0096}, - {0x0F12, 0x007F}, - {0x0F12, 0x0061}, - {0x0F12, 0x004B}, - {0x0F12, 0x003B}, - {0x0F12, 0x002F}, - {0x0F12, 0x002A}, - {0x0F12, 0x002D}, - {0x0F12, 0x0036}, - {0x0F12, 0x0046}, - {0x0F12, 0x005B}, - {0x0F12, 0x0075}, - {0x0F12, 0x008D}, - {0x0F12, 0x00A1}, - {0x0F12, 0x0091}, - {0x0F12, 0x0077}, - {0x0F12, 0x0060}, - {0x0F12, 0x0050}, - {0x0F12, 0x0044}, - {0x0F12, 0x0040}, - {0x0F12, 0x0043}, - {0x0F12, 0x004C}, - {0x0F12, 0x005A}, - {0x0F12, 0x006D}, - {0x0F12, 0x0084}, - {0x0F12, 0x0094}, - {0x0F12, 0x0072}, - {0x0F12, 0x0063}, - {0x0F12, 0x004C}, - {0x0F12, 0x003A}, - {0x0F12, 0x002D}, - {0x0F12, 0x0025}, - {0x0F12, 0x0023}, - {0x0F12, 0x0025}, - {0x0F12, 0x002C}, - {0x0F12, 0x0038}, - {0x0F12, 0x004A}, - {0x0F12, 0x005F}, - {0x0F12, 0x006B}, - {0x0F12, 0x0079}, - {0x0F12, 0x0065}, - {0x0F12, 0x004A}, - {0x0F12, 0x0037}, - {0x0F12, 0x0029}, - {0x0F12, 0x0021}, - {0x0F12, 0x001D}, - {0x0F12, 0x001F}, - {0x0F12, 0x0027}, - {0x0F12, 0x0033}, - {0x0F12, 0x0044}, - {0x0F12, 0x005E}, - {0x0F12, 0x006E}, - {0x0F12, 0x006A}, - {0x0F12, 0x0055}, - {0x0F12, 0x003A}, - {0x0F12, 0x0028}, - {0x0F12, 0x001A}, - {0x0F12, 0x0011}, - {0x0F12, 0x000D}, - {0x0F12, 0x000F}, - {0x0F12, 0x0017}, - {0x0F12, 0x0024}, - {0x0F12, 0x0035}, - {0x0F12, 0x004E}, - {0x0F12, 0x0061}, - {0x0F12, 0x0061}, - {0x0F12, 0x004A}, - {0x0F12, 0x0031}, - {0x0F12, 0x001E}, - {0x0F12, 0x0011}, - {0x0F12, 0x0008}, - {0x0F12, 0x0005}, - {0x0F12, 0x0007}, - {0x0F12, 0x000E}, - {0x0F12, 0x001B}, - {0x0F12, 0x002D}, - {0x0F12, 0x0045}, - {0x0F12, 0x0059}, - {0x0F12, 0x0062}, - {0x0F12, 0x004B}, - {0x0F12, 0x0031}, - {0x0F12, 0x001E}, - {0x0F12, 0x0010}, - {0x0F12, 0x0008}, - {0x0F12, 0x0004}, - {0x0F12, 0x0006}, - {0x0F12, 0x000E}, - {0x0F12, 0x001B}, - {0x0F12, 0x002E}, - {0x0F12, 0x0046}, - {0x0F12, 0x005A}, - {0x0F12, 0x005B}, - {0x0F12, 0x0045}, - {0x0F12, 0x002C}, - {0x0F12, 0x001A}, - {0x0F12, 0x000C}, - {0x0F12, 0x0003}, - {0x0F12, 0x0000}, - {0x0F12, 0x0002}, - {0x0F12, 0x0009}, - {0x0F12, 0x0016}, - {0x0F12, 0x0029}, - {0x0F12, 0x0040}, - {0x0F12, 0x0054}, - {0x0F12, 0x005F}, - {0x0F12, 0x004A}, - {0x0F12, 0x0031}, - {0x0F12, 0x001F}, - {0x0F12, 0x0010}, - {0x0F12, 0x0008}, - {0x0F12, 0x0004}, - {0x0F12, 0x0007}, - {0x0F12, 0x000E}, - {0x0F12, 0x001B}, - {0x0F12, 0x002E}, - {0x0F12, 0x0045}, - {0x0F12, 0x0059}, - {0x0F12, 0x006C}, - {0x0F12, 0x0057}, - {0x0F12, 0x003E}, - {0x0F12, 0x002A}, - {0x0F12, 0x001B}, - {0x0F12, 0x0012}, - {0x0F12, 0x000F}, - {0x0F12, 0x0011}, - {0x0F12, 0x0019}, - {0x0F12, 0x0027}, - {0x0F12, 0x0039}, - {0x0F12, 0x0050}, - {0x0F12, 0x0063}, - {0x0F12, 0x006F}, - {0x0F12, 0x005C}, - {0x0F12, 0x0044}, - {0x0F12, 0x0031}, - {0x0F12, 0x0023}, - {0x0F12, 0x0019}, - {0x0F12, 0x0016}, - {0x0F12, 0x0017}, - {0x0F12, 0x0020}, - {0x0F12, 0x002E}, - {0x0F12, 0x0040}, - {0x0F12, 0x0055}, - {0x0F12, 0x0064}, - {0x0F12, 0x007E}, - {0x0F12, 0x0071}, - {0x0F12, 0x0059}, - {0x0F12, 0x0046}, - {0x0F12, 0x0039}, - {0x0F12, 0x002F}, - {0x0F12, 0x002A}, - {0x0F12, 0x002D}, - {0x0F12, 0x0035}, - {0x0F12, 0x0043}, - {0x0F12, 0x0054}, - {0x0F12, 0x0069}, - {0x0F12, 0x0074}, - {0x0F12, 0x0083}, - {0x0F12, 0x007D}, - {0x0F12, 0x0068}, - {0x0F12, 0x0055}, - {0x0F12, 0x0048}, - {0x0F12, 0x003E}, - {0x0F12, 0x003A}, - {0x0F12, 0x003D}, - {0x0F12, 0x0045}, - {0x0F12, 0x0051}, - {0x0F12, 0x0061}, - {0x0F12, 0x0072}, - {0x0F12, 0x0077}, - {0x002A, 0x1348}, - {0x0F12, 0x0001}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_analog_setting2[] = { - /* Analog Setting 2 */ - {0x002A, 0x1278}, - {0x0F12, 0xAAF0}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_awb_basic_setting[] = { - /* 09.AWB-BASIC setting */ - {0x002A, 0x0B36}, - {0x0F12, 0x0005}, - {0x002A, 0x0B3A}, - {0x0F12, 0x00F3}, - {0x0F12, 0x02CB}, - {0x002A, 0x0B38}, - {0x0F12, 0x0010}, - {0x002A, 0x0AE6}, - {0x0F12, 0x0385}, - {0x0F12, 0x03D8}, - {0x0F12, 0x032A}, - {0x0F12, 0x03C5}, - {0x0F12, 0x02F5}, - {0x0F12, 0x039D}, - {0x0F12, 0x02D3}, - {0x0F12, 0x0372}, - {0x0F12, 0x02B1}, - {0x0F12, 0x033E}, - {0x0F12, 0x028A}, - {0x0F12, 0x0322}, - {0x0F12, 0x0268}, - {0x0F12, 0x02FD}, - {0x0F12, 0x0248}, - {0x0F12, 0x02EF}, - {0x0F12, 0x022F}, - {0x0F12, 0x02D5}, - {0x0F12, 0x0219}, - {0x0F12, 0x02C2}, - {0x0F12, 0x0206}, - {0x0F12, 0x02A3}, - {0x0F12, 0x01F0}, - {0x0F12, 0x0286}, - {0x0F12, 0x01E3}, - {0x0F12, 0x0268}, - {0x0F12, 0x01D6}, - {0x0F12, 0x024E}, - {0x0F12, 0x01DD}, - {0x0F12, 0x022A}, - {0x0F12, 0x0210}, - {0x0F12, 0x01F2}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - - {0x002A, 0x0BAA}, - {0x0F12, 0x0006}, - {0x002A, 0x0BAE}, - {0x0F12, 0x00CC}, - {0x0F12, 0x02F3}, - {0x002A, 0x0BAC}, - {0x0F12, 0x000A}, - {0x002A, 0x0B7A}, - {0x0F12, 0x036C}, - {0x0F12, 0x03C6}, - {0x0F12, 0x02EE}, - {0x0F12, 0x03F9}, - {0x0F12, 0x02BE}, - {0x0F12, 0x03DF}, - {0x0F12, 0x027A}, - {0x0F12, 0x03AE}, - {0x0F12, 0x0234}, - {0x0F12, 0x0376}, - {0x0F12, 0x0204}, - {0x0F12, 0x033E}, - {0x0F12, 0x01E0}, - {0x0F12, 0x02CD}, - {0x0F12, 0x01C3}, - {0x0F12, 0x027A}, - {0x0F12, 0x01B7}, - {0x0F12, 0x0244}, - {0x0F12, 0x01FE}, - {0x0F12, 0x01DD}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x002A, 0x0B70}, - {0x0F12, 0x0005}, - {0x002A, 0x0B74}, - {0x0F12, 0x01E3}, - {0x0F12, 0x0270}, - {0x002A, 0x0B72}, - {0x0F12, 0x0006}, - {0x002A, 0x0B40}, - {0x0F12, 0x028A}, - {0x0F12, 0x02A1}, - {0x0F12, 0x0263}, - {0x0F12, 0x02C0}, - {0x0F12, 0x024C}, - {0x0F12, 0x02BE}, - {0x0F12, 0x023D}, - {0x0F12, 0x02A6}, - {0x0F12, 0x0243}, - {0x0F12, 0x0289}, - {0x0F12, 0x026F}, - {0x0F12, 0x025D}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x002A, 0x0BC8}, - {0x0F12, 0x0005}, - {0x002A, 0x0BCC}, - {0x0F12, 0x010F}, - {0x0F12, 0x018F}, - {0x002A, 0x0BCA}, - {0x0F12, 0x0005}, - {0x002A, 0x0BB4}, - {0x0F12, 0x03E7}, - {0x0F12, 0x03F8}, - {0x0F12, 0x03A7}, - {0x0F12, 0x03FC}, - {0x0F12, 0x0352}, - {0x0F12, 0x03D0}, - {0x0F12, 0x0322}, - {0x0F12, 0x039E}, - {0x0F12, 0x032B}, - {0x0F12, 0x034D}, - {0x002A, 0x0BE6}, - {0x0F12, 0x0006}, - {0x002A, 0x0BEA}, - {0x0F12, 0x019E}, - {0x0F12, 0x0257}, - {0x002A, 0x0BE8}, - {0x0F12, 0x0004}, - {0x002A, 0x0BD2}, - {0x0F12, 0x030B}, - {0x0F12, 0x0323}, - {0x0F12, 0x02C3}, - {0x0F12, 0x030F}, - {0x0F12, 0x0288}, - {0x0F12, 0x02E5}, - {0x0F12, 0x026A}, - {0x0F12, 0x02A2}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x002A, 0x0C2C}, - {0x0F12, 0x0139}, - {0x0F12, 0x0122}, - {0x002A, 0x0BFC}, - {0x0F12, 0x0378}, - {0x0F12, 0x011E}, - {0x0F12, 0x02F0}, - {0x0F12, 0x0184}, - {0x0F12, 0x0313}, - {0x0F12, 0x0158}, - {0x0F12, 0x02BA}, - {0x0F12, 0x01BA}, - {0x0F12, 0x0231}, - {0x0F12, 0x0252}, - {0x0F12, 0x0237}, - {0x0F12, 0x024C}, - {0x0F12, 0x020F}, - {0x0F12, 0x0279}, - {0x0F12, 0x0268}, - {0x0F12, 0x021A}, - {0x002A, 0x0C4C}, - {0x0F12, 0x0450}, - {0x002A, 0x0C58}, - {0x0F12, 0x059C}, - {0x002A, 0x0BF8}, - {0x0F12, 0x01AE}, - {0x002A, 0x0C28}, - {0x0F12, 0x0000}, - {0x002A, 0x0CAC}, - {0x0F12, 0x0050}, - {0x002A, 0x0C28}, - {0x0F12, 0x0000}, - - {0x002A, 0x20BA}, - {0x0F12, 0x0006}, - - {0x002A, 0x0D0E}, - {0x0F12, 0x00B8}, - {0x0F12, 0x00B2}, - {0x002A, 0x0CFE}, - {0x0F12, 0x0FAB}, - {0x0F12, 0x0FF5}, - {0x0F12, 0x10BB}, - {0x0F12, 0x1117}, - {0x0F12, 0x116D}, - {0x0F12, 0x11D5}, - {0x0F12, 0x00A9}, - {0x0F12, 0x00C0}, - {0x002A, 0x0CF8}, - {0x0F12, 0x02CC}, - {0x0F12, 0x031E}, - {0x0F12, 0x0359}, - - {0x002A, 0x0CB0}, - {0x0F12, 0x0030}, - {0x0F12, 0x0040}, - {0x0F12, 0x0060}, - {0x0F12, 0x0040}, - {0x0F12, 0x0008}, - {0x0F12, 0x0008}, - - {0x0F12, 0x0030}, - {0x0F12, 0x0040}, - {0x0F12, 0x0060}, - {0x0F12, 0x0040}, - {0x0F12, 0x0008}, - {0x0F12, 0x0008}, - - {0x0F12, 0x0030}, - {0x0F12, 0x0040}, - {0x0F12, 0x0060}, - {0x0F12, 0x0040}, - {0x0F12, 0x0008}, - {0x0F12, 0x0008}, - - {0x0F12, 0x0018}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFF80}, - {0x0F12, 0xFEC0}, - - {0x0F12, 0x0018}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFF80}, - {0x0F12, 0xFEC0}, - - {0x0F12, 0x0018}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFF80}, - {0x0F12, 0xFEC0}, - - {0x002A, 0x0D30}, - {0x0F12, 0x0002}, - - {0x002A, 0x3362}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - - /* For Outdoor Detector */ - {0x002A, 0x0C86}, - {0x0F12, 0x0005}, - {0x002A, 0x0C70}, - {0x0F12, 0xFF7B}, - {0x0F12, 0x00CE}, - {0x0F12, 0xFF23}, - {0x0F12, 0x010D}, - {0x0F12, 0xFEF3}, - {0x0F12, 0x012C}, - {0x0F12, 0xFED7}, - {0x0F12, 0x014E}, - {0x0F12, 0xFEBB}, - {0x0F12, 0x0162}, - {0x0F12, 0x1388}, - {0x002A, 0x0C8A}, - {0x0F12, 0x4ACB}, - {0x002A, 0x0C88}, - {0x0F12, 0x0A7C}, - - {0x002A, 0x0CA0}, - {0x0F12, 0x0030}, - - {0x002A, 0x0CA4}, - {0x0F12, 0x0030}, - {0x0F12, 0x0180}, - {0x0F12, 0x0002}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_clk_setting[] = { - /* 10.Clock Setting */ - {0x002A, 0x012E}, - {0x0F12, 0x5DC0}, - {0x0F12, 0x0000}, - {0x002A, 0x0146}, - {0x0F12, 0x0000}, - {0x0F12, 0x0001}, - - /* System Clock & Output clock (Pclk) */ - {0x002A, 0x014C}, - {0x0F12, 0x2AF8}, - {0x002A, 0x0152}, - {0x0F12, 0x55F0}, - {0x002A, 0x014E}, - {0x0F12, 0x55F0}, - {0x0F12, 0x00FA}, - - {0x002A, 0x0164}, - {0x0F12, 0x0001}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_flicker_detection[] = { - /* 11.Auto Flicker Detection */ - {0x0028, 0x7000}, - {0x002A, 0x0408}, - {0x0F12, 0x067F}, - {0x002A, 0x0ABC}, - {0x0F12, 0x0000}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_ae_setting[] = { - /* 12.AE Setting */ - {0x002A, 0x0D40}, - {0x0F12, 0x0036}, - - /* For LT Calibration */ - {0x002A, 0x0D46}, - {0x0F12, 0x000F}, - - {0x002A, 0x0440}, - {0x0F12, 0x3410}, - {0x002A, 0x0444}, - {0x0F12, 0x6820}, - {0x002A, 0x0448}, - {0x0F12, 0x8227}, - {0x002A, 0x044C}, - {0x0F12, 0xC350}, - {0x002A, 0x0450}, - {0x0F12, 0x3410}, - {0x002A, 0x0454}, - {0x0F12, 0x6820}, - {0x002A, 0x0458}, - {0x0F12, 0x8227}, - {0x002A, 0x045C}, - {0x0F12, 0xC350}, - {0x002A, 0x0460}, - {0x0F12, 0x01B0}, - {0x0F12, 0x01B0}, - {0x0F12, 0x0280}, - {0x0F12, 0x0600}, - {0x0F12, 0x0100}, - {0x0F12, 0x3000}, - {0x002A, 0x042E}, - {0x0F12, 0x012E}, - {0x0F12, 0x00D5}, - {0x002A, 0x0DE0}, - {0x0F12, 0x0002}, - - {0x002A, 0x0D38}, - {0x0F12, 0x019C}, - {0x002A, 0x0D3E}, - {0x0F12, 0x02A0}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_ae_weight[] = { - /* 13.AE Weight (Normal) */ - {0x002A, 0x0D4E}, - {0x0F12, 0x0100}, - {0x0F12, 0x0001}, - {0x0F12, 0x0100}, - {0x0F12, 0x0001}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0201}, - {0x0F12, 0x0202}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0303}, - {0x0F12, 0x0303}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0503}, - {0x0F12, 0x0305}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0402}, - {0x0F12, 0x0204}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0201}, - {0x0F12, 0x0102}, - {0x0F12, 0x0101}, - {0x0F12, 0x0100}, - {0x0F12, 0x0101}, - {0x0F12, 0x0101}, - {0x0F12, 0x0001}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_ccm_setting[] = { - /* 15.CCM Setting */ - {0x002A, 0x33A4}, - {0x0F12, 0x01D0}, - {0x0F12, 0xFFA1}, - {0x0F12, 0xFFFA}, - {0x0F12, 0xFF6F}, - {0x0F12, 0x0140}, - {0x0F12, 0xFF49}, - {0x0F12, 0xFFC1}, - {0x0F12, 0x001F}, - {0x0F12, 0x01BD}, - {0x0F12, 0x013F}, - {0x0F12, 0x00E1}, - {0x0F12, 0xFF43}, - {0x0F12, 0x0191}, - {0x0F12, 0xFFC0}, - {0x0F12, 0x01B7}, - {0x0F12, 0xFF30}, - {0x0F12, 0x015F}, - {0x0F12, 0x0106}, - {0x0F12, 0x01D0}, - {0x0F12, 0xFFA1}, - {0x0F12, 0xFFFA}, - {0x0F12, 0xFF6F}, - {0x0F12, 0x0140}, - {0x0F12, 0xFF49}, - {0x0F12, 0xFFC1}, - {0x0F12, 0x001F}, - {0x0F12, 0x01BD}, - {0x0F12, 0x013F}, - {0x0F12, 0x00E1}, - {0x0F12, 0xFF43}, - {0x0F12, 0x0191}, - {0x0F12, 0xFFC0}, - {0x0F12, 0x01B7}, - {0x0F12, 0xFF30}, - {0x0F12, 0x015F}, - {0x0F12, 0x0106}, - {0x0F12, 0x01C4}, - {0x0F12, 0xFFAB}, - {0x0F12, 0xFFFC}, - {0x0F12, 0xFF6E}, - {0x0F12, 0x0145}, - {0x0F12, 0xFF4A}, - {0x0F12, 0xFFE1}, - {0x0F12, 0xFFF6}, - {0x0F12, 0x01BD}, - {0x0F12, 0x013E}, - {0x0F12, 0x00E4}, - {0x0F12, 0xFF46}, - {0x0F12, 0x0190}, - {0x0F12, 0xFFBC}, - {0x0F12, 0x01B5}, - {0x0F12, 0xFF30}, - {0x0F12, 0x015E}, - {0x0F12, 0x0103}, - {0x0F12, 0x01C4}, - {0x0F12, 0xFFAB}, - {0x0F12, 0xFFFC}, - {0x0F12, 0xFF6E}, - {0x0F12, 0x0145}, - {0x0F12, 0xFF4A}, - {0x0F12, 0xFFE1}, - {0x0F12, 0xFFF6}, - {0x0F12, 0x01BD}, - {0x0F12, 0x013E}, - {0x0F12, 0x00E4}, - {0x0F12, 0xFF46}, - {0x0F12, 0x0190}, - {0x0F12, 0xFFBC}, - {0x0F12, 0x01B5}, - {0x0F12, 0xFF30}, - {0x0F12, 0x015E}, - {0x0F12, 0x0103}, - {0x0F12, 0x01C6}, - {0x0F12, 0xFFC2}, - {0x0F12, 0x0004}, - {0x0F12, 0xFF6F}, - {0x0F12, 0x01C9}, - {0x0F12, 0xFF4F}, - {0x0F12, 0xFFDB}, - {0x0F12, 0xFFC0}, - {0x0F12, 0x019D}, - {0x0F12, 0x0136}, - {0x0F12, 0x0132}, - {0x0F12, 0xFF85}, - {0x0F12, 0x018B}, - {0x0F12, 0xFF73}, - {0x0F12, 0x0191}, - {0x0F12, 0xFF3F}, - {0x0F12, 0x015B}, - {0x0F12, 0x00D0}, - - {0x0F12, 0x01C6}, - {0x0F12, 0xFFC2}, - {0x0F12, 0x0004}, - {0x0F12, 0xFF56}, - {0x0F12, 0x01C9}, - {0x0F12, 0xFF68}, - {0x0F12, 0xFFDB}, - {0x0F12, 0xFFC0}, - {0x0F12, 0x019D}, - {0x0F12, 0x0140}, - {0x0F12, 0x012C}, - {0x0F12, 0xFF97}, - {0x0F12, 0x018B}, - {0x0F12, 0xFF73}, - {0x0F12, 0x0191}, - {0x0F12, 0xFF3F}, - {0x0F12, 0x015B}, - {0x0F12, 0x00D0}, - - {0x002A, 0x3380}, - {0x0F12, 0x01D6}, - {0x0F12, 0xFF94}, - {0x0F12, 0xFFCC}, - {0x0F12, 0xFF1F}, - {0x0F12, 0x021F}, - {0x0F12, 0xFF1F}, - {0x0F12, 0xFFE4}, - {0x0F12, 0xFFED}, - {0x0F12, 0x01C8}, - {0x0F12, 0x0112}, - {0x0F12, 0x0125}, - {0x0F12, 0xFF3E}, - {0x0F12, 0x0210}, - {0x0F12, 0xFF5D}, - {0x0F12, 0x0244}, - {0x0F12, 0xFF10}, - {0x0F12, 0x0190}, - {0x0F12, 0x0145}, - {0x002A, 0x0612}, - {0x0F12, 0x009D}, - {0x0F12, 0x00D5}, - {0x0F12, 0x0103}, - {0x0F12, 0x0128}, - {0x0F12, 0x0166}, - {0x0F12, 0x0193}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_gamma_setting[] = { - /* 17.GAMMA */ - {0x002A, 0x0538}, - {0x0F12, 0x0000}, - {0x0F12, 0x001F}, - {0x0F12, 0x0035}, - {0x0F12, 0x005A}, - {0x0F12, 0x0095}, - {0x0F12, 0x00E6}, - {0x0F12, 0x0121}, - {0x0F12, 0x0139}, - {0x0F12, 0x0150}, - {0x0F12, 0x0177}, - {0x0F12, 0x019A}, - {0x0F12, 0x01BB}, - {0x0F12, 0x01DC}, - {0x0F12, 0x0219}, - {0x0F12, 0x0251}, - {0x0F12, 0x02B3}, - {0x0F12, 0x030A}, - {0x0F12, 0x035F}, - {0x0F12, 0x03B1}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0000}, - {0x0F12, 0x0001}, - {0x0F12, 0x0001}, - {0x0F12, 0x0002}, - {0x0F12, 0x0004}, - {0x0F12, 0x000A}, - {0x0F12, 0x0012}, - {0x0F12, 0x0016}, - {0x0F12, 0x001A}, - {0x0F12, 0x0024}, - {0x0F12, 0x0031}, - {0x0F12, 0x003E}, - {0x0F12, 0x004E}, - {0x0F12, 0x0075}, - {0x0F12, 0x00A8}, - {0x0F12, 0x0126}, - {0x0F12, 0x01BE}, - {0x0F12, 0x0272}, - {0x0F12, 0x0334}, - {0x0F12, 0x03FF}, - - /* For Gamma Calibration */ - - {0x002A, 0x0498}, - {0x0F12, 0x0000}, - {0x0F12, 0x0002}, - {0x0F12, 0x0007}, - {0x0F12, 0x001D}, - {0x0F12, 0x006E}, - {0x0F12, 0x00D3}, - {0x0F12, 0x0127}, - {0x0F12, 0x014C}, - {0x0F12, 0x016E}, - {0x0F12, 0x01A5}, - {0x0F12, 0x01D3}, - {0x0F12, 0x01FB}, - {0x0F12, 0x021F}, - {0x0F12, 0x0260}, - {0x0F12, 0x029A}, - {0x0F12, 0x02F7}, - {0x0F12, 0x034D}, - {0x0F12, 0x0395}, - {0x0F12, 0x03CE}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0000}, - {0x0F12, 0x0004}, - {0x0F12, 0x000C}, - {0x0F12, 0x0024}, - {0x0F12, 0x006E}, - {0x0F12, 0x00D1}, - {0x0F12, 0x0119}, - {0x0F12, 0x0139}, - {0x0F12, 0x0157}, - {0x0F12, 0x018E}, - {0x0F12, 0x01C3}, - {0x0F12, 0x01F3}, - {0x0F12, 0x021F}, - {0x0F12, 0x0269}, - {0x0F12, 0x02A6}, - {0x0F12, 0x02FF}, - {0x0F12, 0x0351}, - {0x0F12, 0x0395}, - {0x0F12, 0x03CE}, - {0x0F12, 0x03FF}, - - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_afit_setting[] = { - /* 16.AFIT */ - {0x002A, 0x3360}, - {0x0F12, 0x0000}, - - {0x002A, 0x06D4}, - {0x0F12, 0x0032}, - {0x0F12, 0x0078}, - {0x0F12, 0x00C8}, - {0x0F12, 0x0190}, - {0x0F12, 0x028C}, - - {0x002A, 0x0734}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0078}, - {0x0F12, 0x012C}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0014}, - {0x0F12, 0x0064}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x01E6}, - {0x0F12, 0x0000}, - {0x0F12, 0x0070}, - {0x0F12, 0x01FF}, - {0x0F12, 0x0144}, - {0x0F12, 0x000F}, - {0x0F12, 0x000A}, - {0x0F12, 0x0073}, - {0x0F12, 0x0087}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0023}, - {0x0F12, 0x001E}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0023}, - {0x0F12, 0x0046}, - {0x0F12, 0x2B32}, - {0x0F12, 0x0601}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x00FF}, - {0x0F12, 0x07FF}, - {0x0F12, 0xFFFF}, - {0x0F12, 0x0000}, - {0x0F12, 0x050D}, - {0x0F12, 0x1E80}, - {0x0F12, 0x0000}, - {0x0F12, 0x1408}, - {0x0F12, 0x0214}, - {0x0F12, 0xFF01}, - {0x0F12, 0x180F}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {0x0F12, 0x8003}, - {0x0F12, 0x0094}, - {0x0F12, 0x0580}, - {0x0F12, 0x0280}, - {0x0F12, 0x0308}, - {0x0F12, 0x3186}, - {0x0F12, 0x707E}, - {0x0F12, 0x0A02}, - {0x0F12, 0x080A}, - {0x0F12, 0x0500}, - {0x0F12, 0x032D}, - {0x0F12, 0x324E}, - {0x0F12, 0x001E}, - {0x0F12, 0x0200}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x4646}, - {0x0F12, 0x0802}, - {0x0F12, 0x0802}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3202}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x4646}, - {0x0F12, 0x0802}, - {0x0F12, 0x0802}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3202}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0003}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x006A}, - {0x0F12, 0x012C}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0014}, - {0x0F12, 0x0064}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x01E6}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0070}, - {0x0F12, 0x007D}, - {0x0F12, 0x0064}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0073}, - {0x0F12, 0x0087}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0023}, - {0x0F12, 0x001E}, - {0x0F12, 0x0014}, - {0x0F12, 0x000A}, - {0x0F12, 0x0023}, - {0x0F12, 0x001E}, - {0x0F12, 0x2B32}, - {0x0F12, 0x0601}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x00FF}, - {0x0F12, 0x07FF}, - {0x0F12, 0xFFFF}, - {0x0F12, 0x0000}, - {0x0F12, 0x050D}, - {0x0F12, 0x1E80}, - {0x0F12, 0x0000}, - {0x0F12, 0x1403}, - {0x0F12, 0x0214}, - {0x0F12, 0xFF01}, - {0x0F12, 0x180F}, - {0x0F12, 0x0002}, - {0x0F12, 0x0000}, - {0x0F12, 0x8003}, - {0x0F12, 0x0080}, - {0x0F12, 0x0080}, - {0x0F12, 0x0280}, - {0x0F12, 0x0308}, - {0x0F12, 0x1E65}, - {0x0F12, 0x1A24}, - {0x0F12, 0x0A03}, - {0x0F12, 0x080A}, - {0x0F12, 0x0500}, - {0x0F12, 0x032D}, - {0x0F12, 0x324D}, - {0x0F12, 0x001E}, - {0x0F12, 0x0200}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x2F34}, - {0x0F12, 0x0504}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x1414}, - {0x0F12, 0x0504}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0003}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFFFC}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0064}, - {0x0F12, 0x012C}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0014}, - {0x0F12, 0x0064}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x01E6}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0070}, - {0x0F12, 0x007D}, - {0x0F12, 0x0064}, - {0x0F12, 0x0032}, - {0x0F12, 0x003C}, - {0x0F12, 0x0073}, - {0x0F12, 0x0087}, - {0x0F12, 0x0014}, - {0x0F12, 0x0019}, - {0x0F12, 0x0023}, - {0x0F12, 0x001E}, - {0x0F12, 0x0014}, - {0x0F12, 0x0019}, - {0x0F12, 0x0023}, - {0x0F12, 0x001E}, - {0x0F12, 0x2B32}, - {0x0F12, 0x0601}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x00FF}, - {0x0F12, 0x07FF}, - {0x0F12, 0xFFFF}, - {0x0F12, 0x0000}, - {0x0F12, 0x050D}, - {0x0F12, 0x1E80}, - {0x0F12, 0x0000}, - {0x0F12, 0x0A03}, - {0x0F12, 0x0200}, - {0x0F12, 0xFF01}, - {0x0F12, 0x180F}, - {0x0F12, 0x0002}, - {0x0F12, 0x0000}, - {0x0F12, 0x8003}, - {0x0F12, 0x0080}, - {0x0F12, 0x0080}, - {0x0F12, 0x0280}, - {0x0F12, 0x0208}, - {0x0F12, 0x1E4B}, - {0x0F12, 0x1A24}, - {0x0F12, 0x0A05}, - {0x0F12, 0x080A}, - {0x0F12, 0x0500}, - {0x0F12, 0x032D}, - {0x0F12, 0x324D}, - {0x0F12, 0x001E}, - {0x0F12, 0x0200}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x1E23}, - {0x0F12, 0x0505}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x1E23}, - {0x0F12, 0x0505}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0003}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFFFA}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0064}, - {0x0F12, 0x012C}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0014}, - {0x0F12, 0x0064}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x01E6}, - {0x0F12, 0x0000}, - {0x0F12, 0x0070}, - {0x0F12, 0x007D}, - {0x0F12, 0x0064}, - {0x0F12, 0x0032}, - {0x0F12, 0x003C}, - {0x0F12, 0x0073}, - {0x0F12, 0x009F}, - {0x0F12, 0x0028}, - {0x0F12, 0x0028}, - {0x0F12, 0x0023}, - {0x0F12, 0x0037}, - {0x0F12, 0x0028}, - {0x0F12, 0x0028}, - {0x0F12, 0x0023}, - {0x0F12, 0x0037}, - {0x0F12, 0x2B32}, - {0x0F12, 0x0601}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x00FF}, - {0x0F12, 0x07A0}, - {0x0F12, 0xFFFF}, - {0x0F12, 0x0000}, - {0x0F12, 0x050D}, - {0x0F12, 0x1E80}, - {0x0F12, 0x0000}, - {0x0F12, 0x0A03}, - {0x0F12, 0x0200}, - {0x0F12, 0xFF01}, - {0x0F12, 0x180F}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {0x0F12, 0x8003}, - {0x0F12, 0x0080}, - {0x0F12, 0x0080}, - {0x0F12, 0x0280}, - {0x0F12, 0x0108}, - {0x0F12, 0x1E32}, - {0x0F12, 0x1A24}, - {0x0F12, 0x0A05}, - {0x0F12, 0x080A}, - {0x0F12, 0x0000}, - {0x0F12, 0x0328}, - {0x0F12, 0x324C}, - {0x0F12, 0x001E}, - {0x0F12, 0x0200}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x0F0F}, - {0x0F12, 0x0307}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x9696}, - {0x0F12, 0x0F0F}, - {0x0F12, 0x0307}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0003}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0xFFF8}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0028}, - {0x0F12, 0x012C}, - {0x0F12, 0x03FF}, - {0x0F12, 0x0014}, - {0x0F12, 0x0064}, - {0x0F12, 0x000C}, - {0x0F12, 0x0010}, - {0x0F12, 0x01E6}, - {0x0F12, 0x0000}, - {0x0F12, 0x0070}, - {0x0F12, 0x0087}, - {0x0F12, 0x0073}, - {0x0F12, 0x0032}, - {0x0F12, 0x003C}, - {0x0F12, 0x0073}, - {0x0F12, 0x00B4}, - {0x0F12, 0x0028}, - {0x0F12, 0x0028}, - {0x0F12, 0x0023}, - {0x0F12, 0x0046}, - {0x0F12, 0x0028}, - {0x0F12, 0x0028}, - {0x0F12, 0x0023}, - {0x0F12, 0x0046}, - {0x0F12, 0x2B23}, - {0x0F12, 0x0601}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - {0x0F12, 0x00FF}, - {0x0F12, 0x0B84}, - {0x0F12, 0xFFFF}, - {0x0F12, 0x0000}, - {0x0F12, 0x050D}, - {0x0F12, 0x1E80}, - {0x0F12, 0x0000}, - {0x0F12, 0x0A03}, - {0x0F12, 0x0200}, - {0x0F12, 0xFF01}, - {0x0F12, 0x180F}, - {0x0F12, 0x0001}, - {0x0F12, 0x0000}, - {0x0F12, 0x8003}, - {0x0F12, 0x0080}, - {0x0F12, 0x0080}, - {0x0F12, 0x0280}, - {0x0F12, 0x0108}, - {0x0F12, 0x1E1E}, - {0x0F12, 0x1419}, - {0x0F12, 0x0A0A}, - {0x0F12, 0x0800}, - {0x0F12, 0x0000}, - {0x0F12, 0x0328}, - {0x0F12, 0x324C}, - {0x0F12, 0x001E}, - {0x0F12, 0x0200}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x6464}, - {0x0F12, 0x0F0F}, - {0x0F12, 0x0307}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0103}, - {0x0F12, 0x010C}, - {0x0F12, 0x6464}, - {0x0F12, 0x0F0F}, - {0x0F12, 0x0307}, - {0x0F12, 0x080F}, - {0x0F12, 0x0000}, - {0x0F12, 0x030F}, - {0x0F12, 0x3208}, - {0x0F12, 0x0F1E}, - {0x0F12, 0x020F}, - {0x0F12, 0x0003}, - {0x0F12, 0x7F5E}, - {0x0F12, 0xFEEE}, - {0x0F12, 0xD9B7}, - {0x0F12, 0x0472}, - {0x0F12, 0x0001}, - - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_display_setting[] = { - /* 20.Preview & Capture Configration Setting */ - {0x002A, 0x01BE}, - {0x0F12, 0x0280}, - {0x0F12, 0x01e0}, - {0x0F12, 0x0005}, - {0x002A, 0x01C8}, - {0x0F12, 0x0000}, - {0x002A, 0x01C4}, - {0x0F12, 0x0042}, - {0x002A, 0x01D4}, - {0x0F12, 0x0002}, - {0x002A, 0x01D2}, - {0x0F12, 0x0000}, - {0x002A, 0x01D8}, - {0x0F12, 0x014D}, - {0x002A, 0x01D6}, - {0x0F12, 0x014D}, - {0x002A, 0x01E8}, - {0x0F12, 0x0000}, - {0x0F12, 0x0000}, - - /* Capture config[0] 1280x960 7.5fps */ - {0x002A, 0x02AE}, - {0x0F12, 0x0001}, - {0x002A, 0x02B0}, - {0x0F12, 0x0500}, - {0x0F12, 0x03C0}, - {0x0F12, 0x0005}, - {0x002A, 0x02BA}, - {0x0F12, 0x0000}, - {0x002A, 0x02B6}, - {0x0F12, 0x0042}, - {0x002A, 0x02C6}, - {0x0F12, 0x0002}, - {0x002A, 0x02C4}, - {0x0F12, 0x0002}, - {0x002A, 0x02CA}, - {0x0F12, 0x014D}, - {0x002A, 0x02C8}, - {0x0F12, 0x0000}, - - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_stop_stream[] = { - /* {0x0028, 0x7000}, */ - {0x002a, 0x040c}, - {0x0f12, 0x0001}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_start_stream[] = { - /* {0x0028, 0x7000}, */ - {0x002a, 0x040c}, - {0x0f12, 0x0000}, - {S5K8AA_TERM, 0}, -}; - -static const struct s5k8aa_regval regs_select_display[] = { - /* 21.Select Cofigration Display */ - {0x002A, 0x01A8}, - {0x0F12, 0x0000}, - {0x002A, 0x01AA}, - {0x0F12, 0x0001}, - {0x002A, 0x019E}, - {0x0F12, 0x0001}, - {0x0F12, 0x0001}, - - {0x0028, 0xD000}, - {0x002A, 0x1000}, - {0x0F12, 0x0001}, /* Set host interrupt */ - {0x0028, 0x7000}, /* Set 0x7000 as page */ - - {S5K8AA_TERM, 0}, - /* p150 //delay 150ms */ -}; - -/* The next two tables must be kept in sync. */ -static const struct v4l2_frmsize_discrete s5k8aa_resolutions[] = { - { 176, 144 }, /* QCIF */ - { 240, 160 }, /* 240 x 160 */ - { 320, 240 }, /* QVGA */ - { 352, 288 }, /* CIF */ - { 640, 480 }, /* VGA */ - { 720, 480 }, /* 720 x 480 */ - { 800, 480 }, /* WVGA */ - { 1280, 720 }, /* 720P */ -}; - -static const struct v4l2_rect s5k8aa_crops[] = { - { 0, 0, 1280, 920 }, /* QCIF */ - { 40, 80, 1200, 800 }, /* 240 x 160 */ - { 0, 0, 1280, 920 }, /* QVGA */ - { 0, 0, 1280, 920 }, /* CIF */ - { 0, 0, 1280, 920 }, /* VGA */ - { 280, 240, 720, 480 }, /* 720 x 480 */ - { 240, 240, 800, 480 }, /* WVGA */ - { 0, 120, 1280, 720 }, /* 720P */ -}; - -static const struct s5k8aa_datafmt s5k8aa_colour_fmts[] = { - { .code = V4L2_MBUS_FMT_UYVY8_2X8, .reg = 0x0052 }, - { .code = V4L2_MBUS_FMT_VYUY8_2X8, .reg = 0x0072 }, - { .code = V4L2_MBUS_FMT_YUYV8_2X8, .reg = 0x0042 }, - { .code = V4L2_MBUS_FMT_YVYU8_2X8, .reg = 0x0062 }, -}; - -static struct s5k8aa *to_s5k8aa(struct v4l2_subdev *sd) -{ - return container_of(sd, struct s5k8aa, subdev); -} - -static int s5k8aa_i2c_read(struct i2c_client *client, u16 addr, u16 *val) -{ - u8 wbuf[2] = {addr >> 8, addr & 0xFF}; - struct i2c_msg msg[2]; - u8 rbuf[2]; - int ret; - - msg[0].addr = client->addr; - msg[0].flags = 0; - msg[0].len = 2; - msg[0].buf = wbuf; - - msg[1].addr = client->addr; - msg[1].flags = I2C_M_RD; - msg[1].len = 2; - msg[1].buf = rbuf; - - ret = i2c_transfer(client->adapter, msg, 2); - *val = be16_to_cpu(*((u16 *)rbuf)); - - v4l2_dbg(3, debug, client, "i2c_read: 0x%04X : 0x%04x\n", addr, *val); - - return ret == 2 ? 0 : ret; -} - -static int s5k8aa_i2c_write(struct i2c_client *client, u16 addr, u16 val) -{ - u8 buf[4] = {addr >> 8, addr & 0xFF, val >> 8, val & 0xFF}; - - int ret = i2c_master_send(client, buf, 4); - v4l2_dbg(3, debug, client, "i2c_write: 0x%04X : 0x%04x\n", addr, val); - - return ret == 4 ? 0 : ret; -} - -/* The command register write, assumes Command_Wr_addH = 0x7000. */ -static int s5k8aa_write(struct i2c_client *c, u16 addr, u16 val) -{ - int ret = s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, addr); - if (ret) - return ret; - return s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, val); -} - -/* The command register read, assumes Command_Rd_addH = 0x7000. */ -static int s5k8aa_read(struct i2c_client *client, u16 addr, u16 *val) -{ - int ret = s5k8aa_i2c_write(client, REG_CMDRD_ADDRL, addr); - if (ret) - return ret; - - return s5k8aa_i2c_read(client, REG_CMDBUF0_ADDR, val); -} - -static int s5k8aa_write_raw_array(struct v4l2_subdev *sd, - const struct s5k8aa_regval *msg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - int ret = 0; - - while (msg->addr != S5K8AA_TERM) { - ret = s5k8aa_i2c_write(client, msg->addr, msg->val); - if (ret) - break; - /* Assume that msg->addr is always less than 0xfffc */ - msg++; - } - - return ret; -} - -static int s5k8aa_power_on(struct s5k8aa *s5k8aa) -{ - int ret; - - ret = regulator_bulk_enable(ARRAY_SIZE(s5k8aa->supplies), - s5k8aa->supplies); - if (ret) - return ret; - - usleep_range(5000, 10000); - - if (gpio_is_valid(s5k8aa->pwdn_gpio)) { - gpio_direction_output(s5k8aa->pwdn_gpio, 1); - usleep_range(5000, 10000); - } - - if (gpio_is_valid(s5k8aa->reset_gpio)) { - gpio_direction_output(s5k8aa->reset_gpio, 1); - usleep_range(5000, 10000); - } - - clk_set_rate(s5k8aa->clk, 26000000); - clk_prepare_enable(s5k8aa->clk); - - return 0; -} - -static void s5k8aa_power_off(struct s5k8aa *s5k8aa) -{ - clk_disable_unprepare(s5k8aa->clk); - - if (gpio_is_valid(s5k8aa->reset_gpio)) - gpio_direction_output(s5k8aa->reset_gpio, 0); - - if (gpio_is_valid(s5k8aa->pwdn_gpio)) - gpio_direction_output(s5k8aa->pwdn_gpio, 0); - - regulator_bulk_disable(ARRAY_SIZE(s5k8aa->supplies), - s5k8aa->supplies); -} - -static int __s5k8aa_set_power(struct s5k8aa *s5k8aa, bool on) -{ - if (!on) { - s5k8aa_power_off(s5k8aa); - return 0; - } - - return s5k8aa_power_on(s5k8aa); -} - -static int s5k8aa_s_power(struct v4l2_subdev *sd, int on) -{ - struct s5k8aa *s5k8aa = to_s5k8aa(sd); - int ret = 0; - - mutex_lock(&s5k8aa->power_lock); - - /* If the power count is modified from 0 to != 0 or from != 0 to 0, - * update the power state. - */ - if (s5k8aa->power_count == !on) { - ret = __s5k8aa_set_power(s5k8aa, !!on); - if (ret < 0) - goto out; - } - - /* Update the power count. */ - s5k8aa->power_count += on ? 1 : -1; - WARN_ON(s5k8aa->power_count < 0); - -out: - mutex_unlock(&s5k8aa->power_lock); - return ret; -} - -#ifdef CONFIG_VIDEO_ADV_DEBUG -static int s5k8aa_g_register(struct v4l2_subdev *sd, - struct v4l2_dbg_register *reg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - return s5k8aa_read(client, (u16) reg->reg, - (u16 *)&(reg->val)); -} - -static int s5k8aa_s_register(struct v4l2_subdev *sd, - const struct v4l2_dbg_register *reg) -{ - struct i2c_client *client = v4l2_get_subdevdata(sd); - return s5k8aa_write(client, (u16) reg->reg, - (u16)reg->val); -} -#endif - -static int s5k8aa_s_stream(struct v4l2_subdev *sd, int enable) -{ - struct s5k8aa *s5k8aa = to_s5k8aa(sd); - const struct v4l2_mbus_framefmt *format = &s5k8aa->format; - const struct v4l2_rect *crop = &s5k8aa->crop; - struct i2c_client *c = s5k8aa->client; - int ret; - - if (!enable) - return s5k8aa_write_raw_array(sd, regs_stop_stream); - - msleep(150); - ret = s5k8aa_write_raw_array(sd, regs_start_setting); - msleep(20); - ret |= s5k8aa_write_raw_array(sd, regs_trap_patch); - ret |= s5k8aa_write_raw_array(sd, regs_stop_stream); - ret |= s5k8aa_write_raw_array(sd, regs_analog_setting); - ret |= s5k8aa_write_raw_array(sd, regs_otp_control); - ret |= s5k8aa_write_raw_array(sd, regs_gas_setting); - ret |= s5k8aa_write_raw_array(sd, regs_analog_setting2); - ret |= s5k8aa_write_raw_array(sd, regs_awb_basic_setting); - ret |= s5k8aa_write_raw_array(sd, regs_clk_setting); - ret |= s5k8aa_write_raw_array(sd, regs_flicker_detection); - ret |= s5k8aa_write_raw_array(sd, regs_ae_setting); - ret |= s5k8aa_write_raw_array(sd, regs_ae_weight); - ret |= s5k8aa_write_raw_array(sd, regs_ccm_setting); - ret |= s5k8aa_write_raw_array(sd, regs_gamma_setting); - ret |= s5k8aa_write_raw_array(sd, regs_afit_setting); - ret |= s5k8aa_write_raw_array(sd, regs_display_setting); - - /* Format */ - ret |= s5k8aa_write(c, 0x01c4, s5k8aa->fmt_reg); - - /* Crop */ - ret |= s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, 0x01ca); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->width); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->height); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->left); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, crop->top); - - /* Output resolution */ - ret |= s5k8aa_i2c_write(c, REG_CMDWR_ADDRL, 0x01be); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, format->width); - ret |= s5k8aa_i2c_write(c, REG_CMDBUF0_ADDR, format->height); - - ret |= s5k8aa_write(c, 0x01aa, 0x0001); - - ret |= s5k8aa_write_raw_array(sd, regs_start_stream); - ret |= s5k8aa_write_raw_array(sd, regs_select_display); - - return ret; -} - -static void s5k8aa_init_format(struct v4l2_mbus_framefmt *format) -{ - format->width = S5K8AA_OUT_WIDTH_DEF; - format->height = S5K8AA_OUT_HEIGHT_DEF; - format->code = V4L2_MBUS_FMT_UYVY8_2X8; - format->field = V4L2_FIELD_NONE; - format->colorspace = V4L2_COLORSPACE_JPEG; -} - -static void s5k8aa_init_cfg(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg) -{ - struct s5k8aa *s5k8aa = to_s5k8aa(sd); - struct v4l2_mbus_framefmt *format; - - format = v4l2_subdev_get_try_format(&s5k8aa->subdev, cfg, 0); - s5k8aa_init_format(format); -} - -static int s5k8aa_enum_mbus_code(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_mbus_code_enum *code) -{ - if (code->index >= ARRAY_SIZE(s5k8aa_colour_fmts)) - return -EINVAL; - - code->code = s5k8aa_colour_fmts[code->index].code; - return 0; -} - -static int s5k8aa_enum_frame_size(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_frame_size_enum *fse) -{ - unsigned int i; - - if (fse->index >= ARRAY_SIZE(s5k8aa_resolutions)) - return -EINVAL; - - for (i = 0; i < ARRAY_SIZE(s5k8aa_colour_fmts); ++i) { - if (s5k8aa_colour_fmts[i].code == fse->code) - break; - } - - if (i == ARRAY_SIZE(s5k8aa_colour_fmts)) - return -EINVAL; - - fse->min_width = s5k8aa_resolutions[fse->index].width; - fse->max_width = s5k8aa_resolutions[fse->index].width; - fse->min_height = s5k8aa_resolutions[fse->index].height; - fse->max_height = s5k8aa_resolutions[fse->index].height; - - return 0; -} - -static struct v4l2_mbus_framefmt * -s5k8aa_get_pad_format(struct s5k8aa *s5k8aa, - struct v4l2_subdev_pad_config *cfg, - unsigned int pad, u32 which) -{ - switch (which) { - case V4L2_SUBDEV_FORMAT_TRY: - default: - return v4l2_subdev_get_try_format(&s5k8aa->subdev, cfg, pad); - case V4L2_SUBDEV_FORMAT_ACTIVE: - return &s5k8aa->format; - } -} - -static int s5k8aa_get_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - struct s5k8aa *s5k8aa = to_s5k8aa(sd); - - format->format = *s5k8aa_get_pad_format(s5k8aa, cfg, format->pad, - format->which); - - return 0; -} - -static int s5k8aa_set_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_pad_config *cfg, - struct v4l2_subdev_format *format) -{ - static const struct v4l2_discrete_probe sizes = { - .sizes = s5k8aa_resolutions, - .num_sizes = ARRAY_SIZE(s5k8aa_resolutions), - }; - - struct s5k8aa *s5k8aa = to_s5k8aa(sd); - const struct v4l2_frmsize_discrete *size; - unsigned int i; - u16 fmt_reg; - - for (i = 0; i < ARRAY_SIZE(s5k8aa_colour_fmts); ++i) { - if (s5k8aa_colour_fmts[i].code == format->format.code) { - fmt_reg = s5k8aa_colour_fmts[i].reg; - break; - } - } - - if (i == ARRAY_SIZE(s5k8aa_colour_fmts)) { - format->format.code = s5k8aa_colour_fmts[0].code; - fmt_reg = s5k8aa_colour_fmts[0].reg; - } - - size = v4l2_find_nearest_format(&sizes, format->format.width, - format->format.height); - - format->format.width = size->width; - format->format.height = size->height; - format->format.field = V4L2_FIELD_NONE; - format->format.colorspace = V4L2_COLORSPACE_JPEG; - - *s5k8aa_get_pad_format(s5k8aa, cfg, format->pad, format->which) = - format->format; - - if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { - s5k8aa->fmt_reg = fmt_reg; - s5k8aa->crop = s5k8aa_crops[size - s5k8aa_resolutions]; - } - - return 0; -} - -static struct v4l2_subdev_core_ops s5k8aa_subdev_core_ops = { - .s_power = s5k8aa_s_power, -#ifdef CONFIG_VIDEO_ADV_DEBUG - .g_register = s5k8aa_g_register, - .s_register = s5k8aa_s_register, -#endif -}; - -static struct v4l2_subdev_video_ops s5k8aa_subdev_video_ops = { - .s_stream = s5k8aa_s_stream, -}; - -static struct v4l2_subdev_pad_ops s5k8aa_subdev_pad_ops = { - .init_cfg = s5k8aa_init_cfg, - .enum_mbus_code = s5k8aa_enum_mbus_code, - .enum_frame_size = s5k8aa_enum_frame_size, - .get_fmt = s5k8aa_get_fmt, - .set_fmt = s5k8aa_set_fmt, -}; - -static struct v4l2_subdev_ops s5k8aa_subdev_ops = { - .core = &s5k8aa_subdev_core_ops, - .video = &s5k8aa_subdev_video_ops, - .pad = &s5k8aa_subdev_pad_ops, -}; - -static int s5k8aa_detect(struct s5k8aa *s5k8aa) -{ - int ret; - u16 val; - - ret = s5k8aa_power_on(s5k8aa); - if (ret) - return ret; - - ret = s5k8aa_i2c_write(s5k8aa->client, 0xfcfc, 0xd000); - if (ret) - goto done; - - ret = s5k8aa_i2c_write(s5k8aa->client, 0x002c, 0x0000); - if (ret) - goto done; - - /* revision */ - /* s5k8aa_read(s5k8aa->client, 0x0042, &val); */ - ret = s5k8aa_read(s5k8aa->client, 0x0040, &val); - if (ret) - goto done; - - if (val != 0x8aa) - ret = -ENODEV; - -done: - s5k8aa_power_off(s5k8aa); - return ret; -} - -static int s5k8aa_probe(struct i2c_client *client, - const struct i2c_device_id *did) -{ - struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); - struct device_node *np = client->dev.of_node; - struct s5k8aa *s5k8aa; - int ret = 0; - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA)) { - dev_warn(&adapter->dev, - "I2C-Adapter doesn't support I2C_FUNC_SMBUS_WORD\n"); - return -EIO; - } - - s5k8aa = devm_kzalloc(&client->dev, sizeof(*s5k8aa), GFP_KERNEL); - if (!s5k8aa) - return -ENOMEM; - - mutex_init(&s5k8aa->power_lock); - s5k8aa->client = client; - - /* Get power supplies, clocks and GPIOs. */ - s5k8aa->supplies[0].supply = "avdd"; - s5k8aa->supplies[1].supply = "dvdd"; - s5k8aa->supplies[2].supply = "dovdd"; - - ret = devm_regulator_bulk_get(&client->dev, - ARRAY_SIZE(s5k8aa->supplies), - s5k8aa->supplies); - if (ret) { - dev_err(&client->dev, "failed to get power supplies\n"); - return ret; - } - - regulator_set_voltage(s5k8aa->supplies[0].consumer, 2800000, 2800000); - regulator_set_voltage(s5k8aa->supplies[1].consumer, 1200000, 1200000); - regulator_set_voltage(s5k8aa->supplies[2].consumer, 1800000, 1800000); - - s5k8aa->clk = devm_clk_get(&client->dev, NULL); - if (IS_ERR(s5k8aa->clk)) - return PTR_ERR(s5k8aa->clk); - - s5k8aa->pwdn_gpio = of_get_named_gpio(np, "pwdn-gpios", 0); - s5k8aa->reset_gpio = of_get_named_gpio(np, "reset-gpios", 0); - - if (gpio_is_valid(s5k8aa->reset_gpio)) { - ret = devm_gpio_request_one(&client->dev, s5k8aa->reset_gpio, - GPIOF_OUT_INIT_LOW, "reset"); - if (ret) { - dev_err(&client->dev, "failed to request reset GPIO\n"); - return ret; - } - - usleep_range(5000, 20000); - } - - if (gpio_is_valid(s5k8aa->pwdn_gpio)) { - ret = devm_gpio_request_one(&client->dev, s5k8aa->pwdn_gpio, - GPIOF_OUT_INIT_LOW, "pwdn"); - if (ret) { - dev_err(&client->dev, "failed to request pwdn GPIO\n"); - return ret; - } - } - - ret = s5k8aa_detect(s5k8aa); - if (ret) { - dev_err(&client->dev, "sensor detection failed\n"); - return ret; - } - - v4l2_i2c_subdev_init(&s5k8aa->subdev, client, &s5k8aa_subdev_ops); - - s5k8aa->pad.flags = MEDIA_PAD_FL_SOURCE; - ret = media_entity_init(&s5k8aa->subdev.entity, 1, &s5k8aa->pad, 0); - if (ret < 0) - return ret; - - s5k8aa_init_format(&s5k8aa->format); - - ret = v4l2_async_register_subdev(&s5k8aa->subdev); - if (ret < 0) { - media_entity_cleanup(&s5k8aa->subdev.entity); - return ret; - } - - return 0; -} - -static int s5k8aa_remove(struct i2c_client *client) -{ - struct v4l2_subdev *subdev = i2c_get_clientdata(client); - - v4l2_async_unregister_subdev(subdev); - media_entity_cleanup(&subdev->entity); - - return 0; -} - -static const struct i2c_device_id s5k8aa_idtable[] = { - {"s5k8aay", 0}, - {} -}; - -MODULE_DEVICE_TABLE(i2c, s5k8aa_idtable); - -static struct i2c_driver s5k8aa_driver = { - .driver = { - .name = "s5k8aay", - }, - .probe = s5k8aa_probe, - .remove = s5k8aa_remove, - .id_table = s5k8aa_idtable, -}; - -module_i2c_driver(s5k8aa_driver); - -MODULE_DESCRIPTION("Samsumg S5K8AA Camera Driver"); -MODULE_LICENSE("GPL"); -- cgit v1.2.3