diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2013-04-04 10:24:43 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-06-21 14:44:49 -0400 |
commit | 663ccaf4cd61f510e8a8e9bb913d2ee9b1e94932 (patch) | |
tree | 4e365485f9cab31d2368dc4f113aad7a6b77561f /drivers/media | |
parent | ffebad7948ee0e9c619ae6e87d99437d907fc7e3 (diff) |
[media] mx3-camera: move interface activation and deactivation to clock callbacks
When adding and removing a client, the mx3-camera driver only activates
and deactivates its camera interface respectively, which doesn't include
any client-specific actions. Move this functionality into .clock_start()
and .clock_stop() callbacks.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/platform/soc_camera/mx3_camera.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/media/platform/soc_camera/mx3_camera.c b/drivers/media/platform/soc_camera/mx3_camera.c index 71b9b191957c..1047e3e8db77 100644 --- a/drivers/media/platform/soc_camera/mx3_camera.c +++ b/drivers/media/platform/soc_camera/mx3_camera.c | |||
@@ -460,8 +460,7 @@ static int mx3_camera_init_videobuf(struct vb2_queue *q, | |||
460 | } | 460 | } |
461 | 461 | ||
462 | /* First part of ipu_csi_init_interface() */ | 462 | /* First part of ipu_csi_init_interface() */ |
463 | static void mx3_camera_activate(struct mx3_camera_dev *mx3_cam, | 463 | static void mx3_camera_activate(struct mx3_camera_dev *mx3_cam) |
464 | struct soc_camera_device *icd) | ||
465 | { | 464 | { |
466 | u32 conf; | 465 | u32 conf; |
467 | long rate; | 466 | long rate; |
@@ -505,31 +504,40 @@ static void mx3_camera_activate(struct mx3_camera_dev *mx3_cam, | |||
505 | 504 | ||
506 | clk_prepare_enable(mx3_cam->clk); | 505 | clk_prepare_enable(mx3_cam->clk); |
507 | rate = clk_round_rate(mx3_cam->clk, mx3_cam->mclk); | 506 | rate = clk_round_rate(mx3_cam->clk, mx3_cam->mclk); |
508 | dev_dbg(icd->parent, "Set SENS_CONF to %x, rate %ld\n", conf, rate); | 507 | dev_dbg(mx3_cam->soc_host.v4l2_dev.dev, "Set SENS_CONF to %x, rate %ld\n", conf, rate); |
509 | if (rate) | 508 | if (rate) |
510 | clk_set_rate(mx3_cam->clk, rate); | 509 | clk_set_rate(mx3_cam->clk, rate); |
511 | } | 510 | } |
512 | 511 | ||
513 | /* Called with .host_lock held */ | ||
514 | static int mx3_camera_add_device(struct soc_camera_device *icd) | 512 | static int mx3_camera_add_device(struct soc_camera_device *icd) |
515 | { | 513 | { |
516 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); | 514 | dev_info(icd->parent, "MX3 Camera driver attached to camera %d\n", |
515 | icd->devnum); | ||
516 | |||
517 | return 0; | ||
518 | } | ||
519 | |||
520 | static void mx3_camera_remove_device(struct soc_camera_device *icd) | ||
521 | { | ||
522 | dev_info(icd->parent, "MX3 Camera driver detached from camera %d\n", | ||
523 | icd->devnum); | ||
524 | } | ||
525 | |||
526 | /* Called with .host_lock held */ | ||
527 | static int mx3_camera_clock_start(struct soc_camera_host *ici) | ||
528 | { | ||
517 | struct mx3_camera_dev *mx3_cam = ici->priv; | 529 | struct mx3_camera_dev *mx3_cam = ici->priv; |
518 | 530 | ||
519 | mx3_camera_activate(mx3_cam, icd); | 531 | mx3_camera_activate(mx3_cam); |
520 | 532 | ||
521 | mx3_cam->buf_total = 0; | 533 | mx3_cam->buf_total = 0; |
522 | 534 | ||
523 | dev_info(icd->parent, "MX3 Camera driver attached to camera %d\n", | ||
524 | icd->devnum); | ||
525 | |||
526 | return 0; | 535 | return 0; |
527 | } | 536 | } |
528 | 537 | ||
529 | /* Called with .host_lock held */ | 538 | /* Called with .host_lock held */ |
530 | static void mx3_camera_remove_device(struct soc_camera_device *icd) | 539 | static void mx3_camera_clock_stop(struct soc_camera_host *ici) |
531 | { | 540 | { |
532 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); | ||
533 | struct mx3_camera_dev *mx3_cam = ici->priv; | 541 | struct mx3_camera_dev *mx3_cam = ici->priv; |
534 | struct idmac_channel **ichan = &mx3_cam->idmac_channel[0]; | 542 | struct idmac_channel **ichan = &mx3_cam->idmac_channel[0]; |
535 | 543 | ||
@@ -539,9 +547,6 @@ static void mx3_camera_remove_device(struct soc_camera_device *icd) | |||
539 | } | 547 | } |
540 | 548 | ||
541 | clk_disable_unprepare(mx3_cam->clk); | 549 | clk_disable_unprepare(mx3_cam->clk); |
542 | |||
543 | dev_info(icd->parent, "MX3 Camera driver detached from camera %d\n", | ||
544 | icd->devnum); | ||
545 | } | 550 | } |
546 | 551 | ||
547 | static int test_platform_param(struct mx3_camera_dev *mx3_cam, | 552 | static int test_platform_param(struct mx3_camera_dev *mx3_cam, |
@@ -1124,6 +1129,8 @@ static struct soc_camera_host_ops mx3_soc_camera_host_ops = { | |||
1124 | .owner = THIS_MODULE, | 1129 | .owner = THIS_MODULE, |
1125 | .add = mx3_camera_add_device, | 1130 | .add = mx3_camera_add_device, |
1126 | .remove = mx3_camera_remove_device, | 1131 | .remove = mx3_camera_remove_device, |
1132 | .clock_start = mx3_camera_clock_start, | ||
1133 | .clock_stop = mx3_camera_clock_stop, | ||
1127 | .set_crop = mx3_camera_set_crop, | 1134 | .set_crop = mx3_camera_set_crop, |
1128 | .set_fmt = mx3_camera_set_fmt, | 1135 | .set_fmt = mx3_camera_set_fmt, |
1129 | .try_fmt = mx3_camera_try_fmt, | 1136 | .try_fmt = mx3_camera_try_fmt, |