diff options
author | Guoniu.zhou <guoniu.zhou@nxp.com> | 2020-11-20 19:14:35 +0800 |
---|---|---|
committer | Guoniu.zhou <guoniu.zhou@nxp.com> | 2020-11-21 16:21:05 +0800 |
commit | ca8e7409c7f5377a35a0d208b6ee2362098c1054 (patch) | |
tree | 8d76e0bb18cd9a0b426c46ec90c17abef7c7b57f | |
parent | 4c9ea7ca0a22b18e358856a460fa48f0e744b956 (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.c | 4 | ||||
-rw-r--r-- | drivers/staging/media/imx/imx8-isi-core.h | 2 | ||||
-rw-r--r-- | drivers/staging/media/imx/imx8-isi-hw.c | 9 |
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); |