Commit 2db8166f authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab

media: smiapp: Use unaligned get and put functions

Use get_unaligned_be* and put_unaligned_be* functions to convert register
values to CPU endianness. Consequently, two instances of BUG() are
removed.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 8d563eca
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
* Contact: Sakari Ailus <sakari.ailus@iki.fi> * Contact: Sakari Ailus <sakari.ailus@iki.fi>
*/ */
#include <asm/unaligned.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/i2c.h> #include <linux/i2c.h>
...@@ -69,18 +71,19 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg, ...@@ -69,18 +71,19 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
{ {
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd); struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
struct i2c_msg msg; struct i2c_msg msg;
unsigned char data[4]; unsigned char data_buf[sizeof(u32)] = { 0 };
u16 offset = reg; unsigned char offset_buf[sizeof(u16)];
int r; int r;
if (len > sizeof(data_buf))
return -EINVAL;
msg.addr = client->addr; msg.addr = client->addr;
msg.flags = 0; msg.flags = 0;
msg.len = 2; msg.len = sizeof(offset_buf);
msg.buf = data; msg.buf = offset_buf;
put_unaligned_be16(reg, offset_buf);
/* high byte goes out first */
data[0] = (u8) (offset >> 8);
data[1] = (u8) offset;
r = i2c_transfer(client->adapter, &msg, 1); r = i2c_transfer(client->adapter, &msg, 1);
if (r != 1) { if (r != 1) {
if (r >= 0) if (r >= 0)
...@@ -90,6 +93,8 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg, ...@@ -90,6 +93,8 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
msg.len = len; msg.len = len;
msg.flags = I2C_M_RD; msg.flags = I2C_M_RD;
msg.buf = &data_buf[sizeof(data_buf) - len];
r = i2c_transfer(client->adapter, &msg, 1); r = i2c_transfer(client->adapter, &msg, 1);
if (r != 1) { if (r != 1) {
if (r >= 0) if (r >= 0)
...@@ -97,27 +102,12 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg, ...@@ -97,27 +102,12 @@ static int ____smiapp_read(struct smiapp_sensor *sensor, u16 reg,
goto err; goto err;
} }
*val = 0; *val = get_unaligned_be32(data_buf);
/* high byte comes first */
switch (len) {
case SMIAPP_REG_32BIT:
*val = (data[0] << 24) + (data[1] << 16) + (data[2] << 8) +
data[3];
break;
case SMIAPP_REG_16BIT:
*val = (data[0] << 8) + data[1];
break;
case SMIAPP_REG_8BIT:
*val = data[0];
break;
default:
BUG();
}
return 0; return 0;
err: err:
dev_err(&client->dev, "read from offset 0x%x error %d\n", offset, r); dev_err(&client->dev, "read from offset 0x%x error %d\n", reg, r);
return r; return r;
} }
...@@ -214,13 +204,10 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val) ...@@ -214,13 +204,10 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
struct i2c_msg msg; struct i2c_msg msg;
unsigned char data[6]; unsigned char data[6];
unsigned int retries; unsigned int retries;
u8 flags = SMIAPP_REG_FLAGS(reg);
u8 len = SMIAPP_REG_WIDTH(reg); u8 len = SMIAPP_REG_WIDTH(reg);
u16 offset = SMIAPP_REG_ADDR(reg);
int r; int r;
if ((len != SMIAPP_REG_8BIT && len != SMIAPP_REG_16BIT && if (len > sizeof(data) - 2)
len != SMIAPP_REG_32BIT) || flags)
return -EINVAL; return -EINVAL;
msg.addr = client->addr; msg.addr = client->addr;
...@@ -228,27 +215,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val) ...@@ -228,27 +215,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
msg.len = 2 + len; msg.len = 2 + len;
msg.buf = data; msg.buf = data;
/* high byte goes out first */ put_unaligned_be16(SMIAPP_REG_ADDR(reg), data);
data[0] = (u8) (reg >> 8); put_unaligned_be32(val << (8 * (sizeof(val) - len)), data + 2);
data[1] = (u8) (reg & 0xff);
switch (len) {
case SMIAPP_REG_8BIT:
data[2] = val;
break;
case SMIAPP_REG_16BIT:
data[2] = val >> 8;
data[3] = val;
break;
case SMIAPP_REG_32BIT:
data[2] = val >> 24;
data[3] = val >> 16;
data[4] = val >> 8;
data[5] = val;
break;
default:
BUG();
}
for (retries = 0; retries < 5; retries++) { for (retries = 0; retries < 5; retries++) {
/* /*
...@@ -269,7 +237,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val) ...@@ -269,7 +237,8 @@ int smiapp_write_no_quirk(struct smiapp_sensor *sensor, u32 reg, u32 val)
} }
dev_err(&client->dev, dev_err(&client->dev,
"wrote 0x%x to offset 0x%x error %d\n", val, offset, r); "wrote 0x%x to offset 0x%x error %d\n", val,
SMIAPP_REG_ADDR(reg), r);
return r; return r;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment