From 8c33cc6de9866ecc4a64c83e2e9bf11f75059b3b Mon Sep 17 00:00:00 2001 From: Sakari Ailus Date: Thu, 26 Apr 2012 13:39:44 -0300 Subject: [PATCH] --- yaml --- r: 306559 b: refs/heads/master c: 27b2e76dbca0b84cdae1b23c90fb353e63bb2fbb h: refs/heads/master i: 306557: 7ee2cf86535780da25f90336c575a65598c243e5 306555: 283b661626657f86567eccaae18863e0a3f90f6c 306551: 83067259a75f148065f0727457c1765306be40d3 306543: 89d826fbd88f70c1ee3515a3e1d69562fe68267d 306527: b0539f440c565ed8fdbd7591ed81c474cde31c5b 306495: c9898e9e30fad321432c5f571905de0c2a049ae8 306431: 525562f4cd1ad9abbd39b0b41f41713b397b4ecb v: v3 --- [refs] | 2 +- .../drivers/media/video/smiapp/smiapp-quirk.c | 46 +++++++++++++++++++ .../drivers/media/video/smiapp/smiapp-quirk.h | 10 ++++ .../drivers/media/video/smiapp/smiapp-regs.c | 4 ++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 05eec25bb461..ae0c56a339c2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3de886e0e4e1a981442e26edca5a32777299b079 +refs/heads/master: 27b2e76dbca0b84cdae1b23c90fb353e63bb2fbb diff --git a/trunk/drivers/media/video/smiapp/smiapp-quirk.c b/trunk/drivers/media/video/smiapp/smiapp-quirk.c index 81c2be3d47cb..55e87950dcea 100644 --- a/trunk/drivers/media/video/smiapp/smiapp-quirk.c +++ b/trunk/drivers/media/video/smiapp/smiapp-quirk.c @@ -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) diff --git a/trunk/drivers/media/video/smiapp/smiapp-quirk.h b/trunk/drivers/media/video/smiapp/smiapp-quirk.h index de82cdf43a89..f4dcaabaefe7 100644 --- a/trunk/drivers/media/video/smiapp/smiapp-quirk.h +++ b/trunk/drivers/media/video/smiapp/smiapp-quirk.h @@ -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; }; @@ -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 && \ diff --git a/trunk/drivers/media/video/smiapp/smiapp-regs.c b/trunk/drivers/media/video/smiapp/smiapp-regs.c index 9c430647b047..b1812b17a407 100644 --- a/trunk/drivers/media/video/smiapp/smiapp-regs.c +++ b/trunk/drivers/media/video/smiapp/smiapp-regs.c @@ -172,6 +172,9 @@ 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 @@ -179,6 +182,7 @@ static int __smiapp_read(struct smiapp_sensor *sensor, u32 reg, u32 *val, if (rval < 0) return rval; +found_quirk: if (reg & SMIA_REG_FLAG_FLOAT) *val = float_to_u32_mul_1000000(client, *val);