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

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
Loading
Loading
Loading
Loading
+46 −37
Original line number Original line Diff line number Diff line
@@ -970,56 +970,65 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor)
 * SMIA++ NVM handling
 * 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;
	unsigned int i;
	int rval = 0, rval2;
	int rval;


	np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
	rval = smiapp_write(sensor,
	for (p = 0; p < np; p++) {
		rval = smiapp_write(
			sensor,
			    SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
			    SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
	if (rval)
	if (rval)
			goto out;
		return rval;


		rval = smiapp_write(sensor,
	rval = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
				    SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
			    SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN);
			    SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN);
	if (rval)
	if (rval)
			goto out;
		return rval;


	for (i = 1000; i > 0; i--) {
	for (i = 1000; i > 0; i--) {
		u32 s;

		rval = smiapp_read(
		rval = smiapp_read(
			sensor,
			sensor,
			SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
			SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);


		if (rval)
		if (rval)
				goto out;
			return rval;


		if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
		if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
			break;
			break;

		}
		if (!i) {
			rval = -ETIMEDOUT;
			goto out;
	}
	}
	if (!i)
		return -ETIMEDOUT;


	for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
	for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
			rval = smiapp_read(
		u32 v;
				sensor,

		rval = smiapp_read(sensor,
				   SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
				   SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
				   &v);
				   &v);
		if (rval)
		if (rval)
				goto out;
			return rval;


		*nvm++ = v;
		*nvm++ = v;
	}
	}

	return 0;
}

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);
	rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0);
	if (rval < 0)
	if (rval < 0)
		return rval;
		return rval;