aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-06-10 20:13:58 -0400
committerDave Airlie <airlied@redhat.com>2014-06-10 20:13:58 -0400
commitc1a6e9fe82b46159af8cc4cf34fb51ee47862f05 (patch)
tree9ef7fc8fa3483dc7dc92034162118526a5d4377a
parentb06c47a13c52cec01902d0094fdd7f78f4d54152 (diff)
parentd6ca8ca7ec555bdd3372687d0d775c837a09ff6e (diff)
Merge branch 'topic/ipu-destaging' of git://git.pengutronix.de/git/pza/linux into drm-next
Destage IPUv3 * 'topic/ipu-destaging' of git://git.pengutronix.de/git/pza/linux: gpu: ipu-v3: Register the CSI modules gpu: ipu-v3: Add CSI and SMFC module enable wrappers gpu: ipu-v3: Add ipu_idmac_get_current_buffer function gpu: ipu-v3: Add SMFC code gpu: ipu-v3: Move i.MX IPUv3 core driver out of staging
-rw-r--r--drivers/gpu/Makefile1
-rw-r--r--drivers/gpu/ipu-v3/Kconfig7
-rw-r--r--drivers/gpu/ipu-v3/Makefile (renamed from drivers/staging/imx-drm/ipu-v3/Makefile)4
-rw-r--r--drivers/gpu/ipu-v3/ipu-common.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-common.c)82
-rw-r--r--drivers/gpu/ipu-v3/ipu-dc.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dc.c)3
-rw-r--r--drivers/gpu/ipu-v3/ipu-di.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-di.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-dmfc.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-dp.c (renamed from drivers/staging/imx-drm/ipu-v3/ipu-dp.c)2
-rw-r--r--drivers/gpu/ipu-v3/ipu-prv.h (renamed from drivers/staging/imx-drm/ipu-v3/ipu-prv.h)8
-rw-r--r--drivers/gpu/ipu-v3/ipu-smfc.c97
-rw-r--r--drivers/staging/imx-drm/Kconfig11
-rw-r--r--drivers/staging/imx-drm/Makefile1
-rw-r--r--drivers/staging/imx-drm/imx-hdmi.c2
-rw-r--r--drivers/staging/imx-drm/imx-tve.c2
-rw-r--r--drivers/staging/imx-drm/ipuv3-crtc.c2
-rw-r--r--drivers/staging/imx-drm/ipuv3-plane.c2
-rw-r--r--drivers/video/Kconfig1
-rw-r--r--include/video/imx-ipu-v3.h (renamed from drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h)16
18 files changed, 216 insertions, 29 deletions
diff --git a/drivers/gpu/Makefile b/drivers/gpu/Makefile
index d8a22c2a579d..70da9eb52a42 100644
--- a/drivers/gpu/Makefile
+++ b/drivers/gpu/Makefile
@@ -1,2 +1,3 @@
1obj-y += drm/ vga/ 1obj-y += drm/ vga/
2obj-$(CONFIG_TEGRA_HOST1X) += host1x/ 2obj-$(CONFIG_TEGRA_HOST1X) += host1x/
3obj-$(CONFIG_IMX_IPUV3_CORE) += ipu-v3/
diff --git a/drivers/gpu/ipu-v3/Kconfig b/drivers/gpu/ipu-v3/Kconfig
new file mode 100644
index 000000000000..2f228a2f2a48
--- /dev/null
+++ b/drivers/gpu/ipu-v3/Kconfig
@@ -0,0 +1,7 @@
1config IMX_IPUV3_CORE
2 tristate "IPUv3 core support"
3 depends on SOC_IMX5 || SOC_IMX6Q || SOC_IMX6SL || ARCH_MULTIPLATFORM
4 depends on RESET_CONTROLLER
5 help
6 Choose this if you have a i.MX5/6 system and want to use the Image
7 Processing Unit. This option only enables IPU base support.
diff --git a/drivers/staging/imx-drm/ipu-v3/Makefile b/drivers/gpu/ipu-v3/Makefile
index 28ed72e98a96..1887972b4ac2 100644
--- a/drivers/staging/imx-drm/ipu-v3/Makefile
+++ b/drivers/gpu/ipu-v3/Makefile
@@ -1,3 +1,3 @@
1obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += imx-ipu-v3.o 1obj-$(CONFIG_IMX_IPUV3_CORE) += imx-ipu-v3.o
2 2
3imx-ipu-v3-objs := ipu-common.o ipu-dc.o ipu-di.o ipu-dp.o ipu-dmfc.o 3imx-ipu-v3-objs := ipu-common.o ipu-dc.o ipu-di.o ipu-dp.o ipu-dmfc.o ipu-smfc.o
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
index ca85d3d70ae3..719788ce7d9f 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-common.c
+++ b/drivers/gpu/ipu-v3/ipu-common.c
@@ -31,7 +31,7 @@
31 31
32#include <drm/drm_fourcc.h> 32#include <drm/drm_fourcc.h>
33 33
34#include "imx-ipu-v3.h" 34#include <video/imx-ipu-v3.h>
35#include "ipu-prv.h" 35#include "ipu-prv.h"
36 36
37static inline u32 ipu_cm_read(struct ipu_soc *ipu, unsigned offset) 37static inline u32 ipu_cm_read(struct ipu_soc *ipu, unsigned offset)
@@ -661,6 +661,39 @@ int ipu_module_disable(struct ipu_soc *ipu, u32 mask)
661} 661}
662EXPORT_SYMBOL_GPL(ipu_module_disable); 662EXPORT_SYMBOL_GPL(ipu_module_disable);
663 663
664int ipu_csi_enable(struct ipu_soc *ipu, int csi)
665{
666 return ipu_module_enable(ipu, csi ? IPU_CONF_CSI1_EN : IPU_CONF_CSI0_EN);
667}
668EXPORT_SYMBOL_GPL(ipu_csi_enable);
669
670int ipu_csi_disable(struct ipu_soc *ipu, int csi)
671{
672 return ipu_module_disable(ipu, csi ? IPU_CONF_CSI1_EN : IPU_CONF_CSI0_EN);
673}
674EXPORT_SYMBOL_GPL(ipu_csi_disable);
675
676int ipu_smfc_enable(struct ipu_soc *ipu)
677{
678 return ipu_module_enable(ipu, IPU_CONF_SMFC_EN);
679}
680EXPORT_SYMBOL_GPL(ipu_smfc_enable);
681
682int ipu_smfc_disable(struct ipu_soc *ipu)
683{
684 return ipu_module_disable(ipu, IPU_CONF_SMFC_EN);
685}
686EXPORT_SYMBOL_GPL(ipu_smfc_disable);
687
688int ipu_idmac_get_current_buffer(struct ipuv3_channel *channel)
689{
690 struct ipu_soc *ipu = channel->ipu;
691 unsigned int chno = channel->num;
692
693 return (ipu_cm_read(ipu, IPU_CHA_CUR_BUF(chno)) & idma_mask(chno)) ? 1 : 0;
694}
695EXPORT_SYMBOL_GPL(ipu_idmac_get_current_buffer);
696
664void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num) 697void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num)
665{ 698{
666 struct ipu_soc *ipu = channel->ipu; 699 struct ipu_soc *ipu = channel->ipu;
@@ -874,8 +907,17 @@ static int ipu_submodules_init(struct ipu_soc *ipu,
874 goto err_dp; 907 goto err_dp;
875 } 908 }
876 909
910 ret = ipu_smfc_init(ipu, dev, ipu_base +
911 devtype->cm_ofs + IPU_CM_SMFC_REG_OFS);
912 if (ret) {
913 unit = "smfc";
914 goto err_smfc;
915 }
916
877 return 0; 917 return 0;
878 918
919err_smfc:
920 ipu_dp_exit(ipu);
879err_dp: 921err_dp:
880 ipu_dmfc_exit(ipu); 922 ipu_dmfc_exit(ipu);
881err_dmfc: 923err_dmfc:
@@ -947,6 +989,7 @@ EXPORT_SYMBOL_GPL(ipu_idmac_channel_irq);
947 989
948static void ipu_submodules_exit(struct ipu_soc *ipu) 990static void ipu_submodules_exit(struct ipu_soc *ipu)
949{ 991{
992 ipu_smfc_exit(ipu);
950 ipu_dp_exit(ipu); 993 ipu_dp_exit(ipu);
951 ipu_dmfc_exit(ipu); 994 ipu_dmfc_exit(ipu);
952 ipu_dc_exit(ipu); 995 ipu_dc_exit(ipu);
@@ -971,6 +1014,7 @@ static void platform_device_unregister_children(struct platform_device *pdev)
971struct ipu_platform_reg { 1014struct ipu_platform_reg {
972 struct ipu_client_platformdata pdata; 1015 struct ipu_client_platformdata pdata;
973 const char *name; 1016 const char *name;
1017 int reg_offset;
974}; 1018};
975 1019
976static const struct ipu_platform_reg client_reg[] = { 1020static const struct ipu_platform_reg client_reg[] = {
@@ -992,13 +1036,29 @@ static const struct ipu_platform_reg client_reg[] = {
992 .dma[1] = -EINVAL, 1036 .dma[1] = -EINVAL,
993 }, 1037 },
994 .name = "imx-ipuv3-crtc", 1038 .name = "imx-ipuv3-crtc",
1039 }, {
1040 .pdata = {
1041 .csi = 0,
1042 .dma[0] = IPUV3_CHANNEL_CSI0,
1043 .dma[1] = -EINVAL,
1044 },
1045 .reg_offset = IPU_CM_CSI0_REG_OFS,
1046 .name = "imx-ipuv3-camera",
1047 }, {
1048 .pdata = {
1049 .csi = 1,
1050 .dma[0] = IPUV3_CHANNEL_CSI1,
1051 .dma[1] = -EINVAL,
1052 },
1053 .reg_offset = IPU_CM_CSI1_REG_OFS,
1054 .name = "imx-ipuv3-camera",
995 }, 1055 },
996}; 1056};
997 1057
998static DEFINE_MUTEX(ipu_client_id_mutex); 1058static DEFINE_MUTEX(ipu_client_id_mutex);
999static int ipu_client_id; 1059static int ipu_client_id;
1000 1060
1001static int ipu_add_client_devices(struct ipu_soc *ipu) 1061static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
1002{ 1062{
1003 struct device *dev = ipu->dev; 1063 struct device *dev = ipu->dev;
1004 unsigned i; 1064 unsigned i;
@@ -1012,9 +1072,19 @@ static int ipu_add_client_devices(struct ipu_soc *ipu)
1012 for (i = 0; i < ARRAY_SIZE(client_reg); i++) { 1072 for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
1013 const struct ipu_platform_reg *reg = &client_reg[i]; 1073 const struct ipu_platform_reg *reg = &client_reg[i];
1014 struct platform_device *pdev; 1074 struct platform_device *pdev;
1015 1075 struct resource res;
1016 pdev = platform_device_register_data(dev, reg->name, 1076
1017 id++, &reg->pdata, sizeof(reg->pdata)); 1077 if (reg->reg_offset) {
1078 memset(&res, 0, sizeof(res));
1079 res.flags = IORESOURCE_MEM;
1080 res.start = ipu_base + ipu->devtype->cm_ofs + reg->reg_offset;
1081 res.end = res.start + PAGE_SIZE - 1;
1082 pdev = platform_device_register_resndata(dev, reg->name,
1083 id++, &res, 1, &reg->pdata, sizeof(reg->pdata));
1084 } else {
1085 pdev = platform_device_register_data(dev, reg->name,
1086 id++, &reg->pdata, sizeof(reg->pdata));
1087 }
1018 1088
1019 if (IS_ERR(pdev)) 1089 if (IS_ERR(pdev))
1020 goto err_register; 1090 goto err_register;
@@ -1210,7 +1280,7 @@ static int ipu_probe(struct platform_device *pdev)
1210 if (ret) 1280 if (ret)
1211 goto failed_submodules_init; 1281 goto failed_submodules_init;
1212 1282
1213 ret = ipu_add_client_devices(ipu); 1283 ret = ipu_add_client_devices(ipu, ipu_base);
1214 if (ret) { 1284 if (ret) {
1215 dev_err(&pdev->dev, "adding client devices failed with %d\n", 1285 dev_err(&pdev->dev, "adding client devices failed with %d\n",
1216 ret); 1286 ret);
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c b/drivers/gpu/ipu-v3/ipu-dc.c
index d5de8bb5c803..9f1e5efa3acf 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dc.c
+++ b/drivers/gpu/ipu-v3/ipu-dc.c
@@ -20,8 +20,7 @@
20#include <linux/delay.h> 20#include <linux/delay.h>
21#include <linux/io.h> 21#include <linux/io.h>
22 22
23#include "../imx-drm.h" 23#include <video/imx-ipu-v3.h>
24#include "imx-ipu-v3.h"
25#include "ipu-prv.h" 24#include "ipu-prv.h"
26 25
27#define DC_MAP_CONF_PTR(n) (0x108 + ((n) & ~0x1) * 2) 26#define DC_MAP_CONF_PTR(n) (0x108 + ((n) & ~0x1) * 2)
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 82a9ebad697c..42e60b447ae7 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -20,7 +20,7 @@
20#include <linux/err.h> 20#include <linux/err.h>
21#include <linux/platform_device.h> 21#include <linux/platform_device.h>
22 22
23#include "imx-ipu-v3.h" 23#include <video/imx-ipu-v3.h>
24#include "ipu-prv.h" 24#include "ipu-prv.h"
25 25
26struct ipu_di { 26struct ipu_di {
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c b/drivers/gpu/ipu-v3/ipu-dmfc.c
index 45213017fa4b..e1493ab36ca2 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dmfc.c
+++ b/drivers/gpu/ipu-v3/ipu-dmfc.c
@@ -17,7 +17,7 @@
17#include <linux/errno.h> 17#include <linux/errno.h>
18#include <linux/io.h> 18#include <linux/io.h>
19 19
20#include "imx-ipu-v3.h" 20#include <video/imx-ipu-v3.h>
21#include "ipu-prv.h" 21#include "ipu-prv.h"
22 22
23#define DMFC_RD_CHAN 0x0000 23#define DMFC_RD_CHAN 0x0000
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c b/drivers/gpu/ipu-v3/ipu-dp.c
index 58f87c8d7c07..e17fa3f7c4b6 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-dp.c
+++ b/drivers/gpu/ipu-v3/ipu-dp.c
@@ -19,7 +19,7 @@
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/err.h> 20#include <linux/err.h>
21 21
22#include "imx-ipu-v3.h" 22#include <video/imx-ipu-v3.h>
23#include "ipu-prv.h" 23#include "ipu-prv.h"
24 24
25#define DP_SYNC 0 25#define DP_SYNC 0
diff --git a/drivers/staging/imx-drm/ipu-v3/ipu-prv.h b/drivers/gpu/ipu-v3/ipu-prv.h
index 4df00501adc2..acf181183f0b 100644
--- a/drivers/staging/imx-drm/ipu-v3/ipu-prv.h
+++ b/drivers/gpu/ipu-v3/ipu-prv.h
@@ -22,7 +22,7 @@ struct ipu_soc;
22#include <linux/clk.h> 22#include <linux/clk.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24 24
25#include "imx-ipu-v3.h" 25#include <video/imx-ipu-v3.h>
26 26
27#define IPUV3_CHANNEL_CSI0 0 27#define IPUV3_CHANNEL_CSI0 0
28#define IPUV3_CHANNEL_CSI1 1 28#define IPUV3_CHANNEL_CSI1 1
@@ -151,6 +151,8 @@ struct ipuv3_channel {
151struct ipu_dc_priv; 151struct ipu_dc_priv;
152struct ipu_dmfc_priv; 152struct ipu_dmfc_priv;
153struct ipu_di; 153struct ipu_di;
154struct ipu_smfc_priv;
155
154struct ipu_devtype; 156struct ipu_devtype;
155 157
156struct ipu_soc { 158struct ipu_soc {
@@ -178,6 +180,7 @@ struct ipu_soc {
178 struct ipu_dp_priv *dp_priv; 180 struct ipu_dp_priv *dp_priv;
179 struct ipu_dmfc_priv *dmfc_priv; 181 struct ipu_dmfc_priv *dmfc_priv;
180 struct ipu_di *di_priv[2]; 182 struct ipu_di *di_priv[2];
183 struct ipu_smfc_priv *smfc_priv;
181}; 184};
182 185
183void ipu_srm_dp_sync_update(struct ipu_soc *ipu); 186void ipu_srm_dp_sync_update(struct ipu_soc *ipu);
@@ -203,4 +206,7 @@ void ipu_dc_exit(struct ipu_soc *ipu);
203int ipu_cpmem_init(struct ipu_soc *ipu, struct device *dev, unsigned long base); 206int ipu_cpmem_init(struct ipu_soc *ipu, struct device *dev, unsigned long base);
204void ipu_cpmem_exit(struct ipu_soc *ipu); 207void ipu_cpmem_exit(struct ipu_soc *ipu);
205 208
209int ipu_smfc_init(struct ipu_soc *ipu, struct device *dev, unsigned long base);
210void ipu_smfc_exit(struct ipu_soc *ipu);
211
206#endif /* __IPU_PRV_H__ */ 212#endif /* __IPU_PRV_H__ */
diff --git a/drivers/gpu/ipu-v3/ipu-smfc.c b/drivers/gpu/ipu-v3/ipu-smfc.c
new file mode 100644
index 000000000000..e4f85ad286fc
--- /dev/null
+++ b/drivers/gpu/ipu-v3/ipu-smfc.c
@@ -0,0 +1,97 @@
1/*
2 * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11#define DEBUG
12#include <linux/export.h>
13#include <linux/types.h>
14#include <linux/init.h>
15#include <linux/io.h>
16#include <linux/errno.h>
17#include <linux/spinlock.h>
18#include <linux/delay.h>
19#include <linux/clk.h>
20#include <video/imx-ipu-v3.h>
21
22#include "ipu-prv.h"
23
24struct ipu_smfc_priv {
25 void __iomem *base;
26 spinlock_t lock;
27};
28
29/*SMFC Registers */
30#define SMFC_MAP 0x0000
31#define SMFC_WMC 0x0004
32#define SMFC_BS 0x0008
33
34int ipu_smfc_set_burstsize(struct ipu_soc *ipu, int channel, int burstsize)
35{
36 struct ipu_smfc_priv *smfc = ipu->smfc_priv;
37 unsigned long flags;
38 u32 val, shift;
39
40 spin_lock_irqsave(&smfc->lock, flags);
41
42 shift = channel * 4;
43 val = readl(smfc->base + SMFC_BS);
44 val &= ~(0xf << shift);
45 val |= burstsize << shift;
46 writel(val, smfc->base + SMFC_BS);
47
48 spin_unlock_irqrestore(&smfc->lock, flags);
49
50 return 0;
51}
52EXPORT_SYMBOL_GPL(ipu_smfc_set_burstsize);
53
54int ipu_smfc_map_channel(struct ipu_soc *ipu, int channel, int csi_id, int mipi_id)
55{
56 struct ipu_smfc_priv *smfc = ipu->smfc_priv;
57 unsigned long flags;
58 u32 val, shift;
59
60 spin_lock_irqsave(&smfc->lock, flags);
61
62 shift = channel * 3;
63 val = readl(smfc->base + SMFC_MAP);
64 val &= ~(0x7 << shift);
65 val |= ((csi_id << 2) | mipi_id) << shift;
66 writel(val, smfc->base + SMFC_MAP);
67
68 spin_unlock_irqrestore(&smfc->lock, flags);
69
70 return 0;
71}
72EXPORT_SYMBOL_GPL(ipu_smfc_map_channel);
73
74int ipu_smfc_init(struct ipu_soc *ipu, struct device *dev,
75 unsigned long base)
76{
77 struct ipu_smfc_priv *smfc;
78
79 smfc = devm_kzalloc(dev, sizeof(*smfc), GFP_KERNEL);
80 if (!smfc)
81 return -ENOMEM;
82
83 ipu->smfc_priv = smfc;
84 spin_lock_init(&smfc->lock);
85
86 smfc->base = devm_ioremap(dev, base, PAGE_SIZE);
87 if (!smfc->base)
88 return -ENOMEM;
89
90 pr_debug("%s: ioremap 0x%08lx -> %p\n", __func__, base, smfc->base);
91
92 return 0;
93}
94
95void ipu_smfc_exit(struct ipu_soc *ipu)
96{
97}
diff --git a/drivers/staging/imx-drm/Kconfig b/drivers/staging/imx-drm/Kconfig
index c6e8ba7b3e4e..82fb758a29bc 100644
--- a/drivers/staging/imx-drm/Kconfig
+++ b/drivers/staging/imx-drm/Kconfig
@@ -39,19 +39,10 @@ config DRM_IMX_LDB
39 Choose this to enable the internal LVDS Display Bridge (LDB) 39 Choose this to enable the internal LVDS Display Bridge (LDB)
40 found on i.MX53 and i.MX6 processors. 40 found on i.MX53 and i.MX6 processors.
41 41
42config DRM_IMX_IPUV3_CORE
43 tristate "IPUv3 core support"
44 depends on DRM_IMX
45 depends on RESET_CONTROLLER
46 help
47 Choose this if you have a i.MX5/6 system and want
48 to use the IPU. This option only enables IPU base
49 support.
50
51config DRM_IMX_IPUV3 42config DRM_IMX_IPUV3
52 tristate "DRM Support for i.MX IPUv3" 43 tristate "DRM Support for i.MX IPUv3"
53 depends on DRM_IMX 44 depends on DRM_IMX
54 depends on DRM_IMX_IPUV3_CORE 45 depends on IMX_IPUV3_CORE
55 help 46 help
56 Choose this if you have a i.MX5 or i.MX6 processor. 47 Choose this if you have a i.MX5 or i.MX6 processor.
57 48
diff --git a/drivers/staging/imx-drm/Makefile b/drivers/staging/imx-drm/Makefile
index 129e3a3f59f1..582c438d8cbd 100644
--- a/drivers/staging/imx-drm/Makefile
+++ b/drivers/staging/imx-drm/Makefile
@@ -6,7 +6,6 @@ obj-$(CONFIG_DRM_IMX) += imxdrm.o
6obj-$(CONFIG_DRM_IMX_PARALLEL_DISPLAY) += parallel-display.o 6obj-$(CONFIG_DRM_IMX_PARALLEL_DISPLAY) += parallel-display.o
7obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o 7obj-$(CONFIG_DRM_IMX_TVE) += imx-tve.o
8obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o 8obj-$(CONFIG_DRM_IMX_LDB) += imx-ldb.o
9obj-$(CONFIG_DRM_IMX_IPUV3_CORE) += ipu-v3/
10 9
11imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o 10imx-ipuv3-crtc-objs := ipuv3-crtc.o ipuv3-plane.o
12obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o 11obj-$(CONFIG_DRM_IMX_IPUV3) += imx-ipuv3-crtc.o
diff --git a/drivers/staging/imx-drm/imx-hdmi.c b/drivers/staging/imx-drm/imx-hdmi.c
index 9fbe6d6a989d..76749231c48a 100644
--- a/drivers/staging/imx-drm/imx-hdmi.c
+++ b/drivers/staging/imx-drm/imx-hdmi.c
@@ -27,8 +27,8 @@
27#include <drm/drm_crtc_helper.h> 27#include <drm/drm_crtc_helper.h>
28#include <drm/drm_edid.h> 28#include <drm/drm_edid.h>
29#include <drm/drm_encoder_slave.h> 29#include <drm/drm_encoder_slave.h>
30#include <video/imx-ipu-v3.h>
30 31
31#include "ipu-v3/imx-ipu-v3.h"
32#include "imx-hdmi.h" 32#include "imx-hdmi.h"
33#include "imx-drm.h" 33#include "imx-drm.h"
34 34
diff --git a/drivers/staging/imx-drm/imx-tve.c b/drivers/staging/imx-drm/imx-tve.c
index 4caef2b1653d..c628fcdc22ae 100644
--- a/drivers/staging/imx-drm/imx-tve.c
+++ b/drivers/staging/imx-drm/imx-tve.c
@@ -30,8 +30,8 @@
30#include <drm/drmP.h> 30#include <drm/drmP.h>
31#include <drm/drm_fb_helper.h> 31#include <drm/drm_fb_helper.h>
32#include <drm/drm_crtc_helper.h> 32#include <drm/drm_crtc_helper.h>
33#include <video/imx-ipu-v3.h>
33 34
34#include "ipu-v3/imx-ipu-v3.h"
35#include "imx-drm.h" 35#include "imx-drm.h"
36 36
37#define TVE_COM_CONF_REG 0x00 37#define TVE_COM_CONF_REG 0x00
diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c
index c48f640db006..d6913d2e6f77 100644
--- a/drivers/staging/imx-drm/ipuv3-crtc.c
+++ b/drivers/staging/imx-drm/ipuv3-crtc.c
@@ -30,7 +30,7 @@
30#include <drm/drm_gem_cma_helper.h> 30#include <drm/drm_gem_cma_helper.h>
31#include <drm/drm_fb_cma_helper.h> 31#include <drm/drm_fb_cma_helper.h>
32 32
33#include "ipu-v3/imx-ipu-v3.h" 33#include <video/imx-ipu-v3.h>
34#include "imx-drm.h" 34#include "imx-drm.h"
35#include "ipuv3-plane.h" 35#include "ipuv3-plane.h"
36 36
diff --git a/drivers/staging/imx-drm/ipuv3-plane.c b/drivers/staging/imx-drm/ipuv3-plane.c
index 27a8d735dae0..02b4486435a0 100644
--- a/drivers/staging/imx-drm/ipuv3-plane.c
+++ b/drivers/staging/imx-drm/ipuv3-plane.c
@@ -17,7 +17,7 @@
17#include <drm/drm_fb_cma_helper.h> 17#include <drm/drm_fb_cma_helper.h>
18#include <drm/drm_gem_cma_helper.h> 18#include <drm/drm_gem_cma_helper.h>
19 19
20#include "ipu-v3/imx-ipu-v3.h" 20#include "video/imx-ipu-v3.h"
21#include "ipuv3-plane.h" 21#include "ipuv3-plane.h"
22 22
23#define to_ipu_plane(x) container_of(x, struct ipu_plane, base) 23#define to_ipu_plane(x) container_of(x, struct ipu_plane, base)
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index c7b4f0f927b1..8bf495ffb020 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -20,6 +20,7 @@ source "drivers/char/agp/Kconfig"
20source "drivers/gpu/vga/Kconfig" 20source "drivers/gpu/vga/Kconfig"
21 21
22source "drivers/gpu/host1x/Kconfig" 22source "drivers/gpu/host1x/Kconfig"
23source "drivers/gpu/ipu-v3/Kconfig"
23 24
24menu "Direct Rendering Manager" 25menu "Direct Rendering Manager"
25source "drivers/gpu/drm/Kconfig" 26source "drivers/gpu/drm/Kconfig"
diff --git a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index c4d14ead5837..61d6d25caf95 100644
--- a/drivers/staging/imx-drm/ipu-v3/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -103,6 +103,7 @@ int ipu_idmac_wait_busy(struct ipuv3_channel *channel, int ms);
103 103
104void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel, 104void ipu_idmac_set_double_buffer(struct ipuv3_channel *channel,
105 bool doublebuffer); 105 bool doublebuffer);
106int ipu_idmac_get_current_buffer(struct ipuv3_channel *channel);
106void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num); 107void ipu_idmac_select_buffer(struct ipuv3_channel *channel, u32 buf_num);
107 108
108/* 109/*
@@ -160,6 +161,20 @@ int ipu_dp_set_window_pos(struct ipu_dp *, u16 x_pos, u16 y_pos);
160int ipu_dp_set_global_alpha(struct ipu_dp *dp, bool enable, u8 alpha, 161int ipu_dp_set_global_alpha(struct ipu_dp *dp, bool enable, u8 alpha,
161 bool bg_chan); 162 bool bg_chan);
162 163
164/*
165 * IPU CMOS Sensor Interface (csi) functions
166 */
167int ipu_csi_enable(struct ipu_soc *ipu, int csi);
168int ipu_csi_disable(struct ipu_soc *ipu, int csi);
169
170/*
171 * IPU Sensor Multiple FIFO Controller (SMFC) functions
172 */
173int ipu_smfc_enable(struct ipu_soc *ipu);
174int ipu_smfc_disable(struct ipu_soc *ipu);
175int ipu_smfc_map_channel(struct ipu_soc *ipu, int channel, int csi_id, int mipi_id);
176int ipu_smfc_set_burstsize(struct ipu_soc *ipu, int channel, int burstsize);
177
163#define IPU_CPMEM_WORD(word, ofs, size) ((((word) * 160 + (ofs)) << 8) | (size)) 178#define IPU_CPMEM_WORD(word, ofs, size) ((((word) * 160 + (ofs)) << 8) | (size))
164 179
165#define IPU_FIELD_UBO IPU_CPMEM_WORD(0, 46, 22) 180#define IPU_FIELD_UBO IPU_CPMEM_WORD(0, 46, 22)
@@ -316,6 +331,7 @@ static inline void ipu_cpmem_set_burstsize(struct ipu_ch_param __iomem *p,
316}; 331};
317 332
318struct ipu_client_platformdata { 333struct ipu_client_platformdata {
334 int csi;
319 int di; 335 int di;
320 int dc; 336 int dc;
321 int dp; 337 int dp;