2019-06-04 10:16:09

by Stu Hsieh

[permalink] [raw]
Subject: [PATCH v4 00/14] Add mediatek mipicsi driver for Mediatek SOC MT2712

Add mediatek mipicsi driver for Mediatek SOC MT2712

Change in v4:
- remove soc_camera framework dependence in v3
- add some error handle and of_node_put() in patch
"[media] mtk-mipicsi: add mediatek mipicsi driver for mt2712"
- remove some useless variable

Stu Hsieh (14):
dt-bindings: Add binding for MT2712 MIPI-CSI2
dt-bindings: media: Add mipicsi common node binding for MT2712
MIPI-CSI2
dt-bindings: media: Add camsv binding for MT2712 MIPI-CSI2
[media] mtk-mipicsi: add mediatek mipicsi driver for mt2712
[media] mtk-mipicsi: register the v4l2 device for mt2712 mipicsi
[media] mtk-mipicsi: enable/disable ana clk
[media] mtk-mipicsi: add function to get the number of subdev link
[media] mtk-mipicsi: enable/disable cmos for mt2712
[media] mtk-mipicsi: add ISR for writing the data to buffer
[media] mtk-mipicsi: set the output address in HW reg
[media] mtk-mipicsi: add function to get the format
[media] mtk-mipicsi: add debug message for mipicsi driver
[media] mtk-mipicsi: add debugfs for mipicsi driver
[media] mtk-mipicsi: add function to support SerDes for link number

.../bindings/media/mediatek-mipicsi-camsv.txt | 55 +
.../media/mediatek-mipicsi-common.txt | 19 +
.../bindings/media/mediatek-mipicsi.txt | 58 +
drivers/media/platform/mtk-mipicsi/Makefile | 4 +
.../media/platform/mtk-mipicsi/mtk_mipicsi.c | 1734 +++++++++++++++++
5 files changed, 1870 insertions(+)
create mode 100644 Documentation/devicetree/bindings/media/mediatek-mipicsi-camsv.txt
create mode 100644 Documentation/devicetree/bindings/media/mediatek-mipicsi-common.txt
create mode 100644 Documentation/devicetree/bindings/media/mediatek-mipicsi.txt
create mode 100644 drivers/media/platform/mtk-mipicsi/Makefile
create mode 100644 drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c

--
2.18.0


2019-06-04 10:16:14

by Stu Hsieh

[permalink] [raw]
Subject: [PATCH v4 12/14] [media] mtk-mipicsi: add debug message for mipicsi driver

This patch add debug message for mipicsi driver.

Signed-off-by: Stu Hsieh <[email protected]>
---
.../media/platform/mtk-mipicsi/mtk_mipicsi.c | 40 ++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
index aaaea5c6f280..b291c95bbf0e 100644
--- a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
+++ b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
@@ -25,6 +25,7 @@
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/moduleparam.h>
+#include <linux/time64.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
@@ -109,6 +110,15 @@

#define notifier_to_mipicsi(n) container_of(n, struct mtk_mipicsi_dev, \
notifier)
+static int mtk_mipicsi_dbg_level;
+#define mtk_mipicsi_dbg(level, fmt, args...) \
+ do { \
+ if (mtk_mipicsi_dbg_level >= level) \
+ pr_info("[MTK_MIPICSI%d] L%d %s %d: " fmt "\n", \
+ mipicsi->id, level, __func__, __LINE__, \
+ ##args); \
+ } while (0)
+
/* buffer for one video frame */
struct mtk_mipicsi_buf {
struct list_head queue;
@@ -168,6 +178,8 @@ struct mtk_mipicsi_dev {
u8 link_reg_val;
char drv_name[16];
u32 id;
+ struct timespec64 fps_time_cur;
+ struct timespec64 fps_time_pre;

spinlock_t irqlock;
spinlock_t queue_lock;
@@ -535,6 +547,11 @@ static int mtk_mipicsi_vb2_prepare(struct vb2_buffer *vb)
buf->prepare_flag = 1;
buf->vb_dma_addr_phy =
vb2_dma_contig_plane_dma_addr(vb, 0);
+
+ mtk_mipicsi_dbg(1, "vb_dma_addr_phy=%lx size=%d",
+ (unsigned long)buf->vb_dma_addr_phy,
+ vb->planes[0].bytesused);
+
buf->vb = vb;
}

@@ -581,6 +598,8 @@ static void mtk_mipicsi_vb2_queue(struct vb2_buffer *vb)
mtk_mipicsi_write_camsv(mipicsi, vb->index, mipicsi->camsv_num);

spin_unlock(&mipicsi->irqlock);
+
+ mtk_mipicsi_dbg(2, "enqueue NO.%d buffer(%p).", vb->index, vb);
}

static void mtk_mipicsi_cmos_vf_enable(struct mtk_mipicsi_dev *mipicsi,
@@ -888,6 +907,7 @@ static void mtk_mipicsi_irq_buf_process(struct mtk_mipicsi_dev *mipicsi)
struct mtk_mipicsi_buf *tmp = NULL;
unsigned int index = 0;
unsigned int next = 0;
+ long time_interval;

for (i = 0; i < mipicsi->camsv_num; ++i)
ch[i].irq_status = false;
@@ -895,8 +915,10 @@ static void mtk_mipicsi_irq_buf_process(struct mtk_mipicsi_dev *mipicsi)
i = 0;

/* only one buffer left */
- if ((&(mipicsi->fb_list))->next->next == &(mipicsi->fb_list))
+ if ((&(mipicsi->fb_list))->next->next == &(mipicsi->fb_list)) {
+ mtk_mipicsi_dbg(1, "only 1 buffer left, drop frame");
return;
+ }

/*for each fb_lst 2 times to get the top 2 buffer.*/
list_for_each_entry_safe(new_cam_buf, tmp,
@@ -920,6 +942,21 @@ static void mtk_mipicsi_irq_buf_process(struct mtk_mipicsi_dev *mipicsi)
VB2_BUF_STATE_DONE);

list_del_init(&(mipicsi->cam_buf[index].queue));
+
+ if (mtk_mipicsi_dbg_level >= 2) {
+ ktime_get_real_ts64(&(mipicsi->fps_time_cur));
+
+ time_interval = (mipicsi->fps_time_cur.tv_sec
+ - mipicsi->fps_time_pre.tv_sec) * 1000000000
+ + (mipicsi->fps_time_cur.tv_nsec
+ - mipicsi->fps_time_pre.tv_nsec);
+ mtk_mipicsi_dbg(0, "time interval is %ld\n",
+ time_interval);
+ mipicsi->fps_time_pre.tv_sec =
+ mipicsi->fps_time_cur.tv_sec;
+ mipicsi->fps_time_pre.tv_nsec =
+ mipicsi->fps_time_cur.tv_nsec;
+ }
}

static irqreturn_t mtk_mipicsi_isr(int irq, void *data)
@@ -1575,5 +1612,6 @@ static struct platform_driver mtk_mipicsi_driver = {
};

module_platform_driver(mtk_mipicsi_driver);
+module_param(mtk_mipicsi_dbg_level, int, 0644);
MODULE_DESCRIPTION("MediaTek SoC Camera Host driver");
MODULE_LICENSE("GPL v2");
--
2.18.0

2019-06-04 10:16:29

by Stu Hsieh

[permalink] [raw]
Subject: [PATCH v4 08/14] [media] mtk-mipicsi: enable/disable cmos for mt2712

This patch enable/disable cmos setting for mt2712 when
streaming start/stop streaming.

Signed-off-by: Stu Hsieh <[email protected]>
---
.../media/platform/mtk-mipicsi/mtk_mipicsi.c | 34 +++++++++++++++++++
1 file changed, 34 insertions(+)

diff --git a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
index ea1edbc6401b..8bb40656bcb1 100644
--- a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
+++ b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c
@@ -88,9 +88,11 @@
#define CAMSV_MODULE_EN 0x10
#define CAMSV_FMT_SEL 0x14
#define CAMSV_INT_EN 0x18
+#define CAMSV_SW_CTL 0x20
#define CAMSV_CLK_EN 0x30

#define CAMSV_TG_SEN_MODE 0x500
+#define CAMSV_TG_VF_CON 0x504
#define CAMSV_TG_SEN_GRAB_PXL 0x508
#define CAMSV_TG_SEN_GRAB_LIN 0x50C
#define CAMSV_TG_PATH_CFG 0x510
@@ -541,11 +543,41 @@ static void mtk_mipicsi_vb2_queue(struct vb2_buffer *vb)
spin_unlock(&mipicsi->queue_lock);
}

+static void mtk_mipicsi_cmos_vf_enable(struct mtk_mipicsi_dev *mipicsi,
+ unsigned int max_camsv_num,
+ bool enable)
+{
+ void __iomem *base = NULL;
+ u32 mask = enable ? (u32)1 : ~(u32)1;
+ int i;
+
+ for (i = 0; i < max_camsv_num; i++)
+ if (((mipicsi->link_reg_val >> i) & 0x01U) == 0x01U) {
+ if (enable) {
+ /*enable cmos_en and vf_en*/
+ base = mipicsi->camsv[i];
+ writel(readl(base + CAMSV_TG_SEN_MODE) | mask,
+ base + CAMSV_TG_SEN_MODE);
+ writel(readl(base + CAMSV_TG_VF_CON) | mask,
+ base + CAMSV_TG_VF_CON);
+ } else {
+ /*disable cmos_en and vf_en*/
+ base = mipicsi->camsv[i];
+ writel(readl(base + CAMSV_TG_SEN_MODE) & mask,
+ base + CAMSV_TG_SEN_MODE);
+ writel(readl(base + CAMSV_TG_VF_CON) & mask,
+ base + CAMSV_TG_VF_CON);
+ }
+ }
+}
+
static int mtk_mipicsi_vb2_start_streaming(struct vb2_queue *vq,
unsigned int count)
{
struct mtk_mipicsi_dev *mipicsi = vb2_get_drv_priv(vq);

+ mtk_mipicsi_cmos_vf_enable(mipicsi, mipicsi->camsv_num, true);
+
mipicsi->streamon = true;

return 0;
@@ -558,6 +590,8 @@ static void mtk_mipicsi_vb2_stop_streaming(struct vb2_queue *vq)
struct mtk_mipicsi_buf *tmp = NULL;
unsigned int index = 0;

+ mtk_mipicsi_cmos_vf_enable(mipicsi, mipicsi->camsv_num, false);
+
spin_lock(&mipicsi->queue_lock);
while (list_empty(&(mipicsi->fb_list)) == 0) {
list_for_each_entry_safe(buf, tmp, &(mipicsi->fb_list), queue) {
--
2.18.0