Understood. Thank you Tomasz too.

-----Original Message-----
From: Tomasz Figa [mailto:tf...@chromium.org] 
Sent: Friday, March 9, 2018 6:48 PM
To: Yeh, Andy <andy....@intel.com>
Cc: Sakari Ailus <sakari.ai...@linux.intel.com>; Linux Media Mailing List 
<linux-media@vger.kernel.org>; Chen, JasonX Z <jasonx.z.c...@intel.com>; 
Chiang, AlanX <alanx.chi...@intel.com>; Lai, Jim <jim....@intel.com>
Subject: Re: [PATCH v8] media: imx258: Add imx258 camera sensor driver

On Fri, Mar 9, 2018 at 7:46 PM, Yeh, Andy <andy....@intel.com> wrote:
> Hi Tomasz,
>
> My apology. Actually I obsoleted this [V8] 
> https://patchwork.linuxtv.org/patch/47768/ just after submitted.
> Since I found few comments as what you pointed below were not addressed yet.
> Didn’t expect you to check this. I shall send an email to notify you two the 
> obsolete state as well.
>
> We are working on addressing all those outstanding comments. Almost done.
> Will do reply v6 with OKAY, and send to list a new v7 with all fixed.
>

Thank you. Looking forward to next version then! (By the way, I still think 
that replying to review comments, even with a simple "Okay" is a good practice. 
:))

Best regards,
Tomasz

>
> Regards, Andy
>
> -----Original Message-----
> From: Tomasz Figa [mailto:tf...@chromium.org]
> Sent: Friday, March 9, 2018 6:20 PM
> To: Sakari Ailus <sakari.ai...@linux.intel.com>
> Cc: Yeh, Andy <andy....@intel.com>; Linux Media Mailing List 
> <linux-media@vger.kernel.org>; Chen, JasonX Z 
> <jasonx.z.c...@intel.com>; Chiang, AlanX <alanx.chi...@intel.com>
> Subject: Re: [PATCH v8] media: imx258: Add imx258 camera sensor driver
>
> Hi Andy, Sakari,
>
> On Fri, Mar 9, 2018 at 5:54 PM, Sakari Ailus <sakari.ai...@linux.intel.com> 
> wrote:
>> Hi Andy,
>>
>> Thanks for the update. Please see my comments below.
>>
>> On Fri, Mar 09, 2018 at 12:15:54AM +0800, Andy Yeh wrote:
>>> Add a V4L2 sub-device driver for the Sony IMX258 image sensor.
>>> This is a camera sensor using the I2C bus for control and the
>>> CSI-2 bus for data.
>>>
>>> Signed-off-by: Jason Chen <jasonx.z.c...@intel.com>
>>> Signed-off-by: Alan Chiang <alanx.chi...@intel.com>
>>> ---
>>> since v2:
>>> -- Update the streaming function to remove SW_STANDBY in the beginning.
>>> -- Adjust the delay time from 1ms to 12ms before set stream-on register.
>>> since v3:
>>> -- fix the sd.entity to make code be compiled on the mainline kernel.
>>> since v4:
>>> -- Enabled AG, DG, and Exposure time control correctly.
>>> since v5:
>>> -- Sensor vendor provided a new setting to fix different CLK issue
>>> -- Add one more resolution for 1048x780, used for VGA streaming 
>>> since
>>> v6:
>>> -- improve i2c write function to support writing 2 registers
>>> -- Not Orring ret in update_digital_gain which lead to unintended 
>>> error since v7:
>>> -- modified imx258_reg read / write function with a more portable 
>>> way
>>> -- arranged some format per suggestions
>>>
>>>
>>>  MAINTAINERS                |    7 +
>>>  drivers/media/i2c/Kconfig  |   11 +
>>>  drivers/media/i2c/Makefile |    1 +
>>>  drivers/media/i2c/imx258.c | 1324
>>> ++++++++++++++++++++++++++++++++++++++++++++
>>>  4 files changed, 1343 insertions(+)  create mode 100644 
>>> drivers/media/i2c/imx258.c
>>>
>>> diff --git a/MAINTAINERS b/MAINTAINERS index a339bb5..9f75510 100644
>>> --- a/MAINTAINERS
>>> +++ b/MAINTAINERS
>>> @@ -12646,6 +12646,13 @@ S:   Maintained
>>>  F:   drivers/ssb/
>>>  F:   include/linux/ssb/
>>>
>>> +SONY IMX258 SENSOR DRIVER
>>> +M:   Sakari Ailus <sakari.ai...@linux.intel.com>
>>> +L:   linux-media@vger.kernel.org
>>> +T:   git git://linuxtv.org/media_tree.git
>>> +S:   Maintained
>>> +F:   drivers/media/i2c/imx258.c
>>> +
>>>  SONY IMX274 SENSOR DRIVER
>>>  M:   Leon Luo <le...@leopardimaging.com>
>>>  L:   linux-media@vger.kernel.org
>>> diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig 
>>> index fd01842..bcd4bf1 100644
>>> --- a/drivers/media/i2c/Kconfig
>>> +++ b/drivers/media/i2c/Kconfig
>>> @@ -565,6 +565,17 @@ config VIDEO_APTINA_PLL  config VIDEO_SMIAPP_PLL
>>>       tristate
>>>
>>> +config VIDEO_IMX258
>>> +     tristate "Sony IMX258 sensor support"
>>> +     depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
>>> +     depends on MEDIA_CAMERA_SUPPORT
>>> +     ---help---
>>> +       This is a Video4Linux2 sensor-level driver for the Sony
>>> +       IMX258 camera.
>>> +
>>> +       To compile this driver as a module, choose M here: the
>>> +       module will be called imx258.
>>> +
>>>  config VIDEO_IMX274
>>>       tristate "Sony IMX274 sensor support"
>>>       depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API diff 
>>> --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile 
>>> index
>>> 1b62639..4bf7d00 100644
>>> --- a/drivers/media/i2c/Makefile
>>> +++ b/drivers/media/i2c/Makefile
>>> @@ -94,6 +94,7 @@ obj-$(CONFIG_VIDEO_IR_I2C)  += ir-kbd-i2c.o
>>>  obj-$(CONFIG_VIDEO_ML86V7667)        += ml86v7667.o
>>>  obj-$(CONFIG_VIDEO_OV2659)   += ov2659.o
>>>  obj-$(CONFIG_VIDEO_TC358743) += tc358743.o
>>> +obj-$(CONFIG_VIDEO_IMX258)   += imx258.o
>>>  obj-$(CONFIG_VIDEO_IMX274)   += imx274.o
>>>
>>>  obj-$(CONFIG_SDR_MAX2175) += max2175.o diff --git 
>>> a/drivers/media/i2c/imx258.c b/drivers/media/i2c/imx258.c new file 
>>> mode 100644 index 0000000..814520f
>>> --- /dev/null
>>> +++ b/drivers/media/i2c/imx258.c
>>> @@ -0,0 +1,1324 @@
>>> +// Copyright (C) 2018 Intel Corporation // SPDX-License-Identifier:
>>> +GPL-2.0
>>> +
>>> +#include <linux/acpi.h>
>>> +#include <linux/delay.h>
>>> +#include <linux/i2c.h>
>>> +#include <linux/module.h>
>>> +#include <linux/pm_runtime.h>
>>> +#include <media/v4l2-ctrls.h>
>>> +#include <media/v4l2-device.h>
>>> +#include <asm/unaligned.h>
>>> +
>>> +#define IMX258_REG_VALUE_08BIT               1
>>> +#define IMX258_REG_VALUE_16BIT               2
>>> +#define IMX258_REG_VALUE_24BIT               3
>>
>> The last one is not used. Perhaps because the sensor does not have 
>> any 24-bit registers? :-) How about removing it?
>
> I pointed in my earlier review comments that we don't even need these macros 
> anymore. They add as much value as defining ONE = 1 and TWO = 2.
>
> Andy, this is already a second re-spin of this patch, where my previous 
> comments are left unaddressed.
>
>>
>>> +
>>> +#define IMX258_REG_MODE_SELECT               0x0100
>>> +#define IMX258_MODE_STANDBY          0x00
>>> +#define IMX258_MODE_STREAMING                0x01
>>> +
>>> +/* Chip ID */
>>> +#define IMX258_REG_CHIP_ID           0x0016
>>> +#define IMX258_CHIP_ID                       0x0258
>>> +
>>> +/* V_TIMING internal */
>>> +#define IMX258_REG_VTS                       0x0340
>>> +#define IMX258_VTS_30FPS             0x0c98
>>> +#define IMX258_VTS_MAX                       0xffff
>>> +
>>> +/*Frame Length Line*/
>>> +#define IMX258_FLL_MIN                       0x08a6
>>> +#define IMX258_FLL_MAX                       0xffff
>>> +#define IMX258_FLL_STEP                      1
>>> +#define IMX258_FLL_DEFAULT           0x0c98
>>> +
>>> +/* HBLANK control - read only */
>>> +#define IMX258_PPL_DEFAULT           5352
>>> +
>>> +/* Exposure control */
>>> +#define IMX258_REG_EXPOSURE          0x0202
>>> +#define IMX258_EXPOSURE_MIN          4
>>> +#define IMX258_EXPOSURE_STEP         1
>>> +#define IMX258_EXPOSURE_DEFAULT              0x640
>>> +#define IMX258_EXPOSURE_MAX          65535
>>> +
>>> +/* Analog gain control */
>>> +#define IMX258_REG_ANALOG_GAIN               0x0204
>>> +#define IMX258_ANA_GAIN_MIN          0
>>> +#define IMX258_ANA_GAIN_MAX          0x1fff
>>> +#define IMX258_ANA_GAIN_STEP         1
>>> +#define IMX258_ANA_GAIN_DEFAULT              0x0
>>> +
>>> +/* Digital gain control */
>>> +#define IMX258_REG_GR_DIGITAL_GAIN   0x020e
>>> +#define IMX258_REG_R_DIGITAL_GAIN    0x0210
>>> +#define IMX258_REG_B_DIGITAL_GAIN    0x0212
>>> +#define IMX258_REG_GB_DIGITAL_GAIN   0x0214
>>> +#define IMX258_DGTL_GAIN_MIN         0
>>> +#define IMX258_DGTL_GAIN_MAX         4096   /* Max = 0xFFF */
>>> +#define IMX258_DGTL_GAIN_DEFAULT     1024
>>> +#define IMX258_DGTL_GAIN_STEP           1
>>> +
>>> +/* Orientation */
>>> +#define REG_MIRROR_FLIP_CONTROL      0x0101
>>> +#define REG_CONFIG_MIRROR_FLIP               0x03
>>> +
>>> +struct imx258_reg {
>>> +     u16 address;
>>> +     u8 val;
>>> +};
>>> +
>>> +struct imx258_reg_list {
>>> +     u32 num_of_regs;
>>> +     const struct imx258_reg *regs; };
>>> +
>>> +/* Link frequency config */
>>> +struct imx258_link_freq_config {
>>> +     u32 pixels_per_line;
>>> +
>>> +     /* PLL registers for this link frequency */
>>> +     struct imx258_reg_list reg_list; };
>>> +
>>> +/* Mode : resolution and related config&values */ struct 
>>> +imx258_mode {
>>> +     /* Frame width */
>>> +     u32 width;
>>> +     /* Frame height */
>>> +     u32 height;
>>> +
>>> +     /* V-timing */
>>> +     u32 vts_def;
>>> +     u32 vts_min;
>>> +
>>> +     /* Index of Link frequency config to be used */
>>> +     u32 link_freq_index;
>>> +     /* Default register values */
>>> +     struct imx258_reg_list reg_list; };
>>> +
>>> +/* 4208x3118 needs 1267Mbps/lane, 4 lanes */ static const struct 
>>> +imx258_reg mipi_data_rate_1267mbps[] = {
>>> +     { 0x0301, 0x05},
>>
>> If you have a space after the opening brace (which I'd recommend), 
>> you should have one before the closing one as well.
>>
>>> +     { 0x0303, 0x02},
>>> +     { 0x0305, 0x03},
>>> +     { 0x0306, 0x00},
>>> +     { 0x0307, 0xC6},
>>> +     { 0x0309, 0x0A},
>>> +     { 0x030B, 0x01},
>>> +     { 0x030D, 0x02},
>>> +     { 0x030E, 0x00},
>>> +     { 0x030F, 0xD8},
>>> +     { 0x0310, 0x00},
>>> +     { 0x0820, 0x13},
>>> +     { 0x0821, 0x4C},
>>> +     { 0x0822, 0xCC},
>>> +     { 0x0823, 0xCC},
>>> +};
>>> +
>>> +static const struct imx258_reg mipi_data_rate_640mbps[] = {
>>> +     { 0x0301, 0x05},
>>> +     { 0x0303, 0x02},
>>> +     { 0x0305, 0x03},
>>> +     { 0x0306, 0x00},
>>> +     { 0x0307, 0x64},
>>> +     { 0x0309, 0x0A},
>>> +     { 0x030B, 0x01},
>>> +     { 0x030D, 0x02},
>>> +     { 0x030E, 0x00},
>>> +     { 0x030F, 0xD8},
>>> +     { 0x0310, 0x00},
>>> +     { 0x0820, 0x0A},
>>> +     { 0x0821, 0x00},
>>> +     { 0x0822, 0x00},
>>> +     { 0x0823, 0x00},
>>> +};
>>> +
>>> +static const struct imx258_reg mode_4208x3118_regs[] = {
>>> +     { 0x0136, 0x13},
>>> +     { 0x0137, 0x33},
>>> +     { 0x3051, 0x00},
>>> +     { 0x3052, 0x00},
>>> +     { 0x4E21, 0x14},
>>> +     { 0x6B11, 0xCF},
>>> +     { 0x7FF0, 0x08},
>>> +     { 0x7FF1, 0x0F},
>>> +     { 0x7FF2, 0x08},
>>> +     { 0x7FF3, 0x1B},
>>> +     { 0x7FF4, 0x23},
>>> +     { 0x7FF5, 0x60},
>>> +     { 0x7FF6, 0x00},
>>> +     { 0x7FF7, 0x01},
>>> +     { 0x7FF8, 0x00},
>>> +     { 0x7FF9, 0x78},
>>> +     { 0x7FFA, 0x00},
>>> +     { 0x7FFB, 0x00},
>>> +     { 0x7FFC, 0x00},
>>> +     { 0x7FFD, 0x00},
>>> +     { 0x7FFE, 0x00},
>>> +     { 0x7FFF, 0x03},
>>> +     { 0x7F76, 0x03},
>>> +     { 0x7F77, 0xFE},
>>> +     { 0x7FA8, 0x03},
>>> +     { 0x7FA9, 0xFE},
>>> +     { 0x7B24, 0x81},
>>> +     { 0x7B25, 0x00},
>>> +     { 0x6564, 0x07},
>>> +     { 0x6B0D, 0x41},
>>> +     { 0x653D, 0x04},
>>> +     { 0x6B05, 0x8C},
>>> +     { 0x6B06, 0xF9},
>>> +     { 0x6B08, 0x65},
>>> +     { 0x6B09, 0xFC},
>>> +     { 0x6B0A, 0xCF},
>>> +     { 0x6B0B, 0xD2},
>>> +     { 0x6700, 0x0E},
>>> +     { 0x6707, 0x0E},
>>> +     { 0x9104, 0x00},
>>> +     { 0x4648, 0x7F},
>>> +     { 0x7420, 0x00},
>>> +     { 0x7421, 0x1C},
>>> +     { 0x7422, 0x00},
>>> +     { 0x7423, 0xD7},
>>> +     { 0x5F04, 0x00},
>>> +     { 0x5F05, 0xED},
>>> +     { 0x0112, 0x0A},
>>> +     { 0x0113, 0x0A},
>>> +     { 0x0114, 0x03},
>>> +     { 0x0342, 0x14},
>>> +     { 0x0343, 0xE8},
>>> +     { 0x0340, 0x0C},
>>> +     { 0x0341, 0x50},
>>> +     { 0x0344, 0x00},
>>> +     { 0x0345, 0x00},
>>> +     { 0x0346, 0x00},
>>> +     { 0x0347, 0x00},
>>> +     { 0x0348, 0x10},
>>> +     { 0x0349, 0x6F},
>>> +     { 0x034A, 0x0C},
>>> +     { 0x034B, 0x2E},
>>> +     { 0x0381, 0x01},
>>> +     { 0x0383, 0x01},
>>> +     { 0x0385, 0x01},
>>> +     { 0x0387, 0x01},
>>> +     { 0x0900, 0x00},
>>> +     { 0x0901, 0x11},
>>> +     { 0x0401, 0x00},
>>> +     { 0x0404, 0x00},
>>> +     { 0x0405, 0x10},
>>> +     { 0x0408, 0x00},
>>> +     { 0x0409, 0x00},
>>> +     { 0x040A, 0x00},
>>> +     { 0x040B, 0x00},
>>> +     { 0x040C, 0x10},
>>> +     { 0x040D, 0x70},
>>> +     { 0x040E, 0x0C},
>>> +     { 0x040F, 0x30},
>>> +     { 0x3038, 0x00},
>>> +     { 0x303A, 0x00},
>>> +     { 0x303B, 0x10},
>>> +     { 0x300D, 0x00},
>>> +     { 0x034C, 0x10},
>>> +     { 0x034D, 0x70},
>>> +     { 0x034E, 0x0C},
>>> +     { 0x034F, 0x30},
>>> +     { 0x0202, 0x0C},
>>> +     { 0x0203, 0x46},
>>> +     { 0x0204, 0x00},
>>> +     { 0x0205, 0x00},
>>> +     { 0x020E, 0x01},
>>> +     { 0x020F, 0x00},
>>> +     { 0x0210, 0x01},
>>> +     { 0x0211, 0x00},
>>> +     { 0x0212, 0x01},
>>> +     { 0x0213, 0x00},
>>> +     { 0x0214, 0x01},
>>> +     { 0x0215, 0x00},
>>> +     { 0x7BCD, 0x00},
>>> +     { 0x94DC, 0x20},
>>> +     { 0x94DD, 0x20},
>>> +     { 0x94DE, 0x20},
>>> +     { 0x95DC, 0x20},
>>> +     { 0x95DD, 0x20},
>>> +     { 0x95DE, 0x20},
>>> +     { 0x7FB0, 0x00},
>>> +     { 0x9010, 0x3E},
>>> +     { 0x9419, 0x50},
>>> +     { 0x941B, 0x50},
>>> +     { 0x9519, 0x50},
>>> +     { 0x951B, 0x50},
>>> +     { 0x3030, 0x00},
>>> +     { 0x3032, 0x00},
>>> +     { 0x0220, 0x00},
>>> +};
>>> +
>>> +static const struct imx258_reg mode_2104_1560_regs[] = {
>>> +     { 0x0136, 0x13},
>>> +     { 0x0137, 0x33},
>>> +     { 0x3051, 0x00},
>>> +     { 0x3052, 0x00},
>>> +     { 0x4E21, 0x14},
>>> +     { 0x6B11, 0xCF},
>>> +     { 0x7FF0, 0x08},
>>> +     { 0x7FF1, 0x0F},
>>> +     { 0x7FF2, 0x08},
>>> +     { 0x7FF3, 0x1B},
>>> +     { 0x7FF4, 0x23},
>>> +     { 0x7FF5, 0x60},
>>> +     { 0x7FF6, 0x00},
>>> +     { 0x7FF7, 0x01},
>>> +     { 0x7FF8, 0x00},
>>> +     { 0x7FF9, 0x78},
>>> +     { 0x7FFA, 0x00},
>>> +     { 0x7FFB, 0x00},
>>> +     { 0x7FFC, 0x00},
>>> +     { 0x7FFD, 0x00},
>>> +     { 0x7FFE, 0x00},
>>> +     { 0x7FFF, 0x03},
>>> +     { 0x7F76, 0x03},
>>> +     { 0x7F77, 0xFE},
>>> +     { 0x7FA8, 0x03},
>>> +     { 0x7FA9, 0xFE},
>>> +     { 0x7B24, 0x81},
>>> +     { 0x7B25, 0x00},
>>> +     { 0x6564, 0x07},
>>> +     { 0x6B0D, 0x41},
>>> +     { 0x653D, 0x04},
>>> +     { 0x6B05, 0x8C},
>>> +     { 0x6B06, 0xF9},
>>> +     { 0x6B08, 0x65},
>>> +     { 0x6B09, 0xFC},
>>> +     { 0x6B0A, 0xCF},
>>> +     { 0x6B0B, 0xD2},
>>> +     { 0x6700, 0x0E},
>>> +     { 0x6707, 0x0E},
>>> +     { 0x9104, 0x00},
>>> +     { 0x4648, 0x7F},
>>> +     { 0x7420, 0x00},
>>> +     { 0x7421, 0x1C},
>>> +     { 0x7422, 0x00},
>>> +     { 0x7423, 0xD7},
>>> +     { 0x5F04, 0x00},
>>> +     { 0x5F05, 0xED},
>>> +     { 0x0112, 0x0A},
>>> +     { 0x0113, 0x0A},
>>> +     { 0x0114, 0x03},
>>> +     { 0x0342, 0x14},
>>> +     { 0x0343, 0xE8},
>>> +     { 0x0340, 0x06},
>>> +     { 0x0341, 0x38},
>>> +     { 0x0344, 0x00},
>>> +     { 0x0345, 0x00},
>>> +     { 0x0346, 0x00},
>>> +     { 0x0347, 0x00},
>>> +     { 0x0348, 0x10},
>>> +     { 0x0349, 0x6F},
>>> +     { 0x034A, 0x0C},
>>> +     { 0x034B, 0x2E},
>>> +     { 0x0381, 0x01},
>>> +     { 0x0383, 0x01},
>>> +     { 0x0385, 0x01},
>>> +     { 0x0387, 0x01},
>>> +     { 0x0900, 0x01},
>>> +     { 0x0901, 0x12},
>>> +     { 0x0401, 0x01},
>>> +     { 0x0404, 0x00},
>>> +     { 0x0405, 0x20},
>>> +     { 0x0408, 0x00},
>>> +     { 0x0409, 0x02},
>>> +     { 0x040A, 0x00},
>>> +     { 0x040B, 0x00},
>>> +     { 0x040C, 0x10},
>>> +     { 0x040D, 0x6A},
>>> +     { 0x040E, 0x06},
>>> +     { 0x040F, 0x18},
>>> +     { 0x3038, 0x00},
>>> +     { 0x303A, 0x00},
>>> +     { 0x303B, 0x10},
>>> +     { 0x300D, 0x00},
>>> +     { 0x034C, 0x08},
>>> +     { 0x034D, 0x38},
>>> +     { 0x034E, 0x06},
>>> +     { 0x034F, 0x18},
>>> +     { 0x0202, 0x06},
>>> +     { 0x0203, 0x2E},
>>> +     { 0x0204, 0x00},
>>> +     { 0x0205, 0x00},
>>> +     { 0x020E, 0x01},
>>> +     { 0x020F, 0x00},
>>> +     { 0x0210, 0x01},
>>> +     { 0x0211, 0x00},
>>> +     { 0x0212, 0x01},
>>> +     { 0x0213, 0x00},
>>> +     { 0x0214, 0x01},
>>> +     { 0x0215, 0x00},
>>> +     { 0x7BCD, 0x01},
>>> +     { 0x94DC, 0x20},
>>> +     { 0x94DD, 0x20},
>>> +     { 0x94DE, 0x20},
>>> +     { 0x95DC, 0x20},
>>> +     { 0x95DD, 0x20},
>>> +     { 0x95DE, 0x20},
>>> +     { 0x7FB0, 0x00},
>>> +     { 0x9010, 0x3E},
>>> +     { 0x9419, 0x50},
>>> +     { 0x941B, 0x50},
>>> +     { 0x9519, 0x50},
>>> +     { 0x951B, 0x50},
>>> +     { 0x3030, 0x00},
>>> +     { 0x3032, 0x00},
>>> +     { 0x0220, 0x00},
>>> +};
>>> +
>>> +static const struct imx258_reg mode_1048_780_regs[] = {
>>> +     { 0x0136, 0x13},
>>> +     { 0x0137, 0x33},
>>> +     { 0x3051, 0x00},
>>> +     { 0x3052, 0x00},
>>> +     { 0x4E21, 0x14},
>>> +     { 0x6B11, 0xCF},
>>> +     { 0x7FF0, 0x08},
>>> +     { 0x7FF1, 0x0F},
>>> +     { 0x7FF2, 0x08},
>>> +     { 0x7FF3, 0x1B},
>>> +     { 0x7FF4, 0x23},
>>> +     { 0x7FF5, 0x60},
>>> +     { 0x7FF6, 0x00},
>>> +     { 0x7FF7, 0x01},
>>> +     { 0x7FF8, 0x00},
>>> +     { 0x7FF9, 0x78},
>>> +     { 0x7FFA, 0x00},
>>> +     { 0x7FFB, 0x00},
>>> +     { 0x7FFC, 0x00},
>>> +     { 0x7FFD, 0x00},
>>> +     { 0x7FFE, 0x00},
>>> +     { 0x7FFF, 0x03},
>>> +     { 0x7F76, 0x03},
>>> +     { 0x7F77, 0xFE},
>>> +     { 0x7FA8, 0x03},
>>> +     { 0x7FA9, 0xFE},
>>> +     { 0x7B24, 0x81},
>>> +     { 0x7B25, 0x00},
>>> +     { 0x6564, 0x07},
>>> +     { 0x6B0D, 0x41},
>>> +     { 0x653D, 0x04},
>>> +     { 0x6B05, 0x8C},
>>> +     { 0x6B06, 0xF9},
>>> +     { 0x6B08, 0x65},
>>> +     { 0x6B09, 0xFC},
>>> +     { 0x6B0A, 0xCF},
>>> +     { 0x6B0B, 0xD2},
>>> +     { 0x6700, 0x0E},
>>> +     { 0x6707, 0x0E},
>>> +     { 0x9104, 0x00},
>>> +     { 0x4648, 0x7F},
>>> +     { 0x7420, 0x00},
>>> +     { 0x7421, 0x1C},
>>> +     { 0x7422, 0x00},
>>> +     { 0x7423, 0xD7},
>>> +     { 0x5F04, 0x00},
>>> +     { 0x5F05, 0xED},
>>> +     { 0x0112, 0x0A},
>>> +     { 0x0113, 0x0A},
>>> +     { 0x0114, 0x03},
>>> +     { 0x0342, 0x14},
>>> +     { 0x0343, 0xE8},
>>> +     { 0x0340, 0x03},
>>> +     { 0x0341, 0x4C},
>>> +     { 0x0344, 0x00},
>>> +     { 0x0345, 0x00},
>>> +     { 0x0346, 0x00},
>>> +     { 0x0347, 0x00},
>>> +     { 0x0348, 0x10},
>>> +     { 0x0349, 0x6F},
>>> +     { 0x034A, 0x0C},
>>> +     { 0x034B, 0x2E},
>>> +     { 0x0381, 0x01},
>>> +     { 0x0383, 0x01},
>>> +     { 0x0385, 0x01},
>>> +     { 0x0387, 0x01},
>>> +     { 0x0900, 0x01},
>>> +     { 0x0901, 0x14},
>>> +     { 0x0401, 0x01},
>>> +     { 0x0404, 0x00},
>>> +     { 0x0405, 0x40},
>>> +     { 0x0408, 0x00},
>>> +     { 0x0409, 0x06},
>>> +     { 0x040A, 0x00},
>>> +     { 0x040B, 0x00},
>>> +     { 0x040C, 0x10},
>>> +     { 0x040D, 0x64},
>>> +     { 0x040E, 0x03},
>>> +     { 0x040F, 0x0C},
>>> +     { 0x3038, 0x00},
>>> +     { 0x303A, 0x00},
>>> +     { 0x303B, 0x10},
>>> +     { 0x300D, 0x00},
>>> +     { 0x034C, 0x04},
>>> +     { 0x034D, 0x18},
>>> +     { 0x034E, 0x03},
>>> +     { 0x034F, 0x0C},
>>> +     { 0x0202, 0x03},
>>> +     { 0x0203, 0x42},
>>> +     { 0x0204, 0x00},
>>> +     { 0x0205, 0x00},
>>> +     { 0x020E, 0x01},
>>> +     { 0x020F, 0x00},
>>> +     { 0x0210, 0x01},
>>> +     { 0x0211, 0x00},
>>> +     { 0x0212, 0x01},
>>> +     { 0x0213, 0x00},
>>> +     { 0x0214, 0x01},
>>> +     { 0x0215, 0x00},
>>> +     { 0x7BCD, 0x00},
>>> +     { 0x94DC, 0x20},
>>> +     { 0x94DD, 0x20},
>>> +     { 0x94DE, 0x20},
>>> +     { 0x95DC, 0x20},
>>> +     { 0x95DD, 0x20},
>>> +     { 0x95DE, 0x20},
>>> +     { 0x7FB0, 0x00},
>>> +     { 0x9010, 0x3E},
>>> +     { 0x9419, 0x50},
>>> +     { 0x941B, 0x50},
>>> +     { 0x9519, 0x50},
>>> +     { 0x951B, 0x50},
>>> +     { 0x3030, 0x00},
>>> +     { 0x3032, 0x00},
>>> +     { 0x0220, 0x00},
>>> +};
>>> +
>>> +static const char * const imx258_test_pattern_menu[] = {
>>> +     "Disabled",
>>> +     "Vertical Color Bar Type 1",
>>> +     "Vertical Color Bar Type 2",
>>> +     "Vertical Color Bar Type 3",
>>> +     "Vertical Color Bar Type 4"
>>> +};
>>> +
>>> +/* Configurations for supported link frequencies */
>>> +#define IMX258_LINK_FREQ_634MHZ      633600000ULL
>>> +#define IMX258_LINK_FREQ_320MHZ      320000000ULL
>>> +
>>> +/*
>>> + * pixel_rate = link_freq * data-rate * nr_of_lanes / 
>>> +bits_per_sample
>>> + * data rate => double data rate; number of lanes => 4; bits per 
>>> +pixel => 10  */ static u64 link_freq_to_pixel_rate(u64 f) {
>>> +     f *= 2 * 4;
>>> +     do_div(f, 10);
>>> +
>>> +     return f;
>>> +}
>>> +
>>> +/* Menu items for LINK_FREQ V4L2 control */ static const s64 
>>> +link_freq_menu_items[] = {
>>> +     IMX258_LINK_FREQ_634MHZ,
>>> +     IMX258_LINK_FREQ_320MHZ,
>>> +};
>>> +
>>> +/* Link frequency configs */
>>> +static const struct imx258_link_freq_config link_freq_configs[] = {
>>> +     {
>>> +             .pixels_per_line = IMX258_PPL_DEFAULT,
>>> +             .reg_list = {
>>> +                     .num_of_regs = ARRAY_SIZE(mipi_data_rate_1267mbps),
>>> +                     .regs = mipi_data_rate_1267mbps,
>>> +             }
>>> +     },
>>> +     {
>>> +             .pixels_per_line = IMX258_PPL_DEFAULT,
>>> +             .reg_list = {
>>> +                     .num_of_regs = ARRAY_SIZE(mipi_data_rate_640mbps),
>>> +                     .regs = mipi_data_rate_640mbps,
>>> +             }
>>> +     },
>>> +};
>
> I also had comments for using explicit indices in this array, to avoid 
> mistakes in supported_modes[] below.
>
>>> +
>>> +/* Mode configs */
>>> +static const struct imx258_mode supported_modes[] = {
>>> +     {
>>> +             .width = 4208,
>>> +             .height = 3118,
>>> +             .vts_def = IMX258_VTS_30FPS,
>>> +             .vts_min = IMX258_VTS_30FPS,
>>> +             .reg_list = {
>>> +                     .num_of_regs = ARRAY_SIZE(mode_4208x3118_regs),
>>> +                     .regs = mode_4208x3118_regs,
>>> +             },
>>> +             .link_freq_index = 0,
>>> +     },
>>> +     {
>>> +             .width = 2104,
>>> +             .height = 1560,
>>> +             .vts_def = IMX258_VTS_30FPS,
>>> +             .vts_min = 1608,
>>> +             .reg_list = {
>>> +                     .num_of_regs = ARRAY_SIZE(mode_2104_1560_regs),
>>> +                     .regs = mode_2104_1560_regs,
>>> +             },
>>> +             .link_freq_index = 1,
>>> +     },
>>> +     {
>>> +             .width = 1048,
>>> +             .height = 780,
>>> +             .vts_def = IMX258_VTS_30FPS,
>>> +             .vts_min = 804,
>>> +             .reg_list = {
>>> +                     .num_of_regs = ARRAY_SIZE(mode_1048_780_regs),
>>> +                     .regs = mode_1048_780_regs,
>>> +             },
>>> +             .link_freq_index = 1,
>>> +     },
>>> +};
>>> +
>>> +struct imx258 {
>>> +     struct v4l2_subdev sd;
>>> +     struct media_pad pad;
>>> +
>>> +     struct v4l2_ctrl_handler ctrl_handler;
>>> +     /* V4L2 Controls */
>>> +     struct v4l2_ctrl *link_freq;
>>> +     struct v4l2_ctrl *pixel_rate;
>>> +     struct v4l2_ctrl *vblank;
>>> +     struct v4l2_ctrl *hblank;
>>> +     struct v4l2_ctrl *exposure;
>>> +
>>> +     /* Current mode */
>>> +     const struct imx258_mode *cur_mode;
>>> +
>>> +     /* Mutex for serialized access */
>>> +     struct mutex mutex;
>>> +     /*
>>> +      * Protect sensor module set pad format and start streaming normally.
>>> +      */
>>> +
>>> +     /* Streaming on/off */
>>> +     bool streaming;
>>> +};
>>> +
>>> +#define to_imx258(_sd)       container_of(_sd, struct imx258, sd)
>>> +
>>> +/* Read registers up to 2 at a time */ static int 
>>> +imx258_read_reg(struct imx258 *imx258, u16 reg, u32 len, u32 *val) {
>>> +     struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd);
>>> +     struct i2c_msg msgs[2];
>>> +     u8 addr_buf[2] = { reg >> 8, reg & 0xff };
>>> +     u8 data_buf[4] = { 0, };
>>> +     int ret;
>>> +
>>> +     if (len > 4)
>>> +             return -EINVAL;
>>> +
>>> +     /* Write register address */
>>> +     msgs[0].addr = client->addr;
>>> +     msgs[0].flags = 0;
>>> +     msgs[0].len = ARRAY_SIZE(addr_buf);
>>> +     msgs[0].buf = addr_buf;
>>> +
>>> +     /* Read data from register */
>>> +     msgs[1].addr = client->addr;
>>> +     msgs[1].flags = I2C_M_RD;
>>> +     msgs[1].len = len;
>>> +     msgs[1].buf = &data_buf[4 - len];
>>> +
>>> +     ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
>>> +     if (ret != ARRAY_SIZE(msgs))
>>> +             return -EIO;
>>> +
>>> +     *val = get_unaligned_be32(data_buf);
>>> +
>>> +     return 0;
>>> +}
>>> +
>>> +/* Write registers up to 2 at a time */ static int 
>>> +imx258_write_reg(struct imx258 *imx258, u16 reg, u32 len, u32 val) {
>>> +     struct i2c_client *client = v4l2_get_subdevdata(&imx258->sd);
>>> +     u8 __buf[6], *buf = __buf;
>>> +
>>> +     if (len > 4)
>>> +             return -EINVAL;
>>> +
>>> +     *buf++ = reg >> 8;
>>> +     *buf++ = reg & 0xff;
>>
>> You assign reg in variable declaration in imx258_read_reg(). Could 
>> you do the same here? Or even better, use put_unaligned_be16().
>>
>> I wasn't aware of these functions, thanks for introducing them to me.
>> :-)
>>
>> You can then remove buf and rename __buf as buf.
>
> I believe I gave an exact implementation, without that problem, in my 
> previous comments actually.
>
> Andy, please, really please, go through all the comments in my reply to v6 on 
> the list and make sure that they are all addressed. Perhaps reply to it, with 
> "Okay" next to each comment, to make sure some of the message was not lost 
> due to some weird mail client settings.
>
> Best regards,
> Tomasz

Reply via email to