Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 254624
b: refs/heads/master
c: 57644f5
h: refs/heads/master
v: v3
  • Loading branch information
HeungJun, Kim authored and Mauro Carvalho Chehab committed Jun 11, 2011
1 parent fd6be95 commit be6a0f1
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 65 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: bbe66edc607425acc47d7ad69ba7ad7193ec05b4
refs/heads/master: 57644f56234a154afffd0f4d53becf8ff4a55b41
52 changes: 27 additions & 25 deletions trunk/drivers/media/video/m5mols/m5mols.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,23 +106,23 @@ struct m5mols_capture {
* The each value according to each scenemode is recommended in the documents.
*/
struct m5mols_scenemode {
u32 metering;
u32 ev_bias;
u32 wb_mode;
u32 wb_preset;
u32 chroma_en;
u32 chroma_lvl;
u32 edge_en;
u32 edge_lvl;
u32 af_range;
u32 fd_mode;
u32 mcc;
u32 light;
u32 flash;
u32 tone;
u32 iso;
u32 capt_mode;
u32 wdr;
u8 metering;
u8 ev_bias;
u8 wb_mode;
u8 wb_preset;
u8 chroma_en;
u8 chroma_lvl;
u8 edge_en;
u8 edge_lvl;
u8 af_range;
u8 fd_mode;
u8 mcc;
u8 light;
u8 flash;
u8 tone;
u8 iso;
u8 capt_mode;
u8 wdr;
};

/**
Expand Down Expand Up @@ -216,9 +216,9 @@ struct m5mols_info {
bool lock_ae;
bool lock_awb;
u8 resolution;
u32 interrupt;
u32 mode;
u32 mode_save;
u8 interrupt;
u8 mode;
u8 mode_save;
int (*set_power)(struct device *dev, int on);
};

Expand Down Expand Up @@ -256,9 +256,11 @@ struct m5mols_info {
* +-------+---+----------+-----+------+------+------+------+
* - d[0..3]: according to size1
*/
int m5mols_read(struct v4l2_subdev *sd, u32 reg_comb, u32 *val);
int m5mols_read_u8(struct v4l2_subdev *sd, u32 reg_comb, u8 *val);
int m5mols_read_u16(struct v4l2_subdev *sd, u32 reg_comb, u16 *val);
int m5mols_read_u32(struct v4l2_subdev *sd, u32 reg_comb, u32 *val);
int m5mols_write(struct v4l2_subdev *sd, u32 reg_comb, u32 val);
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 value);
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u8 value);

/*
* Mode operation of the M-5MOLS
Expand All @@ -280,12 +282,12 @@ int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 value);
* The available executing order between each modes are as follows:
* PARAMETER <---> MONITOR <---> CAPTURE
*/
int m5mols_mode(struct m5mols_info *info, u32 mode);
int m5mols_mode(struct m5mols_info *info, u8 mode);

int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg);
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u8 reg);
int m5mols_sync_controls(struct m5mols_info *info);
int m5mols_start_capture(struct m5mols_info *info);
int m5mols_do_scenemode(struct m5mols_info *info, u32 mode);
int m5mols_do_scenemode(struct m5mols_info *info, u8 mode);
int m5mols_lock_3a(struct m5mols_info *info, bool lock);
int m5mols_set_ctrl(struct v4l2_ctrl *ctrl);

Expand Down
18 changes: 9 additions & 9 deletions trunk/drivers/media/video/m5mols/m5mols_capture.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ static int m5mols_read_rational(struct v4l2_subdev *sd, u32 addr_num,
{
u32 num, den;

int ret = m5mols_read(sd, addr_num, &num);
int ret = m5mols_read_u32(sd, addr_num, &num);
if (!ret)
ret = m5mols_read(sd, addr_den, &den);
ret = m5mols_read_u32(sd, addr_den, &den);
if (ret)
return ret;
*val = den == 0 ? 0 : num / den;
Expand Down Expand Up @@ -99,20 +99,20 @@ static int m5mols_capture_info(struct m5mols_info *info)
if (ret)
return ret;

ret = m5mols_read(sd, EXIF_INFO_ISO, (u32 *)&exif->iso_speed);
ret = m5mols_read_u16(sd, EXIF_INFO_ISO, &exif->iso_speed);
if (!ret)
ret = m5mols_read(sd, EXIF_INFO_FLASH, (u32 *)&exif->flash);
ret = m5mols_read_u16(sd, EXIF_INFO_FLASH, &exif->flash);
if (!ret)
ret = m5mols_read(sd, EXIF_INFO_SDR, (u32 *)&exif->sdr);
ret = m5mols_read_u16(sd, EXIF_INFO_SDR, &exif->sdr);
if (!ret)
ret = m5mols_read(sd, EXIF_INFO_QVAL, (u32 *)&exif->qval);
ret = m5mols_read_u16(sd, EXIF_INFO_QVAL, &exif->qval);
if (ret)
return ret;

if (!ret)
ret = m5mols_read(sd, CAPC_IMAGE_SIZE, &info->cap.main);
ret = m5mols_read_u32(sd, CAPC_IMAGE_SIZE, &info->cap.main);
if (!ret)
ret = m5mols_read(sd, CAPC_THUMB_SIZE, &info->cap.thumb);
ret = m5mols_read_u32(sd, CAPC_THUMB_SIZE, &info->cap.thumb);
if (!ret)
info->cap.total = info->cap.main + info->cap.thumb;

Expand All @@ -122,7 +122,7 @@ static int m5mols_capture_info(struct m5mols_info *info)
int m5mols_start_capture(struct m5mols_info *info)
{
struct v4l2_subdev *sd = &info->sd;
u32 resolution = info->resolution;
u8 resolution = info->resolution;
int timeout;
int ret;

Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/media/video/m5mols/m5mols_controls.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ static struct m5mols_scenemode m5mols_default_scenemode[] = {
*
* WARNING: The execution order is important. Do not change the order.
*/
int m5mols_do_scenemode(struct m5mols_info *info, u32 mode)
int m5mols_do_scenemode(struct m5mols_info *info, u8 mode)
{
struct v4l2_subdev *sd = &info->sd;
struct m5mols_scenemode scenemode = m5mols_default_scenemode[mode];
Expand Down
96 changes: 67 additions & 29 deletions trunk/drivers/media/video/m5mols/m5mols_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,13 @@ static u32 m5mols_swap_byte(u8 *data, u8 length)
/**
* m5mols_read - I2C read function
* @reg: combination of size, category and command for the I2C packet
* @size: desired size of I2C packet
* @val: read value
*/
int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
static int m5mols_read(struct v4l2_subdev *sd, u32 size, u32 reg, u32 *val)
{
struct i2c_client *client = v4l2_get_subdevdata(sd);
u8 rbuf[M5MOLS_I2C_MAX_SIZE + 1];
u8 size = I2C_SIZE(reg);
u8 category = I2C_CATEGORY(reg);
u8 cmd = I2C_COMMAND(reg);
struct i2c_msg msg[2];
Expand All @@ -149,11 +149,6 @@ int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
if (!client->adapter)
return -ENODEV;

if (size != 1 && size != 2 && size != 4) {
v4l2_err(sd, "Wrong data size\n");
return -EINVAL;
}

msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = 5;
Expand Down Expand Up @@ -184,6 +179,52 @@ int m5mols_read(struct v4l2_subdev *sd, u32 reg, u32 *val)
return 0;
}

int m5mols_read_u8(struct v4l2_subdev *sd, u32 reg, u8 *val)
{
u32 val_32;
int ret;

if (I2C_SIZE(reg) != 1) {
v4l2_err(sd, "Wrong data size\n");
return -EINVAL;
}

ret = m5mols_read(sd, I2C_SIZE(reg), reg, &val_32);
if (ret)
return ret;

*val = (u8)val_32;
return ret;
}

int m5mols_read_u16(struct v4l2_subdev *sd, u32 reg, u16 *val)
{
u32 val_32;
int ret;

if (I2C_SIZE(reg) != 2) {
v4l2_err(sd, "Wrong data size\n");
return -EINVAL;
}

ret = m5mols_read(sd, I2C_SIZE(reg), reg, &val_32);
if (ret)
return ret;

*val = (u16)val_32;
return ret;
}

int m5mols_read_u32(struct v4l2_subdev *sd, u32 reg, u32 *val)
{
if (I2C_SIZE(reg) != 4) {
v4l2_err(sd, "Wrong data size\n");
return -EINVAL;
}

return m5mols_read(sd, I2C_SIZE(reg), reg, val);
}

/**
* m5mols_write - I2C command write function
* @reg: combination of size, category and command for the I2C packet
Expand Down Expand Up @@ -231,13 +272,14 @@ int m5mols_write(struct v4l2_subdev *sd, u32 reg, u32 val)
return 0;
}

int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 mask)
int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u8 mask)
{
u32 busy, i;
u8 busy;
int i;
int ret;

for (i = 0; i < M5MOLS_I2C_CHECK_RETRY; i++) {
ret = m5mols_read(sd, I2C_REG(category, cmd, 1), &busy);
ret = m5mols_read_u8(sd, I2C_REG(category, cmd, 1), &busy);
if (ret < 0)
return ret;
if ((busy & mask) == mask)
Expand All @@ -252,14 +294,14 @@ int m5mols_busy(struct v4l2_subdev *sd, u8 category, u8 cmd, u32 mask)
* Before writing desired interrupt value the INT_FACTOR register should
* be read to clear pending interrupts.
*/
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg)
int m5mols_enable_interrupt(struct v4l2_subdev *sd, u8 reg)
{
struct m5mols_info *info = to_m5mols(sd);
u32 mask = is_available_af(info) ? REG_INT_AF : 0;
u32 dummy;
u8 mask = is_available_af(info) ? REG_INT_AF : 0;
u8 dummy;
int ret;

ret = m5mols_read(sd, SYSTEM_INT_FACTOR, &dummy);
ret = m5mols_read_u8(sd, SYSTEM_INT_FACTOR, &dummy);
if (!ret)
ret = m5mols_write(sd, SYSTEM_INT_ENABLE, reg & ~mask);
return ret;
Expand All @@ -271,7 +313,7 @@ int m5mols_enable_interrupt(struct v4l2_subdev *sd, u32 reg)
* It always accompanies a little delay changing the M-5MOLS mode, so it is
* needed checking current busy status to guarantee right mode.
*/
static int m5mols_reg_mode(struct v4l2_subdev *sd, u32 mode)
static int m5mols_reg_mode(struct v4l2_subdev *sd, u8 mode)
{
int ret = m5mols_write(sd, SYSTEM_SYSMODE, mode);

Expand All @@ -286,16 +328,16 @@ static int m5mols_reg_mode(struct v4l2_subdev *sd, u32 mode)
* can be guaranteed only when the sensor is operating in mode which which
* a command belongs to.
*/
int m5mols_mode(struct m5mols_info *info, u32 mode)
int m5mols_mode(struct m5mols_info *info, u8 mode)
{
struct v4l2_subdev *sd = &info->sd;
int ret = -EINVAL;
u32 reg;
u8 reg;

if (mode < REG_PARAMETER && mode > REG_CAPTURE)
return ret;

ret = m5mols_read(sd, SYSTEM_SYSMODE, &reg);
ret = m5mols_read_u8(sd, SYSTEM_SYSMODE, &reg);
if ((!ret && reg == mode) || ret)
return ret;

Expand Down Expand Up @@ -348,28 +390,24 @@ static int m5mols_get_version(struct v4l2_subdev *sd)
struct m5mols_version ver;
u8 bytes[VERSION_SIZE];
} version;
u32 *value;
u8 cmd = CAT0_VER_CUSTOMER;
int ret;

do {
value = (u32 *)&version.bytes[cmd];
ret = m5mols_read(sd, SYSTEM_CMD(cmd), value);
ret = m5mols_read_u8(sd, SYSTEM_CMD(cmd), &version.bytes[cmd]);
if (ret)
return ret;
} while (cmd++ != CAT0_VER_AWB);

do {
value = (u32 *)&version.bytes[cmd];
ret = m5mols_read(sd, SYSTEM_VER_STRING, value);
ret = m5mols_read_u8(sd, SYSTEM_VER_STRING, &version.bytes[cmd]);
if (ret)
return ret;
if (cmd >= VERSION_SIZE - 1)
return -EINVAL;
} while (version.bytes[cmd++]);

value = (u32 *)&version.bytes[cmd];
ret = m5mols_read(sd, AF_VERSION, value);
ret = m5mols_read_u8(sd, AF_VERSION, &version.bytes[cmd]);
if (ret)
return ret;

Expand Down Expand Up @@ -722,7 +760,7 @@ static int m5mols_init_controls(struct m5mols_info *info)
int ret;

/* Determine value's range & step of controls for various FW version */
ret = m5mols_read(sd, AE_MAX_GAIN_MON, (u32 *)&max_exposure);
ret = m5mols_read_u16(sd, AE_MAX_GAIN_MON, &max_exposure);
if (!ret)
step_zoom = is_manufacturer(info, REG_SAMSUNG_OPTICS) ? 31 : 1;
if (ret)
Expand Down Expand Up @@ -842,18 +880,18 @@ static void m5mols_irq_work(struct work_struct *work)
struct m5mols_info *info =
container_of(work, struct m5mols_info, work_irq);
struct v4l2_subdev *sd = &info->sd;
u32 reg;
u8 reg;
int ret;

if (!is_powered(info) ||
m5mols_read(sd, SYSTEM_INT_FACTOR, &info->interrupt))
m5mols_read_u8(sd, SYSTEM_INT_FACTOR, &info->interrupt))
return;

switch (info->interrupt & REG_INT_MASK) {
case REG_INT_AF:
if (!is_available_af(info))
break;
ret = m5mols_read(sd, AF_STATUS, &reg);
ret = m5mols_read_u8(sd, AF_STATUS, &reg);
v4l2_dbg(2, m5mols_debug, sd, "AF %s\n",
reg == REG_AF_FAIL ? "Failed" :
reg == REG_AF_SUCCESS ? "Success" :
Expand Down

0 comments on commit be6a0f1

Please sign in to comment.