Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc360324 authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab
Browse files

[media] noon010pc30: Improve s_power operation handling



Remove the now unneeded check for the platform data in s_power
handler and the platform data pointer in struct noon010_info.
Also do not reset the configured output resolution and pixel
format when cycling sensor's power.
Add small delay for proper reset signal shape.

Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 6426e14a
Loading
Loading
Loading
Loading
+17 −23
Original line number Diff line number Diff line
@@ -133,7 +133,6 @@ struct noon010_info {
	struct v4l2_subdev sd;
	struct media_pad pad;
	struct v4l2_ctrl_handler hdl;
	const struct noon010pc30_platform_data *pdata;
	struct regulator_bulk_data supply[NOON010_NUM_SUPPLIES];
	u32 gpio_nreset;
	u32 gpio_nstby;
@@ -299,8 +298,10 @@ static int noon010_power_ctrl(struct v4l2_subdev *sd, bool reset, bool sleep)
	u8 reg = sleep ? 0xF1 : 0xF0;
	int ret = 0;

	if (reset)
	if (reset) {
		ret = cam_i2c_write(sd, POWER_CTRL_REG, reg | 0x02);
		udelay(20);
	}
	if (!ret) {
		ret = cam_i2c_write(sd, POWER_CTRL_REG, reg);
		if (reset && !ret)
@@ -573,45 +574,37 @@ static int noon010_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
	return ret;
}

/* Called with struct noon010_info.lock mutex held */
static int noon010_base_config(struct v4l2_subdev *sd)
{
	struct noon010_info *info = to_noon010(sd);
	int ret;

	ret = noon010_bulk_write_reg(sd, noon010_base_regs);
	if (!ret) {
		info->curr_fmt = &noon010_formats[0];
		info->curr_win = &noon010_sizes[0];
	int ret = noon010_bulk_write_reg(sd, noon010_base_regs);
	if (!ret)
		ret = noon010_set_params(sd);
	}
	if (!ret)
		ret = noon010_set_flip(sd, 1, 0);

	/* sync the handler and the registers state */
	v4l2_ctrl_handler_setup(&to_noon010(sd)->hdl);
	return ret;
}

static int noon010_s_power(struct v4l2_subdev *sd, int on)
{
	struct noon010_info *info = to_noon010(sd);
	const struct noon010pc30_platform_data *pdata = info->pdata;
	int ret = 0;

	if (WARN(pdata == NULL, "No platform data!\n"))
		return -ENOMEM;
	int ret;

	mutex_lock(&info->lock);
	if (on) {
		ret = power_enable(info);
		if (ret)
			return ret;
		if (!ret)
			ret = noon010_base_config(sd);
	} else {
		noon010_power_ctrl(sd, false, true);
		ret = power_disable(info);
		info->curr_win = NULL;
		info->curr_fmt = NULL;
	}
	mutex_unlock(&info->lock);

	/* Restore the controls state */
	if (!ret && on)
		ret = v4l2_ctrl_handler_setup(&info->hdl);

	return ret;
}
@@ -762,10 +755,11 @@ static int noon010_probe(struct i2c_client *client,
	if (ret)
		goto np_err;

	info->pdata		= client->dev.platform_data;
	info->i2c_reg_page	= -1;
	info->gpio_nreset	= -EINVAL;
	info->gpio_nstby	= -EINVAL;
	info->curr_fmt		= &noon010_formats[0];
	info->curr_win		= &noon010_sizes[0];

	if (gpio_is_valid(pdata->gpio_nreset)) {
		ret = gpio_request(pdata->gpio_nreset, "NOON010PC30 NRST");