Skip to content

Commit

Permalink
[media] smiapp: Allow generic quirk registers
Browse files Browse the repository at this point in the history
Implement more generic quirk registers than just limit and capability
registers. This comes with the expense of a little bit more access time so
these should be only used when really needed.

Signed-off-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Sakari Ailus authored and Mauro Carvalho Chehab committed May 20, 2012
1 parent 3de886e commit 27b2e76
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
46 changes: 46 additions & 0 deletions drivers/media/video/smiapp/smiapp-quirk.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,52 @@ int smiapp_replace_limit_at(struct smiapp_sensor *sensor,
return -EINVAL;
}

bool smiapp_quirk_reg(struct smiapp_sensor *sensor,
u32 reg, u32 *val)
{
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
const struct smia_reg *sreg;

if (!sensor->minfo.quirk)
return false;

sreg = sensor->minfo.quirk->regs;

if (!sreg)
return false;

while (sreg->type) {
u16 type = reg >> 16;
u16 reg16 = reg;

if (sreg->type != type || sreg->reg != reg16) {
sreg++;
continue;
}

switch ((u8)type) {
case SMIA_REG_8BIT:
dev_dbg(&client->dev, "quirk: 0x%8.8x: 0x%2.2x\n",
reg, sreg->val);
break;
case SMIA_REG_16BIT:
dev_dbg(&client->dev, "quirk: 0x%8.8x: 0x%4.4x\n",
reg, sreg->val);
break;
case SMIA_REG_32BIT:
dev_dbg(&client->dev, "quirk: 0x%8.8x: 0x%8.8x\n",
reg, sreg->val);
break;
}

*val = sreg->val;

return true;
}

return false;
}

static int jt8ew9_limits(struct smiapp_sensor *sensor)
{
if (sensor->minfo.revision_number_major < 0x03)
Expand Down
10 changes: 10 additions & 0 deletions drivers/media/video/smiapp/smiapp-quirk.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct smiapp_quirk {
int (*post_poweron)(struct smiapp_sensor *sensor);
int (*pre_streamon)(struct smiapp_sensor *sensor);
int (*post_streamoff)(struct smiapp_sensor *sensor);
const struct smia_reg *regs;
unsigned long flags;
};

Expand All @@ -55,6 +56,15 @@ struct smiapp_reg_8 {

void smiapp_replace_limit(struct smiapp_sensor *sensor,
u32 limit, u32 val);
bool smiapp_quirk_reg(struct smiapp_sensor *sensor,
u32 reg, u32 *val);

#define SMIAPP_MK_QUIRK_REG(_reg, _val) \
{ \
.type = (_reg >> 16), \
.reg = (u16)_reg, \
.val = _val, \
}

#define smiapp_call_quirk(_sensor, _quirk, ...) \
(_sensor->minfo.quirk && \
Expand Down
4 changes: 4 additions & 0 deletions drivers/media/video/smiapp/smiapp-regs.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,17 @@ static int __smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val,
&& len != SMIA_REG_32BIT)
return -EINVAL;

if (smiapp_quirk_reg(sensor, reg, val))
goto found_quirk;

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;

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

Expand Down

0 comments on commit 27b2e76

Please sign in to comment.