Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306554
b: refs/heads/master
c: ceb9e30
h: refs/heads/master
v: v3
  • Loading branch information
Sakari Ailus authored and Mauro Carvalho Chehab committed May 20, 2012
1 parent 352119c commit 01cf20b
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1e73eea781bc302ba7f35da89d627bd355a7814a
refs/heads/master: ceb9e30e9f4a892997a61f1f5a30bc5b561c9e67
1 change: 1 addition & 0 deletions trunk/drivers/media/video/smiapp/smiapp-quirk.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ struct smiapp_quirk {

/* op pix clock is for all lanes in total normally */
#define SMIAPP_QUIRK_FLAG_OP_PIX_CLOCK_PER_LANE (1 << 0)
#define SMIAPP_QUIRK_FLAG_8BIT_READ_ONLY (1 << 1)

struct smiapp_reg_8 {
u16 reg;
Expand Down
73 changes: 64 additions & 9 deletions trunk/drivers/media/video/smiapp/smiapp-regs.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,19 +78,15 @@ static uint32_t float_to_u32_mul_1000000(struct i2c_client *client,
* Read a 8/16/32-bit i2c register. The value is returned in 'val'.
* Returns zero if successful, or non-zero otherwise.
*/
int smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val)
static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
u16 len, u32 *val)
{
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
struct i2c_msg msg;
unsigned char data[4];
unsigned int len = (u8)(reg >> 16);
u16 offset = reg;
int r;

if (len != SMIA_REG_8BIT && len != SMIA_REG_16BIT
&& len != SMIA_REG_32BIT)
return -EINVAL;

msg.addr = client->addr;
msg.flags = 0;
msg.len = 2;
Expand Down Expand Up @@ -132,9 +128,6 @@ int smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val)
BUG();
}

if (reg & SMIA_REG_FLAG_FLOAT)
*val = float_to_u32_mul_1000000(client, *val);

return 0;

err:
Expand All @@ -143,6 +136,68 @@ int smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val)
return r;
}

/* Read a register using 8-bit access only. */
static int ____smiapp_read_8only(struct smiapp_sensor *sensor, u16 reg,
u16 len, u32 *val)
{
unsigned int i;
int rval;

*val = 0;

for (i = 0; i < len; i++) {
u32 val8;

rval = ____smiapp_read(sensor, reg + i, 1, &val8);
if (rval < 0)
return rval;
*val |= val8 << ((len - i - 1) << 3);
}

return 0;
}

/*
* Read a 8/16/32-bit i2c register. The value is returned in 'val'.
* Returns zero if successful, or non-zero otherwise.
*/
static int __smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val,
bool only8)
{
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
unsigned int len = (u8)(reg >> 16);
int rval;

if (len != SMIA_REG_8BIT && len != SMIA_REG_16BIT
&& len != SMIA_REG_32BIT)
return -EINVAL;

if (len == SMIA_REG_8BIT && !only8)
rval = ____smiapp_read(sensor, (u16)reg, len, val);
else
rval = ____smiapp_read_8only(sensor, (u16)reg, len, val);
if (rval < 0)
return rval;

if (reg & SMIA_REG_FLAG_FLOAT)
*val = float_to_u32_mul_1000000(client, *val);

return 0;
}

int smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val)
{
return __smiapp_read(
sensor, reg, val,
smiapp_needs_quirk(sensor,
SMIAPP_QUIRK_FLAG_8BIT_READ_ONLY));
}

int smiapp_read_8only(struct smiapp_sensor *sensor, u32 reg, u32 *val)
{
return __smiapp_read(sensor, reg, val, true);
}

/*
* Write to a 8/16-bit register.
* Returns zero if successful, or non-zero otherwise.
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/media/video/smiapp/smiapp-regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ struct smia_reg {
struct smiapp_sensor;

int smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val);
int smiapp_read_8only(struct smiapp_sensor *sensor, u32 reg, u32 *val);
int smiapp_write(struct smiapp_sensor *sensor, u32 reg, u32 val);

#endif

0 comments on commit 01cf20b

Please sign in to comment.