summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHu Kejun <william.hu@rock-chips.com>2018-04-09 16:08:10 +0800
committerTao Huang <huangtao@rock-chips.com>2018-04-11 18:30:37 +0800
commitc16d640f8e7d1d23946b4d6b4f0fcd364afed765 (patch)
treeaff9e153b77fd8531229ee6bddbbe22284a1db0f
parent75e03927eee6cca1c0878e579b4876544e770179 (diff)
media: rockchip: isp: Support for RK3326
Change-Id: Iceca3111e6fd03ea6cd64a3c1fcf9627acc4a8c6 Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
-rw-r--r--Documentation/devicetree/bindings/media/rockchip-isp1.txt5
-rw-r--r--drivers/media/platform/rockchip/isp1/dev.c52
-rw-r--r--drivers/media/platform/rockchip/isp1/dev.h7
-rw-r--r--drivers/media/platform/rockchip/isp1/regs.h3
-rw-r--r--drivers/media/platform/rockchip/isp1/rkisp1.c2
5 files changed, 51 insertions, 18 deletions
diff --git a/Documentation/devicetree/bindings/media/rockchip-isp1.txt b/Documentation/devicetree/bindings/media/rockchip-isp1.txt
index 4631a4b7c88a..4d8ef2fcc4df 100644
--- a/Documentation/devicetree/bindings/media/rockchip-isp1.txt
+++ b/Documentation/devicetree/bindings/media/rockchip-isp1.txt
@@ -6,8 +6,9 @@ which contains image processing, scaling, and compression funcitons.
Required properties:
- compatible: value should be one of the following
- "rockchip,rk3288-cif-isp";
- "rockchip,rk3399-cif-isp";
+ "rockchip,rk3288-rkisp1";
+ "rockchip,rk3326-rkisp1";
+ "rockchip,rk3399-rkisp1";
- reg : offset and length of the register set for the device.
- interrupts: should contain ISP interrupt.
- clocks: phandle to the required clocks.
diff --git a/drivers/media/platform/rockchip/isp1/dev.c b/drivers/media/platform/rockchip/isp1/dev.c
index bad4227edacb..b91253ef8293 100644
--- a/drivers/media/platform/rockchip/isp1/dev.c
+++ b/drivers/media/platform/rockchip/isp1/dev.c
@@ -50,6 +50,7 @@
struct isp_match_data {
const char * const *clks;
int size;
+ enum rkisp1_isp_ver isp_ver;
};
int rkisp1_debug;
@@ -422,39 +423,57 @@ err_cleanup_ctx:
return ret;
}
-static const char * const rk3399_isp_clks[] = {
+static const char * const rk3288_isp_clks[] = {
"clk_isp",
"aclk_isp",
"hclk_isp",
- "aclk_isp_wrap",
- "hclk_isp_wrap",
+ "pclk_isp_in",
+ "sclk_isp_jpe",
};
-static const char * const rk3288_isp_clks[] = {
+static const char * const rk3326_isp_clks[] = {
"clk_isp",
"aclk_isp",
"hclk_isp",
- "pclk_isp_in",
- "sclk_isp_jpe",
+ "pclk_isp",
+};
+
+static const char * const rk3399_isp_clks[] = {
+ "clk_isp",
+ "aclk_isp",
+ "hclk_isp",
+ "aclk_isp_wrap",
+ "hclk_isp_wrap",
};
-static const struct isp_match_data rk3288_isp_clk_data = {
+static const struct isp_match_data rk3288_isp_match_data = {
.clks = rk3288_isp_clks,
.size = ARRAY_SIZE(rk3288_isp_clks),
+ .isp_ver = ISP_V10,
};
-static const struct isp_match_data rk3399_isp_clk_data = {
+static const struct isp_match_data rk3326_isp_match_data = {
+ .clks = rk3326_isp_clks,
+ .size = ARRAY_SIZE(rk3326_isp_clks),
+ .isp_ver = ISP_V12,
+};
+
+static const struct isp_match_data rk3399_isp_match_data = {
.clks = rk3399_isp_clks,
.size = ARRAY_SIZE(rk3399_isp_clks),
+ .isp_ver = ISP_V10,
};
static const struct of_device_id rkisp1_plat_of_match[] = {
{
.compatible = "rockchip,rk3288-rkisp1",
- .data = &rk3288_isp_clk_data,
+ .data = &rk3288_isp_match_data,
+ }, {
+ .compatible = "rockchip,rk3326-rkisp1",
+ .data = &rk3326_isp_match_data,
}, {
.compatible = "rockchip,rk3399-rkisp1",
- .data = &rk3399_isp_clk_data,
+ .data = &rk3399_isp_match_data,
},
{},
};
@@ -565,7 +584,7 @@ static int rkisp1_plat_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct v4l2_device *v4l2_dev;
struct rkisp1_device *isp_dev;
- const struct isp_match_data *clk_data;
+ const struct isp_match_data *match_data;
struct resource *res;
int i, ret, irq;
@@ -595,17 +614,18 @@ static int rkisp1_plat_probe(struct platform_device *pdev)
}
isp_dev->irq = irq;
- clk_data = match->data;
- for (i = 0; i < clk_data->size; i++) {
- struct clk *clk = devm_clk_get(dev, clk_data->clks[i]);
+ match_data = match->data;
+ for (i = 0; i < match_data->size; i++) {
+ struct clk *clk = devm_clk_get(dev, match_data->clks[i]);
if (IS_ERR(clk)) {
- dev_err(dev, "failed to get %s\n", clk_data->clks[i]);
+ dev_err(dev, "failed to get %s\n", match_data->clks[i]);
return PTR_ERR(clk);
}
isp_dev->clks[i] = clk;
}
- isp_dev->clk_size = clk_data->size;
+ isp_dev->clk_size = match_data->size;
+ isp_dev->isp_ver = match_data->isp_ver;
atomic_set(&isp_dev->pipe.power_cnt, 0);
atomic_set(&isp_dev->pipe.stream_cnt, 0);
diff --git a/drivers/media/platform/rockchip/isp1/dev.h b/drivers/media/platform/rockchip/isp1/dev.h
index c10de49356ff..9f3b0fff2978 100644
--- a/drivers/media/platform/rockchip/isp1/dev.h
+++ b/drivers/media/platform/rockchip/isp1/dev.h
@@ -56,6 +56,12 @@
#define RKISP1_MAX_SENSOR 2
#define RKISP1_MAX_PIPELINE 4
+enum rkisp1_isp_ver {
+ ISP_V10 = 0,
+ ISP_V11,
+ ISP_V12
+};
+
/*
* struct rkisp1_pipeline - An ISP hardware pipeline
*
@@ -116,6 +122,7 @@ struct rkisp1_device {
struct rkisp1_pipeline pipe;
struct vb2_alloc_ctx *alloc_ctx;
struct iommu_domain *domain;
+ enum rkisp1_isp_ver isp_ver;
};
#endif
diff --git a/drivers/media/platform/rockchip/isp1/regs.h b/drivers/media/platform/rockchip/isp1/regs.h
index 7e15fc7bec8d..f0dd59ed20ef 100644
--- a/drivers/media/platform/rockchip/isp1/regs.h
+++ b/drivers/media/platform/rockchip/isp1/regs.h
@@ -1290,6 +1290,9 @@
#define CIF_ISP_VSM_DELTA_H (CIF_ISP_VSM_BASE + 0x0000001C)
#define CIF_ISP_VSM_DELTA_V (CIF_ISP_VSM_BASE + 0x00000020)
+#define CIF_ISP_CSI0_BASE 0x00007000
+#define CIF_ISP_CSI0_CTRL0 (CIF_ISP_CSI0_BASE + 0x00000000)
+
void disable_dcrop(struct rkisp1_stream *stream, bool async);
void config_dcrop(struct rkisp1_stream *stream, struct v4l2_rect *rect,
bool async);
diff --git a/drivers/media/platform/rockchip/isp1/rkisp1.c b/drivers/media/platform/rockchip/isp1/rkisp1.c
index 30f273b184a5..0438d6ddba91 100644
--- a/drivers/media/platform/rockchip/isp1/rkisp1.c
+++ b/drivers/media/platform/rockchip/isp1/rkisp1.c
@@ -302,6 +302,8 @@ static int rkisp1_config_mipi(struct rkisp1_device *dev)
CIF_MIPI_CTRL_CLOCKLANE_ENA;
writel(mipi_ctrl, base + CIF_MIPI_CTRL);
+ if (dev->isp_ver == ISP_V12)
+ writel(0, base + CIF_ISP_CSI0_CTRL0);
/* Configure Data Type and Virtual Channel */
writel(CIF_MIPI_DATA_SEL_DT(in_fmt->mipi_dt) | CIF_MIPI_DATA_SEL_VC(0),