^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifndef _IPU_INTERN_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define _IPU_INTERN_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/dmaengine.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /* IPU Common registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define IPU_CONF 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define IPU_CHA_BUF0_RDY 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define IPU_CHA_BUF1_RDY 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define IPU_CHA_DB_MODE_SEL 0x0C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define IPU_CHA_CUR_BUF 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define IPU_FS_PROC_FLOW 0x14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define IPU_FS_DISP_FLOW 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define IPU_TASKS_STAT 0x1C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define IPU_IMA_ADDR 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define IPU_IMA_DATA 0x24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define IPU_INT_CTRL_1 0x28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define IPU_INT_CTRL_2 0x2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define IPU_INT_CTRL_3 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define IPU_INT_CTRL_4 0x34
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define IPU_INT_CTRL_5 0x38
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define IPU_INT_STAT_1 0x3C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define IPU_INT_STAT_2 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define IPU_INT_STAT_3 0x44
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define IPU_INT_STAT_4 0x48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define IPU_INT_STAT_5 0x4C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define IPU_BRK_CTRL_1 0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define IPU_BRK_CTRL_2 0x54
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define IPU_BRK_STAT 0x58
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define IPU_DIAGB_CTRL 0x5C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* IPU_CONF Register bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define IPU_CONF_CSI_EN 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define IPU_CONF_IC_EN 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define IPU_CONF_ROT_EN 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define IPU_CONF_PF_EN 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define IPU_CONF_SDC_EN 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define IPU_CONF_ADC_EN 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define IPU_CONF_DI_EN 0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define IPU_CONF_DU_EN 0x00000080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define IPU_CONF_PXL_ENDIAN 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* Image Converter Registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define IC_CONF 0x88
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define IC_PRP_ENC_RSC 0x8C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define IC_PRP_VF_RSC 0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define IC_PP_RSC 0x94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define IC_CMBP_1 0x98
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define IC_CMBP_2 0x9C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define PF_CONF 0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define IDMAC_CONF 0xA4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define IDMAC_CHA_EN 0xA8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define IDMAC_CHA_PRI 0xAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define IDMAC_CHA_BUSY 0xB0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Image Converter Register bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define IC_CONF_PRPENC_EN 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define IC_CONF_PRPENC_CSC1 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define IC_CONF_PRPENC_ROT_EN 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define IC_CONF_PRPVF_EN 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define IC_CONF_PRPVF_CSC1 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define IC_CONF_PRPVF_CSC2 0x00000400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define IC_CONF_PRPVF_CMB 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define IC_CONF_PRPVF_ROT_EN 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define IC_CONF_PP_EN 0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define IC_CONF_PP_CSC1 0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define IC_CONF_PP_CSC2 0x00040000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define IC_CONF_PP_CMB 0x00080000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define IC_CONF_PP_ROT_EN 0x00100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define IC_CONF_IC_GLB_LOC_A 0x10000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define IC_CONF_KEY_COLOR_EN 0x20000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define IC_CONF_RWS_EN 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define IC_CONF_CSI_MEM_WR_EN 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define IDMA_CHAN_INVALID 0x000000FF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define IDMA_IC_0 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define IDMA_IC_1 0x00000002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define IDMA_IC_2 0x00000004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define IDMA_IC_3 0x00000008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define IDMA_IC_4 0x00000010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define IDMA_IC_5 0x00000020
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define IDMA_IC_6 0x00000040
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define IDMA_IC_7 0x00000080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define IDMA_IC_8 0x00000100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define IDMA_IC_9 0x00000200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define IDMA_IC_10 0x00000400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define IDMA_IC_11 0x00000800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define IDMA_IC_12 0x00001000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define IDMA_IC_13 0x00002000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define IDMA_SDC_BG 0x00004000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define IDMA_SDC_FG 0x00008000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define IDMA_SDC_MASK 0x00010000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define IDMA_SDC_PARTIAL 0x00020000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define IDMA_ADC_SYS1_WR 0x00040000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define IDMA_ADC_SYS2_WR 0x00080000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define IDMA_ADC_SYS1_CMD 0x00100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define IDMA_ADC_SYS2_CMD 0x00200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define IDMA_ADC_SYS1_RD 0x00400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define IDMA_ADC_SYS2_RD 0x00800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define IDMA_PF_QP 0x01000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define IDMA_PF_BSP 0x02000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define IDMA_PF_Y_IN 0x04000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define IDMA_PF_U_IN 0x08000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define IDMA_PF_V_IN 0x10000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define IDMA_PF_Y_OUT 0x20000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define IDMA_PF_U_OUT 0x40000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define IDMA_PF_V_OUT 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define TSTAT_PF_H264_PAUSE 0x00000001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define TSTAT_CSI2MEM_MASK 0x0000000C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define TSTAT_CSI2MEM_OFFSET 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define TSTAT_VF_MASK 0x00000600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define TSTAT_VF_OFFSET 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define TSTAT_VF_ROT_MASK 0x000C0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define TSTAT_VF_ROT_OFFSET 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define TSTAT_ENC_MASK 0x00000180
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define TSTAT_ENC_OFFSET 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define TSTAT_ENC_ROT_MASK 0x00030000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define TSTAT_ENC_ROT_OFFSET 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define TSTAT_PP_MASK 0x00001800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define TSTAT_PP_OFFSET 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define TSTAT_PP_ROT_MASK 0x00300000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define TSTAT_PP_ROT_OFFSET 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define TSTAT_PF_MASK 0x00C00000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define TSTAT_PF_OFFSET 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define TSTAT_ADCSYS1_MASK 0x03000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define TSTAT_ADCSYS1_OFFSET 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define TSTAT_ADCSYS2_MASK 0x0C000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define TSTAT_ADCSYS2_OFFSET 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define TASK_STAT_IDLE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define TASK_STAT_ACTIVE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define TASK_STAT_WAIT4READY 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct idmac {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct dma_device dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) struct ipu {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) void __iomem *reg_ipu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) void __iomem *reg_ic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) unsigned int irq_fn; /* IPU Function IRQ to the CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) unsigned int irq_err; /* IPU Error IRQ to the CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) unsigned int irq_base; /* Beginning of the IPU IRQ range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) unsigned long channel_init_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) struct clk *ipu_clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct idmac idmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct idmac_channel channel[IPU_CHANNELS_NUM];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct tasklet_struct tasklet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define to_idmac(d) container_of(d, struct idmac, dma)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) extern int ipu_irq_attach_irq(struct ipu *ipu, struct platform_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) extern void ipu_irq_detach_irq(struct ipu *ipu, struct platform_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) extern bool ipu_irq_status(uint32_t irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) extern int ipu_irq_map(unsigned int source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) extern int ipu_irq_unmap(unsigned int source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #endif