Re: [PATCH v4] media: Driver for Toshiba et8ek8 5MP sensor
From: Pavel Machek
Date: Sun Nov 20 2016 - 10:20:58 EST
Hi!
> > + u32 min, max;
> > +
> > + v4l2_ctrl_handler_init(&sensor->ctrl_handler, 4);
> > +
> > + /* V4L2_CID_GAIN */
> > + v4l2_ctrl_new_std(&sensor->ctrl_handler, &et8ek8_ctrl_ops,
> > + V4L2_CID_GAIN, 0, ARRAY_SIZE(et8ek8_gain_table) - 1,
> > + 1, 0);
> > +
> > + /* V4L2_CID_EXPOSURE */
> > + min = et8ek8_exposure_rows_to_us(sensor, 1);
> > + max = et8ek8_exposure_rows_to_us(sensor,
> > + sensor->current_reglist->mode.max_exp);
>
> Haven't I suggested to use lines instead? I vaguely remember doing so...
> this would remove quite some code from the driver.
Do you have some more hints? I'll try to figure it out...
> > +#ifdef CONFIG_PM
> > +
> > +static int et8ek8_suspend(struct device *dev)
>
> static int __maybe_unused ...
>
> Please check the smiapp patches I just sent to the list. The smiapp driver
> had similar issues.
Ok, I guess I figured it out from other code (no network at the
moment).
> > + if (sensor->power_count) {
> > + gpiod_set_value(sensor->reset, 0);
> > + clk_disable_unprepare(sensor->ext_clk);
> > + sensor->power_count = 0;
> > + }
> > +
>
> You're missing v4l2_async_unregister_subdev() here.
Added.
> > + v4l2_device_unregister_subdev(&sensor->subdev);
> > + device_remove_file(&client->dev, &dev_attr_priv_mem);
> > + v4l2_ctrl_handler_free(&sensor->ctrl_handler);
> > + media_entity_cleanup(&sensor->subdev.entity);
> > +
> > + return 0;
> > +}
> > +MODULE_DEVICE_TABLE(i2c, et8ek8_id_table);
> > +
> > +static const struct dev_pm_ops et8ek8_pm_ops = {
> > + .suspend = et8ek8_suspend,
> > + .resume = et8ek8_resume,
>
> How about using SET_SYSTEM_SLEEP_PM_OPS() here?
Ok, I guess that saves few lines.
> > +module_i2c_driver(et8ek8_i2c_driver);
> > +
> > +MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxx>");
>
> You should put your name here as well. :-)
>
> It's been a long time I even tried to use it. :-i
Me? Ok, I can list myself there, but I don't really know much about
that driver.
> > + * Contact: Sakari Ailus <sakari.ailus@xxxxxx>
> > + * Tuukka Toivonen <tuukka.o.toivonen@xxxxxxxxx>
>
> Tuukka's e-mail is wrong here (the correct address is elsewhere in the
> patch).
Fixed.
Ok, these cleanups are here.
Pavel
diff --git a/drivers/media/i2c/et8ek8/et8ek8_driver.c b/drivers/media/i2c/et8ek8/et8ek8_driver.c
index eb131b2..eb8c1b4 100644
--- a/drivers/media/i2c/et8ek8/et8ek8_driver.c
+++ b/drivers/media/i2c/et8ek8/et8ek8_driver.c
@@ -5,6 +5,7 @@
*
* Contact: Sakari Ailus <sakari.ailus@xxxxxx>
* Tuukka Toivonen <tuukkat76@xxxxxxxxx>
+ * Pavel Machek <pavel@xxxxxx>
*
* Based on code from Toni Leinonen <toni.leinonen@xxxxxxxxxx>.
*
@@ -1435,9 +1436,7 @@ static const struct v4l2_subdev_internal_ops et8ek8_internal_ops = {
/* --------------------------------------------------------------------------
* I2C driver
*/
-#ifdef CONFIG_PM
-
-static int et8ek8_suspend(struct device *dev)
+static int __maybe_unused et8ek8_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct v4l2_subdev *subdev = i2c_get_clientdata(client);
@@ -1449,7 +1448,7 @@ static int et8ek8_suspend(struct device *dev)
return __et8ek8_set_power(sensor, false);
}
-static int et8ek8_resume(struct device *dev)
+static int __maybe_unused et8ek8_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct v4l2_subdev *subdev = i2c_get_clientdata(client);
@@ -1461,13 +1460,6 @@ static int et8ek8_resume(struct device *dev)
return __et8ek8_set_power(sensor, true);
}
-#else
-
-#define et8ek8_suspend NULL
-#define et8ek8_resume NULL
-
-#endif /* CONFIG_PM */
-
static int et8ek8_probe(struct i2c_client *client,
const struct i2c_device_id *devid)
{
@@ -1542,6 +1534,7 @@ static int __exit et8ek8_remove(struct i2c_client *client)
v4l2_device_unregister_subdev(&sensor->subdev);
device_remove_file(&client->dev, &dev_attr_priv_mem);
v4l2_ctrl_handler_free(&sensor->ctrl_handler);
+ v4l2_async_unregister_subdev(&sensor->subdev);
media_entity_cleanup(&sensor->subdev.entity);
return 0;
@@ -1559,8 +1552,7 @@ static const struct i2c_device_id et8ek8_id_table[] = {
MODULE_DEVICE_TABLE(i2c, et8ek8_id_table);
static const struct dev_pm_ops et8ek8_pm_ops = {
- .suspend = et8ek8_suspend,
- .resume = et8ek8_resume,
+ SET_SYSTEM_SLEEP_PM_OPS(et8ek8_suspend, et8ek8_resume)
};
static struct i2c_driver et8ek8_i2c_driver = {
@@ -1576,6 +1568,6 @@ static struct i2c_driver et8ek8_i2c_driver = {
module_i2c_driver(et8ek8_i2c_driver);
-MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxx>");
+MODULE_AUTHOR("Sakari Ailus <sakari.ailus@xxxxxx>, Pavel Machek <pavel@xxxxxx");
MODULE_DESCRIPTION("Toshiba ET8EK8 camera sensor driver");
MODULE_LICENSE("GPL");
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Attachment:
signature.asc
Description: Digital signature