You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
gpu: ipu-v3: Add Image Converter unit
Adds the Image Converter (IC) unit. Signed-off-by: Steve 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: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
committed by
Philipp Zabel
parent
2ffd48f2e7
commit
1aa8ea0d2b
@@ -1,4 +1,4 @@
|
||||
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 \
|
||||
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 {
|
||||
unsigned long tpm_ofs;
|
||||
unsigned long csi0_ofs;
|
||||
unsigned long csi1_ofs;
|
||||
unsigned long ic_ofs;
|
||||
unsigned long disp0_ofs;
|
||||
unsigned long disp1_ofs;
|
||||
unsigned long dc_tmpl_ofs;
|
||||
@@ -444,6 +445,7 @@ static struct ipu_devtype ipu_type_imx51 = {
|
||||
.tpm_ofs = 0x1f060000,
|
||||
.csi0_ofs = 0x1f030000,
|
||||
.csi1_ofs = 0x1f038000,
|
||||
.ic_ofs = 0x1f020000,
|
||||
.disp0_ofs = 0x1e040000,
|
||||
.disp1_ofs = 0x1e048000,
|
||||
.dc_tmpl_ofs = 0x1f080000,
|
||||
@@ -459,6 +461,7 @@ static struct ipu_devtype ipu_type_imx53 = {
|
||||
.tpm_ofs = 0x07060000,
|
||||
.csi0_ofs = 0x07030000,
|
||||
.csi1_ofs = 0x07038000,
|
||||
.ic_ofs = 0x07020000,
|
||||
.disp0_ofs = 0x06040000,
|
||||
.disp1_ofs = 0x06048000,
|
||||
.dc_tmpl_ofs = 0x07080000,
|
||||
@@ -474,6 +477,7 @@ static struct ipu_devtype ipu_type_imx6q = {
|
||||
.tpm_ofs = 0x00360000,
|
||||
.csi0_ofs = 0x00230000,
|
||||
.csi1_ofs = 0x00238000,
|
||||
.ic_ofs = 0x00220000,
|
||||
.disp0_ofs = 0x00240000,
|
||||
.disp1_ofs = 0x00248000,
|
||||
.dc_tmpl_ofs = 0x00380000,
|
||||
@@ -518,8 +522,16 @@ static int ipu_submodules_init(struct ipu_soc *ipu,
|
||||
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,
|
||||
IPU_CONF_DI0_EN, ipu_clk);
|
||||
IPU_CONF_DI0_EN, ipu_clk);
|
||||
if (ret) {
|
||||
unit = "di0";
|
||||
goto err_di_0;
|
||||
@@ -572,6 +584,8 @@ err_dc:
|
||||
err_di_1:
|
||||
ipu_di_exit(ipu, 0);
|
||||
err_di_0:
|
||||
ipu_ic_exit(ipu);
|
||||
err_ic:
|
||||
ipu_csi_exit(ipu, 1);
|
||||
err_csi_1:
|
||||
ipu_csi_exit(ipu, 0);
|
||||
@@ -654,6 +668,7 @@ static void ipu_submodules_exit(struct ipu_soc *ipu)
|
||||
ipu_dc_exit(ipu);
|
||||
ipu_di_exit(ipu, 1);
|
||||
ipu_di_exit(ipu, 0);
|
||||
ipu_ic_exit(ipu);
|
||||
ipu_csi_exit(ipu, 1);
|
||||
ipu_csi_exit(ipu, 0);
|
||||
ipu_cpmem_exit(ipu);
|
||||
@@ -879,6 +894,8 @@ static int ipu_probe(struct platform_device *pdev)
|
||||
ipu_base + devtype->csi0_ofs);
|
||||
dev_dbg(&pdev->dev, "csi1: 0x%08lx\n",
|
||||
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",
|
||||
ipu_base + devtype->disp0_ofs);
|
||||
dev_dbg(&pdev->dev, "disp1: 0x%08lx\n",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -161,6 +161,7 @@ struct ipu_csi;
|
||||
struct ipu_dc_priv;
|
||||
struct ipu_dmfc_priv;
|
||||
struct ipu_di;
|
||||
struct ipu_ic_priv;
|
||||
struct ipu_smfc_priv;
|
||||
|
||||
struct ipu_devtype;
|
||||
@@ -191,6 +192,7 @@ struct ipu_soc {
|
||||
struct ipu_dmfc_priv *dmfc_priv;
|
||||
struct ipu_di *di_priv[2];
|
||||
struct ipu_csi *csi_priv[2];
|
||||
struct ipu_ic_priv *ic_priv;
|
||||
struct ipu_smfc_priv *smfc_priv;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
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,
|
||||
unsigned long base, u32 module, struct clk *ipu_clk);
|
||||
void ipu_di_exit(struct ipu_soc *ipu, int id);
|
||||
|
||||
@@ -71,6 +71,20 @@ enum ipu_csi_dest {
|
||||
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 {
|
||||
IPUV3_COLORSPACE_RGB,
|
||||
IPUV3_COLORSPACE_YUV,
|
||||
@@ -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_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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user