Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 306559
b: refs/heads/master
c: 27b2e76
h: refs/heads/master
i:
  306557: 7ee2cf8
  306555: 283b661
  306551: 8306725
  306543: 89d826f
  306527: b0539f4
  306495: c9898e9
  306431: 525562f
v: v3
  • Loading branch information
Sakari Ailus authored and Mauro Carvalho Chehab committed May 20, 2012
1 parent 64ec615 commit 8c33cc6
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3de886e0e4e1a981442e26edca5a32777299b079
refs/heads/master: 27b2e76dbca0b84cdae1b23c90fb353e63bb2fbb
46 changes: 46 additions & 0 deletions trunk/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 trunk/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 trunk/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 8c33cc6

Please sign in to comment.