Commit 2e521061 authored by Robert Jarzmik's avatar Robert Jarzmik Committed by Mauro Carvalho Chehab

V4L/DVB (8610): Add suspend/resume capabilities to soc_camera.

Add suspend/resume hooks to call soc operation specific
suspend and resume functions. This ensures the camera
chip has been previously resumed, as well as the camera
bus.
These hooks in camera chip drivers should save/restore
chip context between suspend and resume time.
Signed-off-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 01c1e4ca
...@@ -732,10 +732,36 @@ static int soc_camera_remove(struct device *dev) ...@@ -732,10 +732,36 @@ static int soc_camera_remove(struct device *dev)
return 0; return 0;
} }
static int soc_camera_suspend(struct device *dev, pm_message_t state)
{
struct soc_camera_device *icd = to_soc_camera_dev(dev);
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
int ret = 0;
if (ici->ops->suspend)
ret = ici->ops->suspend(icd, state);
return ret;
}
static int soc_camera_resume(struct device *dev)
{
struct soc_camera_device *icd = to_soc_camera_dev(dev);
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
int ret = 0;
if (ici->ops->resume)
ret = ici->ops->resume(icd);
return ret;
}
static struct bus_type soc_camera_bus_type = { static struct bus_type soc_camera_bus_type = {
.name = "soc-camera", .name = "soc-camera",
.probe = soc_camera_probe, .probe = soc_camera_probe,
.remove = soc_camera_remove, .remove = soc_camera_remove,
.suspend = soc_camera_suspend,
.resume = soc_camera_resume,
}; };
static struct device_driver ic_drv = { static struct device_driver ic_drv = {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/videobuf-core.h> #include <media/videobuf-core.h>
#include <linux/pm.h>
struct soc_camera_device { struct soc_camera_device {
struct list_head list; struct list_head list;
...@@ -63,6 +64,8 @@ struct soc_camera_host_ops { ...@@ -63,6 +64,8 @@ struct soc_camera_host_ops {
struct module *owner; struct module *owner;
int (*add)(struct soc_camera_device *); int (*add)(struct soc_camera_device *);
void (*remove)(struct soc_camera_device *); void (*remove)(struct soc_camera_device *);
int (*suspend)(struct soc_camera_device *, pm_message_t state);
int (*resume)(struct soc_camera_device *);
int (*set_fmt_cap)(struct soc_camera_device *, __u32, int (*set_fmt_cap)(struct soc_camera_device *, __u32,
struct v4l2_rect *); struct v4l2_rect *);
int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *);
...@@ -111,6 +114,8 @@ struct soc_camera_ops { ...@@ -111,6 +114,8 @@ struct soc_camera_ops {
struct module *owner; struct module *owner;
int (*probe)(struct soc_camera_device *); int (*probe)(struct soc_camera_device *);
void (*remove)(struct soc_camera_device *); void (*remove)(struct soc_camera_device *);
int (*suspend)(struct soc_camera_device *, pm_message_t state);
int (*resume)(struct soc_camera_device *);
int (*init)(struct soc_camera_device *); int (*init)(struct soc_camera_device *);
int (*release)(struct soc_camera_device *); int (*release)(struct soc_camera_device *);
int (*start_capture)(struct soc_camera_device *); int (*start_capture)(struct soc_camera_device *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment