summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuoniu.zhou <guoniu.zhou@nxp.com>2020-11-20 19:14:35 +0800
committerGuoniu.zhou <guoniu.zhou@nxp.com>2020-11-21 16:21:05 +0800
commitca8e7409c7f5377a35a0d208b6ee2362098c1054 (patch)
tree8d76e0bb18cd9a0b426c46ec90c17abef7c7b57f
parent4c9ea7ca0a22b18e358856a460fa48f0e744b956 (diff)
MLK-25027-2: media: isi: add workaround for iMX865 ISI to support 4K
Add workaround for iMX865 ISI to support 4K because for the ISI line buffer management, the other chips used a single clock for all the memories, where as in iMX865, each channel has the corresponding clock which is used, so need to enable channel1 clock when channel0 chain buffer enabled. Signed-off-by: Guoniu.zhou <guoniu.zhou@nxp.com> Reviewed-by: Robby Cai <robby.cai@nxp.com>
-rw-r--r--drivers/staging/media/imx/imx8-isi-core.c4
-rw-r--r--drivers/staging/media/imx/imx8-isi-core.h2
-rw-r--r--drivers/staging/media/imx/imx8-isi-hw.c9
3 files changed, 14 insertions, 1 deletions
diff --git a/drivers/staging/media/imx/imx8-isi-core.c b/drivers/staging/media/imx/imx8-isi-core.c
index 6f9599d18965..1acc530b4ba3 100644
--- a/drivers/staging/media/imx/imx8-isi-core.c
+++ b/drivers/staging/media/imx/imx8-isi-core.c
@@ -466,6 +466,10 @@ static int mxc_isi_probe(struct platform_device *pdev)
return -EINVAL;
}
+ mxc_isi->chain = syscon_regmap_lookup_by_phandle(dev->of_node, "isi_chain");
+ if (IS_ERR(mxc_isi->chain))
+ mxc_isi->chain = NULL;
+
spin_lock_init(&mxc_isi->slock);
mutex_init(&mxc_isi->lock);
atomic_set(&mxc_isi->usage_count, 0);
diff --git a/drivers/staging/media/imx/imx8-isi-core.h b/drivers/staging/media/imx/imx8-isi-core.h
index dbf9242873c2..c955ec21c8d8 100644
--- a/drivers/staging/media/imx/imx8-isi-core.h
+++ b/drivers/staging/media/imx/imx8-isi-core.h
@@ -344,6 +344,8 @@ struct mxc_isi_dev {
struct reset_control *soft_resetn;
struct reset_control *clk_enable;
+ struct regmap *chain;
+
struct mutex lock;
spinlock_t slock;
diff --git a/drivers/staging/media/imx/imx8-isi-hw.c b/drivers/staging/media/imx/imx8-isi-hw.c
index 10732ec2280b..7b6c7f954c97 100644
--- a/drivers/staging/media/imx/imx8-isi-hw.c
+++ b/drivers/staging/media/imx/imx8-isi-hw.c
@@ -151,10 +151,14 @@ static void chain_buf(struct mxc_isi_dev *mxc_isi, struct mxc_isi_frame *frm)
val &= ~CHNL_CTRL_CHAIN_BUF_MASK;
val |= (CHNL_CTRL_CHAIN_BUF_2_CHAIN << CHNL_CTRL_CHAIN_BUF_OFFSET);
writel(val, mxc_isi->regs + CHNL_CTRL);
- } else if (!mxc_isi->chain_buf) {
+ if (mxc_isi->chain)
+ regmap_write(mxc_isi->chain, CHNL_CTRL, CHNL_CTRL_CLK_EN_MASK);
+ mxc_isi->chain_buf = 1;
+ } else {
val = readl(mxc_isi->regs + CHNL_CTRL);
val &= ~CHNL_CTRL_CHAIN_BUF_MASK;
writel(val, mxc_isi->regs + CHNL_CTRL);
+ mxc_isi->chain_buf = 0;
}
}
@@ -628,6 +632,9 @@ void mxc_isi_channel_deinit(struct mxc_isi_dev *mxc_isi)
/* deinit channel clk first */
val = (CHNL_CTRL_CLK_EN_DISABLE << CHNL_CTRL_CLK_EN_OFFSET);
writel(val, mxc_isi->regs + CHNL_CTRL);
+
+ if (mxc_isi->chain_buf && mxc_isi->chain)
+ regmap_write(mxc_isi->chain, CHNL_CTRL, 0x0);
}
EXPORT_SYMBOL_GPL(mxc_isi_channel_deinit);