提交 1aa8ea0d 编写于 作者: S Steve Longerbeam 提交者: Philipp Zabel

gpu: ipu-v3: Add Image Converter unit

Adds the Image Converter (IC) unit.
Signed-off-by: NSteve Longerbeam <steve_longerbeam@mentor.com>

Condensed the three CSC setup functions into a single one that
uses static tables to set up the CSC task parameters.
Signed-off-by: NPhilipp Zabel <p.zabel@pengutronix.de>
上级 2ffd48f2
obj-$(CONFIG_IMX_IPUV3_CORE) += imx-ipu-v3.o obj-$(CONFIG_IMX_IPUV3_CORE) += imx-ipu-v3.o
imx-ipu-v3-objs := ipu-common.o ipu-cpmem.o ipu-csi.o ipu-dc.o ipu-di.o \ imx-ipu-v3-objs := ipu-common.o ipu-cpmem.o ipu-csi.o ipu-dc.o ipu-di.o \
ipu-dp.o ipu-dmfc.o ipu-smfc.o ipu-dp.o ipu-dmfc.o ipu-ic.o ipu-smfc.o
...@@ -429,6 +429,7 @@ struct ipu_devtype { ...@@ -429,6 +429,7 @@ struct ipu_devtype {
unsigned long tpm_ofs; unsigned long tpm_ofs;
unsigned long csi0_ofs; unsigned long csi0_ofs;
unsigned long csi1_ofs; unsigned long csi1_ofs;
unsigned long ic_ofs;
unsigned long disp0_ofs; unsigned long disp0_ofs;
unsigned long disp1_ofs; unsigned long disp1_ofs;
unsigned long dc_tmpl_ofs; unsigned long dc_tmpl_ofs;
...@@ -444,6 +445,7 @@ static struct ipu_devtype ipu_type_imx51 = { ...@@ -444,6 +445,7 @@ static struct ipu_devtype ipu_type_imx51 = {
.tpm_ofs = 0x1f060000, .tpm_ofs = 0x1f060000,
.csi0_ofs = 0x1f030000, .csi0_ofs = 0x1f030000,
.csi1_ofs = 0x1f038000, .csi1_ofs = 0x1f038000,
.ic_ofs = 0x1f020000,
.disp0_ofs = 0x1e040000, .disp0_ofs = 0x1e040000,
.disp1_ofs = 0x1e048000, .disp1_ofs = 0x1e048000,
.dc_tmpl_ofs = 0x1f080000, .dc_tmpl_ofs = 0x1f080000,
...@@ -459,6 +461,7 @@ static struct ipu_devtype ipu_type_imx53 = { ...@@ -459,6 +461,7 @@ static struct ipu_devtype ipu_type_imx53 = {
.tpm_ofs = 0x07060000, .tpm_ofs = 0x07060000,
.csi0_ofs = 0x07030000, .csi0_ofs = 0x07030000,
.csi1_ofs = 0x07038000, .csi1_ofs = 0x07038000,
.ic_ofs = 0x07020000,
.disp0_ofs = 0x06040000, .disp0_ofs = 0x06040000,
.disp1_ofs = 0x06048000, .disp1_ofs = 0x06048000,
.dc_tmpl_ofs = 0x07080000, .dc_tmpl_ofs = 0x07080000,
...@@ -474,6 +477,7 @@ static struct ipu_devtype ipu_type_imx6q = { ...@@ -474,6 +477,7 @@ static struct ipu_devtype ipu_type_imx6q = {
.tpm_ofs = 0x00360000, .tpm_ofs = 0x00360000,
.csi0_ofs = 0x00230000, .csi0_ofs = 0x00230000,
.csi1_ofs = 0x00238000, .csi1_ofs = 0x00238000,
.ic_ofs = 0x00220000,
.disp0_ofs = 0x00240000, .disp0_ofs = 0x00240000,
.disp1_ofs = 0x00248000, .disp1_ofs = 0x00248000,
.dc_tmpl_ofs = 0x00380000, .dc_tmpl_ofs = 0x00380000,
...@@ -518,8 +522,16 @@ static int ipu_submodules_init(struct ipu_soc *ipu, ...@@ -518,8 +522,16 @@ static int ipu_submodules_init(struct ipu_soc *ipu,
goto err_csi_1; goto err_csi_1;
} }
ret = ipu_ic_init(ipu, dev,
ipu_base + devtype->ic_ofs,
ipu_base + devtype->tpm_ofs);
if (ret) {
unit = "ic";
goto err_ic;
}
ret = ipu_di_init(ipu, dev, 0, ipu_base + devtype->disp0_ofs, ret = ipu_di_init(ipu, dev, 0, ipu_base + devtype->disp0_ofs,
IPU_CONF_DI0_EN, ipu_clk); IPU_CONF_DI0_EN, ipu_clk);
if (ret) { if (ret) {
unit = "di0"; unit = "di0";
goto err_di_0; goto err_di_0;
...@@ -572,6 +584,8 @@ static int ipu_submodules_init(struct ipu_soc *ipu, ...@@ -572,6 +584,8 @@ static int ipu_submodules_init(struct ipu_soc *ipu,
err_di_1: err_di_1:
ipu_di_exit(ipu, 0); ipu_di_exit(ipu, 0);
err_di_0: err_di_0:
ipu_ic_exit(ipu);
err_ic:
ipu_csi_exit(ipu, 1); ipu_csi_exit(ipu, 1);
err_csi_1: err_csi_1:
ipu_csi_exit(ipu, 0); ipu_csi_exit(ipu, 0);
...@@ -654,6 +668,7 @@ static void ipu_submodules_exit(struct ipu_soc *ipu) ...@@ -654,6 +668,7 @@ static void ipu_submodules_exit(struct ipu_soc *ipu)
ipu_dc_exit(ipu); ipu_dc_exit(ipu);
ipu_di_exit(ipu, 1); ipu_di_exit(ipu, 1);
ipu_di_exit(ipu, 0); ipu_di_exit(ipu, 0);
ipu_ic_exit(ipu);
ipu_csi_exit(ipu, 1); ipu_csi_exit(ipu, 1);
ipu_csi_exit(ipu, 0); ipu_csi_exit(ipu, 0);
ipu_cpmem_exit(ipu); ipu_cpmem_exit(ipu);
...@@ -879,6 +894,8 @@ static int ipu_probe(struct platform_device *pdev) ...@@ -879,6 +894,8 @@ static int ipu_probe(struct platform_device *pdev)
ipu_base + devtype->csi0_ofs); ipu_base + devtype->csi0_ofs);
dev_dbg(&pdev->dev, "csi1: 0x%08lx\n", dev_dbg(&pdev->dev, "csi1: 0x%08lx\n",
ipu_base + devtype->csi1_ofs); ipu_base + devtype->csi1_ofs);
dev_dbg(&pdev->dev, "ic: 0x%08lx\n",
ipu_base + devtype->ic_ofs);
dev_dbg(&pdev->dev, "disp0: 0x%08lx\n", dev_dbg(&pdev->dev, "disp0: 0x%08lx\n",
ipu_base + devtype->disp0_ofs); ipu_base + devtype->disp0_ofs);
dev_dbg(&pdev->dev, "disp1: 0x%08lx\n", dev_dbg(&pdev->dev, "disp1: 0x%08lx\n",
......
此差异已折叠。
...@@ -161,6 +161,7 @@ struct ipu_csi; ...@@ -161,6 +161,7 @@ struct ipu_csi;
struct ipu_dc_priv; struct ipu_dc_priv;
struct ipu_dmfc_priv; struct ipu_dmfc_priv;
struct ipu_di; struct ipu_di;
struct ipu_ic_priv;
struct ipu_smfc_priv; struct ipu_smfc_priv;
struct ipu_devtype; struct ipu_devtype;
...@@ -191,6 +192,7 @@ struct ipu_soc { ...@@ -191,6 +192,7 @@ struct ipu_soc {
struct ipu_dmfc_priv *dmfc_priv; struct ipu_dmfc_priv *dmfc_priv;
struct ipu_di *di_priv[2]; struct ipu_di *di_priv[2];
struct ipu_csi *csi_priv[2]; struct ipu_csi *csi_priv[2];
struct ipu_ic_priv *ic_priv;
struct ipu_smfc_priv *smfc_priv; struct ipu_smfc_priv *smfc_priv;
}; };
...@@ -217,6 +219,10 @@ int ipu_csi_init(struct ipu_soc *ipu, struct device *dev, int id, ...@@ -217,6 +219,10 @@ int ipu_csi_init(struct ipu_soc *ipu, struct device *dev, int id,
unsigned long base, u32 module, struct clk *clk_ipu); unsigned long base, u32 module, struct clk *clk_ipu);
void ipu_csi_exit(struct ipu_soc *ipu, int id); void ipu_csi_exit(struct ipu_soc *ipu, int id);
int ipu_ic_init(struct ipu_soc *ipu, struct device *dev,
unsigned long base, unsigned long tpmem_base);
void ipu_ic_exit(struct ipu_soc *ipu);
int ipu_di_init(struct ipu_soc *ipu, struct device *dev, int id, int ipu_di_init(struct ipu_soc *ipu, struct device *dev, int id,
unsigned long base, u32 module, struct clk *ipu_clk); unsigned long base, u32 module, struct clk *ipu_clk);
void ipu_di_exit(struct ipu_soc *ipu, int id); void ipu_di_exit(struct ipu_soc *ipu, int id);
......
...@@ -71,6 +71,20 @@ enum ipu_csi_dest { ...@@ -71,6 +71,20 @@ enum ipu_csi_dest {
IPU_CSI_DEST_VDIC, /* to VDIC */ IPU_CSI_DEST_VDIC, /* to VDIC */
}; };
/*
* Enumeration of IPU rotation modes
*/
enum ipu_rotate_mode {
IPU_ROTATE_NONE = 0,
IPU_ROTATE_VERT_FLIP,
IPU_ROTATE_HORIZ_FLIP,
IPU_ROTATE_180,
IPU_ROTATE_90_RIGHT,
IPU_ROTATE_90_RIGHT_VFLIP,
IPU_ROTATE_90_RIGHT_HFLIP,
IPU_ROTATE_90_LEFT,
};
enum ipu_color_space { enum ipu_color_space {
IPUV3_COLORSPACE_RGB, IPUV3_COLORSPACE_RGB,
IPUV3_COLORSPACE_YUV, IPUV3_COLORSPACE_YUV,
...@@ -242,6 +256,37 @@ struct ipu_csi *ipu_csi_get(struct ipu_soc *ipu, int id); ...@@ -242,6 +256,37 @@ struct ipu_csi *ipu_csi_get(struct ipu_soc *ipu, int id);
void ipu_csi_put(struct ipu_csi *csi); void ipu_csi_put(struct ipu_csi *csi);
void ipu_csi_dump(struct ipu_csi *csi); void ipu_csi_dump(struct ipu_csi *csi);
/*
* IPU Image Converter (ic) functions
*/
enum ipu_ic_task {
IC_TASK_ENCODER,
IC_TASK_VIEWFINDER,
IC_TASK_POST_PROCESSOR,
IC_NUM_TASKS,
};
struct ipu_ic;
int ipu_ic_task_init(struct ipu_ic *ic,
int in_width, int in_height,
int out_width, int out_height,
enum ipu_color_space in_cs,
enum ipu_color_space out_cs);
int ipu_ic_task_graphics_init(struct ipu_ic *ic,
enum ipu_color_space in_g_cs,
bool galpha_en, u32 galpha,
bool colorkey_en, u32 colorkey);
void ipu_ic_task_enable(struct ipu_ic *ic);
void ipu_ic_task_disable(struct ipu_ic *ic);
int ipu_ic_task_idma_init(struct ipu_ic *ic, struct ipuv3_channel *channel,
u32 width, u32 height, int burst_size,
enum ipu_rotate_mode rot);
int ipu_ic_enable(struct ipu_ic *ic);
int ipu_ic_disable(struct ipu_ic *ic);
struct ipu_ic *ipu_ic_get(struct ipu_soc *ipu, enum ipu_ic_task task);
void ipu_ic_put(struct ipu_ic *ic);
void ipu_ic_dump(struct ipu_ic *ic);
/* /*
* IPU Sensor Multiple FIFO Controller (SMFC) functions * IPU Sensor Multiple FIFO Controller (SMFC) functions
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册