All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Martina Krasteva" <martinax.krasteva@linux.intel.com>
To: "'Sakari Ailus'" <sakari.ailus@linux.intel.com>
Cc: <linux-media@vger.kernel.org>, <mchehab@kernel.org>,
	<robh+dt@kernel.org>, <devicetree@vger.kernel.org>,
	<daniele.alessandrelli@linux.intel.com>,
	<paul.j.murphy@linux.intel.com>,
	<gjorgjix.rosikopulos@linux.intel.com>
Subject: RE: [PATCH 2/6] media: i2c: Add imx335 camera sensor driver
Date: Fri, 14 May 2021 12:50:48 +0100	[thread overview]
Message-ID: <000001d748b7$6ce65b50$46b311f0$@linux.intel.com> (raw)
In-Reply-To: <20210429215150.GA3@paasikivi.fi.intel.com>

Hi Sakari,

Thank you for your review. I will address both your and Rob's comments.

I have a question regarding the switch from pm_runtime_get_sync() to pm_runtime_resume_and_get()
In my understanding get_sync() is fine to use in case the error handling is correct, but for convenience resume_and_get() is
recommended.
So should I do this change in my drivers as well? 

Best Regards,
Martina

> 
> Hi Martina,
> 
> Thanks for the a of new drivers. Also my apologies for reviewing them so
> late.
> 
> On Tue, Mar 30, 2021 at 03:20:19PM +0100, Martina Krasteva wrote:
> 
> ...
> > +static int imx335_probe(struct i2c_client *client)
> > +{
> > +	struct imx335 *imx335;
> > +	int ret;
> > +
> > +	imx335 = devm_kzalloc(&client->dev, sizeof(*imx335), GFP_KERNEL);
> > +	if (!imx335)
> > +		return -ENOMEM;
> > +
> > +	imx335->dev = &client->dev;
> > +
> > +	/* Initialize subdev */
> > +	v4l2_i2c_subdev_init(&imx335->sd, client, &imx335_subdev_ops);
> > +
> > +	ret = imx335_parse_hw_config(imx335);
> > +	if (ret) {
> > +		dev_err(imx335->dev, "HW configuration is not supported");
> > +		return ret;
> > +	}
> > +
> > +	mutex_init(&imx335->mutex);
> > +
> > +	ret = imx335_power_on(imx335->dev);
> > +	if (ret) {
> > +		dev_err(imx335->dev, "failed to power-on the sensor");
> > +		goto error_mutex_destroy;
> > +	}
> > +
> > +	/* Check module identity */
> > +	ret = imx335_detect(imx335);
> > +	if (ret) {
> > +		dev_err(imx335->dev, "failed to find sensor: %d", ret);
> > +		goto error_power_off;
> > +	}
> > +
> > +	/* Set default mode to max resolution */
> > +	imx335->cur_mode = &supported_mode;
> > +	imx335->vblank = imx335->cur_mode->vblank;
> > +
> > +	ret = imx335_init_controls(imx335);
> > +	if (ret) {
> > +		dev_err(imx335->dev, "failed to init controls: %d", ret);
> > +		goto error_power_off;
> > +	}
> > +
> > +	/* Initialize subdev */
> > +	imx335->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
> > +	imx335->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
> > +
> > +	/* Initialize source pad */
> > +	imx335->pad.flags = MEDIA_PAD_FL_SOURCE;
> > +	ret = media_entity_pads_init(&imx335->sd.entity, 1, &imx335->pad);
> > +	if (ret) {
> > +		dev_err(imx335->dev, "failed to init entity pads: %d", ret);
> > +		goto error_handler_free;
> > +	}
> > +
> > +	ret = v4l2_async_register_subdev_sensor_common(&imx335->sd);
> > +	if (ret < 0) {
> > +		dev_err(imx335->dev,
> > +			"failed to register async subdev: %d", ret);
> > +		goto error_media_entity;
> > +	}
> > +
> > +	pm_runtime_set_active(imx335->dev);
> > +	pm_runtime_enable(imx335->dev);
> > +	pm_runtime_idle(imx335->dev);
> > +
> > +	return 0;
> > +
> > +error_media_entity:
> > +	media_entity_cleanup(&imx335->sd.entity);
> > +error_handler_free:
> > +	v4l2_ctrl_handler_free(imx335->sd.ctrl_handler);
> > +error_power_off:
> > +	imx335_power_off(imx335->dev);
> > +error_mutex_destroy:
> > +	mutex_destroy(&imx335->mutex);
> > +
> > +	return ret;
> > +}
> > +
> > +/**
> > + * imx335_remove() - I2C client device unbinding
> > + * @client: pointer to I2C client device
> > + *
> > + * Return: 0 if successful, error code otherwise.
> > + */
> > +static int imx335_remove(struct i2c_client *client)
> > +{
> > +	struct v4l2_subdev *sd = i2c_get_clientdata(client);
> > +	struct imx335 *imx335 = to_imx335(sd);
> > +
> > +	v4l2_async_unregister_subdev(sd);
> > +	media_entity_cleanup(&sd->entity);
> > +	v4l2_ctrl_handler_free(sd->ctrl_handler);
> > +
> > +	pm_runtime_disable(&client->dev);
> > +	pm_runtime_suspended(&client->dev);
> 
> The sensor will be powered off here only if runtime PM is enabled.
> 
> Could you use pm_runtime_status_suspended() to check whether the device is
> still powered on, as e.g. the CCS driver (drivers/media/i2c/ccs/ccs-core.c)
> does?
> 
> I think I'll merge these when this and Rob's comments have been addressed.
> 
> > +
> > +	mutex_destroy(&imx335->mutex);
> > +
> > +	return 0;
> > +}
> > +
> > +static const struct dev_pm_ops imx335_pm_ops = {
> > +	SET_RUNTIME_PM_OPS(imx335_power_off, imx335_power_on, NULL)
> > +};
> > +
> > +static const struct of_device_id imx335_of_match[] = {
> > +	{ .compatible = "sony,imx335" },
> > +	{ }
> > +};
> > +
> > +MODULE_DEVICE_TABLE(of, imx335_of_match);
> > +
> > +static struct i2c_driver imx335_driver = {
> > +	.probe_new = imx335_probe,
> > +	.remove = imx335_remove,
> > +	.driver = {
> > +		.name = "imx335",
> > +		.pm = &imx335_pm_ops,
> > +		.of_match_table = imx335_of_match,
> > +	},
> > +};
> > +
> > +module_i2c_driver(imx335_driver);
> > +
> > +MODULE_DESCRIPTION("Sony imx335 sensor driver");
> > +MODULE_LICENSE("GPL");
> 
> --
> Kind regards,
> 
> Sakari Ailus


  reply	other threads:[~2021-05-14 11:51 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-30 14:20 [PATCH 0/6] Camera Sensor Drivers Martina Krasteva
2021-03-30 14:20 ` [PATCH 1/6] dt-bindings: media: Add bindings for imx335 Martina Krasteva
2021-04-07 22:33   ` Rob Herring
2021-04-07 22:35   ` Rob Herring
2021-04-09  7:34     ` Martina Krasteva
2021-03-30 14:20 ` [PATCH 2/6] media: i2c: Add imx335 camera sensor driver Martina Krasteva
2021-04-29 21:51   ` Sakari Ailus
2021-05-14 11:50     ` Martina Krasteva [this message]
2021-03-30 14:20 ` [PATCH 3/6] dt-bindings: media: Add bindings for imx412 Martina Krasteva
2021-03-30 14:20 ` [PATCH 4/6] media: i2c: Add imx412 camera sensor driver Martina Krasteva
2021-03-30 14:20 ` [PATCH 5/6] dt-bindings: media: Add bindings for ov9282 Martina Krasteva
2021-03-30 14:20 ` [PATCH 6/6] media: i2c: Add ov9282 camera sensor driver Martina Krasteva

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000001d748b7$6ce65b50$46b311f0$@linux.intel.com' \
    --to=martinax.krasteva@linux.intel.com \
    --cc=daniele.alessandrelli@linux.intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gjorgjix.rosikopulos@linux.intel.com \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=paul.j.murphy@linux.intel.com \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.