hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/platform/rockchip/rga/rga.c
....@@ -1,15 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
34 * Author: Jacob Chen <jacob-chen@iotwrt.com>
4
- *
5
- * This software is licensed under the terms of the GNU General Public
6
- * License version 2, as published by the Free Software Foundation, and
7
- * may be copied, distributed, and modified under those terms.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
135 */
146
157 #include <linux/clk.h>
....@@ -97,7 +89,7 @@
9789 return IRQ_HANDLED;
9890 }
9991
100
-static struct v4l2_m2m_ops rga_m2m_ops = {
92
+static const struct v4l2_m2m_ops rga_m2m_ops = {
10193 .device_run = device_run,
10294 };
10395
....@@ -447,9 +439,9 @@
447439 static int
448440 vidioc_querycap(struct file *file, void *priv, struct v4l2_capability *cap)
449441 {
450
- strlcpy(cap->driver, RGA_NAME, sizeof(cap->driver));
451
- strlcpy(cap->card, "rockchip-rga", sizeof(cap->card));
452
- strlcpy(cap->bus_info, "platform:rga", sizeof(cap->bus_info));
442
+ strscpy(cap->driver, RGA_NAME, sizeof(cap->driver));
443
+ strscpy(cap->card, "rockchip-rga", sizeof(cap->card));
444
+ strscpy(cap->bus_info, "platform:rga", sizeof(cap->bus_info));
453445
454446 return 0;
455447 }
....@@ -700,7 +692,7 @@
700692 .vidioc_s_selection = vidioc_s_selection,
701693 };
702694
703
-static struct video_device rga_videodev = {
695
+static const struct video_device rga_videodev = {
704696 .name = "rockchip-rga",
705697 .fops = &rga_fops,
706698 .ioctl_ops = &rga_ioctl_ops,
....@@ -839,7 +831,6 @@
839831
840832 irq = platform_get_irq(pdev, 0);
841833 if (irq < 0) {
842
- dev_err(rga->dev, "failed to get irq\n");
843834 ret = irq;
844835 goto err_put_clk;
845836 }
....@@ -872,10 +863,12 @@
872863 if (IS_ERR(rga->m2m_dev)) {
873864 v4l2_err(&rga->v4l2_dev, "Failed to init mem2mem device\n");
874865 ret = PTR_ERR(rga->m2m_dev);
875
- goto unreg_video_dev;
866
+ goto rel_vdev;
876867 }
877868
878
- pm_runtime_get_sync(rga->dev);
869
+ ret = pm_runtime_resume_and_get(rga->dev);
870
+ if (ret < 0)
871
+ goto rel_m2m;
879872
880873 rga->version.major = (rga_read(rga, RGA_VERSION_INFO) >> 24) & 0xFF;
881874 rga->version.minor = (rga_read(rga, RGA_VERSION_INFO) >> 20) & 0x0F;
....@@ -889,19 +882,31 @@
889882 rga->cmdbuf_virt = dma_alloc_attrs(rga->dev, RGA_CMDBUF_SIZE,
890883 &rga->cmdbuf_phy, GFP_KERNEL,
891884 DMA_ATTR_WRITE_COMBINE);
885
+ if (!rga->cmdbuf_virt) {
886
+ ret = -ENOMEM;
887
+ goto rel_m2m;
888
+ }
892889
893890 rga->src_mmu_pages =
894891 (unsigned int *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 3);
892
+ if (!rga->src_mmu_pages) {
893
+ ret = -ENOMEM;
894
+ goto free_dma;
895
+ }
895896 rga->dst_mmu_pages =
896897 (unsigned int *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 3);
898
+ if (!rga->dst_mmu_pages) {
899
+ ret = -ENOMEM;
900
+ goto free_src_pages;
901
+ }
897902
898903 def_frame.stride = (def_frame.width * def_frame.fmt->depth) >> 3;
899904 def_frame.size = def_frame.stride * def_frame.height;
900905
901
- ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1);
906
+ ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1);
902907 if (ret) {
903908 v4l2_err(&rga->v4l2_dev, "Failed to register video device\n");
904
- goto rel_vdev;
909
+ goto free_dst_pages;
905910 }
906911
907912 v4l2_info(&rga->v4l2_dev, "Registered %s as /dev/%s\n",
....@@ -909,10 +914,17 @@
909914
910915 return 0;
911916
917
+free_dst_pages:
918
+ free_pages((unsigned long)rga->dst_mmu_pages, 3);
919
+free_src_pages:
920
+ free_pages((unsigned long)rga->src_mmu_pages, 3);
921
+free_dma:
922
+ dma_free_attrs(rga->dev, RGA_CMDBUF_SIZE, rga->cmdbuf_virt,
923
+ rga->cmdbuf_phy, DMA_ATTR_WRITE_COMBINE);
924
+rel_m2m:
925
+ v4l2_m2m_release(rga->m2m_dev);
912926 rel_vdev:
913927 video_device_release(vfd);
914
-unreg_video_dev:
915
- video_unregister_device(rga->vfd);
916928 unreg_v4l2_dev:
917929 v4l2_device_unregister(&rga->v4l2_dev);
918930 err_put_clk: