Files
linux-nv-oot/drivers/media/i2c/ar0234_mode_tbls.h
Praveen AC e31d73fa20 media: i2c: ar0234: Fix dual hawk corruption
- Fixes the frame corruption issue encountered
  when simultaneously streaming from two
  hawks via E3653 GMSL2 board
- Route each serializer output to a different
  deserializer output CSI port instead of
  routing video data from both serializers
  to the same deserializer output port
- Route data through two virtual channels for
  each of the two output ports instead of four
  virtual channels all through a single output
  port
- Fix serdes programming comments

Bug 4032165
Bug 3753423
JEC-286

Change-Id: I7b4e929e9f5330cc6eb0aa72646ce429a713df7a
Signed-off-by: Praveen AC <pac@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3072829
Reviewed-by: Ankur Pawar <ankurp@nvidia.com>
Reviewed-by: Anubhav Rai <arai@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2024-02-08 22:54:15 -08:00

700 lines
19 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2018-2024, NVIDIA CORPORATION & AFFILIATES. All Rights Reserved. */
/*
* ar0234_mode_tbls.h - ar0234 sensor mode tables
*/
#ifndef __AR0234_I2C_TABLES__
#define __AR0234_I2C_TABLES__
#include <media/camera_common.h>
#define AR0234_TABLE_WAIT_MS 0xff00
#define AR0234_TABLE_END 0xff01
#define AR0234_MAX_RETRIES 3
#define AR0234_WAIT_MS_STOP 1
#define AR0234_WAIT_MS_START 30
#define AR0234_WAIT_MS_STREAM 210
#define AR0234_GAIN_TABLE_SIZE 255
#define AR0234_EEPROM_ADDRESS 0x54
#define AR0234_EEPROM_ADDRESS_R 0x58
#define AR0234_EEPROM_SIZE 512
#define AR0234_EEPROM_STR_SIZE (AR0234_EEPROM_SIZE * 2)
#define AR0234_EEPROM_BLOCK_SIZE (1 << 8)
#define AR0234_EEPROM_NUM_BLOCKS \
(AR0234_EEPROM_SIZE / AR0234_EEPROM_BLOCK_SIZE)
#define ar0234_reg struct reg_16
struct index_reg_8 {
u16 source;
u16 addr;
u16 val;
};
static struct index_reg_8 ar0234_start[] = {
{0x06, 0x30ce, 0x0120},
{0x06, 0x301A, 0x295C}, // RESET_REGISTER
{0x00, AR0234_TABLE_END, 0x00}
};
static struct index_reg_8 ar0234_stop[] = {
{0x06, 0x301a, 0x2058},
{0x00, AR0234_TABLE_END, 0x00}
};
static struct index_reg_8 ar0234_Double_Dser_Ser[] = {
{0x52, 0x1458, 0x28},
{0x52, 0x1459, 0x68},
{0x52, 0x1558, 0x28},
{0x52, 0x1559, 0x68},
{0x52, 0x1658, 0x28},
{0x52, 0x1659, 0x68},
{0x52, 0x1758, 0x28},
{0x52, 0x1759, 0x68},
{0x52, 0x0018, 0x0F}, // Oneshot reset
{0x52, 0x0006, 0xF3}, // Enable links A and B
{0x52, 0x0001, 0xcc}, // disable the i2c2
{0x52, 0x0003, 0xAE}, // Disable CC to link B
{0x80, 0x0000, 0x84}, // Link A serializer address is 0x84
{0x52, 0x0003, 0xAB}, // Disable CC to link A
{0x80, 0x0000, 0x88}, // Link B serializer address is 0x88
{0x52, 0x0003, 0xAA}, // Enable CC to links A and B
{0x84, 0x0002, 0x33}, // Enable pipes X and Y
{0x84, 0x0308, 0x7E}, // Pipe X pulls clock from port A, pipe Y from port B
{0x84, 0x0311, 0x21}, // Pipe X pulls data from port A, pipe Y from port B
{0x84, 0x0316, 0x6b}, // RAW10 to pipe Y
{0x84, 0x0314, 0x6b}, // RAW10 to pipe X
{0x88, 0x0002, 0x33}, // Enable pipes X and Y
{0x88, 0x0308, 0x7E}, // Pipe X pulls clock from port A, pipe Y from port B
{0x88, 0x0311, 0x21}, // Pipe X pulls data from port A, pipe Y from port B
{0x88, 0x0316, 0x6b}, // RAW10 to pipe Y
{0x88, 0x0314, 0x6b}, // RAW10 to pipe X
{0x52, 0x00F4, 0x0f}, // Enable pipes 0-3 in deserializer
{0x52, 0x00F0, 0x10}, // Link A ID 0 to pipe 0 // Link A ID 1 to pipe 1
{0x52, 0x00F1, 0x54}, // Link B ID 0 to pipe 2 // Link B ID 1 to pipe 3
{0x52, 0x08A0, 0x01}, // CSI output is 4x2
{0x52, 0x08A3, 0x44}, // Default 4x2 lane mapping
{0x52, 0x08A4, 0x44}, // Default 4x2 lane mapping
{0x52, 0x090A, 0x40},
{0x52, 0x094A, 0x40}, // 2 lanes on port D
{0x52, 0x098A, 0x40}, // 2 lanes on port E
{0x52, 0x09CA, 0x40},
{0x52, 0x1D00, 0xF4},
{0x52, 0x1E00, 0xF4},
{0x52, 0x0415, 0x39},
{0x52, 0x0418, 0x39}, // Date rate is 2500Mbps/lane on port D
{0x52, 0x041B, 0x39}, // Data rate is 2500Mbps/lane on port E
{0x52, 0x041E, 0x39},
{0x52, 0x1D00, 0xF5},
{0x52, 0x1E00, 0xF5},
{0x52, 0x090B, 0x07}, // Enable 3 mappings Pipe 0//video2
{0x52, 0x092D, 0x00}, // All mappings to controller 0 (port C)
{0x52, 0x090D, 0x2B}, // Input RAW10, VC0
{0x52, 0x090E, 0x2B}, // Output RAW10, VC0
{0x52, 0x090F, 0x00}, // Input FS, VC0
{0x52, 0x0910, 0x00}, // Output FS, VC0
{0x52, 0x0911, 0x01}, // Input FE, VC0
{0x52, 0x0912, 0x01}, // Output FE, VC0
{0x52, 0x094B, 0x07}, // Enable 3 mappings Pipe 1 //video3
{0x52, 0x096D, 0x00}, // All mappings to controller 0 (port C)
{0x52, 0x094D, 0x2B}, // Input RAW10, VC0
{0x52, 0x094E, 0x6B}, // Output RAW10, VC1
{0x52, 0x094F, 0x00}, // Input FS, VC0
{0x52, 0x0950, 0x40}, // Output FS, VC1
{0x52, 0x0951, 0x01}, // Input FE, VC0
{0x52, 0x0952, 0x41}, // Output FE, VC1
{0x52, 0x098B, 0x07}, // Enable 3 mappings Pipe 2 //video1
{0x52, 0x09AD, 0x15}, // All mappings to controller 1 (port D)
{0x52, 0x098D, 0x2B}, // Input RAW10, VC0
{0x52, 0x098E, 0x2B}, // Output RAW10, VC0
{0x52, 0x098F, 0x00}, // Input FS, VC0
{0x52, 0x0990, 0x00}, // Output FS, VC0
{0x52, 0x0991, 0x01}, // Input FE, VC0
{0x52, 0x0992, 0x01}, // Output FE, VC0
{0x52, 0x09CB, 0x07}, // Enable 3 mappings Pipe 3 //video0
{0x52, 0x09ED, 0x15}, // All mappings to controller 1 (port D)
{0x52, 0x09CD, 0x2B}, // Input RAW10, VC0
{0x52, 0x09CE, 0x6B}, // Output RAW10, VC1
{0x52, 0x09CF, 0x00}, // Input FS, VC0
{0x52, 0x09D0, 0x40}, // Output FS, VC1
{0x52, 0x09D1, 0x01}, // Input FE, VC0
{0x52, 0x09D2, 0x41}, // Output FE, VC1
{0x52, 0x08A2, 0xF0},
{0x84, 0x02be, 0x90}, // Enable sensor power down pin.
{0x84, 0x02bf, 0x60}, // Enable sensor reset pin.
{0x84, 0x02ca, 0x80}, // Enable sensor power down pin.
{0x84, 0x02cb, 0x60}, // Enable sensor reset pin.
{0x84, 0x02d3, 0x90}, // Enable sensor power down pin.
{0x84, 0x02d4, 0x60}, // Enable sensor reset pin.
{0x84, 0x02d6, 0x90}, // Enable sensor power down pin.
{0x84, 0x02d7, 0x60}, // Enable sensor reset pin.
{0x88, 0x02be, 0x90}, // Enable sensor power down pin.
{0x88, 0x02bf, 0x60}, // Enable sensor reset pin.
{0x88, 0x02ca, 0x80}, // Enable sensor power down pin.
{0x88, 0x02cb, 0x60}, // Enable sensor reset pin.
{0x88, 0x02d3, 0x90}, // Enable sensor power down pin.
{0x88, 0x02d4, 0x60}, // Enable sensor reset pin.
{0x88, 0x02d6, 0x90}, // Enable sensor power down pin.
{0x88, 0x02d7, 0x60}, // Enable sensor reset pin.
{0x52, 0x04AF, 0xC0}, // AUTO_FS_LINKS = 0, FS_USE_XTAL = 1, FS_LINK_[3:0] = 0
{0x52, 0x04A0, 0x00}, // Manual frame sync, no pin output
{0x52, 0x04A2, 0x00}, // Turn off auto master link selection
{0x52, 0x04AA, 0x00}, // OVLP window = 0
{0x52, 0x04AB, 0x00},
{0x52, 0x04A5, 0x35}, // 30Hz FSYNC
{0x52, 0x04A6, 0xB7},
{0x52, 0x04A7, 0x0C},
{0x84, 0x02D9, 0x04},
{0x84, 0x02DB, 0x08},
{0x84, 0x02Dc, 0x04},
{0x84, 0x02De, 0x08}, // MFP8 for FSIN
{0x88, 0x02D9, 0x04},
{0x88, 0x02DB, 0x08},
{0x88, 0x02Dc, 0x04},
{0x88, 0x02De, 0x08}, // MFP8 for FSIN
{0x52, 0x04B1, 0x40}, // FSYNC TX ID is 8
{0x84, 0x0042, 0xB0}, // eeprom i2c map
{0x84, 0x0043, 0xA8},
{0x84, 0x0044, 0xB2},
{0x84, 0x0045, 0xAA},
{0x88, 0x0042, 0xB0}, // eeprom i2c map
{0x88, 0x0043, 0xA8},
{0x88, 0x0044, 0xB2},
{0x88, 0x0045, 0xAA},
{0x84, 0x02be, 0x83}, // hawk1(0x84) max9295D MFP0-- ACCEL interrupt
{0x84, 0x02bf, 0x11},
{0x52, 0x030c, 0x04}, // max96712 MTF4---ACCEL1 interrupt
{0x52, 0x030e, 0x11}, // MTF4
{0x84, 0x02c7, 0x83}, // hawk1(0x84)max9295D MFP3-- gyro interrupt
{0x84, 0x02c8, 0x12},
{0x52, 0x0320, 0x04}, // max96712 MTF10---gyro1 interrupt
{0x52, 0x0322, 0x12}, // MTF10
// Disable output, enable TX hawk2(0x88) max9295D MFP0-- ACCEL interrupt
{0x88, 0x02BE, 0x03},
{0x88, 0x02BF, 0x00}, // No pull-up/down, TX ID = 0
{0x52, 0x0310, 0x00}, // Enable output max96712 MTF5---ACCEL2 interrupt
{0x52, 0x0347, 0x05}, // Disable TX on link B
{0x52, 0x0348, 0x60}, // Enable RX on link B, RX ID = 0
{0x88, 0x02c7, 0x03}, // hawk2(0x88)max9295D MFP3-- gyro interrupt
{0x88, 0x02c8, 0x15},
{0x52, 0x0313, 0x00},
{0x52, 0x034A, 0x05}, // max96712 MTF6---gyro2 interrupt
{0x52, 0x034B, 0x75}, // MTF6
{0x52, 0x0003, 0xFF}, // enable i2c channel B
{0x52, 0x0007, 0x20},
{0x52, 0x0003, 0xF6},
{0x00, AR0234_TABLE_END, 0x00 }
};
static struct index_reg_8 ar0234_Single_Dser_Ser[] = {
{0x52, 0x1458, 0x28},
{0x52, 0x1459, 0x68},
{0x52, 0x1558, 0x28},
{0x52, 0x1559, 0x68},
{0x52, 0x1658, 0x28},
{0x52, 0x1659, 0x68},
{0x52, 0x1758, 0x28},
{0x52, 0x1759, 0x68},
{0x52, 0x0018, 0x0F},
{0x52, 0x0006, 0xF1},
{0x52, 0x0001, 0xcc}, // disable the i2c2
{0x80, 0x0010, 0x21},
{0x80, 0x0330, 0x06},
{0x80, 0x0332, 0x4E},
{0x80, 0x0333, 0xE4},
{0x80, 0x0331, 0x77},
{0x80, 0x0311, 0x41},
{0x80, 0x0308, 0x74},
{0x80, 0x0314, 0x2B},
{0x80, 0x0316, 0x22},
{0x80, 0x0318, 0x2B},
{0x80, 0x031A, 0x22},
{0x80, 0x0002, 0xff},
{0x80, 0x0053, 0x10},
{0x80, 0x0057, 0x11},
{0x80, 0x005B, 0x12},
{0x80, 0x005F, 0x13},
{0x52, 0x00F0, 0x20}, // pipx--pip0 pipz--pip1 gmsl phy A
{0x52, 0x00F4, 0x03}, // enable pip 0/1
{0x52, 0x08A0, 0x01},
{0x52, 0x08A3, 0x44},
{0x52, 0x08A4, 0x44},
{0x52, 0x090A, 0x40},
{0x52, 0x094A, 0x40},
{0x52, 0x098A, 0x40},
{0x52, 0x09CA, 0x40},
{0x52, 0x0415, 0x2E},
{0x52, 0x0418, 0x2E},
{0x52, 0x041B, 0x2E},
{0x52, 0x041E, 0x2E},
{0x52, 0x090B, 0x07},
{0x52, 0x092D, 0x15},
{0x52, 0x090D, 0x2b},
{0x52, 0x090E, 0x2b},
{0x52, 0x090F, 0x00},
{0x52, 0x0910, 0x00},
{0x52, 0x0911, 0x01},
{0x52, 0x0912, 0x01},
{0x52, 0x094B, 0x07},
{0x52, 0x096D, 0x15},
{0x52, 0x094D, 0x2b},
{0x52, 0x094E, 0x6b},
{0x52, 0x094F, 0x00},
{0x52, 0x0950, 0x40},
{0x52, 0x0951, 0x01},
{0x52, 0x0952, 0x41},
{0x80, 0x02be, 0x90}, // Enable sensor power down pin.
{0x80, 0x02bf, 0x60}, // Enable sensor reset pin.
{0x80, 0x02ca, 0x80}, // Enable sensor power down pin.
{0x80, 0x02cb, 0x60}, // Enable sensor reset pin.
{0x80, 0x02d3, 0x90}, // Enable sensor power down pin.
{0x80, 0x02d4, 0x60}, // Enable sensor reset pin.
{0x80, 0x02d6, 0x90}, // Enable sensor power down pin.
{0x80, 0x02d7, 0x60}, // Enable sensor reset pin.
{0x52, 0x04AF, 0xC0}, // AUTO_FS_LINKS = 0, FS_USE_XTAL = 1, FS_LINK_[3:0] = 0
{0x52, 0x04A0, 0x04}, // Manual frame sync, output on MFP2
{0x52, 0x04A2, 0x00}, // Turn off auto master link selection
{0x52, 0x04AA, 0x00}, // OVLP window = 0
{0x52, 0x04AB, 0x00},
{0x52, 0x04A5, 0x35}, // 30Hz FSYNC
{0x52, 0x04A6, 0xB7},
{0x52, 0x04A7, 0x0C},
{0x80, 0x02D9, 0x04},
{0x80, 0x02DB, 0x08}, // MFP8 for FSIN
{0x80, 0x02Dc, 0x04},
{0x80, 0x02De, 0x08}, // MFP8 for FSIN
{0x52, 0x04B1, 0x40}, // FSYNC TX ID is 8
{0x80, 0x0042, 0xB0}, // eeprom i2c map eeporm have two i2c address
{0x80, 0x0043, 0xA8},
{0x80, 0x0044, 0xB2},
{0x80, 0x0045, 0xAA},
{0x80, 0x02be, 0x83}, // hawk1(0x84) max9295D MFP0-- ACCEL interrupt
{0x80, 0x02bf, 0x11},
{0x52, 0x030c, 0x04}, // max96712 MTF4---ACCEL1 interrupt
{0x52, 0x030e, 0x11}, // MTF4
{0x80, 0x02c7, 0x83}, // hawk1(0x84)max9295D MFP3-- gyro interrupt
{0x80, 0x02c8, 0x12},
{0x52, 0x0320, 0x04}, // max96712 MTF10---gyro1 interrupt
{0x52, 0x0322, 0x12}, // MTF10
{0x00, AR0234_TABLE_END, 0x00 }
};
static struct index_reg_8 ar0234_1920x1080_crop_30fps[] = {
{0x06, 0x301A, 0x00D9},
{0x06, AR0234_TABLE_WAIT_MS, 100},
{0x06, 0x3F4C, 0x121F},
{0x06, 0x3F4E, 0x121F},
{0x06, 0x3F50, 0x0B81},
{0x06, 0x31E0, 0x0003},
{0x06, 0x31E0, 0x0003},
{0x06, 0x30B0, 0x0028},
{0x06, 0x3088, 0x8000},
{0x06, 0x3086, 0xC1AE},
{0x06, 0x3086, 0x327F},
{0x06, 0x3086, 0x5780},
{0x06, 0x3086, 0x272F},
{0x06, 0x3086, 0x7416},
{0x06, 0x3086, 0x7E13},
{0x06, 0x3086, 0x8000},
{0x06, 0x3086, 0x307E},
{0x06, 0x3086, 0xFF80},
{0x06, 0x3086, 0x20C3},
{0x06, 0x3086, 0xB00E},
{0x06, 0x3086, 0x8190},
{0x06, 0x3086, 0x1643},
{0x06, 0x3086, 0x1651},
{0x06, 0x3086, 0x9D3E},
{0x06, 0x3086, 0x9545},
{0x06, 0x3086, 0x2209},
{0x06, 0x3086, 0x3781},
{0x06, 0x3086, 0x9016},
{0x06, 0x3086, 0x4316},
{0x06, 0x3086, 0x7F90},
{0x06, 0x3086, 0x8000},
{0x06, 0x3086, 0x387F},
{0x06, 0x3086, 0x1380},
{0x06, 0x3086, 0x233B},
{0x06, 0x3086, 0x7F93},
{0x06, 0x3086, 0x4502},
{0x06, 0x3086, 0x8000},
{0x06, 0x3086, 0x7FB0},
{0x06, 0x3086, 0x8D66},
{0x06, 0x3086, 0x7F90},
{0x06, 0x3086, 0x8192},
{0x06, 0x3086, 0x3C16},
{0x06, 0x3086, 0x357F},
{0x06, 0x3086, 0x9345},
{0x06, 0x3086, 0x0280},
{0x06, 0x3086, 0x007F},
{0x06, 0x3086, 0xB08D},
{0x06, 0x3086, 0x667F},
{0x06, 0x3086, 0x9081},
{0x06, 0x3086, 0x8237},
{0x06, 0x3086, 0x4502},
{0x06, 0x3086, 0x3681},
{0x06, 0x3086, 0x8044},
{0x06, 0x3086, 0x1631},
{0x06, 0x3086, 0x4374},
{0x06, 0x3086, 0x1678},
{0x06, 0x3086, 0x7B7D},
{0x06, 0x3086, 0x4502},
{0x06, 0x3086, 0x450A},
{0x06, 0x3086, 0x7E12},
{0x06, 0x3086, 0x8180},
{0x06, 0x3086, 0x377F},
{0x06, 0x3086, 0x1045},
{0x06, 0x3086, 0x0A0E},
{0x06, 0x3086, 0x7FD4},
{0x06, 0x3086, 0x8024},
{0x06, 0x3086, 0x0E82},
{0x06, 0x3086, 0x9CC2},
{0x06, 0x3086, 0xAFA8},
{0x06, 0x3086, 0xAA03},
{0x06, 0x3086, 0x430D},
{0x06, 0x3086, 0x2D46},
{0x06, 0x3086, 0x4316},
{0x06, 0x3086, 0x5F16},
{0x06, 0x3086, 0x530D},
{0x06, 0x3086, 0x1660},
{0x06, 0x3086, 0x401E},
{0x06, 0x3086, 0x2904},
{0x06, 0x3086, 0x2984},
{0x06, 0x3086, 0x81E7},
{0x06, 0x3086, 0x816F},
{0x06, 0x3086, 0x1706},
{0x06, 0x3086, 0x81E7},
{0x06, 0x3086, 0x7F81},
{0x06, 0x3086, 0x5C0D},
{0x06, 0x3086, 0x5754},
{0x06, 0x3086, 0x495F},
{0x06, 0x3086, 0x5305},
{0x06, 0x3086, 0x5307},
{0x06, 0x3086, 0x4D2B},
{0x06, 0x3086, 0xF810},
{0x06, 0x3086, 0x164C},
{0x06, 0x3086, 0x0755},
{0x06, 0x3086, 0x562B},
{0x06, 0x3086, 0xB82B},
{0x06, 0x3086, 0x984E},
{0x06, 0x3086, 0x1129},
{0x06, 0x3086, 0x9460},
{0x06, 0x3086, 0x5C09},
{0x06, 0x3086, 0x5C1B},
{0x06, 0x3086, 0x4002},
{0x06, 0x3086, 0x4500},
{0x06, 0x3086, 0x4580},
{0x06, 0x3086, 0x29B6},
{0x06, 0x3086, 0x7F80},
{0x06, 0x3086, 0x4004},
{0x06, 0x3086, 0x7F88},
{0x06, 0x3086, 0x4109},
{0x06, 0x3086, 0x5C0B},
{0x06, 0x3086, 0x29B2},
{0x06, 0x3086, 0x4115},
{0x06, 0x3086, 0x5C03},
{0x06, 0x3086, 0x4105},
{0x06, 0x3086, 0x5F2B},
{0x06, 0x3086, 0x902B},
{0x06, 0x3086, 0x8081},
{0x06, 0x3086, 0x6F40},
{0x06, 0x3086, 0x1041},
{0x06, 0x3086, 0x0160},
{0x06, 0x3086, 0x29A2},
{0x06, 0x3086, 0x29A3},
{0x06, 0x3086, 0x5F4D},
{0x06, 0x3086, 0x1C17},
{0x06, 0x3086, 0x0281},
{0x06, 0x3086, 0xE729},
{0x06, 0x3086, 0x8345},
{0x06, 0x3086, 0x8840},
{0x06, 0x3086, 0x0F7F},
{0x06, 0x3086, 0x8A40},
{0x06, 0x3086, 0x2345},
{0x06, 0x3086, 0x8024},
{0x06, 0x3086, 0x4008},
{0x06, 0x3086, 0x7F88},
{0x06, 0x3086, 0x5D29},
{0x06, 0x3086, 0x9288},
{0x06, 0x3086, 0x102B},
{0x06, 0x3086, 0x0489},
{0x06, 0x3086, 0x165C},
{0x06, 0x3086, 0x4386},
{0x06, 0x3086, 0x170B},
{0x06, 0x3086, 0x5C03},
{0x06, 0x3086, 0x8A48},
{0x06, 0x3086, 0x4D4E},
{0x06, 0x3086, 0x2B80},
{0x06, 0x3086, 0x4C09},
{0x06, 0x3086, 0x4119},
{0x06, 0x3086, 0x816F},
{0x06, 0x3086, 0x4110},
{0x06, 0x3086, 0x4001},
{0x06, 0x3086, 0x6029},
{0x06, 0x3086, 0x8229},
{0x06, 0x3086, 0x8329},
{0x06, 0x3086, 0x435C},
{0x06, 0x3086, 0x055F},
{0x06, 0x3086, 0x4D1C},
{0x06, 0x3086, 0x81E7},
{0x06, 0x3086, 0x4502},
{0x06, 0x3086, 0x8180},
{0x06, 0x3086, 0x7F80},
{0x06, 0x3086, 0x410A},
{0x06, 0x3086, 0x9144},
{0x06, 0x3086, 0x1609},
{0x06, 0x3086, 0x2FC3},
{0x06, 0x3086, 0xB130},
{0x06, 0x3086, 0xC3B1},
{0x06, 0x3086, 0x0343},
{0x06, 0x3086, 0x164A},
{0x06, 0x3086, 0x0A43},
{0x06, 0x3086, 0x160B},
{0x06, 0x3086, 0x4316},
{0x06, 0x3086, 0x8F43},
{0x06, 0x3086, 0x1690},
{0x06, 0x3086, 0x4316},
{0x06, 0x3086, 0x7F81},
{0x06, 0x3086, 0x450A},
{0x06, 0x3086, 0x410F},
{0x06, 0x3086, 0x7F83},
{0x06, 0x3086, 0x5D29},
{0x06, 0x3086, 0x4488},
{0x06, 0x3086, 0x102B},
{0x06, 0x3086, 0x0453},
{0x06, 0x3086, 0x0D40},
{0x06, 0x3086, 0x2345},
{0x06, 0x3086, 0x0240},
{0x06, 0x3086, 0x087F},
{0x06, 0x3086, 0x8053},
{0x06, 0x3086, 0x0D89},
{0x06, 0x3086, 0x165C},
{0x06, 0x3086, 0x4586},
{0x06, 0x3086, 0x170B},
{0x06, 0x3086, 0x5C05},
{0x06, 0x3086, 0x8A60},
{0x06, 0x3086, 0x4B91},
{0x06, 0x3086, 0x4416},
{0x06, 0x3086, 0x09C1},
{0x06, 0x3086, 0x2CA9},
{0x06, 0x3086, 0xAB30},
{0x06, 0x3086, 0x51B3},
{0x06, 0x3086, 0x3D5A},
{0x06, 0x3086, 0x7E3D},
{0x06, 0x3086, 0x7E19},
{0x06, 0x3086, 0x8000},
{0x06, 0x3086, 0x8B1F},
{0x06, 0x3086, 0x2A1F},
{0x06, 0x3086, 0x83A2},
{0x06, 0x3086, 0x7516},
{0x06, 0x3086, 0xAD33},
{0x06, 0x3086, 0x450A},
{0x06, 0x3086, 0x7F53},
{0x06, 0x3086, 0x8023},
{0x06, 0x3086, 0x8C66},
{0x06, 0x3086, 0x7F13},
{0x06, 0x3086, 0x8184},
{0x06, 0x3086, 0x1481},
{0x06, 0x3086, 0x8031},
{0x06, 0x3086, 0x3D64},
{0x06, 0x3086, 0x452A},
{0x06, 0x3086, 0x9451},
{0x06, 0x3086, 0x9E96},
{0x06, 0x3086, 0x3D2B},
{0x06, 0x3086, 0x3D1B},
{0x06, 0x3086, 0x529F},
{0x06, 0x3086, 0x0E3D},
{0x06, 0x3086, 0x083D},
{0x06, 0x3086, 0x167E},
{0x06, 0x3086, 0x307E},
{0x06, 0x3086, 0x1175},
{0x06, 0x3086, 0x163E},
{0x06, 0x3086, 0x970E},
{0x06, 0x3086, 0x82B2},
{0x06, 0x3086, 0x3D7F},
{0x06, 0x3086, 0xAC3E},
{0x06, 0x3086, 0x4502},
{0x06, 0x3086, 0x7E11},
{0x06, 0x3086, 0x7FD0},
{0x06, 0x3086, 0x8000},
{0x06, 0x3086, 0x8C66},
{0x06, 0x3086, 0x7F90},
{0x06, 0x3086, 0x8194},
{0x06, 0x3086, 0x3F44},
{0x06, 0x3086, 0x1681},
{0x06, 0x3086, 0x8416},
{0x06, 0x3086, 0x2C2C},
{0x06, 0x3086, 0x2C2C},
{0x06, 0x302A, 0x0005},
{0x06, 0x302C, 0x0001},
{0x06, 0x302E, 0x0003},
{0x06, 0x3030, 0x0096}, // PLL multiplier
{0x06, 0x302E, 0x0006}, // PLL input pre-divider value
{0x06, 0x302C, 0x0004}, // P1 divider
{0x06, 0x302A, 0x0005}, // P2 divider
{0x06, 0x3038, 0x0004}, // P3 divider
{0x06, 0x3036, 0x000A}, // WCD divider
{0x06, 0x31B0, 0x002F}, // Frame preamble
{0x06, 0x31B2, 0x002C}, // Line preamble
{0x06, 0x31B4, 0x1144}, // MIPI timing 0
{0x06, 0x31B6, 0x00C7}, // MIPI timing 1
{0x06, 0x31B8, 0x3047}, // MIPI timing 2
{0x06, 0x31BA, 0x0103}, // MIPI timing 3
{0x06, 0x31BC, 0x8583}, // MIPI timing 4
{0x06, 0x31AE, 0x0204}, // 4-lane MIPI
{0x06, 0x3002, 0x0008}, // Y_ADDR_START = 8
{0x06, 0x3004, 0x0008}, // X_ADDR_START = 8
{0x06, 0x3006, 0x04B7}, // Y_ADDR_END = 1207
{0x06, 0x3008, 0x0787}, // X_ADDR_END = 1927
{0x06, 0x300A, 0x04C6}, // FRAME_LENGTH_LINES = 1220
{0x06, 0x300C, 0x0264}, // LINE_LENGTH_PCK = 612
{0x06, 0x3012, 0x02DC}, // COARSE_INTEGRATION_TIME = 732
{0x06, 0x31AC, 0x0A0A}, // DATA_FORMAT_BITS = 2570
{0x06, 0x306E, 0x9010}, // DATAPATH_SELECT = 36880
{0x06, 0x30A2, 0x0001}, // X_ODD_INC = 1
{0x06, 0x30A6, 0x0001}, // Y_ODD_INC = 1
{0x06, 0x3082, 0x0003}, // OPERATION_MODE_CTRL = 3
{0x06, 0x3040, 0x0000}, // READ_MODE = 0
{0x06, 0x31D0, 0x0000}, // COMPANDING = 0
{0x06, 0x3044, 0x0410},
{0x06, 0x3094, 0x03D4},
{0x06, 0x3096, 0x0480},
{0x06, 0x30BA, 0x7602},
{0x06, 0x30B0, 0x0028},
{0x06, 0x30FE, 0x002A},
{0x06, 0x31DE, 0x0410},
{0x06, 0x3ED6, 0x1435},
{0x06, 0x3ED8, 0x9865},
{0x06, 0x3EDA, 0x7698},
{0x06, 0x3EDC, 0x99FF},
{0x06, 0x3EE2, 0xBB88},
{0x06, 0x3EE4, 0x8836},
{0x06, 0x3EF0, 0x1CF0},
{0x06, 0x3EF2, 0x0000},
{0x06, 0x3EF8, 0x6166},
{0x06, 0x3EFA, 0x3333},
{0x06, 0x3EFC, 0x6634},
{0x06, 0x3276, 0x05DC},
{0x06, 0x3F00, 0x9D05},
{0x06, 0x3ED2, 0xFA86},
{0x06, 0x3EEE, 0xA4FE},
{0x06, 0x30BA, 0x7602},
{0x06, 0x3180, 0xC24F},
{0x06, 0x3ECC, 0x6E42},
{0x06, 0x3ECC, 0x0E42},
{0x06, 0x3EEC, 0x0C0C},
{0x06, 0x3EE8, 0xAAE4},
{0x06, 0x3EE6, 0x3363},
{0x06, 0x3EE6, 0x3363},
{0x06, 0x3EE8, 0xAAE4},
{0x06, 0x3EE8, 0xAAE4},
{0x06, 0x3102, 0x5000},
{0x06, 0x3060, 0x000D},
{0x06, 0x3ED0, 0xFF44},
{0x06, 0x3ED2, 0xAA86},
{0x06, 0x3ED4, 0x031F},
{0x06, 0x3EEE, 0xA4AA},
{0x06, 0x301a, 0x2058},
{0x00, AR0234_TABLE_END, 0x00},
};
static struct index_reg_8 tp_colorbars[] = {
{0x06, 0x3070, 0x2},
{0x00, AR0234_TABLE_END, 0x00},
};
enum {
AR0234_MODE_1920X1080_CROP_30FPS,
AR0234_MODE_START_STREAM,
AR0234_MODE_STOP_STREAM,
AR0234_MODE_Dser_Ser,
AR0234_MODE_Single_Dser_Ser,
AR0234_MODE_TEST_PATTERN
};
static struct index_reg_8 *mode_table[] = {
[AR0234_MODE_1920X1080_CROP_30FPS]
= ar0234_1920x1080_crop_30fps,
[AR0234_MODE_START_STREAM]
= ar0234_start,
[AR0234_MODE_STOP_STREAM]
= ar0234_stop,
[AR0234_MODE_Dser_Ser] = ar0234_Double_Dser_Ser,
[AR0234_MODE_Single_Dser_Ser] = ar0234_Single_Dser_Ser,
[AR0234_MODE_TEST_PATTERN] = tp_colorbars,
};
static const int ar0234_30fps[] = {
30,
};
static const int ar0234_36fps[] = {
36,
};
static const int ar0234_18fps[] = {
18,
};
static const int ar0234_60fps[] = {
60,
};
static const int ar0234_120fps[] = {
120,
};
static const struct camera_common_frmfmt ar0234_frmfmt[] = {
{{1920, 1200}, ar0234_60fps, 1, 0, AR0234_MODE_1920X1080_CROP_30FPS},
};
#endif /* __AR0234_I2C_TABLES__ */