forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/drivers/media/platform/marvell-ccic/mcam-core.c
....@@ -4,6 +4,7 @@
44 * so it needs platform-specific support outside of the core.
55 *
66 * Copyright 2011 Jonathan Corbet corbet@lwn.net
7
+ * Copyright 2018 Lubomir Rintel <lkundrak@v3.sk>
78 */
89 #include <linux/kernel.h>
910 #include <linux/module.h>
....@@ -21,12 +22,13 @@
2122 #include <linux/vmalloc.h>
2223 #include <linux/io.h>
2324 #include <linux/clk.h>
25
+#include <linux/clk-provider.h>
2426 #include <linux/videodev2.h>
27
+#include <linux/pm_runtime.h>
2528 #include <media/v4l2-device.h>
2629 #include <media/v4l2-ioctl.h>
2730 #include <media/v4l2-ctrls.h>
2831 #include <media/v4l2-event.h>
29
-#include <media/i2c/ov7670.h>
3032 #include <media/videobuf2-vmalloc.h>
3133 #include <media/videobuf2-dma-contig.h>
3234 #include <media/videobuf2-dma-sg.h>
....@@ -93,57 +95,52 @@
9395 #define sensor_call(cam, o, f, args...) \
9496 v4l2_subdev_call(cam->sensor, o, f, ##args)
9597
98
+#define notifier_to_mcam(notifier) \
99
+ container_of(notifier, struct mcam_camera, notifier)
100
+
96101 static struct mcam_format_struct {
97
- __u8 *desc;
98102 __u32 pixelformat;
99103 int bpp; /* Bytes per pixel */
100104 bool planar;
101105 u32 mbus_code;
102106 } mcam_formats[] = {
103107 {
104
- .desc = "YUYV 4:2:2",
105108 .pixelformat = V4L2_PIX_FMT_YUYV,
106109 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
107110 .bpp = 2,
108111 .planar = false,
109112 },
110113 {
111
- .desc = "YVYU 4:2:2",
112114 .pixelformat = V4L2_PIX_FMT_YVYU,
113115 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
114116 .bpp = 2,
115117 .planar = false,
116118 },
117119 {
118
- .desc = "YUV 4:2:0 PLANAR",
119120 .pixelformat = V4L2_PIX_FMT_YUV420,
120121 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
121122 .bpp = 1,
122123 .planar = true,
123124 },
124125 {
125
- .desc = "YVU 4:2:0 PLANAR",
126126 .pixelformat = V4L2_PIX_FMT_YVU420,
127127 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
128128 .bpp = 1,
129129 .planar = true,
130130 },
131131 {
132
- .desc = "XRGB 444",
133132 .pixelformat = V4L2_PIX_FMT_XRGB444,
134133 .mbus_code = MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE,
135134 .bpp = 2,
136135 .planar = false,
137136 },
138137 {
139
- .desc = "RGB 565",
140138 .pixelformat = V4L2_PIX_FMT_RGB565,
141139 .mbus_code = MEDIA_BUS_FMT_RGB565_2X8_LE,
142140 .bpp = 2,
143141 .planar = false,
144142 },
145143 {
146
- .desc = "Raw RGB Bayer",
147144 .pixelformat = V4L2_PIX_FMT_SBGGR8,
148145 .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
149146 .bpp = 1,
....@@ -281,6 +278,8 @@
281278 static void mcam_enable_mipi(struct mcam_camera *mcam)
282279 {
283280 /* Using MIPI mode and enable MIPI */
281
+ if (mcam->calc_dphy)
282
+ mcam->calc_dphy(mcam);
284283 cam_dbg(mcam, "camera: DPHY3=0x%x, DPHY5=0x%x, DPHY6=0x%x\n",
285284 mcam->dphy[0], mcam->dphy[1], mcam->dphy[2]);
286285 mcam_reg_write(mcam, REG_CSI2_DPHY3, mcam->dphy[0]);
....@@ -300,9 +299,6 @@
300299 */
301300 mcam_reg_write(mcam, REG_CSI2_CTRL0,
302301 CSI2_C0_MIPI_EN | CSI2_C0_ACT_LANE(mcam->lane));
303
- mcam_reg_write(mcam, REG_CLKCTRL,
304
- (mcam->mclk_src << 29) | mcam->mclk_div);
305
-
306302 mcam->mipi_enabled = true;
307303 }
308304 }
....@@ -393,7 +389,7 @@
393389 dma_free_coherent(cam->dev, cam->dma_buf_size,
394390 cam->dma_bufs[0], cam->dma_handles[0]);
395391 cam->nbufs = 0;
396
- /* fall-through */
392
+ fallthrough;
397393 case 0:
398394 cam_err(cam, "Insufficient DMA buffers, cannot operate\n");
399395 return -ENOMEM;
....@@ -443,9 +439,9 @@
443439 /*
444440 * Copy data out to user space in the vmalloc case
445441 */
446
-static void mcam_frame_tasklet(unsigned long data)
442
+static void mcam_frame_tasklet(struct tasklet_struct *t)
447443 {
448
- struct mcam_camera *cam = (struct mcam_camera *) data;
444
+ struct mcam_camera *cam = from_tasklet(cam, t, s_tasklet);
449445 int i;
450446 unsigned long flags;
451447 struct mcam_vb_buffer *buf;
....@@ -792,12 +788,6 @@
792788 * Make sure it knows we want to use hsync/vsync.
793789 */
794790 mcam_reg_write_mask(cam, REG_CTRL0, C0_SIF_HVSYNC, C0_SIFM_MASK);
795
- /*
796
- * This field controls the generation of EOF(DVP only)
797
- */
798
- if (cam->bus_type != V4L2_MBUS_CSI2)
799
- mcam_reg_set_bit(cam, REG_CTRL0,
800
- C0_EOF_VSYNC | C0_VEDGE_CTRL);
801791 }
802792
803793
....@@ -832,31 +822,6 @@
832822 {
833823 mcam_reg_clear_bit(cam, REG_IRQMASK, FRAMEIRQS);
834824 }
835
-
836
-
837
-
838
-static void mcam_ctlr_init(struct mcam_camera *cam)
839
-{
840
- unsigned long flags;
841
-
842
- spin_lock_irqsave(&cam->dev_lock, flags);
843
- /*
844
- * Make sure it's not powered down.
845
- */
846
- mcam_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN);
847
- /*
848
- * Turn off the enable bit. It sure should be off anyway,
849
- * but it's good to be sure.
850
- */
851
- mcam_reg_clear_bit(cam, REG_CTRL0, C0_ENABLE);
852
- /*
853
- * Clock the sensor appropriately. Controller clock should
854
- * be 48MHz, sensor "typical" value is half that.
855
- */
856
- mcam_reg_write_mask(cam, REG_CLKCTRL, 2, CLK_DIV_MASK);
857
- spin_unlock_irqrestore(&cam->dev_lock, flags);
858
-}
859
-
860825
861826 /*
862827 * Stop the controller, and don't return until we're really sure that no
....@@ -901,14 +866,15 @@
901866 int ret;
902867
903868 spin_lock_irqsave(&cam->dev_lock, flags);
904
- ret = cam->plat_power_up(cam);
905
- if (ret) {
906
- spin_unlock_irqrestore(&cam->dev_lock, flags);
907
- return ret;
869
+ if (cam->plat_power_up) {
870
+ ret = cam->plat_power_up(cam);
871
+ if (ret) {
872
+ spin_unlock_irqrestore(&cam->dev_lock, flags);
873
+ return ret;
874
+ }
908875 }
909876 mcam_reg_clear_bit(cam, REG_CTRL1, C1_PWRDWN);
910877 spin_unlock_irqrestore(&cam->dev_lock, flags);
911
- msleep(5); /* Just to be sure */
912878 return 0;
913879 }
914880
....@@ -923,9 +889,81 @@
923889 * power down routine.
924890 */
925891 mcam_reg_set_bit(cam, REG_CTRL1, C1_PWRDWN);
926
- cam->plat_power_down(cam);
892
+ if (cam->plat_power_down)
893
+ cam->plat_power_down(cam);
927894 spin_unlock_irqrestore(&cam->dev_lock, flags);
928895 }
896
+
897
+/* ---------------------------------------------------------------------- */
898
+/*
899
+ * Master sensor clock.
900
+ */
901
+static int mclk_prepare(struct clk_hw *hw)
902
+{
903
+ struct mcam_camera *cam = container_of(hw, struct mcam_camera, mclk_hw);
904
+
905
+ clk_prepare(cam->clk[0]);
906
+ return 0;
907
+}
908
+
909
+static void mclk_unprepare(struct clk_hw *hw)
910
+{
911
+ struct mcam_camera *cam = container_of(hw, struct mcam_camera, mclk_hw);
912
+
913
+ clk_unprepare(cam->clk[0]);
914
+}
915
+
916
+static int mclk_enable(struct clk_hw *hw)
917
+{
918
+ struct mcam_camera *cam = container_of(hw, struct mcam_camera, mclk_hw);
919
+ int mclk_src;
920
+ int mclk_div;
921
+ int ret;
922
+
923
+ /*
924
+ * Clock the sensor appropriately. Controller clock should
925
+ * be 48MHz, sensor "typical" value is half that.
926
+ */
927
+ if (cam->bus_type == V4L2_MBUS_CSI2_DPHY) {
928
+ mclk_src = cam->mclk_src;
929
+ mclk_div = cam->mclk_div;
930
+ } else {
931
+ mclk_src = 3;
932
+ mclk_div = 2;
933
+ }
934
+
935
+ ret = pm_runtime_resume_and_get(cam->dev);
936
+ if (ret < 0)
937
+ return ret;
938
+ clk_enable(cam->clk[0]);
939
+ mcam_reg_write(cam, REG_CLKCTRL, (mclk_src << 29) | mclk_div);
940
+ mcam_ctlr_power_up(cam);
941
+
942
+ return 0;
943
+}
944
+
945
+static void mclk_disable(struct clk_hw *hw)
946
+{
947
+ struct mcam_camera *cam = container_of(hw, struct mcam_camera, mclk_hw);
948
+
949
+ mcam_ctlr_power_down(cam);
950
+ clk_disable(cam->clk[0]);
951
+ pm_runtime_put(cam->dev);
952
+}
953
+
954
+static unsigned long mclk_recalc_rate(struct clk_hw *hw,
955
+ unsigned long parent_rate)
956
+{
957
+ return 48000000;
958
+}
959
+
960
+static const struct clk_ops mclk_ops = {
961
+ .prepare = mclk_prepare,
962
+ .unprepare = mclk_unprepare,
963
+ .enable = mclk_enable,
964
+ .disable = mclk_disable,
965
+ .recalc_rate = mclk_recalc_rate,
966
+};
929967
930968 /* -------------------------------------------------------------------- */
931969 /*
....@@ -951,7 +989,6 @@
951989 ret = __mcam_cam_reset(cam);
952990 /* Get/set parameters? */
953991 cam->state = S_IDLE;
954
- mcam_ctlr_power_down(cam);
955992 return ret;
956993 }
957994
....@@ -1017,14 +1054,7 @@
10171054 spin_lock_irqsave(&cam->dev_lock, flags);
10181055 clear_bit(CF_DMA_ACTIVE, &cam->flags);
10191056 mcam_reset_buffers(cam);
1020
- /*
1021
- * Update CSI2_DPHY value
1022
- */
1023
- if (cam->calc_dphy)
1024
- cam->calc_dphy(cam);
1025
- cam_dbg(cam, "camera: DPHY sets: dphy3=0x%x, dphy5=0x%x, dphy6=0x%x\n",
1026
- cam->dphy[0], cam->dphy[1], cam->dphy[2]);
1027
- if (cam->bus_type == V4L2_MBUS_CSI2)
1057
+ if (cam->bus_type == V4L2_MBUS_CSI2_DPHY)
10281058 mcam_enable_mipi(cam);
10291059 else
10301060 mcam_disable_mipi(cam);
....@@ -1161,12 +1191,6 @@
11611191 return;
11621192 mcam_ctlr_stop_dma(cam);
11631193 /*
1164
- * Reset the CCIC PHY after stopping streaming,
1165
- * otherwise, the CCIC may be unstable.
1166
- */
1167
- if (cam->ctlr_reset)
1168
- cam->ctlr_reset(cam);
1169
- /*
11701194 * VB2 reclaims the buffers, so we need to forget
11711195 * about them.
11721196 */
....@@ -1281,8 +1305,7 @@
12811305 break;
12821306 case B_vmalloc:
12831307 #ifdef MCAM_MODE_VMALLOC
1284
- tasklet_init(&cam->s_tasklet, mcam_frame_tasklet,
1285
- (unsigned long) cam);
1308
+ tasklet_setup(&cam->s_tasklet, mcam_frame_tasklet);
12861309 vq->ops = &mcam_vb2_ops;
12871310 vq->mem_ops = &vb2_vmalloc_memops;
12881311 cam->dma_setup = mcam_ctlr_dma_vmalloc;
....@@ -1304,12 +1327,9 @@
13041327 {
13051328 struct mcam_camera *cam = video_drvdata(file);
13061329
1307
- strcpy(cap->driver, "marvell_ccic");
1308
- strcpy(cap->card, "marvell_ccic");
1309
- strlcpy(cap->bus_info, cam->bus_info, sizeof(cap->bus_info));
1310
- cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
1311
- V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
1312
- cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
1330
+ strscpy(cap->driver, "marvell_ccic", sizeof(cap->driver));
1331
+ strscpy(cap->card, "marvell_ccic", sizeof(cap->card));
1332
+ strscpy(cap->bus_info, cam->bus_info, sizeof(cap->bus_info));
13131333 return 0;
13141334 }
13151335
....@@ -1319,8 +1339,6 @@
13191339 {
13201340 if (fmt->index >= N_MCAM_FMTS)
13211341 return -EINVAL;
1322
- strlcpy(fmt->description, mcam_formats[fmt->index].desc,
1323
- sizeof(fmt->description));
13241342 fmt->pixelformat = mcam_formats[fmt->index].pixelformat;
13251343 return 0;
13261344 }
....@@ -1422,7 +1440,7 @@
14221440 return -EINVAL;
14231441
14241442 input->type = V4L2_INPUT_TYPE_CAMERA;
1425
- strcpy(input->name, "Camera");
1443
+ strscpy(input->name, "Camera", sizeof(input->name));
14261444 return 0;
14271445 }
14281446
....@@ -1593,8 +1611,11 @@
15931611 if (ret)
15941612 goto out;
15951613 if (v4l2_fh_is_singular_file(filp)) {
1596
- ret = mcam_ctlr_power_up(cam);
1614
+ ret = sensor_call(cam, core, s_power, 1);
15971615 if (ret)
1616
+ goto out;
1617
+ ret = pm_runtime_resume_and_get(cam->dev);
1618
+ if (ret < 0)
15981619 goto out;
15991620 __mcam_cam_reset(cam);
16001621 mcam_set_config_needed(cam, 1);
....@@ -1617,7 +1638,8 @@
16171638 _vb2_fop_release(filp, NULL);
16181639 if (last_open) {
16191640 mcam_disable_mipi(cam);
1620
- mcam_ctlr_power_down(cam);
1641
+ sensor_call(cam, core, s_power, 0);
1642
+ pm_runtime_put(cam->dev);
16211643 if (cam->buffer_mode == B_vmalloc && alloc_bufs_at_read)
16221644 mcam_free_dma_bufs(cam);
16231645 }
....@@ -1646,6 +1668,8 @@
16461668 .fops = &mcam_v4l_fops,
16471669 .ioctl_ops = &mcam_v4l_ioctl_ops,
16481670 .release = video_device_release_empty,
1671
+ .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
1672
+ V4L2_CAP_STREAMING,
16491673 };
16501674
16511675 /* ---------------------------------------------------------------------- */
....@@ -1727,23 +1751,95 @@
17271751 /*
17281752 * Registration and such.
17291753 */
1730
-static struct ov7670_config sensor_cfg = {
1731
- /*
1732
- * Exclude QCIF mode, because it only captures a tiny portion
1733
- * of the sensor FOV
1734
- */
1735
- .min_width = 320,
1736
- .min_height = 240,
1737
-};
17381754
1755
+static int mccic_notify_bound(struct v4l2_async_notifier *notifier,
1756
+ struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd)
1757
+{
1758
+ struct mcam_camera *cam = notifier_to_mcam(notifier);
1759
+ int ret;
1760
+
1761
+ mutex_lock(&cam->s_mutex);
1762
+ if (cam->sensor) {
1763
+ cam_err(cam, "sensor already bound\n");
1764
+ ret = -EBUSY;
1765
+ goto out;
1766
+ }
1767
+
1768
+ v4l2_set_subdev_hostdata(subdev, cam);
1769
+ cam->sensor = subdev;
1770
+
1771
+ ret = mcam_cam_init(cam);
1772
+ if (ret) {
1773
+ cam->sensor = NULL;
1774
+ goto out;
1775
+ }
1776
+
1777
+ ret = mcam_setup_vb2(cam);
1778
+ if (ret) {
1779
+ cam->sensor = NULL;
1780
+ goto out;
1781
+ }
1782
+
1783
+ cam->vdev = mcam_v4l_template;
1784
+ cam->vdev.v4l2_dev = &cam->v4l2_dev;
1785
+ cam->vdev.lock = &cam->s_mutex;
1786
+ cam->vdev.queue = &cam->vb_queue;
1787
+ video_set_drvdata(&cam->vdev, cam);
1788
+ ret = video_register_device(&cam->vdev, VFL_TYPE_VIDEO, -1);
1789
+ if (ret) {
1790
+ cam->sensor = NULL;
1791
+ goto out;
1792
+ }
1793
+
1794
+ cam_dbg(cam, "sensor %s bound\n", subdev->name);
1795
+out:
1796
+ mutex_unlock(&cam->s_mutex);
1797
+ return ret;
1798
+}
1799
+
1800
+static void mccic_notify_unbind(struct v4l2_async_notifier *notifier,
1801
+ struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd)
1802
+{
1803
+ struct mcam_camera *cam = notifier_to_mcam(notifier);
1804
+
1805
+ mutex_lock(&cam->s_mutex);
1806
+ if (cam->sensor != subdev) {
1807
+ cam_err(cam, "sensor %s not bound\n", subdev->name);
1808
+ goto out;
1809
+ }
1810
+
1811
+ video_unregister_device(&cam->vdev);
1812
+ cam->sensor = NULL;
1813
+ cam_dbg(cam, "sensor %s unbound\n", subdev->name);
1814
+
1815
+out:
1816
+ mutex_unlock(&cam->s_mutex);
1817
+}
1818
+
1819
+static int mccic_notify_complete(struct v4l2_async_notifier *notifier)
1820
+{
1821
+ struct mcam_camera *cam = notifier_to_mcam(notifier);
1822
+ int ret;
1823
+
1824
+ /*
1825
+ * Get the v4l2 setup done.
1826
+ */
1827
+ ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10);
1828
+ if (!ret)
1829
+ cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler;
1830
+
1831
+ return ret;
1832
+}
1833
+
1834
+static const struct v4l2_async_notifier_operations mccic_notify_ops = {
1835
+ .bound = mccic_notify_bound,
1836
+ .unbind = mccic_notify_unbind,
1837
+ .complete = mccic_notify_complete,
1838
+};
17391839
17401840 int mccic_register(struct mcam_camera *cam)
17411841 {
1742
- struct i2c_board_info ov7670_info = {
1743
- .type = "ov7670",
1744
- .addr = 0x42 >> 1,
1745
- .platform_data = &sensor_cfg,
1746
- };
1842
+ struct clk_init_data mclk_init = { };
17471843 int ret;
17481844
17491845 /*
....@@ -1756,64 +1852,62 @@
17561852 printk(KERN_ERR "marvell-cam: Cafe can't do S/G I/O, attempting vmalloc mode instead\n");
17571853 cam->buffer_mode = B_vmalloc;
17581854 }
1855
+
17591856 if (!mcam_buffer_mode_supported(cam->buffer_mode)) {
17601857 printk(KERN_ERR "marvell-cam: buffer mode %d unsupported\n",
17611858 cam->buffer_mode);
1762
- return -EINVAL;
1859
+ ret = -EINVAL;
1860
+ goto out;
17631861 }
1862
+
17641863 /*
17651864 * Register with V4L
17661865 */
17671866 ret = v4l2_device_register(cam->dev, &cam->v4l2_dev);
17681867 if (ret)
1769
- return ret;
1868
+ goto out;
17701869
17711870 mutex_init(&cam->s_mutex);
17721871 cam->state = S_NOTREADY;
17731872 mcam_set_config_needed(cam, 1);
17741873 cam->pix_format = mcam_def_pix_format;
17751874 cam->mbus_code = mcam_def_mbus_code;
1776
- mcam_ctlr_init(cam);
17771875
17781876 /*
1779
- * Get the v4l2 setup done.
1877
+ * Register sensor notifier.
17801878 */
1781
- ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10);
1782
- if (ret)
1783
- goto out_unregister;
1784
- cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler;
1785
-
1786
- /*
1787
- * Try to find the sensor.
1788
- */
1789
- sensor_cfg.clock_speed = cam->clock_speed;
1790
- sensor_cfg.use_smbus = cam->use_smbus;
1791
- cam->sensor_addr = ov7670_info.addr;
1792
- cam->sensor = v4l2_i2c_new_subdev_board(&cam->v4l2_dev,
1793
- cam->i2c_adapter, &ov7670_info, NULL);
1794
- if (cam->sensor == NULL) {
1795
- ret = -ENODEV;
1796
- goto out_unregister;
1879
+ v4l2_async_notifier_init(&cam->notifier);
1880
+ ret = v4l2_async_notifier_add_subdev(&cam->notifier, &cam->asd);
1881
+ if (ret) {
1882
+ cam_warn(cam, "failed to add subdev to a notifier");
1883
+ goto out;
17971884 }
17981885
1799
- ret = mcam_cam_init(cam);
1800
- if (ret)
1801
- goto out_unregister;
1886
+ cam->notifier.ops = &mccic_notify_ops;
1887
+ ret = v4l2_async_notifier_register(&cam->v4l2_dev, &cam->notifier);
1888
+ if (ret < 0) {
1889
+ cam_warn(cam, "failed to register a sensor notifier");
1890
+ goto out;
1891
+ }
18021892
1803
- ret = mcam_setup_vb2(cam);
1804
- if (ret)
1805
- goto out_unregister;
1893
+ /*
1894
+ * Register sensor master clock.
1895
+ */
1896
+ mclk_init.parent_names = NULL;
1897
+ mclk_init.num_parents = 0;
1898
+ mclk_init.ops = &mclk_ops;
1899
+ mclk_init.name = "mclk";
18061900
1807
- mutex_lock(&cam->s_mutex);
1808
- cam->vdev = mcam_v4l_template;
1809
- cam->vdev.v4l2_dev = &cam->v4l2_dev;
1810
- cam->vdev.lock = &cam->s_mutex;
1811
- cam->vdev.queue = &cam->vb_queue;
1812
- video_set_drvdata(&cam->vdev, cam);
1813
- ret = video_register_device(&cam->vdev, VFL_TYPE_GRABBER, -1);
1814
- if (ret) {
1815
- mutex_unlock(&cam->s_mutex);
1816
- goto out_unregister;
1901
+ of_property_read_string(cam->dev->of_node, "clock-output-names",
1902
+ &mclk_init.name);
1903
+
1904
+ cam->mclk_hw.init = &mclk_init;
1905
+
1906
+ cam->mclk = devm_clk_register(cam->dev, &cam->mclk_hw);
1907
+ if (IS_ERR(cam->mclk)) {
1908
+ ret = PTR_ERR(cam->mclk);
1909
+ dev_err(cam->dev, "can't register clock\n");
1910
+ goto out;
18171911 }
18181912
18191913 /*
....@@ -1824,12 +1918,12 @@
18241918 cam_warn(cam, "Unable to alloc DMA buffers at load will try again later.");
18251919 }
18261920
1827
- mutex_unlock(&cam->s_mutex);
18281921 return 0;
18291922
1830
-out_unregister:
1831
- v4l2_ctrl_handler_free(&cam->ctrl_handler);
1923
+out:
1924
+ v4l2_async_notifier_unregister(&cam->notifier);
18321925 v4l2_device_unregister(&cam->v4l2_dev);
1926
+ v4l2_async_notifier_cleanup(&cam->notifier);
18331927 return ret;
18341928 }
18351929 EXPORT_SYMBOL_GPL(mccic_register);
....@@ -1844,21 +1938,20 @@
18441938 */
18451939 if (!list_empty(&cam->vdev.fh_list)) {
18461940 cam_warn(cam, "Removing a device with users!\n");
1847
- mcam_ctlr_power_down(cam);
1941
+ sensor_call(cam, core, s_power, 0);
18481942 }
18491943 if (cam->buffer_mode == B_vmalloc)
18501944 mcam_free_dma_bufs(cam);
1851
- video_unregister_device(&cam->vdev);
18521945 v4l2_ctrl_handler_free(&cam->ctrl_handler);
1946
+ v4l2_async_notifier_unregister(&cam->notifier);
18531947 v4l2_device_unregister(&cam->v4l2_dev);
1948
+ v4l2_async_notifier_cleanup(&cam->notifier);
18541949 }
18551950 EXPORT_SYMBOL_GPL(mccic_shutdown);
18561951
18571952 /*
18581953 * Power management
18591954 */
1860
-#ifdef CONFIG_PM
1861
-
18621955 void mccic_suspend(struct mcam_camera *cam)
18631956 {
18641957 mutex_lock(&cam->s_mutex);
....@@ -1866,7 +1959,7 @@
18661959 enum mcam_state cstate = cam->state;
18671960
18681961 mcam_ctlr_stop_dma(cam);
1869
- mcam_ctlr_power_down(cam);
1962
+ sensor_call(cam, core, s_power, 0);
18701963 cam->state = cstate;
18711964 }
18721965 mutex_unlock(&cam->s_mutex);
....@@ -1879,14 +1972,14 @@
18791972
18801973 mutex_lock(&cam->s_mutex);
18811974 if (!list_empty(&cam->vdev.fh_list)) {
1882
- ret = mcam_ctlr_power_up(cam);
1975
+ ret = sensor_call(cam, core, s_power, 1);
18831976 if (ret) {
18841977 mutex_unlock(&cam->s_mutex);
18851978 return ret;
18861979 }
18871980 __mcam_cam_reset(cam);
18881981 } else {
1889
- mcam_ctlr_power_down(cam);
1982
+ sensor_call(cam, core, s_power, 0);
18901983 }
18911984 mutex_unlock(&cam->s_mutex);
18921985
....@@ -1903,7 +1996,6 @@
19031996 return ret;
19041997 }
19051998 EXPORT_SYMBOL_GPL(mccic_resume);
1906
-#endif /* CONFIG_PM */
19071999
19082000 MODULE_LICENSE("GPL v2");
19092001 MODULE_AUTHOR("Jonathan Corbet <corbet@lwn.net>");