1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2010 Sascha Hauer <s.hauer@pengutronix.de>
4 * Copyright (C) 2005-2009 Freescale Semiconductor, Inc.
6 #include <linux/module.h>
7 #include <linux/export.h>
8 #include <linux/types.h>
9 #include <linux/reset.h>
10 #include <linux/platform_device.h>
11 #include <linux/err.h>
12 #include <linux/spinlock.h>
13 #include <linux/delay.h>
14 #include <linux/interrupt.h>
16 #include <linux/clk.h>
17 #include <linux/list.h>
18 #include <linux/irq.h>
19 #include <linux/irqchip/chained_irq.h>
20 #include <linux/irqdomain.h>
21 #include <linux/of_device.h>
22 #include <linux/of_graph.h>
24 #include <drm/drm_fourcc.h>
26 #include <video/imx-ipu-v3.h>
29 static inline u32
ipu_cm_read(struct ipu_soc
*ipu
, unsigned offset
)
31 return readl(ipu
->cm_reg
+ offset
);
34 static inline void ipu_cm_write(struct ipu_soc
*ipu
, u32 value
, unsigned offset
)
36 writel(value
, ipu
->cm_reg
+ offset
);
39 int ipu_get_num(struct ipu_soc
*ipu
)
43 EXPORT_SYMBOL_GPL(ipu_get_num
);
45 void ipu_srm_dp_update(struct ipu_soc
*ipu
, bool sync
)
49 val
= ipu_cm_read(ipu
, IPU_SRM_PRI2
);
50 val
&= ~DP_S_SRM_MODE_MASK
;
51 val
|= sync
? DP_S_SRM_MODE_NEXT_FRAME
:
53 ipu_cm_write(ipu
, val
, IPU_SRM_PRI2
);
55 EXPORT_SYMBOL_GPL(ipu_srm_dp_update
);
57 enum ipu_color_space
ipu_drm_fourcc_to_colorspace(u32 drm_fourcc
)
60 case DRM_FORMAT_ARGB1555
:
61 case DRM_FORMAT_ABGR1555
:
62 case DRM_FORMAT_RGBA5551
:
63 case DRM_FORMAT_BGRA5551
:
64 case DRM_FORMAT_RGB565
:
65 case DRM_FORMAT_BGR565
:
66 case DRM_FORMAT_RGB888
:
67 case DRM_FORMAT_BGR888
:
68 case DRM_FORMAT_ARGB4444
:
69 case DRM_FORMAT_XRGB8888
:
70 case DRM_FORMAT_XBGR8888
:
71 case DRM_FORMAT_RGBX8888
:
72 case DRM_FORMAT_BGRX8888
:
73 case DRM_FORMAT_ARGB8888
:
74 case DRM_FORMAT_ABGR8888
:
75 case DRM_FORMAT_RGBA8888
:
76 case DRM_FORMAT_BGRA8888
:
77 case DRM_FORMAT_RGB565_A8
:
78 case DRM_FORMAT_BGR565_A8
:
79 case DRM_FORMAT_RGB888_A8
:
80 case DRM_FORMAT_BGR888_A8
:
81 case DRM_FORMAT_RGBX8888_A8
:
82 case DRM_FORMAT_BGRX8888_A8
:
83 return IPUV3_COLORSPACE_RGB
;
86 case DRM_FORMAT_YUV420
:
87 case DRM_FORMAT_YVU420
:
88 case DRM_FORMAT_YUV422
:
89 case DRM_FORMAT_YVU422
:
90 case DRM_FORMAT_YUV444
:
91 case DRM_FORMAT_YVU444
:
96 return IPUV3_COLORSPACE_YUV
;
98 return IPUV3_COLORSPACE_UNKNOWN
;
101 EXPORT_SYMBOL_GPL(ipu_drm_fourcc_to_colorspace
);
103 enum ipu_color_space
ipu_pixelformat_to_colorspace(u32 pixelformat
)
105 switch (pixelformat
) {
106 case V4L2_PIX_FMT_YUV420
:
107 case V4L2_PIX_FMT_YVU420
:
108 case V4L2_PIX_FMT_YUV422P
:
109 case V4L2_PIX_FMT_UYVY
:
110 case V4L2_PIX_FMT_YUYV
:
111 case V4L2_PIX_FMT_NV12
:
112 case V4L2_PIX_FMT_NV21
:
113 case V4L2_PIX_FMT_NV16
:
114 case V4L2_PIX_FMT_NV61
:
115 return IPUV3_COLORSPACE_YUV
;
116 case V4L2_PIX_FMT_RGB565
:
117 case V4L2_PIX_FMT_BGR24
:
118 case V4L2_PIX_FMT_RGB24
:
119 case V4L2_PIX_FMT_ABGR32
:
120 case V4L2_PIX_FMT_XBGR32
:
121 case V4L2_PIX_FMT_BGRA32
:
122 case V4L2_PIX_FMT_BGRX32
:
123 case V4L2_PIX_FMT_RGBA32
:
124 case V4L2_PIX_FMT_RGBX32
:
125 case V4L2_PIX_FMT_ARGB32
:
126 case V4L2_PIX_FMT_XRGB32
:
127 case V4L2_PIX_FMT_RGB32
:
128 case V4L2_PIX_FMT_BGR32
:
129 return IPUV3_COLORSPACE_RGB
;
131 return IPUV3_COLORSPACE_UNKNOWN
;
134 EXPORT_SYMBOL_GPL(ipu_pixelformat_to_colorspace
);
136 int ipu_degrees_to_rot_mode(enum ipu_rotate_mode
*mode
, int degrees
,
137 bool hflip
, bool vflip
)
163 *mode
= (enum ipu_rotate_mode
)((r90
<< 2) | (hf
<< 1) | vf
);
166 EXPORT_SYMBOL_GPL(ipu_degrees_to_rot_mode
);
168 int ipu_rot_mode_to_degrees(int *degrees
, enum ipu_rotate_mode mode
,
169 bool hflip
, bool vflip
)
173 r90
= ((u32
)mode
>> 2) & 0x1;
174 hf
= ((u32
)mode
>> 1) & 0x1;
175 vf
= ((u32
)mode
>> 0) & 0x1;
179 switch ((enum ipu_rotate_mode
)((r90
<< 2) | (hf
<< 1) | vf
)) {
180 case IPU_ROTATE_NONE
:
183 case IPU_ROTATE_90_RIGHT
:
189 case IPU_ROTATE_90_LEFT
:
198 EXPORT_SYMBOL_GPL(ipu_rot_mode_to_degrees
);
200 struct ipuv3_channel
*ipu_idmac_get(struct ipu_soc
*ipu
, unsigned num
)
202 struct ipuv3_channel
*channel
;
204 dev_dbg(ipu
->dev
, "%s %d\n", __func__
, num
);
207 return ERR_PTR(-ENODEV
);
209 mutex_lock(&ipu
->channel_lock
);
211 list_for_each_entry(channel
, &ipu
->channels
, list
) {
212 if (channel
->num
== num
) {
213 channel
= ERR_PTR(-EBUSY
);
218 channel
= kzalloc(sizeof(*channel
), GFP_KERNEL
);
220 channel
= ERR_PTR(-ENOMEM
);
226 list_add(&channel
->list
, &ipu
->channels
);
229 mutex_unlock(&ipu
->channel_lock
);
233 EXPORT_SYMBOL_GPL(ipu_idmac_get
);
235 void ipu_idmac_put(struct ipuv3_channel
*channel
)
237 struct ipu_soc
*ipu
= channel
->ipu
;
239 dev_dbg(ipu
->dev
, "%s %d\n", __func__
, channel
->num
);
241 mutex_lock(&ipu
->channel_lock
);
243 list_del(&channel
->list
);
246 mutex_unlock(&ipu
->channel_lock
);
248 EXPORT_SYMBOL_GPL(ipu_idmac_put
);
250 #define idma_mask(ch) (1 << ((ch) & 0x1f))
253 * This is an undocumented feature, a write one to a channel bit in
254 * IPU_CHA_CUR_BUF and IPU_CHA_TRIPLE_CUR_BUF will reset the channel's
255 * internal current buffer pointer so that transfers start from buffer
256 * 0 on the next channel enable (that's the theory anyway, the imx6 TRM
257 * only says these are read-only registers). This operation is required
258 * for channel linking to work correctly, for instance video capture
259 * pipelines that carry out image rotations will fail after the first
260 * streaming unless this function is called for each channel before
261 * re-enabling the channels.
263 static void __ipu_idmac_reset_current_buffer(struct ipuv3_channel
*channel
)
265 struct ipu_soc
*ipu
= channel
->ipu
;
266 unsigned int chno
= channel
->num
;
268 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_CUR_BUF(chno
));
271 void ipu_idmac_set_double_buffer(struct ipuv3_channel
*channel
,
274 struct ipu_soc
*ipu
= channel
->ipu
;
278 spin_lock_irqsave(&ipu
->lock
, flags
);
280 reg
= ipu_cm_read(ipu
, IPU_CHA_DB_MODE_SEL(channel
->num
));
282 reg
|= idma_mask(channel
->num
);
284 reg
&= ~idma_mask(channel
->num
);
285 ipu_cm_write(ipu
, reg
, IPU_CHA_DB_MODE_SEL(channel
->num
));
287 __ipu_idmac_reset_current_buffer(channel
);
289 spin_unlock_irqrestore(&ipu
->lock
, flags
);
291 EXPORT_SYMBOL_GPL(ipu_idmac_set_double_buffer
);
293 static const struct {
297 } idmac_lock_en_info
[] = {
298 { .chnum
= 5, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 0, },
299 { .chnum
= 11, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 2, },
300 { .chnum
= 12, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 4, },
301 { .chnum
= 14, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 6, },
302 { .chnum
= 15, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 8, },
303 { .chnum
= 20, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 10, },
304 { .chnum
= 21, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 12, },
305 { .chnum
= 22, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 14, },
306 { .chnum
= 23, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 16, },
307 { .chnum
= 27, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 18, },
308 { .chnum
= 28, .reg
= IDMAC_CH_LOCK_EN_1
, .shift
= 20, },
309 { .chnum
= 45, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 0, },
310 { .chnum
= 46, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 2, },
311 { .chnum
= 47, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 4, },
312 { .chnum
= 48, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 6, },
313 { .chnum
= 49, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 8, },
314 { .chnum
= 50, .reg
= IDMAC_CH_LOCK_EN_2
, .shift
= 10, },
317 int ipu_idmac_lock_enable(struct ipuv3_channel
*channel
, int num_bursts
)
319 struct ipu_soc
*ipu
= channel
->ipu
;
324 switch (num_bursts
) {
327 bursts
= 0x00; /* locking disabled */
343 * IPUv3EX / i.MX51 has a different register layout, and on IPUv3M /
344 * i.MX53 channel arbitration locking doesn't seem to work properly.
345 * Allow enabling the lock feature on IPUv3H / i.MX6 only.
347 if (bursts
&& ipu
->ipu_type
!= IPUV3H
)
350 for (i
= 0; i
< ARRAY_SIZE(idmac_lock_en_info
); i
++) {
351 if (channel
->num
== idmac_lock_en_info
[i
].chnum
)
354 if (i
>= ARRAY_SIZE(idmac_lock_en_info
))
357 spin_lock_irqsave(&ipu
->lock
, flags
);
359 regval
= ipu_idmac_read(ipu
, idmac_lock_en_info
[i
].reg
);
360 regval
&= ~(0x03 << idmac_lock_en_info
[i
].shift
);
361 regval
|= (bursts
<< idmac_lock_en_info
[i
].shift
);
362 ipu_idmac_write(ipu
, regval
, idmac_lock_en_info
[i
].reg
);
364 spin_unlock_irqrestore(&ipu
->lock
, flags
);
368 EXPORT_SYMBOL_GPL(ipu_idmac_lock_enable
);
370 int ipu_module_enable(struct ipu_soc
*ipu
, u32 mask
)
372 unsigned long lock_flags
;
375 spin_lock_irqsave(&ipu
->lock
, lock_flags
);
377 val
= ipu_cm_read(ipu
, IPU_DISP_GEN
);
379 if (mask
& IPU_CONF_DI0_EN
)
380 val
|= IPU_DI0_COUNTER_RELEASE
;
381 if (mask
& IPU_CONF_DI1_EN
)
382 val
|= IPU_DI1_COUNTER_RELEASE
;
384 ipu_cm_write(ipu
, val
, IPU_DISP_GEN
);
386 val
= ipu_cm_read(ipu
, IPU_CONF
);
388 ipu_cm_write(ipu
, val
, IPU_CONF
);
390 spin_unlock_irqrestore(&ipu
->lock
, lock_flags
);
394 EXPORT_SYMBOL_GPL(ipu_module_enable
);
396 int ipu_module_disable(struct ipu_soc
*ipu
, u32 mask
)
398 unsigned long lock_flags
;
401 spin_lock_irqsave(&ipu
->lock
, lock_flags
);
403 val
= ipu_cm_read(ipu
, IPU_CONF
);
405 ipu_cm_write(ipu
, val
, IPU_CONF
);
407 val
= ipu_cm_read(ipu
, IPU_DISP_GEN
);
409 if (mask
& IPU_CONF_DI0_EN
)
410 val
&= ~IPU_DI0_COUNTER_RELEASE
;
411 if (mask
& IPU_CONF_DI1_EN
)
412 val
&= ~IPU_DI1_COUNTER_RELEASE
;
414 ipu_cm_write(ipu
, val
, IPU_DISP_GEN
);
416 spin_unlock_irqrestore(&ipu
->lock
, lock_flags
);
420 EXPORT_SYMBOL_GPL(ipu_module_disable
);
422 int ipu_idmac_get_current_buffer(struct ipuv3_channel
*channel
)
424 struct ipu_soc
*ipu
= channel
->ipu
;
425 unsigned int chno
= channel
->num
;
427 return (ipu_cm_read(ipu
, IPU_CHA_CUR_BUF(chno
)) & idma_mask(chno
)) ? 1 : 0;
429 EXPORT_SYMBOL_GPL(ipu_idmac_get_current_buffer
);
431 bool ipu_idmac_buffer_is_ready(struct ipuv3_channel
*channel
, u32 buf_num
)
433 struct ipu_soc
*ipu
= channel
->ipu
;
437 spin_lock_irqsave(&ipu
->lock
, flags
);
440 reg
= ipu_cm_read(ipu
, IPU_CHA_BUF0_RDY(channel
->num
));
443 reg
= ipu_cm_read(ipu
, IPU_CHA_BUF1_RDY(channel
->num
));
446 reg
= ipu_cm_read(ipu
, IPU_CHA_BUF2_RDY(channel
->num
));
449 spin_unlock_irqrestore(&ipu
->lock
, flags
);
451 return ((reg
& idma_mask(channel
->num
)) != 0);
453 EXPORT_SYMBOL_GPL(ipu_idmac_buffer_is_ready
);
455 void ipu_idmac_select_buffer(struct ipuv3_channel
*channel
, u32 buf_num
)
457 struct ipu_soc
*ipu
= channel
->ipu
;
458 unsigned int chno
= channel
->num
;
461 spin_lock_irqsave(&ipu
->lock
, flags
);
463 /* Mark buffer as ready. */
465 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_BUF0_RDY(chno
));
467 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_BUF1_RDY(chno
));
469 spin_unlock_irqrestore(&ipu
->lock
, flags
);
471 EXPORT_SYMBOL_GPL(ipu_idmac_select_buffer
);
473 void ipu_idmac_clear_buffer(struct ipuv3_channel
*channel
, u32 buf_num
)
475 struct ipu_soc
*ipu
= channel
->ipu
;
476 unsigned int chno
= channel
->num
;
479 spin_lock_irqsave(&ipu
->lock
, flags
);
481 ipu_cm_write(ipu
, 0xF0300000, IPU_GPR
); /* write one to clear */
484 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_BUF0_RDY(chno
));
487 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_BUF1_RDY(chno
));
490 ipu_cm_write(ipu
, idma_mask(chno
), IPU_CHA_BUF2_RDY(chno
));
495 ipu_cm_write(ipu
, 0x0, IPU_GPR
); /* write one to set */
497 spin_unlock_irqrestore(&ipu
->lock
, flags
);
499 EXPORT_SYMBOL_GPL(ipu_idmac_clear_buffer
);
501 int ipu_idmac_enable_channel(struct ipuv3_channel
*channel
)
503 struct ipu_soc
*ipu
= channel
->ipu
;
507 spin_lock_irqsave(&ipu
->lock
, flags
);
509 val
= ipu_idmac_read(ipu
, IDMAC_CHA_EN(channel
->num
));
510 val
|= idma_mask(channel
->num
);
511 ipu_idmac_write(ipu
, val
, IDMAC_CHA_EN(channel
->num
));
513 spin_unlock_irqrestore(&ipu
->lock
, flags
);
517 EXPORT_SYMBOL_GPL(ipu_idmac_enable_channel
);
519 bool ipu_idmac_channel_busy(struct ipu_soc
*ipu
, unsigned int chno
)
521 return (ipu_idmac_read(ipu
, IDMAC_CHA_BUSY(chno
)) & idma_mask(chno
));
523 EXPORT_SYMBOL_GPL(ipu_idmac_channel_busy
);
525 int ipu_idmac_wait_busy(struct ipuv3_channel
*channel
, int ms
)
527 struct ipu_soc
*ipu
= channel
->ipu
;
528 unsigned long timeout
;
530 timeout
= jiffies
+ msecs_to_jiffies(ms
);
531 while (ipu_idmac_read(ipu
, IDMAC_CHA_BUSY(channel
->num
)) &
532 idma_mask(channel
->num
)) {
533 if (time_after(jiffies
, timeout
))
540 EXPORT_SYMBOL_GPL(ipu_idmac_wait_busy
);
542 int ipu_idmac_disable_channel(struct ipuv3_channel
*channel
)
544 struct ipu_soc
*ipu
= channel
->ipu
;
548 spin_lock_irqsave(&ipu
->lock
, flags
);
550 /* Disable DMA channel(s) */
551 val
= ipu_idmac_read(ipu
, IDMAC_CHA_EN(channel
->num
));
552 val
&= ~idma_mask(channel
->num
);
553 ipu_idmac_write(ipu
, val
, IDMAC_CHA_EN(channel
->num
));
555 __ipu_idmac_reset_current_buffer(channel
);
557 /* Set channel buffers NOT to be ready */
558 ipu_cm_write(ipu
, 0xf0000000, IPU_GPR
); /* write one to clear */
560 if (ipu_cm_read(ipu
, IPU_CHA_BUF0_RDY(channel
->num
)) &
561 idma_mask(channel
->num
)) {
562 ipu_cm_write(ipu
, idma_mask(channel
->num
),
563 IPU_CHA_BUF0_RDY(channel
->num
));
566 if (ipu_cm_read(ipu
, IPU_CHA_BUF1_RDY(channel
->num
)) &
567 idma_mask(channel
->num
)) {
568 ipu_cm_write(ipu
, idma_mask(channel
->num
),
569 IPU_CHA_BUF1_RDY(channel
->num
));
572 ipu_cm_write(ipu
, 0x0, IPU_GPR
); /* write one to set */
574 /* Reset the double buffer */
575 val
= ipu_cm_read(ipu
, IPU_CHA_DB_MODE_SEL(channel
->num
));
576 val
&= ~idma_mask(channel
->num
);
577 ipu_cm_write(ipu
, val
, IPU_CHA_DB_MODE_SEL(channel
->num
));
579 spin_unlock_irqrestore(&ipu
->lock
, flags
);
583 EXPORT_SYMBOL_GPL(ipu_idmac_disable_channel
);
586 * The imx6 rev. D TRM says that enabling the WM feature will increase
587 * a channel's priority. Refer to Table 36-8 Calculated priority value.
588 * The sub-module that is the sink or source for the channel must enable
589 * watermark signal for this to take effect (SMFC_WM for instance).
591 void ipu_idmac_enable_watermark(struct ipuv3_channel
*channel
, bool enable
)
593 struct ipu_soc
*ipu
= channel
->ipu
;
597 spin_lock_irqsave(&ipu
->lock
, flags
);
599 val
= ipu_idmac_read(ipu
, IDMAC_WM_EN(channel
->num
));
601 val
|= 1 << (channel
->num
% 32);
603 val
&= ~(1 << (channel
->num
% 32));
604 ipu_idmac_write(ipu
, val
, IDMAC_WM_EN(channel
->num
));
606 spin_unlock_irqrestore(&ipu
->lock
, flags
);
608 EXPORT_SYMBOL_GPL(ipu_idmac_enable_watermark
);
610 static int ipu_memory_reset(struct ipu_soc
*ipu
)
612 unsigned long timeout
;
614 ipu_cm_write(ipu
, 0x807FFFFF, IPU_MEM_RST
);
616 timeout
= jiffies
+ msecs_to_jiffies(1000);
617 while (ipu_cm_read(ipu
, IPU_MEM_RST
) & 0x80000000) {
618 if (time_after(jiffies
, timeout
))
627 * Set the source mux for the given CSI. Selects either parallel or
630 void ipu_set_csi_src_mux(struct ipu_soc
*ipu
, int csi_id
, bool mipi_csi2
)
635 mask
= (csi_id
== 1) ? IPU_CONF_CSI1_DATA_SOURCE
:
636 IPU_CONF_CSI0_DATA_SOURCE
;
638 spin_lock_irqsave(&ipu
->lock
, flags
);
640 val
= ipu_cm_read(ipu
, IPU_CONF
);
645 ipu_cm_write(ipu
, val
, IPU_CONF
);
647 spin_unlock_irqrestore(&ipu
->lock
, flags
);
649 EXPORT_SYMBOL_GPL(ipu_set_csi_src_mux
);
652 * Set the source mux for the IC. Selects either CSI[01] or the VDI.
654 void ipu_set_ic_src_mux(struct ipu_soc
*ipu
, int csi_id
, bool vdi
)
659 spin_lock_irqsave(&ipu
->lock
, flags
);
661 val
= ipu_cm_read(ipu
, IPU_CONF
);
663 val
|= IPU_CONF_IC_INPUT
;
665 val
&= ~IPU_CONF_IC_INPUT
;
668 val
|= IPU_CONF_CSI_SEL
;
670 val
&= ~IPU_CONF_CSI_SEL
;
672 ipu_cm_write(ipu
, val
, IPU_CONF
);
674 spin_unlock_irqrestore(&ipu
->lock
, flags
);
676 EXPORT_SYMBOL_GPL(ipu_set_ic_src_mux
);
679 /* Frame Synchronization Unit Channel Linking */
681 struct fsu_link_reg_info
{
688 struct fsu_link_info
{
689 struct fsu_link_reg_info src
;
690 struct fsu_link_reg_info sink
;
693 static const struct fsu_link_info fsu_link_info
[] = {
695 .src
= { IPUV3_CHANNEL_IC_PRP_ENC_MEM
, IPU_FS_PROC_FLOW2
,
696 FS_PRP_ENC_DEST_SEL_MASK
, FS_PRP_ENC_DEST_SEL_IRT_ENC
},
697 .sink
= { IPUV3_CHANNEL_MEM_ROT_ENC
, IPU_FS_PROC_FLOW1
,
698 FS_PRPENC_ROT_SRC_SEL_MASK
, FS_PRPENC_ROT_SRC_SEL_ENC
},
700 .src
= { IPUV3_CHANNEL_IC_PRP_VF_MEM
, IPU_FS_PROC_FLOW2
,
701 FS_PRPVF_DEST_SEL_MASK
, FS_PRPVF_DEST_SEL_IRT_VF
},
702 .sink
= { IPUV3_CHANNEL_MEM_ROT_VF
, IPU_FS_PROC_FLOW1
,
703 FS_PRPVF_ROT_SRC_SEL_MASK
, FS_PRPVF_ROT_SRC_SEL_VF
},
705 .src
= { IPUV3_CHANNEL_IC_PP_MEM
, IPU_FS_PROC_FLOW2
,
706 FS_PP_DEST_SEL_MASK
, FS_PP_DEST_SEL_IRT_PP
},
707 .sink
= { IPUV3_CHANNEL_MEM_ROT_PP
, IPU_FS_PROC_FLOW1
,
708 FS_PP_ROT_SRC_SEL_MASK
, FS_PP_ROT_SRC_SEL_PP
},
710 .src
= { IPUV3_CHANNEL_CSI_DIRECT
, 0 },
711 .sink
= { IPUV3_CHANNEL_CSI_VDI_PREV
, IPU_FS_PROC_FLOW1
,
712 FS_VDI_SRC_SEL_MASK
, FS_VDI_SRC_SEL_CSI_DIRECT
},
716 static const struct fsu_link_info
*find_fsu_link_info(int src
, int sink
)
720 for (i
= 0; i
< ARRAY_SIZE(fsu_link_info
); i
++) {
721 if (src
== fsu_link_info
[i
].src
.chno
&&
722 sink
== fsu_link_info
[i
].sink
.chno
)
723 return &fsu_link_info
[i
];
730 * Links a source channel to a sink channel in the FSU.
732 int ipu_fsu_link(struct ipu_soc
*ipu
, int src_ch
, int sink_ch
)
734 const struct fsu_link_info
*link
;
735 u32 src_reg
, sink_reg
;
738 link
= find_fsu_link_info(src_ch
, sink_ch
);
742 spin_lock_irqsave(&ipu
->lock
, flags
);
744 if (link
->src
.mask
) {
745 src_reg
= ipu_cm_read(ipu
, link
->src
.reg
);
746 src_reg
&= ~link
->src
.mask
;
747 src_reg
|= link
->src
.val
;
748 ipu_cm_write(ipu
, src_reg
, link
->src
.reg
);
751 if (link
->sink
.mask
) {
752 sink_reg
= ipu_cm_read(ipu
, link
->sink
.reg
);
753 sink_reg
&= ~link
->sink
.mask
;
754 sink_reg
|= link
->sink
.val
;
755 ipu_cm_write(ipu
, sink_reg
, link
->sink
.reg
);
758 spin_unlock_irqrestore(&ipu
->lock
, flags
);
761 EXPORT_SYMBOL_GPL(ipu_fsu_link
);
764 * Unlinks source and sink channels in the FSU.
766 int ipu_fsu_unlink(struct ipu_soc
*ipu
, int src_ch
, int sink_ch
)
768 const struct fsu_link_info
*link
;
769 u32 src_reg
, sink_reg
;
772 link
= find_fsu_link_info(src_ch
, sink_ch
);
776 spin_lock_irqsave(&ipu
->lock
, flags
);
778 if (link
->src
.mask
) {
779 src_reg
= ipu_cm_read(ipu
, link
->src
.reg
);
780 src_reg
&= ~link
->src
.mask
;
781 ipu_cm_write(ipu
, src_reg
, link
->src
.reg
);
784 if (link
->sink
.mask
) {
785 sink_reg
= ipu_cm_read(ipu
, link
->sink
.reg
);
786 sink_reg
&= ~link
->sink
.mask
;
787 ipu_cm_write(ipu
, sink_reg
, link
->sink
.reg
);
790 spin_unlock_irqrestore(&ipu
->lock
, flags
);
793 EXPORT_SYMBOL_GPL(ipu_fsu_unlink
);
795 /* Link IDMAC channels in the FSU */
796 int ipu_idmac_link(struct ipuv3_channel
*src
, struct ipuv3_channel
*sink
)
798 return ipu_fsu_link(src
->ipu
, src
->num
, sink
->num
);
800 EXPORT_SYMBOL_GPL(ipu_idmac_link
);
802 /* Unlink IDMAC channels in the FSU */
803 int ipu_idmac_unlink(struct ipuv3_channel
*src
, struct ipuv3_channel
*sink
)
805 return ipu_fsu_unlink(src
->ipu
, src
->num
, sink
->num
);
807 EXPORT_SYMBOL_GPL(ipu_idmac_unlink
);
811 unsigned long cm_ofs
;
812 unsigned long cpmem_ofs
;
813 unsigned long srm_ofs
;
814 unsigned long tpm_ofs
;
815 unsigned long csi0_ofs
;
816 unsigned long csi1_ofs
;
817 unsigned long ic_ofs
;
818 unsigned long disp0_ofs
;
819 unsigned long disp1_ofs
;
820 unsigned long dc_tmpl_ofs
;
821 unsigned long vdi_ofs
;
822 enum ipuv3_type type
;
825 static struct ipu_devtype ipu_type_imx51
= {
827 .cm_ofs
= 0x1e000000,
828 .cpmem_ofs
= 0x1f000000,
829 .srm_ofs
= 0x1f040000,
830 .tpm_ofs
= 0x1f060000,
831 .csi0_ofs
= 0x1e030000,
832 .csi1_ofs
= 0x1e038000,
833 .ic_ofs
= 0x1e020000,
834 .disp0_ofs
= 0x1e040000,
835 .disp1_ofs
= 0x1e048000,
836 .dc_tmpl_ofs
= 0x1f080000,
837 .vdi_ofs
= 0x1e068000,
841 static struct ipu_devtype ipu_type_imx53
= {
843 .cm_ofs
= 0x06000000,
844 .cpmem_ofs
= 0x07000000,
845 .srm_ofs
= 0x07040000,
846 .tpm_ofs
= 0x07060000,
847 .csi0_ofs
= 0x06030000,
848 .csi1_ofs
= 0x06038000,
849 .ic_ofs
= 0x06020000,
850 .disp0_ofs
= 0x06040000,
851 .disp1_ofs
= 0x06048000,
852 .dc_tmpl_ofs
= 0x07080000,
853 .vdi_ofs
= 0x06068000,
857 static struct ipu_devtype ipu_type_imx6q
= {
859 .cm_ofs
= 0x00200000,
860 .cpmem_ofs
= 0x00300000,
861 .srm_ofs
= 0x00340000,
862 .tpm_ofs
= 0x00360000,
863 .csi0_ofs
= 0x00230000,
864 .csi1_ofs
= 0x00238000,
865 .ic_ofs
= 0x00220000,
866 .disp0_ofs
= 0x00240000,
867 .disp1_ofs
= 0x00248000,
868 .dc_tmpl_ofs
= 0x00380000,
869 .vdi_ofs
= 0x00268000,
873 static const struct of_device_id imx_ipu_dt_ids
[] = {
874 { .compatible
= "fsl,imx51-ipu", .data
= &ipu_type_imx51
, },
875 { .compatible
= "fsl,imx53-ipu", .data
= &ipu_type_imx53
, },
876 { .compatible
= "fsl,imx6q-ipu", .data
= &ipu_type_imx6q
, },
877 { .compatible
= "fsl,imx6qp-ipu", .data
= &ipu_type_imx6q
, },
880 MODULE_DEVICE_TABLE(of
, imx_ipu_dt_ids
);
882 static int ipu_submodules_init(struct ipu_soc
*ipu
,
883 struct platform_device
*pdev
, unsigned long ipu_base
,
888 struct device
*dev
= &pdev
->dev
;
889 const struct ipu_devtype
*devtype
= ipu
->devtype
;
891 ret
= ipu_cpmem_init(ipu
, dev
, ipu_base
+ devtype
->cpmem_ofs
);
897 ret
= ipu_csi_init(ipu
, dev
, 0, ipu_base
+ devtype
->csi0_ofs
,
898 IPU_CONF_CSI0_EN
, ipu_clk
);
904 ret
= ipu_csi_init(ipu
, dev
, 1, ipu_base
+ devtype
->csi1_ofs
,
905 IPU_CONF_CSI1_EN
, ipu_clk
);
911 ret
= ipu_ic_init(ipu
, dev
,
912 ipu_base
+ devtype
->ic_ofs
,
913 ipu_base
+ devtype
->tpm_ofs
);
919 ret
= ipu_vdi_init(ipu
, dev
, ipu_base
+ devtype
->vdi_ofs
,
920 IPU_CONF_VDI_EN
| IPU_CONF_ISP_EN
|
927 ret
= ipu_image_convert_init(ipu
, dev
);
929 unit
= "image_convert";
930 goto err_image_convert
;
933 ret
= ipu_di_init(ipu
, dev
, 0, ipu_base
+ devtype
->disp0_ofs
,
934 IPU_CONF_DI0_EN
, ipu_clk
);
940 ret
= ipu_di_init(ipu
, dev
, 1, ipu_base
+ devtype
->disp1_ofs
,
941 IPU_CONF_DI1_EN
, ipu_clk
);
947 ret
= ipu_dc_init(ipu
, dev
, ipu_base
+ devtype
->cm_ofs
+
948 IPU_CM_DC_REG_OFS
, ipu_base
+ devtype
->dc_tmpl_ofs
);
950 unit
= "dc_template";
954 ret
= ipu_dmfc_init(ipu
, dev
, ipu_base
+
955 devtype
->cm_ofs
+ IPU_CM_DMFC_REG_OFS
, ipu_clk
);
961 ret
= ipu_dp_init(ipu
, dev
, ipu_base
+ devtype
->srm_ofs
);
967 ret
= ipu_smfc_init(ipu
, dev
, ipu_base
+
968 devtype
->cm_ofs
+ IPU_CM_SMFC_REG_OFS
);
987 ipu_image_convert_exit(ipu
);
993 ipu_csi_exit(ipu
, 1);
995 ipu_csi_exit(ipu
, 0);
999 dev_err(&pdev
->dev
, "init %s failed with %d\n", unit
, ret
);
1003 static void ipu_irq_handle(struct ipu_soc
*ipu
, const int *regs
, int num_regs
)
1005 unsigned long status
;
1008 for (i
= 0; i
< num_regs
; i
++) {
1010 status
= ipu_cm_read(ipu
, IPU_INT_STAT(regs
[i
]));
1011 status
&= ipu_cm_read(ipu
, IPU_INT_CTRL(regs
[i
]));
1013 for_each_set_bit(bit
, &status
, 32) {
1014 irq
= irq_linear_revmap(ipu
->domain
,
1015 regs
[i
] * 32 + bit
);
1017 generic_handle_irq(irq
);
1022 static void ipu_irq_handler(struct irq_desc
*desc
)
1024 struct ipu_soc
*ipu
= irq_desc_get_handler_data(desc
);
1025 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
1026 static const int int_reg
[] = { 0, 1, 2, 3, 10, 11, 12, 13, 14};
1028 chained_irq_enter(chip
, desc
);
1030 ipu_irq_handle(ipu
, int_reg
, ARRAY_SIZE(int_reg
));
1032 chained_irq_exit(chip
, desc
);
1035 static void ipu_err_irq_handler(struct irq_desc
*desc
)
1037 struct ipu_soc
*ipu
= irq_desc_get_handler_data(desc
);
1038 struct irq_chip
*chip
= irq_desc_get_chip(desc
);
1039 static const int int_reg
[] = { 4, 5, 8, 9};
1041 chained_irq_enter(chip
, desc
);
1043 ipu_irq_handle(ipu
, int_reg
, ARRAY_SIZE(int_reg
));
1045 chained_irq_exit(chip
, desc
);
1048 int ipu_map_irq(struct ipu_soc
*ipu
, int irq
)
1052 virq
= irq_linear_revmap(ipu
->domain
, irq
);
1054 virq
= irq_create_mapping(ipu
->domain
, irq
);
1058 EXPORT_SYMBOL_GPL(ipu_map_irq
);
1060 int ipu_idmac_channel_irq(struct ipu_soc
*ipu
, struct ipuv3_channel
*channel
,
1061 enum ipu_channel_irq irq_type
)
1063 return ipu_map_irq(ipu
, irq_type
+ channel
->num
);
1065 EXPORT_SYMBOL_GPL(ipu_idmac_channel_irq
);
1067 static void ipu_submodules_exit(struct ipu_soc
*ipu
)
1073 ipu_di_exit(ipu
, 1);
1074 ipu_di_exit(ipu
, 0);
1075 ipu_image_convert_exit(ipu
);
1078 ipu_csi_exit(ipu
, 1);
1079 ipu_csi_exit(ipu
, 0);
1080 ipu_cpmem_exit(ipu
);
1083 static int platform_remove_devices_fn(struct device
*dev
, void *unused
)
1085 struct platform_device
*pdev
= to_platform_device(dev
);
1087 platform_device_unregister(pdev
);
1092 static void platform_device_unregister_children(struct platform_device
*pdev
)
1094 device_for_each_child(&pdev
->dev
, NULL
, platform_remove_devices_fn
);
1097 struct ipu_platform_reg
{
1098 struct ipu_client_platformdata pdata
;
1102 /* These must be in the order of the corresponding device tree port nodes */
1103 static struct ipu_platform_reg client_reg
[] = {
1107 .dma
[0] = IPUV3_CHANNEL_CSI0
,
1110 .name
= "imx-ipuv3-csi",
1114 .dma
[0] = IPUV3_CHANNEL_CSI1
,
1117 .name
= "imx-ipuv3-csi",
1122 .dp
= IPU_DP_FLOW_SYNC_BG
,
1123 .dma
[0] = IPUV3_CHANNEL_MEM_BG_SYNC
,
1124 .dma
[1] = IPUV3_CHANNEL_MEM_FG_SYNC
,
1126 .name
= "imx-ipuv3-crtc",
1132 .dma
[0] = IPUV3_CHANNEL_MEM_DC_SYNC
,
1135 .name
= "imx-ipuv3-crtc",
1139 static DEFINE_MUTEX(ipu_client_id_mutex
);
1140 static int ipu_client_id
;
1142 static int ipu_add_client_devices(struct ipu_soc
*ipu
, unsigned long ipu_base
)
1144 struct device
*dev
= ipu
->dev
;
1148 mutex_lock(&ipu_client_id_mutex
);
1150 ipu_client_id
+= ARRAY_SIZE(client_reg
);
1151 mutex_unlock(&ipu_client_id_mutex
);
1153 for (i
= 0; i
< ARRAY_SIZE(client_reg
); i
++) {
1154 struct ipu_platform_reg
*reg
= &client_reg
[i
];
1155 struct platform_device
*pdev
;
1156 struct device_node
*of_node
;
1158 /* Associate subdevice with the corresponding port node */
1159 of_node
= of_graph_get_port_by_id(dev
->of_node
, i
);
1162 "no port@%d node in %pOF, not using %s%d\n",
1164 (i
/ 2) ? "DI" : "CSI", i
% 2);
1168 pdev
= platform_device_alloc(reg
->name
, id
++);
1174 pdev
->dev
.parent
= dev
;
1176 reg
->pdata
.of_node
= of_node
;
1177 ret
= platform_device_add_data(pdev
, ®
->pdata
,
1178 sizeof(reg
->pdata
));
1180 ret
= platform_device_add(pdev
);
1182 platform_device_put(pdev
);
1190 platform_device_unregister_children(to_platform_device(dev
));
1196 static int ipu_irq_init(struct ipu_soc
*ipu
)
1198 struct irq_chip_generic
*gc
;
1199 struct irq_chip_type
*ct
;
1200 unsigned long unused
[IPU_NUM_IRQS
/ 32] = {
1201 0x400100d0, 0xffe000fd,
1202 0x400100d0, 0xffe000fd,
1203 0x400100d0, 0xffe000fd,
1204 0x4077ffff, 0xffe7e1fd,
1205 0x23fffffe, 0x8880fff0,
1206 0xf98fe7d0, 0xfff81fff,
1207 0x400100d0, 0xffe000fd,
1212 ipu
->domain
= irq_domain_add_linear(ipu
->dev
->of_node
, IPU_NUM_IRQS
,
1213 &irq_generic_chip_ops
, ipu
);
1215 dev_err(ipu
->dev
, "failed to add irq domain\n");
1219 ret
= irq_alloc_domain_generic_chips(ipu
->domain
, 32, 1, "IPU",
1220 handle_level_irq
, 0, 0, 0);
1222 dev_err(ipu
->dev
, "failed to alloc generic irq chips\n");
1223 irq_domain_remove(ipu
->domain
);
1227 /* Mask and clear all interrupts */
1228 for (i
= 0; i
< IPU_NUM_IRQS
; i
+= 32) {
1229 ipu_cm_write(ipu
, 0, IPU_INT_CTRL(i
/ 32));
1230 ipu_cm_write(ipu
, ~unused
[i
/ 32], IPU_INT_STAT(i
/ 32));
1233 for (i
= 0; i
< IPU_NUM_IRQS
; i
+= 32) {
1234 gc
= irq_get_domain_generic_chip(ipu
->domain
, i
);
1235 gc
->reg_base
= ipu
->cm_reg
;
1236 gc
->unused
= unused
[i
/ 32];
1237 ct
= gc
->chip_types
;
1238 ct
->chip
.irq_ack
= irq_gc_ack_set_bit
;
1239 ct
->chip
.irq_mask
= irq_gc_mask_clr_bit
;
1240 ct
->chip
.irq_unmask
= irq_gc_mask_set_bit
;
1241 ct
->regs
.ack
= IPU_INT_STAT(i
/ 32);
1242 ct
->regs
.mask
= IPU_INT_CTRL(i
/ 32);
1245 irq_set_chained_handler_and_data(ipu
->irq_sync
, ipu_irq_handler
, ipu
);
1246 irq_set_chained_handler_and_data(ipu
->irq_err
, ipu_err_irq_handler
,
1252 static void ipu_irq_exit(struct ipu_soc
*ipu
)
1256 irq_set_chained_handler_and_data(ipu
->irq_err
, NULL
, NULL
);
1257 irq_set_chained_handler_and_data(ipu
->irq_sync
, NULL
, NULL
);
1259 /* TODO: remove irq_domain_generic_chips */
1261 for (i
= 0; i
< IPU_NUM_IRQS
; i
++) {
1262 irq
= irq_linear_revmap(ipu
->domain
, i
);
1264 irq_dispose_mapping(irq
);
1267 irq_domain_remove(ipu
->domain
);
1270 void ipu_dump(struct ipu_soc
*ipu
)
1274 dev_dbg(ipu
->dev
, "IPU_CONF = \t0x%08X\n",
1275 ipu_cm_read(ipu
, IPU_CONF
));
1276 dev_dbg(ipu
->dev
, "IDMAC_CONF = \t0x%08X\n",
1277 ipu_idmac_read(ipu
, IDMAC_CONF
));
1278 dev_dbg(ipu
->dev
, "IDMAC_CHA_EN1 = \t0x%08X\n",
1279 ipu_idmac_read(ipu
, IDMAC_CHA_EN(0)));
1280 dev_dbg(ipu
->dev
, "IDMAC_CHA_EN2 = \t0x%08X\n",
1281 ipu_idmac_read(ipu
, IDMAC_CHA_EN(32)));
1282 dev_dbg(ipu
->dev
, "IDMAC_CHA_PRI1 = \t0x%08X\n",
1283 ipu_idmac_read(ipu
, IDMAC_CHA_PRI(0)));
1284 dev_dbg(ipu
->dev
, "IDMAC_CHA_PRI2 = \t0x%08X\n",
1285 ipu_idmac_read(ipu
, IDMAC_CHA_PRI(32)));
1286 dev_dbg(ipu
->dev
, "IDMAC_BAND_EN1 = \t0x%08X\n",
1287 ipu_idmac_read(ipu
, IDMAC_BAND_EN(0)));
1288 dev_dbg(ipu
->dev
, "IDMAC_BAND_EN2 = \t0x%08X\n",
1289 ipu_idmac_read(ipu
, IDMAC_BAND_EN(32)));
1290 dev_dbg(ipu
->dev
, "IPU_CHA_DB_MODE_SEL0 = \t0x%08X\n",
1291 ipu_cm_read(ipu
, IPU_CHA_DB_MODE_SEL(0)));
1292 dev_dbg(ipu
->dev
, "IPU_CHA_DB_MODE_SEL1 = \t0x%08X\n",
1293 ipu_cm_read(ipu
, IPU_CHA_DB_MODE_SEL(32)));
1294 dev_dbg(ipu
->dev
, "IPU_FS_PROC_FLOW1 = \t0x%08X\n",
1295 ipu_cm_read(ipu
, IPU_FS_PROC_FLOW1
));
1296 dev_dbg(ipu
->dev
, "IPU_FS_PROC_FLOW2 = \t0x%08X\n",
1297 ipu_cm_read(ipu
, IPU_FS_PROC_FLOW2
));
1298 dev_dbg(ipu
->dev
, "IPU_FS_PROC_FLOW3 = \t0x%08X\n",
1299 ipu_cm_read(ipu
, IPU_FS_PROC_FLOW3
));
1300 dev_dbg(ipu
->dev
, "IPU_FS_DISP_FLOW1 = \t0x%08X\n",
1301 ipu_cm_read(ipu
, IPU_FS_DISP_FLOW1
));
1302 for (i
= 0; i
< 15; i
++)
1303 dev_dbg(ipu
->dev
, "IPU_INT_CTRL(%d) = \t%08X\n", i
,
1304 ipu_cm_read(ipu
, IPU_INT_CTRL(i
)));
1306 EXPORT_SYMBOL_GPL(ipu_dump
);
1308 static int ipu_probe(struct platform_device
*pdev
)
1310 struct device_node
*np
= pdev
->dev
.of_node
;
1311 struct ipu_soc
*ipu
;
1312 struct resource
*res
;
1313 unsigned long ipu_base
;
1314 int ret
, irq_sync
, irq_err
;
1315 const struct ipu_devtype
*devtype
;
1317 devtype
= of_device_get_match_data(&pdev
->dev
);
1321 irq_sync
= platform_get_irq(pdev
, 0);
1322 irq_err
= platform_get_irq(pdev
, 1);
1323 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
1325 dev_dbg(&pdev
->dev
, "irq_sync: %d irq_err: %d\n",
1328 if (!res
|| irq_sync
< 0 || irq_err
< 0)
1331 ipu_base
= res
->start
;
1333 ipu
= devm_kzalloc(&pdev
->dev
, sizeof(*ipu
), GFP_KERNEL
);
1337 ipu
->id
= of_alias_get_id(np
, "ipu");
1341 if (of_device_is_compatible(np
, "fsl,imx6qp-ipu") &&
1342 IS_ENABLED(CONFIG_DRM
)) {
1343 ipu
->prg_priv
= ipu_prg_lookup_by_phandle(&pdev
->dev
,
1344 "fsl,prg", ipu
->id
);
1346 return -EPROBE_DEFER
;
1349 ipu
->devtype
= devtype
;
1350 ipu
->ipu_type
= devtype
->type
;
1352 spin_lock_init(&ipu
->lock
);
1353 mutex_init(&ipu
->channel_lock
);
1354 INIT_LIST_HEAD(&ipu
->channels
);
1356 dev_dbg(&pdev
->dev
, "cm_reg: 0x%08lx\n",
1357 ipu_base
+ devtype
->cm_ofs
);
1358 dev_dbg(&pdev
->dev
, "idmac: 0x%08lx\n",
1359 ipu_base
+ devtype
->cm_ofs
+ IPU_CM_IDMAC_REG_OFS
);
1360 dev_dbg(&pdev
->dev
, "cpmem: 0x%08lx\n",
1361 ipu_base
+ devtype
->cpmem_ofs
);
1362 dev_dbg(&pdev
->dev
, "csi0: 0x%08lx\n",
1363 ipu_base
+ devtype
->csi0_ofs
);
1364 dev_dbg(&pdev
->dev
, "csi1: 0x%08lx\n",
1365 ipu_base
+ devtype
->csi1_ofs
);
1366 dev_dbg(&pdev
->dev
, "ic: 0x%08lx\n",
1367 ipu_base
+ devtype
->ic_ofs
);
1368 dev_dbg(&pdev
->dev
, "disp0: 0x%08lx\n",
1369 ipu_base
+ devtype
->disp0_ofs
);
1370 dev_dbg(&pdev
->dev
, "disp1: 0x%08lx\n",
1371 ipu_base
+ devtype
->disp1_ofs
);
1372 dev_dbg(&pdev
->dev
, "srm: 0x%08lx\n",
1373 ipu_base
+ devtype
->srm_ofs
);
1374 dev_dbg(&pdev
->dev
, "tpm: 0x%08lx\n",
1375 ipu_base
+ devtype
->tpm_ofs
);
1376 dev_dbg(&pdev
->dev
, "dc: 0x%08lx\n",
1377 ipu_base
+ devtype
->cm_ofs
+ IPU_CM_DC_REG_OFS
);
1378 dev_dbg(&pdev
->dev
, "ic: 0x%08lx\n",
1379 ipu_base
+ devtype
->cm_ofs
+ IPU_CM_IC_REG_OFS
);
1380 dev_dbg(&pdev
->dev
, "dmfc: 0x%08lx\n",
1381 ipu_base
+ devtype
->cm_ofs
+ IPU_CM_DMFC_REG_OFS
);
1382 dev_dbg(&pdev
->dev
, "vdi: 0x%08lx\n",
1383 ipu_base
+ devtype
->vdi_ofs
);
1385 ipu
->cm_reg
= devm_ioremap(&pdev
->dev
,
1386 ipu_base
+ devtype
->cm_ofs
, PAGE_SIZE
);
1387 ipu
->idmac_reg
= devm_ioremap(&pdev
->dev
,
1388 ipu_base
+ devtype
->cm_ofs
+ IPU_CM_IDMAC_REG_OFS
,
1391 if (!ipu
->cm_reg
|| !ipu
->idmac_reg
)
1394 ipu
->clk
= devm_clk_get(&pdev
->dev
, "bus");
1395 if (IS_ERR(ipu
->clk
)) {
1396 ret
= PTR_ERR(ipu
->clk
);
1397 dev_err(&pdev
->dev
, "clk_get failed with %d", ret
);
1401 platform_set_drvdata(pdev
, ipu
);
1403 ret
= clk_prepare_enable(ipu
->clk
);
1405 dev_err(&pdev
->dev
, "clk_prepare_enable failed: %d\n", ret
);
1409 ipu
->dev
= &pdev
->dev
;
1410 ipu
->irq_sync
= irq_sync
;
1411 ipu
->irq_err
= irq_err
;
1413 ret
= device_reset(&pdev
->dev
);
1415 dev_err(&pdev
->dev
, "failed to reset: %d\n", ret
);
1416 goto out_failed_reset
;
1418 ret
= ipu_memory_reset(ipu
);
1420 goto out_failed_reset
;
1422 ret
= ipu_irq_init(ipu
);
1424 goto out_failed_irq
;
1426 /* Set MCU_T to divide MCU access window into 2 */
1427 ipu_cm_write(ipu
, 0x00400000L
| (IPU_MCU_T_DEFAULT
<< 18),
1430 ret
= ipu_submodules_init(ipu
, pdev
, ipu_base
, ipu
->clk
);
1432 goto failed_submodules_init
;
1434 ret
= ipu_add_client_devices(ipu
, ipu_base
);
1436 dev_err(&pdev
->dev
, "adding client devices failed with %d\n",
1438 goto failed_add_clients
;
1441 dev_info(&pdev
->dev
, "%s probed\n", devtype
->name
);
1446 ipu_submodules_exit(ipu
);
1447 failed_submodules_init
:
1451 clk_disable_unprepare(ipu
->clk
);
1455 static int ipu_remove(struct platform_device
*pdev
)
1457 struct ipu_soc
*ipu
= platform_get_drvdata(pdev
);
1459 platform_device_unregister_children(pdev
);
1460 ipu_submodules_exit(ipu
);
1463 clk_disable_unprepare(ipu
->clk
);
1468 static struct platform_driver imx_ipu_driver
= {
1470 .name
= "imx-ipuv3",
1471 .of_match_table
= imx_ipu_dt_ids
,
1474 .remove
= ipu_remove
,
1477 static struct platform_driver
* const drivers
[] = {
1478 #if IS_ENABLED(CONFIG_DRM)
1485 static int __init
imx_ipu_init(void)
1487 return platform_register_drivers(drivers
, ARRAY_SIZE(drivers
));
1489 module_init(imx_ipu_init
);
1491 static void __exit
imx_ipu_exit(void)
1493 platform_unregister_drivers(drivers
, ARRAY_SIZE(drivers
));
1495 module_exit(imx_ipu_exit
);
1497 MODULE_ALIAS("platform:imx-ipuv3");
1498 MODULE_DESCRIPTION("i.MX IPU v3 driver");
1499 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
1500 MODULE_LICENSE("GPL");