hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/media/platform/exynos4-is/fimc-is.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
34 *
....@@ -5,17 +6,12 @@
56 *
67 * Authors: Sylwester Nawrocki <s.nawrocki@samsung.com>
78 * Younghwan Joo <yhwan.joo@samsung.com>
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License version 2 as
11
- * published by the Free Software Foundation.
129 */
1310 #define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__
1411
1512 #include <linux/device.h>
1613 #include <linux/debugfs.h>
1714 #include <linux/delay.h>
18
-#include <linux/dma-contiguous.h>
1915 #include <linux/errno.h>
2016 #include <linux/firmware.h>
2117 #include <linux/interrupt.h>
....@@ -144,7 +140,7 @@
144140 dev_err(&is->pdev->dev, "clock %s enable failed\n",
145141 fimc_is_clocks[i]);
146142 for (--i; i >= 0; i--)
147
- clk_disable(is->clocks[i]);
143
+ clk_disable_unprepare(is->clocks[i]);
148144 return ret;
149145 }
150146 pr_debug("enabled clock: %s\n", fimc_is_clocks[i]);
....@@ -217,6 +213,7 @@
217213
218214 if (ret < 0 || index >= FIMC_IS_SENSORS_NUM) {
219215 of_node_put(child);
216
+ of_node_put(i2c_bus);
220217 return ret;
221218 }
222219 index++;
....@@ -344,7 +341,6 @@
344341 return -ENOMEM;
345342
346343 is->memory.size = FIMC_IS_CPU_MEM_SIZE;
347
- memset(is->memory.vaddr, 0, is->memory.size);
348344
349345 dev_info(dev, "FIMC-IS CPU memory base: %#x\n", (u32)is->memory.paddr);
350346
....@@ -656,7 +652,7 @@
656652
657653 int fimc_is_hw_initialize(struct fimc_is *is)
658654 {
659
- const int config_ids[] = {
655
+ static const int config_ids[] = {
660656 IS_SC_PREVIEW_STILL, IS_SC_PREVIEW_VIDEO,
661657 IS_SC_CAPTURE_STILL, IS_SC_CAPTURE_VIDEO
662658 };
....@@ -738,7 +734,7 @@
738734 return 0;
739735 }
740736
741
-static int fimc_is_log_show(struct seq_file *s, void *data)
737
+static int fimc_is_show(struct seq_file *s, void *data)
742738 {
743739 struct fimc_is *is = s->private;
744740 const u8 *buf = is->memory.vaddr + FIMC_IS_DEBUG_REGION_OFFSET;
....@@ -752,17 +748,7 @@
752748 return 0;
753749 }
754750
755
-static int fimc_is_debugfs_open(struct inode *inode, struct file *file)
756
-{
757
- return single_open(file, fimc_is_log_show, inode->i_private);
758
-}
759
-
760
-static const struct file_operations fimc_is_debugfs_fops = {
761
- .open = fimc_is_debugfs_open,
762
- .read = seq_read,
763
- .llseek = seq_lseek,
764
- .release = single_release,
765
-};
751
+DEFINE_SHOW_ATTRIBUTE(fimc_is);
766752
767753 static void fimc_is_debugfs_remove(struct fimc_is *is)
768754 {
....@@ -770,18 +756,12 @@
770756 is->debugfs_entry = NULL;
771757 }
772758
773
-static int fimc_is_debugfs_create(struct fimc_is *is)
759
+static void fimc_is_debugfs_create(struct fimc_is *is)
774760 {
775
- struct dentry *dentry;
776
-
777761 is->debugfs_entry = debugfs_create_dir("fimc_is", NULL);
778762
779
- dentry = debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry,
780
- is, &fimc_is_debugfs_fops);
781
- if (!dentry)
782
- fimc_is_debugfs_remove(is);
783
-
784
- return is->debugfs_entry == NULL ? -EIO : 0;
763
+ debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry, is,
764
+ &fimc_is_fops);
785765 }
786766
787767 static int fimc_is_runtime_resume(struct device *dev);
....@@ -849,9 +829,9 @@
849829 goto err_irq;
850830 }
851831
852
- ret = pm_runtime_get_sync(dev);
832
+ ret = pm_runtime_resume_and_get(dev);
853833 if (ret < 0)
854
- goto err_pm;
834
+ goto err_pm_disable;
855835
856836 vb2_dma_contig_set_max_seg_size(dev, DMA_BIT_MASK(32));
857837
....@@ -867,9 +847,7 @@
867847 if (ret < 0)
868848 goto err_pm;
869849
870
- ret = fimc_is_debugfs_create(is);
871
- if (ret < 0)
872
- goto err_sd;
850
+ fimc_is_debugfs_create(is);
873851
874852 ret = fimc_is_request_firmware(is, FIMC_IS_FW_FILENAME);
875853 if (ret < 0)
....@@ -882,11 +860,13 @@
882860
883861 err_dfs:
884862 fimc_is_debugfs_remove(is);
885
-err_sd:
886863 fimc_is_unregister_subdevs(is);
887864 err_pm:
865
+ pm_runtime_put_noidle(dev);
888866 if (!pm_runtime_enabled(dev))
889867 fimc_is_runtime_suspend(dev);
868
+err_pm_disable:
869
+ pm_runtime_disable(dev);
890870 err_irq:
891871 free_irq(is->irq, is);
892872 err_clk: