diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2009-08-25 10:43:33 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-09-18 23:18:35 -0400 |
commit | 979ea1ddf80ac7383acdea03471355ca62702539 (patch) | |
tree | 2ee4c73eb672c1ee8167ed7e0906bac6f3b00e69 /drivers/media/video/mx3_camera.c | |
parent | 0bab829de1ab60d8c3cbf7e402192bb9446840b7 (diff) |
V4L/DVB (12510): soc-camera: (partially) convert to v4l2-(sub)dev API
Convert the soc-camera framework to use the v4l2-(sub)dev API. Start using
v4l2-subdev operations. Only a part of the interface between the
soc_camera core, soc_camera host drivers on one side and soc_camera device
drivers on the other side is replaced so far. The rest of the interface
will be replaced in incremental steps, and will require extensions and,
possibly, modifications to the v4l2-subdev code.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/mx3_camera.c')
-rw-r--r-- | drivers/media/video/mx3_camera.c | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/drivers/media/video/mx3_camera.c b/drivers/media/video/mx3_camera.c index 2edf77a6256b..677d355be8fc 100644 --- a/drivers/media/video/mx3_camera.c +++ b/drivers/media/video/mx3_camera.c | |||
@@ -431,7 +431,7 @@ static void mx3_camera_init_videobuf(struct videobuf_queue *q, | |||
431 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 431 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
432 | struct mx3_camera_dev *mx3_cam = ici->priv; | 432 | struct mx3_camera_dev *mx3_cam = ici->priv; |
433 | 433 | ||
434 | videobuf_queue_dma_contig_init(q, &mx3_videobuf_ops, ici->dev, | 434 | videobuf_queue_dma_contig_init(q, &mx3_videobuf_ops, icd->dev.parent, |
435 | &mx3_cam->lock, | 435 | &mx3_cam->lock, |
436 | V4L2_BUF_TYPE_VIDEO_CAPTURE, | 436 | V4L2_BUF_TYPE_VIDEO_CAPTURE, |
437 | V4L2_FIELD_NONE, | 437 | V4L2_FIELD_NONE, |
@@ -494,17 +494,11 @@ static int mx3_camera_add_device(struct soc_camera_device *icd) | |||
494 | { | 494 | { |
495 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 495 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
496 | struct mx3_camera_dev *mx3_cam = ici->priv; | 496 | struct mx3_camera_dev *mx3_cam = ici->priv; |
497 | int ret; | ||
498 | 497 | ||
499 | if (mx3_cam->icd) { | 498 | if (mx3_cam->icd) |
500 | ret = -EBUSY; | 499 | return -EBUSY; |
501 | goto ebusy; | ||
502 | } | ||
503 | 500 | ||
504 | mx3_camera_activate(mx3_cam, icd); | 501 | mx3_camera_activate(mx3_cam, icd); |
505 | ret = icd->ops->init(icd); | ||
506 | if (ret < 0) | ||
507 | goto einit; | ||
508 | 502 | ||
509 | mx3_cam->icd = icd; | 503 | mx3_cam->icd = icd; |
510 | 504 | ||
@@ -512,12 +506,6 @@ static int mx3_camera_add_device(struct soc_camera_device *icd) | |||
512 | icd->devnum); | 506 | icd->devnum); |
513 | 507 | ||
514 | return 0; | 508 | return 0; |
515 | |||
516 | einit: | ||
517 | clk_disable(mx3_cam->clk); | ||
518 | ebusy: | ||
519 | |||
520 | return ret; | ||
521 | } | 509 | } |
522 | 510 | ||
523 | /* Called with .video_lock held */ | 511 | /* Called with .video_lock held */ |
@@ -534,8 +522,6 @@ static void mx3_camera_remove_device(struct soc_camera_device *icd) | |||
534 | *ichan = NULL; | 522 | *ichan = NULL; |
535 | } | 523 | } |
536 | 524 | ||
537 | icd->ops->release(icd); | ||
538 | |||
539 | clk_disable(mx3_cam->clk); | 525 | clk_disable(mx3_cam->clk); |
540 | 526 | ||
541 | mx3_cam->icd = NULL; | 527 | mx3_cam->icd = NULL; |
@@ -600,7 +586,7 @@ static int test_platform_param(struct mx3_camera_dev *mx3_cam, | |||
600 | *flags |= SOCAM_DATAWIDTH_4; | 586 | *flags |= SOCAM_DATAWIDTH_4; |
601 | break; | 587 | break; |
602 | default: | 588 | default: |
603 | dev_info(mx3_cam->soc_host.dev, "Unsupported bus width %d\n", | 589 | dev_info(mx3_cam->soc_host.v4l2_dev.dev, "Unsupported bus width %d\n", |
604 | buswidth); | 590 | buswidth); |
605 | return -EINVAL; | 591 | return -EINVAL; |
606 | } | 592 | } |
@@ -616,7 +602,7 @@ static int mx3_camera_try_bus_param(struct soc_camera_device *icd, | |||
616 | unsigned long bus_flags, camera_flags; | 602 | unsigned long bus_flags, camera_flags; |
617 | int ret = test_platform_param(mx3_cam, depth, &bus_flags); | 603 | int ret = test_platform_param(mx3_cam, depth, &bus_flags); |
618 | 604 | ||
619 | dev_dbg(ici->dev, "requested bus width %d bit: %d\n", depth, ret); | 605 | dev_dbg(icd->dev.parent, "requested bus width %d bit: %d\n", depth, ret); |
620 | 606 | ||
621 | if (ret < 0) | 607 | if (ret < 0) |
622 | return ret; | 608 | return ret; |
@@ -639,7 +625,7 @@ static bool chan_filter(struct dma_chan *chan, void *arg) | |||
639 | if (!rq) | 625 | if (!rq) |
640 | return false; | 626 | return false; |
641 | 627 | ||
642 | pdata = rq->mx3_cam->soc_host.dev->platform_data; | 628 | pdata = rq->mx3_cam->soc_host.v4l2_dev.dev->platform_data; |
643 | 629 | ||
644 | return rq->id == chan->chan_id && | 630 | return rq->id == chan->chan_id && |
645 | pdata->dma_dev == chan->device->dev; | 631 | pdata->dma_dev == chan->device->dev; |
@@ -699,7 +685,7 @@ static int mx3_camera_get_formats(struct soc_camera_device *icd, int idx, | |||
699 | xlate->cam_fmt = icd->formats + idx; | 685 | xlate->cam_fmt = icd->formats + idx; |
700 | xlate->buswidth = buswidth; | 686 | xlate->buswidth = buswidth; |
701 | xlate++; | 687 | xlate++; |
702 | dev_dbg(ici->dev, "Providing format %s using %s\n", | 688 | dev_dbg(icd->dev.parent, "Providing format %s using %s\n", |
703 | mx3_camera_formats[0].name, | 689 | mx3_camera_formats[0].name, |
704 | icd->formats[idx].name); | 690 | icd->formats[idx].name); |
705 | } | 691 | } |
@@ -711,7 +697,7 @@ static int mx3_camera_get_formats(struct soc_camera_device *icd, int idx, | |||
711 | xlate->cam_fmt = icd->formats + idx; | 697 | xlate->cam_fmt = icd->formats + idx; |
712 | xlate->buswidth = buswidth; | 698 | xlate->buswidth = buswidth; |
713 | xlate++; | 699 | xlate++; |
714 | dev_dbg(ici->dev, "Providing format %s using %s\n", | 700 | dev_dbg(icd->dev.parent, "Providing format %s using %s\n", |
715 | mx3_camera_formats[0].name, | 701 | mx3_camera_formats[0].name, |
716 | icd->formats[idx].name); | 702 | icd->formats[idx].name); |
717 | } | 703 | } |
@@ -724,7 +710,7 @@ passthrough: | |||
724 | xlate->cam_fmt = icd->formats + idx; | 710 | xlate->cam_fmt = icd->formats + idx; |
725 | xlate->buswidth = buswidth; | 711 | xlate->buswidth = buswidth; |
726 | xlate++; | 712 | xlate++; |
727 | dev_dbg(ici->dev, | 713 | dev_dbg(icd->dev.parent, |
728 | "Providing format %s in pass-through mode\n", | 714 | "Providing format %s in pass-through mode\n", |
729 | icd->formats[idx].name); | 715 | icd->formats[idx].name); |
730 | } | 716 | } |
@@ -831,7 +817,7 @@ static int mx3_camera_set_fmt(struct soc_camera_device *icd, | |||
831 | 817 | ||
832 | xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat); | 818 | xlate = soc_camera_xlate_by_fourcc(icd, pix->pixelformat); |
833 | if (!xlate) { | 819 | if (!xlate) { |
834 | dev_warn(ici->dev, "Format %x not found\n", pix->pixelformat); | 820 | dev_warn(icd->dev.parent, "Format %x not found\n", pix->pixelformat); |
835 | return -EINVAL; | 821 | return -EINVAL; |
836 | } | 822 | } |
837 | 823 | ||
@@ -847,7 +833,7 @@ static int mx3_camera_set_fmt(struct soc_camera_device *icd, | |||
847 | 833 | ||
848 | configure_geometry(mx3_cam, &rect); | 834 | configure_geometry(mx3_cam, &rect); |
849 | 835 | ||
850 | ret = icd->ops->set_fmt(icd, f); | 836 | ret = v4l2_device_call_until_err(&ici->v4l2_dev, 0, video, s_fmt, f); |
851 | if (!ret) { | 837 | if (!ret) { |
852 | icd->buswidth = xlate->buswidth; | 838 | icd->buswidth = xlate->buswidth; |
853 | icd->current_fmt = xlate->host_fmt; | 839 | icd->current_fmt = xlate->host_fmt; |
@@ -868,7 +854,7 @@ static int mx3_camera_try_fmt(struct soc_camera_device *icd, | |||
868 | 854 | ||
869 | xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); | 855 | xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); |
870 | if (pixfmt && !xlate) { | 856 | if (pixfmt && !xlate) { |
871 | dev_warn(ici->dev, "Format %x not found\n", pixfmt); | 857 | dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt); |
872 | return -EINVAL; | 858 | return -EINVAL; |
873 | } | 859 | } |
874 | 860 | ||
@@ -885,7 +871,7 @@ static int mx3_camera_try_fmt(struct soc_camera_device *icd, | |||
885 | /* camera has to see its format, but the user the original one */ | 871 | /* camera has to see its format, but the user the original one */ |
886 | pix->pixelformat = xlate->cam_fmt->fourcc; | 872 | pix->pixelformat = xlate->cam_fmt->fourcc; |
887 | /* limit to sensor capabilities */ | 873 | /* limit to sensor capabilities */ |
888 | ret = icd->ops->try_fmt(icd, f); | 874 | ret = v4l2_device_call_until_err(&ici->v4l2_dev, 0, video, try_fmt, f); |
889 | pix->pixelformat = xlate->host_fmt->fourcc; | 875 | pix->pixelformat = xlate->host_fmt->fourcc; |
890 | 876 | ||
891 | field = pix->field; | 877 | field = pix->field; |
@@ -935,11 +921,11 @@ static int mx3_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt) | |||
935 | 921 | ||
936 | xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); | 922 | xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); |
937 | if (!xlate) { | 923 | if (!xlate) { |
938 | dev_warn(ici->dev, "Format %x not found\n", pixfmt); | 924 | dev_warn(icd->dev.parent, "Format %x not found\n", pixfmt); |
939 | return -EINVAL; | 925 | return -EINVAL; |
940 | } | 926 | } |
941 | 927 | ||
942 | dev_dbg(ici->dev, "requested bus width %d bit: %d\n", | 928 | dev_dbg(icd->dev.parent, "requested bus width %d bit: %d\n", |
943 | icd->buswidth, ret); | 929 | icd->buswidth, ret); |
944 | 930 | ||
945 | if (ret < 0) | 931 | if (ret < 0) |
@@ -948,10 +934,10 @@ static int mx3_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt) | |||
948 | camera_flags = icd->ops->query_bus_param(icd); | 934 | camera_flags = icd->ops->query_bus_param(icd); |
949 | 935 | ||
950 | common_flags = soc_camera_bus_param_compatible(camera_flags, bus_flags); | 936 | common_flags = soc_camera_bus_param_compatible(camera_flags, bus_flags); |
951 | dev_dbg(ici->dev, "Flags cam: 0x%lx host: 0x%lx common: 0x%lx\n", | 937 | dev_dbg(icd->dev.parent, "Flags cam: 0x%lx host: 0x%lx common: 0x%lx\n", |
952 | camera_flags, bus_flags, common_flags); | 938 | camera_flags, bus_flags, common_flags); |
953 | if (!common_flags) { | 939 | if (!common_flags) { |
954 | dev_dbg(ici->dev, "no common flags"); | 940 | dev_dbg(icd->dev.parent, "no common flags"); |
955 | return -EINVAL; | 941 | return -EINVAL; |
956 | } | 942 | } |
957 | 943 | ||
@@ -1005,7 +991,7 @@ static int mx3_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt) | |||
1005 | 991 | ||
1006 | ret = icd->ops->set_bus_param(icd, common_flags); | 992 | ret = icd->ops->set_bus_param(icd, common_flags); |
1007 | if (ret < 0) { | 993 | if (ret < 0) { |
1008 | dev_dbg(ici->dev, "camera set_bus_param(%lx) returned %d\n", | 994 | dev_dbg(icd->dev.parent, "camera set_bus_param(%lx) returned %d\n", |
1009 | common_flags, ret); | 995 | common_flags, ret); |
1010 | return ret; | 996 | return ret; |
1011 | } | 997 | } |
@@ -1060,7 +1046,7 @@ static int mx3_camera_set_bus_param(struct soc_camera_device *icd, __u32 pixfmt) | |||
1060 | 1046 | ||
1061 | csi_reg_write(mx3_cam, sens_conf | dw, CSI_SENS_CONF); | 1047 | csi_reg_write(mx3_cam, sens_conf | dw, CSI_SENS_CONF); |
1062 | 1048 | ||
1063 | dev_dbg(ici->dev, "Set SENS_CONF to %x\n", sens_conf | dw); | 1049 | dev_dbg(icd->dev.parent, "Set SENS_CONF to %x\n", sens_conf | dw); |
1064 | 1050 | ||
1065 | return 0; | 1051 | return 0; |
1066 | } | 1052 | } |
@@ -1145,7 +1131,7 @@ static int __devinit mx3_camera_probe(struct platform_device *pdev) | |||
1145 | soc_host->drv_name = MX3_CAM_DRV_NAME; | 1131 | soc_host->drv_name = MX3_CAM_DRV_NAME; |
1146 | soc_host->ops = &mx3_soc_camera_host_ops; | 1132 | soc_host->ops = &mx3_soc_camera_host_ops; |
1147 | soc_host->priv = mx3_cam; | 1133 | soc_host->priv = mx3_cam; |
1148 | soc_host->dev = &pdev->dev; | 1134 | soc_host->v4l2_dev.dev = &pdev->dev; |
1149 | soc_host->nr = pdev->id; | 1135 | soc_host->nr = pdev->id; |
1150 | 1136 | ||
1151 | err = soc_camera_host_register(soc_host); | 1137 | err = soc_camera_host_register(soc_host); |