Re: [PATCH v2 1/2] media: i2c: imx415: Convert to new CCI register access helpers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

Am Montag, 8. Januar 2024, 11:50:55 CET schrieb Laurent Pinchart:
> Hi Alexander,
> 
> Thank you for the patch.
> 
> On Tue, Dec 12, 2023 at 08:26:36AM +0100, Alexander Stein wrote:
> > Use the new common CCI register access helpers to replace the private
> > register access helpers in the imx415 driver.
> > 
> > Signed-off-by: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx>
> > ---
> > 
> >  drivers/media/i2c/Kconfig  |   1 +
> >  drivers/media/i2c/imx415.c | 396 +++++++++++++++----------------------
> >  2 files changed, 161 insertions(+), 236 deletions(-)
> > 
> > diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
> > index 7ccac4e08d1d7..f6baa22372ac2 100644
> > --- a/drivers/media/i2c/Kconfig
> > +++ b/drivers/media/i2c/Kconfig
> > @@ -204,6 +204,7 @@ config VIDEO_IMX412
> > 
> >  config VIDEO_IMX415
> >  
> >  	tristate "Sony IMX415 sensor support"
> >  	depends on OF_GPIO
> > 
> > +	select V4L2_CCI_I2C
> > 
> >  	help
> >  	
> >  	  This is a Video4Linux2 sensor driver for the Sony
> >  	  IMX415 camera.
> > 
> > diff --git a/drivers/media/i2c/imx415.c b/drivers/media/i2c/imx415.c
> > index 1e5f20c3ed824..a20ece87d6e23 100644
> > --- a/drivers/media/i2c/imx415.c
> > +++ b/drivers/media/i2c/imx415.c
> > @@ -16,6 +16,7 @@
> > 
> >  #include <linux/slab.h>
> >  #include <linux/videodev2.h>
> > 
> > +#include <media/v4l2-cci.h>
> > 
> >  #include <media/v4l2-ctrls.h>
> >  #include <media/v4l2-fwnode.h>
> >  #include <media/v4l2-subdev.h>
> > 
> > @@ -28,76 +29,65 @@
> > 
> >  #define IMX415_NUM_CLK_PARAM_REGS 11
> > 
> > -#define IMX415_REG_8BIT(n)	  ((1 << 16) | (n))
> > -#define IMX415_REG_16BIT(n)	  ((2 << 16) | (n))
> > -#define IMX415_REG_24BIT(n)	  ((3 << 16) | (n))
> > -#define IMX415_REG_SIZE_SHIFT	  16
> > -#define IMX415_REG_ADDR_MASK	  0xffff
> > -
> > -#define IMX415_MODE		  IMX415_REG_8BIT(0x3000)
> > +#define IMX415_MODE		  CCI_REG8(0x3000)
> > 
> >  #define IMX415_MODE_OPERATING	  (0)
> >  #define IMX415_MODE_STANDBY	  BIT(0)
> > 
> > -#define IMX415_REGHOLD		  IMX415_REG_8BIT(0x3001)
> > +#define IMX415_REGHOLD		  CCI_REG8(0x3001)
> > 
> >  #define IMX415_REGHOLD_INVALID	  (0)
> >  #define IMX415_REGHOLD_VALID	  BIT(0)
> > 
> > -#define IMX415_XMSTA		  IMX415_REG_8BIT(0x3002)
> > +#define IMX415_XMSTA		  CCI_REG8(0x3002)
> > 
> >  #define IMX415_XMSTA_START	  (0)
> >  #define IMX415_XMSTA_STOP	  BIT(0)
> > 
> > -#define IMX415_BCWAIT_TIME	  IMX415_REG_16BIT(0x3008)
> > -#define IMX415_CPWAIT_TIME	  IMX415_REG_16BIT(0x300A)
> > -#define IMX415_WINMODE		  IMX415_REG_8BIT(0x301C)
> > -#define IMX415_ADDMODE		  IMX415_REG_8BIT(0x3022)
> > -#define IMX415_REVERSE		  IMX415_REG_8BIT(0x3030)
> > +#define IMX415_BCWAIT_TIME	  CCI_REG16_LE(0x3008)
> > +#define IMX415_CPWAIT_TIME	  CCI_REG16_LE(0x300A)
> > +#define IMX415_WINMODE		  CCI_REG8(0x301C)
> > +#define IMX415_ADDMODE		  CCI_REG8(0x3022)
> > +#define IMX415_REVERSE		  CCI_REG8(0x3030)
> > 
> >  #define IMX415_HREVERSE_SHIFT	  (0)
> >  #define IMX415_VREVERSE_SHIFT	  BIT(0)
> > 
> > -#define IMX415_ADBIT		  IMX415_REG_8BIT(0x3031)
> > -#define IMX415_MDBIT		  IMX415_REG_8BIT(0x3032)
> > -#define IMX415_SYS_MODE		  IMX415_REG_8BIT(0x3033)
> > -#define IMX415_OUTSEL		  IMX415_REG_8BIT(0x30C0)
> > -#define IMX415_DRV		  IMX415_REG_8BIT(0x30C1)
> > -#define IMX415_VMAX		  IMX415_REG_24BIT(0x3024)
> > -#define IMX415_HMAX		  IMX415_REG_16BIT(0x3028)
> > -#define IMX415_SHR0		  IMX415_REG_24BIT(0x3050)
> > -#define IMX415_GAIN_PCG_0	  IMX415_REG_16BIT(0x3090)
> > +#define IMX415_ADBIT		  CCI_REG8(0x3031)
> > +#define IMX415_MDBIT		  CCI_REG8(0x3032)
> > +#define IMX415_SYS_MODE		  CCI_REG8(0x3033)
> > +#define IMX415_OUTSEL		  CCI_REG8(0x30C0)
> > +#define IMX415_DRV		  CCI_REG8(0x30C1)
> > +#define IMX415_VMAX		  CCI_REG24_LE(0x3024)
> > +#define IMX415_HMAX		  CCI_REG16_LE(0x3028)
> > +#define IMX415_SHR0		  CCI_REG24_LE(0x3050)
> > +#define IMX415_GAIN_PCG_0	  CCI_REG16_LE(0x3090)
> > 
> >  #define IMX415_AGAIN_MIN	  0
> >  #define IMX415_AGAIN_MAX	  100
> >  #define IMX415_AGAIN_STEP	  1
> > 
> > -#define IMX415_BLKLEVEL		  IMX415_REG_16BIT(0x30E2)
> > +#define IMX415_BLKLEVEL		  CCI_REG16_LE(0x30E2)
> > 
> >  #define IMX415_BLKLEVEL_DEFAULT	  50
> > 
> > -#define IMX415_TPG_EN_DUOUT	  IMX415_REG_8BIT(0x30E4)
> > -#define IMX415_TPG_PATSEL_DUOUT	  IMX415_REG_8BIT(0x30E6)
> > -#define IMX415_TPG_COLORWIDTH	  IMX415_REG_8BIT(0x30E8)
> > -#define IMX415_TESTCLKEN_MIPI	  IMX415_REG_8BIT(0x3110)
> > -#define IMX415_INCKSEL1		  IMX415_REG_8BIT(0x3115)
> > -#define IMX415_INCKSEL2		  IMX415_REG_8BIT(0x3116)
> > -#define IMX415_INCKSEL3		  IMX415_REG_16BIT(0x3118)
> > -#define IMX415_INCKSEL4		  IMX415_REG_16BIT(0x311A)
> > -#define IMX415_INCKSEL5		  IMX415_REG_8BIT(0x311E)
> > -#define IMX415_DIG_CLP_MODE	  IMX415_REG_8BIT(0x32C8)
> > -#define IMX415_WRJ_OPEN		  IMX415_REG_8BIT(0x3390)
> > -#define IMX415_SENSOR_INFO	  IMX415_REG_16BIT(0x3F12)
> > +#define IMX415_TPG_EN_DUOUT	  CCI_REG8(0x30E4)
> > +#define IMX415_TPG_PATSEL_DUOUT	  CCI_REG8(0x30E6)
> > +#define IMX415_TPG_COLORWIDTH	  CCI_REG8(0x30E8)
> > +#define IMX415_TESTCLKEN_MIPI	  CCI_REG8(0x3110)
> > +#define IMX415_INCKSEL1		  CCI_REG8(0x3115)
> > +#define IMX415_INCKSEL2		  CCI_REG8(0x3116)
> > +#define IMX415_INCKSEL3		  CCI_REG16_LE(0x3118)
> > +#define IMX415_INCKSEL4		  CCI_REG16_LE(0x311A)
> > +#define IMX415_INCKSEL5		  CCI_REG8(0x311E)
> > +#define IMX415_DIG_CLP_MODE	  CCI_REG8(0x32C8)
> > +#define IMX415_WRJ_OPEN		  CCI_REG8(0x3390)
> > +#define IMX415_SENSOR_INFO	  CCI_REG16_LE(0x3F12)
> > 
> >  #define IMX415_SENSOR_INFO_MASK	  0xFFF
> >  #define IMX415_CHIP_ID		  0x514
> > 
> > -#define IMX415_LANEMODE		  IMX415_REG_16BIT(0x4001)
> > +#define IMX415_LANEMODE		  CCI_REG16_LE(0x4001)
> > 
> >  #define IMX415_LANEMODE_2	  1
> >  #define IMX415_LANEMODE_4	  3
> > 
> > -#define IMX415_TXCLKESC_FREQ	  IMX415_REG_16BIT(0x4004)
> > -#define IMX415_INCKSEL6		  IMX415_REG_8BIT(0x400C)
> > -#define IMX415_TCLKPOST		  IMX415_REG_16BIT(0x4018)
> > -#define IMX415_TCLKPREPARE	  IMX415_REG_16BIT(0x401A)
> > -#define IMX415_TCLKTRAIL	  IMX415_REG_16BIT(0x401C)
> > -#define IMX415_TCLKZERO		  IMX415_REG_16BIT(0x401E)
> > -#define IMX415_THSPREPARE	  IMX415_REG_16BIT(0x4020)
> > -#define IMX415_THSZERO		  IMX415_REG_16BIT(0x4022)
> > -#define IMX415_THSTRAIL		  IMX415_REG_16BIT(0x4024)
> > -#define IMX415_THSEXIT		  IMX415_REG_16BIT(0x4026)
> > -#define IMX415_TLPX		  IMX415_REG_16BIT(0x4028)
> > -#define IMX415_INCKSEL7		  IMX415_REG_8BIT(0x4074)
> > -
> > -struct imx415_reg {
> > -	u32 address;
> > -	u32 val;
> > -};
> > +#define IMX415_TXCLKESC_FREQ	  CCI_REG16_LE(0x4004)
> > +#define IMX415_INCKSEL6		  CCI_REG8(0x400C)
> > +#define IMX415_TCLKPOST		  CCI_REG16_LE(0x4018)
> > +#define IMX415_TCLKPREPARE	  CCI_REG16_LE(0x401A)
> > +#define IMX415_TCLKTRAIL	  CCI_REG16_LE(0x401C)
> > +#define IMX415_TCLKZERO		  CCI_REG16_LE(0x401E)
> > +#define IMX415_THSPREPARE	  CCI_REG16_LE(0x4020)
> > +#define IMX415_THSZERO		  CCI_REG16_LE(0x4022)
> > +#define IMX415_THSTRAIL		  CCI_REG16_LE(0x4024)
> > +#define IMX415_THSEXIT		  CCI_REG16_LE(0x4026)
> > +#define IMX415_TLPX		  CCI_REG16_LE(0x4028)
> > +#define IMX415_INCKSEL7		  CCI_REG8(0x4074)
> > 
> >  static const char *const imx415_supply_names[] = {
> >  
> >  	"dvdd",
> > 
> > @@ -118,7 +108,7 @@ static const s64 link_freq_menu_items[] = {
> > 
> >  struct imx415_clk_params {
> >  
> >  	u64 lane_rate;
> >  	u64 inck;
> > 
> > -	struct imx415_reg regs[IMX415_NUM_CLK_PARAM_REGS];
> > +	struct cci_reg_sequence regs[IMX415_NUM_CLK_PARAM_REGS];
> > 
> >  };
> >  
> >  /* INCK Settings - includes all lane rate and INCK dependent registers */
> > 
> > @@ -201,7 +191,7 @@ static const struct imx415_clk_params
> > imx415_clk_params[] = {> 
> >  };
> >  
> >  /* all-pixel 2-lane 720 Mbps 15.74 Hz mode */
> > 
> > -static const struct imx415_reg imx415_mode_2_720[] = {
> > +static const struct cci_reg_sequence imx415_mode_2_720[] = {
> > 
> >  	{ IMX415_VMAX, 0x08CA },
> >  	{ IMX415_HMAX, 0x07F0 },
> >  	{ IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > 
> > @@ -217,7 +207,7 @@ static const struct imx415_reg imx415_mode_2_720[] = {
> > 
> >  };
> >  
> >  /* all-pixel 2-lane 1440 Mbps 30.01 Hz mode */
> > 
> > -static const struct imx415_reg imx415_mode_2_1440[] = {
> > +static const struct cci_reg_sequence imx415_mode_2_1440[] = {
> > 
> >  	{ IMX415_VMAX, 0x08CA },
> >  	{ IMX415_HMAX, 0x042A },
> >  	{ IMX415_LANEMODE, IMX415_LANEMODE_2 },
> > 
> > @@ -233,7 +223,7 @@ static const struct imx415_reg imx415_mode_2_1440[] =
> > {
> > 
> >  };
> >  
> >  /* all-pixel 4-lane 891 Mbps 30 Hz mode */
> > 
> > -static const struct imx415_reg imx415_mode_4_891[] = {
> > +static const struct cci_reg_sequence imx415_mode_4_891[] = {
> > 
> >  	{ IMX415_VMAX, 0x08CA },
> >  	{ IMX415_HMAX, 0x044C },
> >  	{ IMX415_LANEMODE, IMX415_LANEMODE_4 },
> > 
> > @@ -250,7 +240,7 @@ static const struct imx415_reg imx415_mode_4_891[] = {
> > 
> >  struct imx415_mode_reg_list {
> >  
> >  	u32 num_of_regs;
> > 
> > -	const struct imx415_reg *regs;
> > +	const struct cci_reg_sequence *regs;
> > 
> >  };
> >  
> >  /*
> > 
> > @@ -323,11 +313,6 @@ static const struct imx415_mode supported_modes[] = {
> > 
> >  	},
> >  
> >  };
> > 
> > -static const struct regmap_config imx415_regmap_config = {
> > -	.reg_bits = 16,
> > -	.val_bits = 8,
> > -};
> > -
> > 
> >  static const char *const imx415_test_pattern_menu[] = {
> >  
> >  	"disabled",
> >  	"solid black",
> > 
> > @@ -369,7 +354,7 @@ struct imx415 {
> > 
> >   * This table includes fixed register settings and a bunch of
> >   undocumented
> >   * registers that have to be set to another value than default.
> >   */
> > 
> > -static const struct imx415_reg imx415_init_table[] = {
> > +static const struct cci_reg_sequence imx415_init_table[] = {
> > 
> >  	/* use all-pixel readout mode, no flip */
> >  	{ IMX415_WINMODE, 0x00 },
> >  	{ IMX415_ADDMODE, 0x00 },
> > 
> > @@ -382,77 +367,77 @@ static const struct imx415_reg imx415_init_table[] =
> > {> 
> >  	{ IMX415_DRV, 0x00 },
> >  	
> >  	/* SONY magic registers */
> > 
> > -	{ IMX415_REG_8BIT(0x32D4), 0x21 },
> > -	{ IMX415_REG_8BIT(0x32EC), 0xA1 },
> > -	{ IMX415_REG_8BIT(0x3452), 0x7F },
> > -	{ IMX415_REG_8BIT(0x3453), 0x03 },
> > -	{ IMX415_REG_8BIT(0x358A), 0x04 },
> > -	{ IMX415_REG_8BIT(0x35A1), 0x02 },
> > -	{ IMX415_REG_8BIT(0x36BC), 0x0C },
> > -	{ IMX415_REG_8BIT(0x36CC), 0x53 },
> > -	{ IMX415_REG_8BIT(0x36CD), 0x00 },
> > -	{ IMX415_REG_8BIT(0x36CE), 0x3C },
> > -	{ IMX415_REG_8BIT(0x36D0), 0x8C },
> > -	{ IMX415_REG_8BIT(0x36D1), 0x00 },
> > -	{ IMX415_REG_8BIT(0x36D2), 0x71 },
> > -	{ IMX415_REG_8BIT(0x36D4), 0x3C },
> > -	{ IMX415_REG_8BIT(0x36D6), 0x53 },
> > -	{ IMX415_REG_8BIT(0x36D7), 0x00 },
> > -	{ IMX415_REG_8BIT(0x36D8), 0x71 },
> > -	{ IMX415_REG_8BIT(0x36DA), 0x8C },
> > -	{ IMX415_REG_8BIT(0x36DB), 0x00 },
> > -	{ IMX415_REG_8BIT(0x3724), 0x02 },
> > -	{ IMX415_REG_8BIT(0x3726), 0x02 },
> > -	{ IMX415_REG_8BIT(0x3732), 0x02 },
> > -	{ IMX415_REG_8BIT(0x3734), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3736), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3742), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3862), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x38CC), 0x30 },
> > -	{ IMX415_REG_8BIT(0x38CD), 0x2F },
> > -	{ IMX415_REG_8BIT(0x395C), 0x0C },
> > -	{ IMX415_REG_8BIT(0x3A42), 0xD1 },
> > -	{ IMX415_REG_8BIT(0x3A4C), 0x77 },
> > -	{ IMX415_REG_8BIT(0x3AE0), 0x02 },
> > -	{ IMX415_REG_8BIT(0x3AEC), 0x0C },
> > -	{ IMX415_REG_8BIT(0x3B00), 0x2E },
> > -	{ IMX415_REG_8BIT(0x3B06), 0x29 },
> > -	{ IMX415_REG_8BIT(0x3B98), 0x25 },
> > -	{ IMX415_REG_8BIT(0x3B99), 0x21 },
> > -	{ IMX415_REG_8BIT(0x3B9B), 0x13 },
> > -	{ IMX415_REG_8BIT(0x3B9C), 0x13 },
> > -	{ IMX415_REG_8BIT(0x3B9D), 0x13 },
> > -	{ IMX415_REG_8BIT(0x3B9E), 0x13 },
> > -	{ IMX415_REG_8BIT(0x3BA1), 0x00 },
> > -	{ IMX415_REG_8BIT(0x3BA2), 0x06 },
> > -	{ IMX415_REG_8BIT(0x3BA3), 0x0B },
> > -	{ IMX415_REG_8BIT(0x3BA4), 0x10 },
> > -	{ IMX415_REG_8BIT(0x3BA5), 0x14 },
> > -	{ IMX415_REG_8BIT(0x3BA6), 0x18 },
> > -	{ IMX415_REG_8BIT(0x3BA7), 0x1A },
> > -	{ IMX415_REG_8BIT(0x3BA8), 0x1A },
> > -	{ IMX415_REG_8BIT(0x3BA9), 0x1A },
> > -	{ IMX415_REG_8BIT(0x3BAC), 0xED },
> > -	{ IMX415_REG_8BIT(0x3BAD), 0x01 },
> > -	{ IMX415_REG_8BIT(0x3BAE), 0xF6 },
> > -	{ IMX415_REG_8BIT(0x3BAF), 0x02 },
> > -	{ IMX415_REG_8BIT(0x3BB0), 0xA2 },
> > -	{ IMX415_REG_8BIT(0x3BB1), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3BB2), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x3BB3), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3BB4), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x3BB5), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3BB6), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x3BB7), 0x03 },
> > -	{ IMX415_REG_8BIT(0x3BB8), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x3BBA), 0xE0 },
> > -	{ IMX415_REG_8BIT(0x3BBC), 0xDA },
> > -	{ IMX415_REG_8BIT(0x3BBE), 0x88 },
> > -	{ IMX415_REG_8BIT(0x3BC0), 0x44 },
> > -	{ IMX415_REG_8BIT(0x3BC2), 0x7B },
> > -	{ IMX415_REG_8BIT(0x3BC4), 0xA2 },
> > -	{ IMX415_REG_8BIT(0x3BC8), 0xBD },
> > -	{ IMX415_REG_8BIT(0x3BCA), 0xBD },
> > +	{ CCI_REG8(0x32D4), 0x21 },
> > +	{ CCI_REG8(0x32EC), 0xA1 },
> > +	{ CCI_REG8(0x3452), 0x7F },
> > +	{ CCI_REG8(0x3453), 0x03 },
> > +	{ CCI_REG8(0x358A), 0x04 },
> > +	{ CCI_REG8(0x35A1), 0x02 },
> > +	{ CCI_REG8(0x36BC), 0x0C },
> > +	{ CCI_REG8(0x36CC), 0x53 },
> > +	{ CCI_REG8(0x36CD), 0x00 },
> > +	{ CCI_REG8(0x36CE), 0x3C },
> > +	{ CCI_REG8(0x36D0), 0x8C },
> > +	{ CCI_REG8(0x36D1), 0x00 },
> > +	{ CCI_REG8(0x36D2), 0x71 },
> > +	{ CCI_REG8(0x36D4), 0x3C },
> > +	{ CCI_REG8(0x36D6), 0x53 },
> > +	{ CCI_REG8(0x36D7), 0x00 },
> > +	{ CCI_REG8(0x36D8), 0x71 },
> > +	{ CCI_REG8(0x36DA), 0x8C },
> > +	{ CCI_REG8(0x36DB), 0x00 },
> > +	{ CCI_REG8(0x3724), 0x02 },
> > +	{ CCI_REG8(0x3726), 0x02 },
> > +	{ CCI_REG8(0x3732), 0x02 },
> > +	{ CCI_REG8(0x3734), 0x03 },
> > +	{ CCI_REG8(0x3736), 0x03 },
> > +	{ CCI_REG8(0x3742), 0x03 },
> > +	{ CCI_REG8(0x3862), 0xE0 },
> > +	{ CCI_REG8(0x38CC), 0x30 },
> > +	{ CCI_REG8(0x38CD), 0x2F },
> > +	{ CCI_REG8(0x395C), 0x0C },
> > +	{ CCI_REG8(0x3A42), 0xD1 },
> > +	{ CCI_REG8(0x3A4C), 0x77 },
> > +	{ CCI_REG8(0x3AE0), 0x02 },
> > +	{ CCI_REG8(0x3AEC), 0x0C },
> > +	{ CCI_REG8(0x3B00), 0x2E },
> > +	{ CCI_REG8(0x3B06), 0x29 },
> > +	{ CCI_REG8(0x3B98), 0x25 },
> > +	{ CCI_REG8(0x3B99), 0x21 },
> > +	{ CCI_REG8(0x3B9B), 0x13 },
> > +	{ CCI_REG8(0x3B9C), 0x13 },
> > +	{ CCI_REG8(0x3B9D), 0x13 },
> > +	{ CCI_REG8(0x3B9E), 0x13 },
> > +	{ CCI_REG8(0x3BA1), 0x00 },
> > +	{ CCI_REG8(0x3BA2), 0x06 },
> > +	{ CCI_REG8(0x3BA3), 0x0B },
> > +	{ CCI_REG8(0x3BA4), 0x10 },
> > +	{ CCI_REG8(0x3BA5), 0x14 },
> > +	{ CCI_REG8(0x3BA6), 0x18 },
> > +	{ CCI_REG8(0x3BA7), 0x1A },
> > +	{ CCI_REG8(0x3BA8), 0x1A },
> > +	{ CCI_REG8(0x3BA9), 0x1A },
> > +	{ CCI_REG8(0x3BAC), 0xED },
> > +	{ CCI_REG8(0x3BAD), 0x01 },
> > +	{ CCI_REG8(0x3BAE), 0xF6 },
> > +	{ CCI_REG8(0x3BAF), 0x02 },
> > +	{ CCI_REG8(0x3BB0), 0xA2 },
> > +	{ CCI_REG8(0x3BB1), 0x03 },
> > +	{ CCI_REG8(0x3BB2), 0xE0 },
> > +	{ CCI_REG8(0x3BB3), 0x03 },
> > +	{ CCI_REG8(0x3BB4), 0xE0 },
> > +	{ CCI_REG8(0x3BB5), 0x03 },
> > +	{ CCI_REG8(0x3BB6), 0xE0 },
> > +	{ CCI_REG8(0x3BB7), 0x03 },
> > +	{ CCI_REG8(0x3BB8), 0xE0 },
> > +	{ CCI_REG8(0x3BBA), 0xE0 },
> > +	{ CCI_REG8(0x3BBC), 0xDA },
> > +	{ CCI_REG8(0x3BBE), 0x88 },
> > +	{ CCI_REG8(0x3BC0), 0x44 },
> > +	{ CCI_REG8(0x3BC2), 0x7B },
> > +	{ CCI_REG8(0x3BC4), 0xA2 },
> > +	{ CCI_REG8(0x3BC8), 0xBD },
> > +	{ CCI_REG8(0x3BCA), 0xBD },
> > 
> >  };
> >  
> >  static inline struct imx415 *to_imx415(struct v4l2_subdev *sd)
> > 
> > @@ -460,74 +445,25 @@ static inline struct imx415 *to_imx415(struct
> > v4l2_subdev *sd)> 
> >  	return container_of(sd, struct imx415, subdev);
> >  
> >  }
> > 
> > -static int imx415_read(struct imx415 *sensor, u32 addr)
> > -{
> > -	u8 data[3] = { 0 };
> > -	int ret;
> > -
> > -	ret = regmap_raw_read(sensor->regmap, addr & IMX415_REG_ADDR_MASK, 
data,
> > -			      (addr >> IMX415_REG_SIZE_SHIFT) & 3);
> > -	if (ret < 0)
> > -		return ret;
> > -
> > -	return (data[2] << 16) | (data[1] << 8) | data[0];
> > -}
> > -
> > -static int imx415_write(struct imx415 *sensor, u32 addr, u32 value)
> > -{
> > -	u8 data[3] = { value & 0xff, (value >> 8) & 0xff, value >> 16 };
> > -	int ret;
> > -
> > -	ret = regmap_raw_write(sensor->regmap, addr & IMX415_REG_ADDR_MASK,
> > -			       data, (addr >> IMX415_REG_SIZE_SHIFT) & 
3);
> > -	if (ret < 0)
> > -		dev_err_ratelimited(sensor->dev,
> > -				    "%u-bit write to 0x%04x failed: 
%d\n",
> > -				    ((addr >> IMX415_REG_SIZE_SHIFT) & 
3) * 8,
> > -				    addr & IMX415_REG_ADDR_MASK, ret);
> > -
> > -	return 0;
> > -}
> > -
> > 
> >  static int imx415_set_testpattern(struct imx415 *sensor, int val)
> >  {
> >  
> >  	int ret;
> 
> You need to initialize ret to 0 here, otherwise the first cci_write()
> call will get a random value.

Nice catch. Thanks.

> As a v3 is needed, would you consider switching to lower-case hex
> constants for registers while at it ?

Sure, I'll change them accordingly.

> 
> >  	if (val) {
> > 
> > -		ret = imx415_write(sensor, IMX415_BLKLEVEL, 0x00);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TPG_EN_DUOUT, 0x01);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TPG_PATSEL_DUOUT, val - 
1);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TPG_COLORWIDTH, 0x01);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TESTCLKEN_MIPI, 0x20);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_DIG_CLP_MODE, 0x00);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_WRJ_OPEN, 0x00);
> > +		cci_write(sensor->regmap, IMX415_BLKLEVEL, 0x00, &ret);
> > +		cci_write(sensor->regmap, IMX415_TPG_EN_DUOUT, 0x01, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_TPG_PATSEL_DUOUT, val - 
1, &ret);
> > +		cci_write(sensor->regmap, IMX415_TPG_COLORWIDTH, 0x01, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_TESTCLKEN_MIPI, 0x20, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_DIG_CLP_MODE, 0x00, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_WRJ_OPEN, 0x00, &ret);
> > 
> >  	} else {
> > 
> > -		ret = imx415_write(sensor, IMX415_BLKLEVEL,
> > -				   IMX415_BLKLEVEL_DEFAULT);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TPG_EN_DUOUT, 0x00);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_TESTCLKEN_MIPI, 0x00);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_DIG_CLP_MODE, 0x01);
> > -		if (ret)
> > -			return ret;
> > -		ret = imx415_write(sensor, IMX415_WRJ_OPEN, 0x01);
> > +		cci_write(sensor->regmap, IMX415_BLKLEVEL,
> > +				   IMX415_BLKLEVEL_DEFAULT, &ret);
> > +		cci_write(sensor->regmap, IMX415_TPG_EN_DUOUT, 0x00, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_TESTCLKEN_MIPI, 0x00, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_DIG_CLP_MODE, 0x01, 
&ret);
> > +		cci_write(sensor->regmap, IMX415_WRJ_OPEN, 0x01, &ret);
> > 
> >  	}
> >  	return 0;
> >  
> >  }
> > 
> > @@ -540,7 +476,7 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl)
> > 
> >  	struct v4l2_subdev_state *state;
> >  	unsigned int vmax;
> >  	unsigned int flip;
> > 
> > -	int ret;
> > +	int ret = 0;
> > 
> >  	if (!pm_runtime_get_if_in_use(sensor->dev))
> >  	
> >  		return 0;
> > 
> > @@ -553,19 +489,19 @@ static int imx415_s_ctrl(struct v4l2_ctrl *ctrl)
> > 
> >  		/* clamp the exposure value to VMAX. */
> >  		vmax = format->height + sensor->vblank->cur.val;
> >  		ctrl->val = min_t(int, ctrl->val, vmax);
> > 
> > -		ret = imx415_write(sensor, IMX415_SHR0, vmax - ctrl->val);
> > +		ret = cci_write(sensor->regmap, IMX415_SHR0, vmax - ctrl-
>val, &ret);
> 
> If you assign the return value to ret, you don't need to pass &ret as
> the last argument, you can use NULL. Initializating ret to 0 will then
> not be required.

My ides was to use &ret in case an additional write before or afterwards is 
added, so these lines don't need to be touched again. But I'll keep it simple 
for now.

> 
> With these small issues addressed,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>

Thanks.

Best regards,
Alexander

> 
> >  		break;
> >  	
> >  	case V4L2_CID_ANALOGUE_GAIN:
> >  		/* analogue gain in 0.3 dB step size */
> > 
> > -		ret = imx415_write(sensor, IMX415_GAIN_PCG_0, ctrl->val);
> > +		ret = cci_write(sensor->regmap, IMX415_GAIN_PCG_0, ctrl-
>val, &ret);
> > 
> >  		break;
> >  	
> >  	case V4L2_CID_HFLIP:
> >  	
> >  	case V4L2_CID_VFLIP:
> >  		flip = (sensor->hflip->val << IMX415_HREVERSE_SHIFT) |
> >  		
> >  		       (sensor->vflip->val << IMX415_VREVERSE_SHIFT);
> > 
> > -		ret = imx415_write(sensor, IMX415_REVERSE, flip);
> > +		ret = cci_write(sensor->regmap, IMX415_REVERSE, flip, 
&ret);
> > 
> >  		break;
> >  	
> >  	case V4L2_CID_TEST_PATTERN:
> > @@ -679,8 +615,6 @@ static int imx415_ctrls_init(struct imx415 *sensor)
> > 
> >  static int imx415_set_mode(struct imx415 *sensor, int mode)
> >  {
> > 
> > -	const struct imx415_reg *reg;
> > -	unsigned int i;
> > 
> >  	int ret = 0;
> >  	
> >  	if (mode >= ARRAY_SIZE(supported_modes)) {
> > 
> > @@ -688,34 +622,29 @@ static int imx415_set_mode(struct imx415 *sensor,
> > int mode)> 
> >  		return -EINVAL;
> >  	
> >  	}
> > 
> > -	for (i = 0; i < supported_modes[mode].reg_list.num_of_regs; ++i) {
> > -		reg = &supported_modes[mode].reg_list.regs[i];
> > -		ret = imx415_write(sensor, reg->address, reg->val);
> > -		if (ret)
> > -			return ret;
> > -	}
> > +	cci_multi_reg_write(sensor->regmap,
> > +			    supported_modes[mode].reg_list.regs,
> > +			    supported_modes[mode].reg_list.num_of_regs,
> > +			    &ret);
> > 
> > -	for (i = 0; i < IMX415_NUM_CLK_PARAM_REGS; ++i) {
> > -		reg = &sensor->clk_params->regs[i];
> > -		ret = imx415_write(sensor, reg->address, reg->val);
> > -		if (ret)
> > -			return ret;
> > -	}
> > +	cci_multi_reg_write(sensor->regmap,
> > +			    sensor->clk_params->regs,
> > +			    IMX415_NUM_CLK_PARAM_REGS,
> > +			    &ret);
> > 
> >  	return 0;
> >  
> >  }
> >  
> >  static int imx415_setup(struct imx415 *sensor, struct v4l2_subdev_state
> >  *state) {
> > 
> > -	unsigned int i;
> > 
> >  	int ret;
> > 
> > -	for (i = 0; i < ARRAY_SIZE(imx415_init_table); ++i) {
> > -		ret = imx415_write(sensor, imx415_init_table[i].address,
> > -				   imx415_init_table[i].val);
> > -		if (ret)
> > -			return ret;
> > -	}
> > +	ret = cci_multi_reg_write(sensor->regmap,
> > +				  imx415_init_table,
> > +				  ARRAY_SIZE(imx415_init_table),
> > +				  NULL);
> > +	if (ret)
> > +		return ret;
> > 
> >  	return imx415_set_mode(sensor, sensor->cur_mode);
> >  
> >  }
> > 
> > @@ -724,7 +653,7 @@ static int imx415_wakeup(struct imx415 *sensor)
> > 
> >  {
> >  
> >  	int ret;
> > 
> > -	ret = imx415_write(sensor, IMX415_MODE, IMX415_MODE_OPERATING);
> > +	ret = cci_write(sensor->regmap, IMX415_MODE, IMX415_MODE_OPERATING,
> > NULL);> 
> >  	if (ret)
> >  	
> >  		return ret;
> > 
> > @@ -743,21 +672,15 @@ static int imx415_stream_on(struct imx415 *sensor)
> > 
> >  	int ret;
> >  	
> >  	ret = imx415_wakeup(sensor);
> > 
> > -	if (ret)
> > -		return ret;
> > -
> > -	return imx415_write(sensor, IMX415_XMSTA, IMX415_XMSTA_START);
> > +	return cci_write(sensor->regmap, IMX415_XMSTA, IMX415_XMSTA_START,
> > &ret);
> > 
> >  }
> >  
> >  static int imx415_stream_off(struct imx415 *sensor)
> >  {
> >  
> >  	int ret;
> > 
> > -	ret = imx415_write(sensor, IMX415_XMSTA, IMX415_XMSTA_STOP);
> > -	if (ret)
> > -		return ret;
> > -
> > -	return imx415_write(sensor, IMX415_MODE, IMX415_MODE_STANDBY);
> > +	ret = cci_write(sensor->regmap, IMX415_XMSTA, IMX415_XMSTA_STOP, 
NULL);
> > +	return cci_write(sensor->regmap, IMX415_MODE, IMX415_MODE_STANDBY,
> > &ret);
> > 
> >  }
> >  
> >  static int imx415_s_stream(struct v4l2_subdev *sd, int enable)
> > 
> > @@ -992,6 +915,7 @@ static void imx415_power_off(struct imx415 *sensor)
> > 
> >  static int imx415_identify_model(struct imx415 *sensor)
> >  {
> >  
> >  	int model, ret;
> > 
> > +	u64 chip_id;
> > 
> >  	/*
> >  	
> >  	 * While most registers can be read when the sensor is in standby, 
this
> > 
> > @@ -1002,7 +926,7 @@ static int imx415_identify_model(struct imx415
> > *sensor)> 
> >  		return dev_err_probe(sensor->dev, ret,
> >  		
> >  				     "failed to get sensor out of 
standby\n");
> > 
> > -	ret = imx415_read(sensor, IMX415_SENSOR_INFO);
> > +	ret = cci_read(sensor->regmap, IMX415_SENSOR_INFO, &chip_id, NULL);
> > 
> >  	if (ret < 0) {
> >  	
> >  		dev_err_probe(sensor->dev, ret,
> >  		
> >  			      "failed to read sensor information\n");
> > 
> > @@ -1024,7 +948,7 @@ static int imx415_identify_model(struct imx415
> > *sensor)> 
> >  	ret = 0;
> >  
> >  done:
> > -	imx415_write(sensor, IMX415_MODE, IMX415_MODE_STANDBY);
> > +	cci_write(sensor->regmap, IMX415_MODE, IMX415_MODE_STANDBY, &ret);
> > 
> >  	return ret;
> >  
> >  }
> > 
> > @@ -1173,7 +1097,7 @@ static int imx415_probe(struct i2c_client *client)
> > 
> >  	if (ret)
> >  	
> >  		return ret;
> > 
> > -	sensor->regmap = devm_regmap_init_i2c(client, 
&imx415_regmap_config);
> > +	sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
> > 
> >  	if (IS_ERR(sensor->regmap))
> >  	
> >  		return PTR_ERR(sensor->regmap);


-- 
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/







[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux