media: ov9640: Use the generic clock framework

Commit 63839882c5 ("media: mach-pxa: palmz72/pcm990: remove soc_camera dependencies")
removed the last in-tree user of this sensor. New users
will be required to use the generic clock framework,
so it's possible to convert the driver to use it.

Convert the driver to use the CCF, and drop the legacy
v4l2-clk API.

Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
Acked-by: Petr Cvek <petrcvekcz@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Ezequiel Garcia 2021-01-12 20:49:16 +01:00 коммит произвёл Mauro Carvalho Chehab
Родитель 832e6609f7
Коммит 8de14b3acb
2 изменённых файлов: 7 добавлений и 10 удалений

Просмотреть файл

@ -17,6 +17,7 @@
* Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de> * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
*/ */
#include <linux/clk.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/i2c.h> #include <linux/i2c.h>
@ -26,7 +27,6 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/v4l2-async.h> #include <media/v4l2-async.h>
#include <media/v4l2-clk.h>
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h> #include <media/v4l2-device.h>
@ -333,13 +333,13 @@ static int ov9640_s_power(struct v4l2_subdev *sd, int on)
if (on) { if (on) {
gpiod_set_value(priv->gpio_power, 1); gpiod_set_value(priv->gpio_power, 1);
usleep_range(1000, 2000); usleep_range(1000, 2000);
ret = v4l2_clk_enable(priv->clk); ret = clk_prepare_enable(priv->clk);
usleep_range(1000, 2000); usleep_range(1000, 2000);
gpiod_set_value(priv->gpio_reset, 0); gpiod_set_value(priv->gpio_reset, 0);
} else { } else {
gpiod_set_value(priv->gpio_reset, 1); gpiod_set_value(priv->gpio_reset, 1);
usleep_range(1000, 2000); usleep_range(1000, 2000);
v4l2_clk_disable(priv->clk); clk_disable_unprepare(priv->clk);
usleep_range(1000, 2000); usleep_range(1000, 2000);
gpiod_set_value(priv->gpio_power, 0); gpiod_set_value(priv->gpio_power, 0);
} }
@ -719,7 +719,7 @@ static int ov9640_probe(struct i2c_client *client,
priv->subdev.ctrl_handler = &priv->hdl; priv->subdev.ctrl_handler = &priv->hdl;
priv->clk = v4l2_clk_get(&client->dev, "mclk"); priv->clk = devm_clk_get(&client->dev, "mclk");
if (IS_ERR(priv->clk)) { if (IS_ERR(priv->clk)) {
ret = PTR_ERR(priv->clk); ret = PTR_ERR(priv->clk);
goto ectrlinit; goto ectrlinit;
@ -727,17 +727,15 @@ static int ov9640_probe(struct i2c_client *client,
ret = ov9640_video_probe(client); ret = ov9640_video_probe(client);
if (ret) if (ret)
goto eprobe; goto ectrlinit;
priv->subdev.dev = &client->dev; priv->subdev.dev = &client->dev;
ret = v4l2_async_register_subdev(&priv->subdev); ret = v4l2_async_register_subdev(&priv->subdev);
if (ret) if (ret)
goto eprobe; goto ectrlinit;
return 0; return 0;
eprobe:
v4l2_clk_put(priv->clk);
ectrlinit: ectrlinit:
v4l2_ctrl_handler_free(&priv->hdl); v4l2_ctrl_handler_free(&priv->hdl);
@ -749,7 +747,6 @@ static int ov9640_remove(struct i2c_client *client)
struct v4l2_subdev *sd = i2c_get_clientdata(client); struct v4l2_subdev *sd = i2c_get_clientdata(client);
struct ov9640_priv *priv = to_ov9640_sensor(sd); struct ov9640_priv *priv = to_ov9640_sensor(sd);
v4l2_clk_put(priv->clk);
v4l2_async_unregister_subdev(&priv->subdev); v4l2_async_unregister_subdev(&priv->subdev);
v4l2_ctrl_handler_free(&priv->hdl); v4l2_ctrl_handler_free(&priv->hdl);

Просмотреть файл

@ -196,7 +196,7 @@ struct ov9640_reg {
struct ov9640_priv { struct ov9640_priv {
struct v4l2_subdev subdev; struct v4l2_subdev subdev;
struct v4l2_ctrl_handler hdl; struct v4l2_ctrl_handler hdl;
struct v4l2_clk *clk; struct clk *clk;
struct gpio_desc *gpio_power; struct gpio_desc *gpio_power;
struct gpio_desc *gpio_reset; struct gpio_desc *gpio_reset;