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
next prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).