Re: [PATCH] media: i2c: ADV7604: Migrate to regmap

2015-02-03 Thread Lars-Peter Clausen

On 02/01/2015 11:08 AM, Jean-Michel Hautbois wrote:

Looks mostly good, some things in addition to what Hans already said.

[...]

-
-static s32 adv_smbus_write_byte_data(struct adv7604_state *state,
-enum adv7604_page page, u8 command,
-u8 value)
+static int regmap_read_check(struct adv7604_state *state,
+int client_page, u8 reg)


This should have adv rather than regmap prefix.


[...]

+static int configure_regmap(struct adv7604_state *state, int region)
+{
+   int err;
+
+   if (!state-i2c_clients[region])
+   return -ENODEV;
+
+   if (!state-regmap[region]) {


Given that this function is only called once for each regmap this check 
seems unnecessary,



+
+   state-regmap[region] =
+   devm_regmap_init_i2c(state-i2c_clients[region],
+adv76xx_regmap[region]);
+
+   if (IS_ERR(state-regmap[region])) {
+   err = PTR_ERR(state-regmap[region]);
+   v4l_err(state-i2c_clients[region],
+   Error initializing regmap %d with error 
%d\n,
+   region, err);
+   return -EINVAL;
+   }
+   }
+
+   return 0;
+}
+

[...]
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] media: i2c: ADV7604: Migrate to regmap

2015-02-03 Thread Hans Verkuil
On 02/02/15 11:44, Hans Verkuil wrote:
 Hi Pablo, Jean-Michel,
 
 On 02/01/2015 11:08 AM, Jean-Michel Hautbois wrote:
 This is a preliminary patch in order to add support for ALSA.
 It replaces all current i2c access with regmap.
 Add the registers which will then be used too, as these are declared at init.

I have one other general comment: it is a bit confusing at the moment
which parts of the driver are adv7604 specific, adv7611 specific or common
for both.

It might be a good idea to create a separate patch that renames any adv7604
prefixes (both for functions and defines) to adv76xx whenever they are common.

Regards,

Hans


 Signed-off-by: Pablo Anton pablo.an...@vodalys-labs.com
 Signed-off-by: Jean-Michel Hautbois jean-michel.hautb...@vodalys.com
 ---
  drivers/media/i2c/adv7604.c | 428 
 +---
  include/media/adv7604.h | 129 +
  2 files changed, 455 insertions(+), 102 deletions(-)

 diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
 index e43dd2e..af19544 100644
 --- a/drivers/media/i2c/adv7604.c
 +++ b/drivers/media/i2c/adv7604.c
 @@ -43,6 +43,8 @@
  #include media/v4l2-dv-timings.h
  #include media/v4l2-of.h
  
 +#include linux/regmap.h
 +
  static int debug;
  module_param(debug, int, 0644);
  MODULE_PARM_DESC(debug, debug level (0-2));
 @@ -165,6 +167,9 @@ struct adv7604_state {
  /* i2c clients */
  struct i2c_client *i2c_clients[ADV7604_PAGE_MAX];
  
 +/* Regmaps */
 +struct regmap *regmap[ADV7604_PAGE_MAX];
 +
  /* controls */
  struct v4l2_ctrl *detect_tx_5v_ctrl;
  struct v4l2_ctrl *analog_sampling_phase_ctrl;
 @@ -353,84 +358,53 @@ static inline unsigned vtotal(const struct 
 v4l2_bt_timings *t)
  return V4L2_DV_BT_FRAME_HEIGHT(t);
  }
  
 -/* --- 
 */
 -
 -static s32 adv_smbus_read_byte_data_check(struct i2c_client *client,
 -u8 command, bool check)
 -{
 -union i2c_smbus_data data;
 -
 -if (!i2c_smbus_xfer(client-adapter, client-addr, client-flags,
 -I2C_SMBUS_READ, command,
 -I2C_SMBUS_BYTE_DATA, data))
 -return data.byte;
 -if (check)
 -v4l_err(client, error reading %02x, %02x\n,
 -client-addr, command);
 -return -EIO;
 -}
 -
 -static s32 adv_smbus_read_byte_data(struct adv7604_state *state,
 -enum adv7604_page page, u8 command)
 -{
 -return adv_smbus_read_byte_data_check(state-i2c_clients[page],
 -  command, true);
 -}
 -
 -static s32 adv_smbus_write_byte_data(struct adv7604_state *state,
 - enum adv7604_page page, u8 command,
 - u8 value)
 +static int regmap_read_check(struct adv7604_state *state,
 + int client_page, u8 reg)
  {
 -struct i2c_client *client = state-i2c_clients[page];
 -union i2c_smbus_data data;
 +struct i2c_client *client = state-i2c_clients[client_page];
  int err;
 -int i;
 +unsigned int val;
  
 -data.byte = value;
 -for (i = 0; i  3; i++) {
 -err = i2c_smbus_xfer(client-adapter, client-addr,
 -client-flags,
 -I2C_SMBUS_WRITE, command,
 -I2C_SMBUS_BYTE_DATA, data);
 -if (!err)
 -break;
 +err = regmap_read(state-regmap[client_page], reg, val);
 +
 +if (err) {
 +v4l_err(client, error reading %02x, %02x\n,
 +client-addr, reg);
 +return err;
  }
 -if (err  0)
 -v4l_err(client, error writing %02x, %02x, %02x\n,
 -client-addr, command, value);
 -return err;
 +return val;
  }
  
 -static s32 adv_smbus_write_i2c_block_data(struct adv7604_state *state,
 -  enum adv7604_page page, u8 command,
 -  unsigned length, const u8 *values)
 +/* regmap_write_block(): Write raw data with a maximum of 
 I2C_SMBUS_BLOCK_MAX
 + * size to one or more registers.
 + *
 + * A value of zero will be returned on success, a negative errno will
 + * be returned in error cases.
 + */
 +static int regmap_write_block(struct adv7604_state *state, int client_page,
 +  unsigned int init_reg, const void *val,
 +  size_t val_len)
  {
 -struct i2c_client *client = state-i2c_clients[page];
 -union i2c_smbus_data data;
 +struct regmap *regmap = state-regmap[client_page];
  
 -if (length  I2C_SMBUS_BLOCK_MAX)
 -length = I2C_SMBUS_BLOCK_MAX;
 -data.block[0] = length;
 -memcpy(data.block + 1, values, length);
 -return i2c_smbus_xfer(client-adapter, client-addr, client-flags,
 -  I2C_SMBUS_WRITE, 

Re: [PATCH] media: i2c: ADV7604: Migrate to regmap

2015-02-02 Thread Hans Verkuil
Hi Pablo, Jean-Michel,

On 02/01/2015 11:08 AM, Jean-Michel Hautbois wrote:
 This is a preliminary patch in order to add support for ALSA.
 It replaces all current i2c access with regmap.
 Add the registers which will then be used too, as these are declared at init.
 
 Signed-off-by: Pablo Anton pablo.an...@vodalys-labs.com
 Signed-off-by: Jean-Michel Hautbois jean-michel.hautb...@vodalys.com
 ---
  drivers/media/i2c/adv7604.c | 428 
 +---
  include/media/adv7604.h | 129 +
  2 files changed, 455 insertions(+), 102 deletions(-)
 
 diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
 index e43dd2e..af19544 100644
 --- a/drivers/media/i2c/adv7604.c
 +++ b/drivers/media/i2c/adv7604.c
 @@ -43,6 +43,8 @@
  #include media/v4l2-dv-timings.h
  #include media/v4l2-of.h
  
 +#include linux/regmap.h
 +
  static int debug;
  module_param(debug, int, 0644);
  MODULE_PARM_DESC(debug, debug level (0-2));
 @@ -165,6 +167,9 @@ struct adv7604_state {
   /* i2c clients */
   struct i2c_client *i2c_clients[ADV7604_PAGE_MAX];
  
 + /* Regmaps */
 + struct regmap *regmap[ADV7604_PAGE_MAX];
 +
   /* controls */
   struct v4l2_ctrl *detect_tx_5v_ctrl;
   struct v4l2_ctrl *analog_sampling_phase_ctrl;
 @@ -353,84 +358,53 @@ static inline unsigned vtotal(const struct 
 v4l2_bt_timings *t)
   return V4L2_DV_BT_FRAME_HEIGHT(t);
  }
  
 -/* --- */
 -
 -static s32 adv_smbus_read_byte_data_check(struct i2c_client *client,
 - u8 command, bool check)
 -{
 - union i2c_smbus_data data;
 -
 - if (!i2c_smbus_xfer(client-adapter, client-addr, client-flags,
 - I2C_SMBUS_READ, command,
 - I2C_SMBUS_BYTE_DATA, data))
 - return data.byte;
 - if (check)
 - v4l_err(client, error reading %02x, %02x\n,
 - client-addr, command);
 - return -EIO;
 -}
 -
 -static s32 adv_smbus_read_byte_data(struct adv7604_state *state,
 - enum adv7604_page page, u8 command)
 -{
 - return adv_smbus_read_byte_data_check(state-i2c_clients[page],
 -   command, true);
 -}
 -
 -static s32 adv_smbus_write_byte_data(struct adv7604_state *state,
 -  enum adv7604_page page, u8 command,
 -  u8 value)
 +static int regmap_read_check(struct adv7604_state *state,
 +  int client_page, u8 reg)
  {
 - struct i2c_client *client = state-i2c_clients[page];
 - union i2c_smbus_data data;
 + struct i2c_client *client = state-i2c_clients[client_page];
   int err;
 - int i;
 + unsigned int val;
  
 - data.byte = value;
 - for (i = 0; i  3; i++) {
 - err = i2c_smbus_xfer(client-adapter, client-addr,
 - client-flags,
 - I2C_SMBUS_WRITE, command,
 - I2C_SMBUS_BYTE_DATA, data);
 - if (!err)
 - break;
 + err = regmap_read(state-regmap[client_page], reg, val);
 +
 + if (err) {
 + v4l_err(client, error reading %02x, %02x\n,
 + client-addr, reg);
 + return err;
   }
 - if (err  0)
 - v4l_err(client, error writing %02x, %02x, %02x\n,
 - client-addr, command, value);
 - return err;
 + return val;
  }
  
 -static s32 adv_smbus_write_i2c_block_data(struct adv7604_state *state,
 -   enum adv7604_page page, u8 command,
 -   unsigned length, const u8 *values)
 +/* regmap_write_block(): Write raw data with a maximum of I2C_SMBUS_BLOCK_MAX
 + * size to one or more registers.
 + *
 + * A value of zero will be returned on success, a negative errno will
 + * be returned in error cases.
 + */
 +static int regmap_write_block(struct adv7604_state *state, int client_page,
 +   unsigned int init_reg, const void *val,
 +   size_t val_len)
  {
 - struct i2c_client *client = state-i2c_clients[page];
 - union i2c_smbus_data data;
 + struct regmap *regmap = state-regmap[client_page];
  
 - if (length  I2C_SMBUS_BLOCK_MAX)
 - length = I2C_SMBUS_BLOCK_MAX;
 - data.block[0] = length;
 - memcpy(data.block + 1, values, length);
 - return i2c_smbus_xfer(client-adapter, client-addr, client-flags,
 -   I2C_SMBUS_WRITE, command,
 -   I2C_SMBUS_I2C_BLOCK_DATA, data);
 -}
 + if (val_len  I2C_SMBUS_BLOCK_MAX)
 + val_len = I2C_SMBUS_BLOCK_MAX;
  
 -/* --- */
 + return regmap_raw_write(regmap, init_reg, val, val_len);
 +}
  
  

[PATCH] media: i2c: ADV7604: Migrate to regmap

2015-02-01 Thread Jean-Michel Hautbois
This is a preliminary patch in order to add support for ALSA.
It replaces all current i2c access with regmap.
Add the registers which will then be used too, as these are declared at init.

Signed-off-by: Pablo Anton pablo.an...@vodalys-labs.com
Signed-off-by: Jean-Michel Hautbois jean-michel.hautb...@vodalys.com
---
 drivers/media/i2c/adv7604.c | 428 +---
 include/media/adv7604.h | 129 +
 2 files changed, 455 insertions(+), 102 deletions(-)

diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
index e43dd2e..af19544 100644
--- a/drivers/media/i2c/adv7604.c
+++ b/drivers/media/i2c/adv7604.c
@@ -43,6 +43,8 @@
 #include media/v4l2-dv-timings.h
 #include media/v4l2-of.h
 
+#include linux/regmap.h
+
 static int debug;
 module_param(debug, int, 0644);
 MODULE_PARM_DESC(debug, debug level (0-2));
@@ -165,6 +167,9 @@ struct adv7604_state {
/* i2c clients */
struct i2c_client *i2c_clients[ADV7604_PAGE_MAX];
 
+   /* Regmaps */
+   struct regmap *regmap[ADV7604_PAGE_MAX];
+
/* controls */
struct v4l2_ctrl *detect_tx_5v_ctrl;
struct v4l2_ctrl *analog_sampling_phase_ctrl;
@@ -353,84 +358,53 @@ static inline unsigned vtotal(const struct 
v4l2_bt_timings *t)
return V4L2_DV_BT_FRAME_HEIGHT(t);
 }
 
-/* --- */
-
-static s32 adv_smbus_read_byte_data_check(struct i2c_client *client,
-   u8 command, bool check)
-{
-   union i2c_smbus_data data;
-
-   if (!i2c_smbus_xfer(client-adapter, client-addr, client-flags,
-   I2C_SMBUS_READ, command,
-   I2C_SMBUS_BYTE_DATA, data))
-   return data.byte;
-   if (check)
-   v4l_err(client, error reading %02x, %02x\n,
-   client-addr, command);
-   return -EIO;
-}
-
-static s32 adv_smbus_read_byte_data(struct adv7604_state *state,
-   enum adv7604_page page, u8 command)
-{
-   return adv_smbus_read_byte_data_check(state-i2c_clients[page],
- command, true);
-}
-
-static s32 adv_smbus_write_byte_data(struct adv7604_state *state,
-enum adv7604_page page, u8 command,
-u8 value)
+static int regmap_read_check(struct adv7604_state *state,
+int client_page, u8 reg)
 {
-   struct i2c_client *client = state-i2c_clients[page];
-   union i2c_smbus_data data;
+   struct i2c_client *client = state-i2c_clients[client_page];
int err;
-   int i;
+   unsigned int val;
 
-   data.byte = value;
-   for (i = 0; i  3; i++) {
-   err = i2c_smbus_xfer(client-adapter, client-addr,
-   client-flags,
-   I2C_SMBUS_WRITE, command,
-   I2C_SMBUS_BYTE_DATA, data);
-   if (!err)
-   break;
+   err = regmap_read(state-regmap[client_page], reg, val);
+
+   if (err) {
+   v4l_err(client, error reading %02x, %02x\n,
+   client-addr, reg);
+   return err;
}
-   if (err  0)
-   v4l_err(client, error writing %02x, %02x, %02x\n,
-   client-addr, command, value);
-   return err;
+   return val;
 }
 
-static s32 adv_smbus_write_i2c_block_data(struct adv7604_state *state,
- enum adv7604_page page, u8 command,
- unsigned length, const u8 *values)
+/* regmap_write_block(): Write raw data with a maximum of I2C_SMBUS_BLOCK_MAX
+ * size to one or more registers.
+ *
+ * A value of zero will be returned on success, a negative errno will
+ * be returned in error cases.
+ */
+static int regmap_write_block(struct adv7604_state *state, int client_page,
+ unsigned int init_reg, const void *val,
+ size_t val_len)
 {
-   struct i2c_client *client = state-i2c_clients[page];
-   union i2c_smbus_data data;
+   struct regmap *regmap = state-regmap[client_page];
 
-   if (length  I2C_SMBUS_BLOCK_MAX)
-   length = I2C_SMBUS_BLOCK_MAX;
-   data.block[0] = length;
-   memcpy(data.block + 1, values, length);
-   return i2c_smbus_xfer(client-adapter, client-addr, client-flags,
- I2C_SMBUS_WRITE, command,
- I2C_SMBUS_I2C_BLOCK_DATA, data);
-}
+   if (val_len  I2C_SMBUS_BLOCK_MAX)
+   val_len = I2C_SMBUS_BLOCK_MAX;
 
-/* --- */
+   return regmap_raw_write(regmap, init_reg, val, val_len);
+}
 
 static inline int io_read(struct v4l2_subdev *sd, u8 reg)
 {
struct