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

media: smiapp: Refactor reading NVM page

Split out reading a single NVM page into a separate function.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent a5b1d541
......@@ -970,56 +970,65 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor)
* SMIA++ NVM handling
*
*/
static int smiapp_read_nvm(struct smiapp_sensor *sensor,
unsigned char *nvm)
static int smiapp_read_nvm_page(struct smiapp_sensor *sensor, u32 p, u8 *nvm)
{
u32 i, s, p, np, v;
int rval = 0, rval2;
unsigned int i;
int rval;
np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
for (p = 0; p < np; p++) {
rval = smiapp_write(
rval = smiapp_write(sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
if (rval)
return rval;
rval = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN);
if (rval)
return rval;
for (i = 1000; i > 0; i--) {
u32 s;
rval = smiapp_read(
sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
if (rval)
goto out;
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
rval = smiapp_write(sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN);
if (rval)
goto out;
return rval;
for (i = 1000; i > 0; i--) {
rval = smiapp_read(
sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
break;
}
if (!i)
return -ETIMEDOUT;
if (rval)
goto out;
for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
u32 v;
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
break;
rval = smiapp_read(sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
&v);
if (rval)
return rval;
}
if (!i) {
rval = -ETIMEDOUT;
goto out;
}
*nvm++ = v;
}
for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
rval = smiapp_read(
sensor,
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
&v);
if (rval)
goto out;
return 0;
}
*nvm++ = v;
}
static int smiapp_read_nvm(struct smiapp_sensor *sensor,
unsigned char *nvm)
{
u32 p, np;
int rval = 0, rval2;
np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
for (p = 0; p < np && !rval; p++) {
rval = smiapp_read_nvm_page(sensor, p, nvm);
nvm += SMIAPP_NVM_PAGE_SIZE;
}
out:
rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0);
if (rval < 0)
return rval;
......
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