From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753868AbcIBL0T (ORCPT ); Fri, 2 Sep 2016 07:26:19 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:42438 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752684AbcIBL0O (ORCPT ); Fri, 2 Sep 2016 07:26:14 -0400 From: YT Shen To: , Philipp Zabel CC: David Airlie , Matthias Brugger , YT Shen , Daniel Kurtz , Mao Huang , CK Hu , Bibby Hsieh , Daniel Vetter , Thierry Reding , Jie Qiu , Maxime Ripard , Chris Wilson , shaoming chen , Jitao Shi , Boris Brezillon , Dan Carpenter , , , , , Sascha Hauer , , Subject: [PATCH v7 6/9] drm/mediatek: add dsi interrupt control Date: Fri, 2 Sep 2016 19:24:41 +0800 Message-ID: <1472815484-43821-7-git-send-email-yt.shen@mediatek.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> References: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: shaoming chen add dsi interrupt control Signed-off-by: shaoming chen --- drivers/gpu/drm/mediatek/mtk_dsi.c | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c index 4efeb38..d20f6f9 100644 --- a/drivers/gpu/drm/mediatek/mtk_dsi.c +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,17 @@ #define DSI_START 0x00 +#define DSI_INTEN 0x08 + +#define DSI_INTSTA 0x0c +#define LPRX_RD_RDY_INT_FLAG BIT(0) +#define CMD_DONE_INT_FLAG BIT(1) +#define TE_RDY_INT_FLAG BIT(2) +#define VM_DONE_INT_FLAG BIT(3) +#define EXT_TE_RDY_INT_FLAG BIT(4) +#define DSI_INT_ALL_BITS 0x1f +#define DSI_BUSY BIT(31) + #define DSI_CON_CTRL 0x10 #define DSI_RESET BIT(0) #define DSI_EN BIT(1) @@ -71,6 +83,9 @@ #define DSI_HSTX_CKL_WC 0x64 +#define DSI_RACK 0x84 +#define RACK BIT(0) + #define DSI_PHY_LCCON 0x104 #define LC_HS_TX_EN BIT(0) #define LC_ULPM_EN BIT(1) @@ -131,8 +146,11 @@ struct mtk_dsi { struct videomode vm; int refcount; bool enabled; + u32 irq_data; }; +static wait_queue_head_t _dsi_irq_wait_queue; + static inline struct mtk_dsi *encoder_to_dsi(struct drm_encoder *e) { return container_of(e, struct mtk_dsi, encoder); @@ -437,6 +455,43 @@ static void mtk_dsi_start(struct mtk_dsi *dsi) writel(1, dsi->regs + DSI_START); } +static void mtk_dsi_set_interrupt_enable(struct mtk_dsi *dsi) +{ + u32 inten = DSI_INT_ALL_BITS; + + if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) + inten &= ~(TE_RDY_INT_FLAG | EXT_TE_RDY_INT_FLAG); + + writel(inten, dsi->regs + DSI_INTEN); +} + +static void mtk_dsi_irq_data_set(struct mtk_dsi *dsi, u32 irq_bit) +{ + dsi->irq_data |= irq_bit; +} + +static irqreturn_t mtk_dsi_irq(int irq, void *dev_id) +{ + struct mtk_dsi *dsi = dev_id; + u32 status, tmp; + u32 flag = LPRX_RD_RDY_INT_FLAG | CMD_DONE_INT_FLAG | VM_DONE_INT_FLAG; + + status = readl(dsi->regs + DSI_INTSTA); + + if (status & flag) { + do { + mtk_dsi_mask(dsi, DSI_RACK, RACK, RACK); + tmp = readl(dsi->regs + DSI_INTSTA); + } while (tmp & DSI_BUSY); + + mtk_dsi_mask(dsi, DSI_INTSTA, status & flag, 0); + mtk_dsi_irq_data_set(dsi, status & flag); + wake_up_interruptible(&_dsi_irq_wait_queue); + } + + return IRQ_HANDLED; +} + static void mtk_dsi_poweroff(struct mtk_dsi *dsi) { if (WARN_ON(dsi->refcount == 0)) @@ -485,6 +540,7 @@ static void mtk_output_dsi_enable(struct mtk_dsi *dsi) mtk_dsi_ps_control_vact(dsi); mtk_dsi_config_vdo_timing(dsi); + mtk_dsi_set_interrupt_enable(dsi); mtk_dsi_set_mode(dsi); mtk_dsi_clk_hs_mode(dsi, 1); @@ -793,6 +849,7 @@ static int mtk_dsi_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct device_node *remote_node, *endpoint; struct resource *regs; + int irq_num; int comp_id; int ret; @@ -869,8 +926,27 @@ static int mtk_dsi_probe(struct platform_device *pdev) return ret; } + irq_num = platform_get_irq(pdev, 0); + if (irq_num < 0) { + dev_err(&pdev->dev, "failed to request dsi irq resource\n"); + return -EPROBE_DEFER; + } + + irq_set_status_flags(irq_num, IRQ_TYPE_LEVEL_LOW); + ret = devm_request_irq(&pdev->dev, irq_num, mtk_dsi_irq, + IRQF_TRIGGER_LOW, dev_name(&pdev->dev), dsi); + if (ret) { + dev_err(&pdev->dev, "failed to request mediatek dsi irq\n"); + return -EPROBE_DEFER; + } + + dsi->irq_data = 0; + dev_info(dev, "dsi irq num is 0x%x\n", irq_num); + platform_set_drvdata(pdev, dsi); + init_waitqueue_head(&_dsi_irq_wait_queue); + return component_add(&pdev->dev, &mtk_dsi_component_ops); } -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: YT Shen Subject: [PATCH v7 6/9] drm/mediatek: add dsi interrupt control Date: Fri, 2 Sep 2016 19:24:41 +0800 Message-ID: <1472815484-43821-7-git-send-email-yt.shen@mediatek.com> References: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, Philipp Zabel Cc: Daniel Vetter , Jie Qiu , Mao Huang , yingjoe.chen@mediatek.com, Dan Carpenter , Jitao Shi , linux-mediatek@lists.infradead.org, Matthias Brugger , shaoming chen , linux-arm-kernel@lists.infradead.org, srv_heupstream@mediatek.com, emil.l.velikov@gmail.com, linux-kernel@vger.kernel.org, Sascha Hauer , Maxime Ripard List-Id: linux-mediatek@lists.infradead.org RnJvbTogc2hhb21pbmcgY2hlbiA8c2hhb21pbmcuY2hlbkBtZWRpYXRlay5jb20+CgphZGQgZHNp IGludGVycnVwdCBjb250cm9sCgpTaWduZWQtb2ZmLWJ5OiBzaGFvbWluZyBjaGVuIDxzaGFvbWlu Zy5jaGVuQG1lZGlhdGVrLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Rz aS5jIHwgNzYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBj aGFuZ2VkLCA3NiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21l ZGlhdGVrL210a19kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHNpLmMKaW5k ZXggNGVmZWIzOC4uZDIwZjZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVr L210a19kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RzaS5jCkBAIC0x OCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgogI2luY2x1ZGUgPGxpbnV4 L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2ly cS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0u aD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncmFwaC5oPgpAQCAtMjksNiArMzAsMTcgQEAKIAogI2Rl ZmluZSBEU0lfU1RBUlQJCTB4MDAKIAorI2RlZmluZSBEU0lfSU5URU4JCTB4MDgKKworI2RlZmlu ZSBEU0lfSU5UU1RBCQkweDBjCisjZGVmaW5lIExQUlhfUkRfUkRZX0lOVF9GTEFHCQlCSVQoMCkK KyNkZWZpbmUgQ01EX0RPTkVfSU5UX0ZMQUcJCUJJVCgxKQorI2RlZmluZSBURV9SRFlfSU5UX0ZM QUcJCQlCSVQoMikKKyNkZWZpbmUgVk1fRE9ORV9JTlRfRkxBRwkJQklUKDMpCisjZGVmaW5lIEVY VF9URV9SRFlfSU5UX0ZMQUcJCUJJVCg0KQorI2RlZmluZSBEU0lfSU5UX0FMTF9CSVRTCQkweDFm CisjZGVmaW5lIERTSV9CVVNZCQkJQklUKDMxKQorCiAjZGVmaW5lIERTSV9DT05fQ1RSTAkJMHgx MAogI2RlZmluZSBEU0lfUkVTRVQJCQlCSVQoMCkKICNkZWZpbmUgRFNJX0VOCQkJCUJJVCgxKQpA QCAtNzEsNiArODMsOSBAQAogCiAjZGVmaW5lIERTSV9IU1RYX0NLTF9XQwkJMHg2NAogCisjZGVm aW5lIERTSV9SQUNLCQkweDg0CisjZGVmaW5lIFJBQ0sJCQkJQklUKDApCisKICNkZWZpbmUgRFNJ X1BIWV9MQ0NPTgkJMHgxMDQKICNkZWZpbmUgTENfSFNfVFhfRU4JCQlCSVQoMCkKICNkZWZpbmUg TENfVUxQTV9FTgkJCUJJVCgxKQpAQCAtMTMxLDggKzE0NiwxMSBAQCBzdHJ1Y3QgbXRrX2RzaSB7 CiAJc3RydWN0IHZpZGVvbW9kZSB2bTsKIAlpbnQgcmVmY291bnQ7CiAJYm9vbCBlbmFibGVkOwor CXUzMiBpcnFfZGF0YTsKIH07CiAKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBfZHNpX2lycV93 YWl0X3F1ZXVlOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfZHNpICplbmNvZGVyX3RvX2Rz aShzdHJ1Y3QgZHJtX2VuY29kZXIgKmUpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihlLCBzdHJ1 Y3QgbXRrX2RzaSwgZW5jb2Rlcik7CkBAIC00MzcsNiArNDU1LDQzIEBAIHN0YXRpYyB2b2lkIG10 a19kc2lfc3RhcnQoc3RydWN0IG10a19kc2kgKmRzaSkKIAl3cml0ZWwoMSwgZHNpLT5yZWdzICsg RFNJX1NUQVJUKTsKIH0KIAorc3RhdGljIHZvaWQgbXRrX2RzaV9zZXRfaW50ZXJydXB0X2VuYWJs ZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQoreworCXUzMiBpbnRlbiA9IERTSV9JTlRfQUxMX0JJVFM7 CisKKwlpZiAoZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykKKwkJaW50ZW4g Jj0gfihURV9SRFlfSU5UX0ZMQUcgfCBFWFRfVEVfUkRZX0lOVF9GTEFHKTsKKworCXdyaXRlbChp bnRlbiwgZHNpLT5yZWdzICsgRFNJX0lOVEVOKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RzaV9p cnFfZGF0YV9zZXQoc3RydWN0IG10a19kc2kgKmRzaSwgdTMyIGlycV9iaXQpCit7CisJZHNpLT5p cnFfZGF0YSB8PSBpcnFfYml0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXRrX2RzaV9pcnEo aW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBkZXZfaWQ7 CisJdTMyIHN0YXR1cywgdG1wOworCXUzMiBmbGFnID0gTFBSWF9SRF9SRFlfSU5UX0ZMQUcgfCBD TURfRE9ORV9JTlRfRkxBRyB8IFZNX0RPTkVfSU5UX0ZMQUc7CisKKwlzdGF0dXMgPSByZWFkbChk c2ktPnJlZ3MgKyBEU0lfSU5UU1RBKTsKKworCWlmIChzdGF0dXMgJiBmbGFnKSB7CisJCWRvIHsK KwkJCW10a19kc2lfbWFzayhkc2ksIERTSV9SQUNLLCBSQUNLLCBSQUNLKTsKKwkJCXRtcCA9IHJl YWRsKGRzaS0+cmVncyArIERTSV9JTlRTVEEpOworCQl9IHdoaWxlICh0bXAgJiBEU0lfQlVTWSk7 CisKKwkJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX0lOVFNUQSwgc3RhdHVzICYgZmxhZywgMCk7CisJ CW10a19kc2lfaXJxX2RhdGFfc2V0KGRzaSwgc3RhdHVzICYgZmxhZyk7CisJCXdha2VfdXBfaW50 ZXJydXB0aWJsZSgmX2RzaV9pcnFfd2FpdF9xdWV1ZSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCiBzdGF0aWMgdm9pZCBtdGtfZHNpX3Bvd2Vyb2ZmKHN0cnVjdCBtdGtfZHNpICpk c2kpCiB7CiAJaWYgKFdBUk5fT04oZHNpLT5yZWZjb3VudCA9PSAwKSkKQEAgLTQ4NSw2ICs1NDAs NyBAQCBzdGF0aWMgdm9pZCBtdGtfb3V0cHV0X2RzaV9lbmFibGUoc3RydWN0IG10a19kc2kgKmRz aSkKIAogCW10a19kc2lfcHNfY29udHJvbF92YWN0KGRzaSk7CiAJbXRrX2RzaV9jb25maWdfdmRv X3RpbWluZyhkc2kpOworCW10a19kc2lfc2V0X2ludGVycnVwdF9lbmFibGUoZHNpKTsKIAogCW10 a19kc2lfc2V0X21vZGUoZHNpKTsKIAltdGtfZHNpX2Nsa19oc19tb2RlKGRzaSwgMSk7CkBAIC03 OTMsNiArODQ5LDcgQEAgc3RhdGljIGludCBtdGtfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKnJlbW90ZV9ub2RlLCAqZW5kcG9pbnQ7CiAJc3RydWN0IHJlc291cmNlICpy ZWdzOworCWludCBpcnFfbnVtOwogCWludCBjb21wX2lkOwogCWludCByZXQ7CiAKQEAgLTg2OSw4 ICs5MjYsMjcgQEAgc3RhdGljIGludCBtdGtfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCiAJCXJldHVybiByZXQ7CiAJfQogCisJaXJxX251bSA9IHBsYXRmb3JtX2dldF9p cnEocGRldiwgMCk7CisJaWYgKGlycV9udW0gPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwg ImZhaWxlZCB0byByZXF1ZXN0IGRzaSBpcnEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVQUk9C RV9ERUZFUjsKKwl9CisKKwlpcnFfc2V0X3N0YXR1c19mbGFncyhpcnFfbnVtLCBJUlFfVFlQRV9M RVZFTF9MT1cpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxX251bSwg bXRrX2RzaV9pcnEsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX0xPVywgZGV2X25hbWUoJnBkZXYt PmRldiksIGRzaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQg dG8gcmVxdWVzdCBtZWRpYXRlayBkc2kgaXJxXG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7 CisJfQorCisJZHNpLT5pcnFfZGF0YSA9IDA7CisJZGV2X2luZm8oZGV2LCAiZHNpIGlycSBudW0g aXMgMHgleFxuIiwgaXJxX251bSk7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkc2kp OwogCisJaW5pdF93YWl0cXVldWVfaGVhZCgmX2RzaV9pcnFfd2FpdF9xdWV1ZSk7CisKIAlyZXR1 cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmbXRrX2RzaV9jb21wb25lbnRfb3BzKTsKIH0K IAotLSAKMS45LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: yt.shen@mediatek.com (YT Shen) Date: Fri, 2 Sep 2016 19:24:41 +0800 Subject: [PATCH v7 6/9] drm/mediatek: add dsi interrupt control In-Reply-To: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> References: <1472815484-43821-1-git-send-email-yt.shen@mediatek.com> Message-ID: <1472815484-43821-7-git-send-email-yt.shen@mediatek.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: shaoming chen add dsi interrupt control Signed-off-by: shaoming chen --- drivers/gpu/drm/mediatek/mtk_dsi.c | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c index 4efeb38..d20f6f9 100644 --- a/drivers/gpu/drm/mediatek/mtk_dsi.c +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -29,6 +30,17 @@ #define DSI_START 0x00 +#define DSI_INTEN 0x08 + +#define DSI_INTSTA 0x0c +#define LPRX_RD_RDY_INT_FLAG BIT(0) +#define CMD_DONE_INT_FLAG BIT(1) +#define TE_RDY_INT_FLAG BIT(2) +#define VM_DONE_INT_FLAG BIT(3) +#define EXT_TE_RDY_INT_FLAG BIT(4) +#define DSI_INT_ALL_BITS 0x1f +#define DSI_BUSY BIT(31) + #define DSI_CON_CTRL 0x10 #define DSI_RESET BIT(0) #define DSI_EN BIT(1) @@ -71,6 +83,9 @@ #define DSI_HSTX_CKL_WC 0x64 +#define DSI_RACK 0x84 +#define RACK BIT(0) + #define DSI_PHY_LCCON 0x104 #define LC_HS_TX_EN BIT(0) #define LC_ULPM_EN BIT(1) @@ -131,8 +146,11 @@ struct mtk_dsi { struct videomode vm; int refcount; bool enabled; + u32 irq_data; }; +static wait_queue_head_t _dsi_irq_wait_queue; + static inline struct mtk_dsi *encoder_to_dsi(struct drm_encoder *e) { return container_of(e, struct mtk_dsi, encoder); @@ -437,6 +455,43 @@ static void mtk_dsi_start(struct mtk_dsi *dsi) writel(1, dsi->regs + DSI_START); } +static void mtk_dsi_set_interrupt_enable(struct mtk_dsi *dsi) +{ + u32 inten = DSI_INT_ALL_BITS; + + if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) + inten &= ~(TE_RDY_INT_FLAG | EXT_TE_RDY_INT_FLAG); + + writel(inten, dsi->regs + DSI_INTEN); +} + +static void mtk_dsi_irq_data_set(struct mtk_dsi *dsi, u32 irq_bit) +{ + dsi->irq_data |= irq_bit; +} + +static irqreturn_t mtk_dsi_irq(int irq, void *dev_id) +{ + struct mtk_dsi *dsi = dev_id; + u32 status, tmp; + u32 flag = LPRX_RD_RDY_INT_FLAG | CMD_DONE_INT_FLAG | VM_DONE_INT_FLAG; + + status = readl(dsi->regs + DSI_INTSTA); + + if (status & flag) { + do { + mtk_dsi_mask(dsi, DSI_RACK, RACK, RACK); + tmp = readl(dsi->regs + DSI_INTSTA); + } while (tmp & DSI_BUSY); + + mtk_dsi_mask(dsi, DSI_INTSTA, status & flag, 0); + mtk_dsi_irq_data_set(dsi, status & flag); + wake_up_interruptible(&_dsi_irq_wait_queue); + } + + return IRQ_HANDLED; +} + static void mtk_dsi_poweroff(struct mtk_dsi *dsi) { if (WARN_ON(dsi->refcount == 0)) @@ -485,6 +540,7 @@ static void mtk_output_dsi_enable(struct mtk_dsi *dsi) mtk_dsi_ps_control_vact(dsi); mtk_dsi_config_vdo_timing(dsi); + mtk_dsi_set_interrupt_enable(dsi); mtk_dsi_set_mode(dsi); mtk_dsi_clk_hs_mode(dsi, 1); @@ -793,6 +849,7 @@ static int mtk_dsi_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct device_node *remote_node, *endpoint; struct resource *regs; + int irq_num; int comp_id; int ret; @@ -869,8 +926,27 @@ static int mtk_dsi_probe(struct platform_device *pdev) return ret; } + irq_num = platform_get_irq(pdev, 0); + if (irq_num < 0) { + dev_err(&pdev->dev, "failed to request dsi irq resource\n"); + return -EPROBE_DEFER; + } + + irq_set_status_flags(irq_num, IRQ_TYPE_LEVEL_LOW); + ret = devm_request_irq(&pdev->dev, irq_num, mtk_dsi_irq, + IRQF_TRIGGER_LOW, dev_name(&pdev->dev), dsi); + if (ret) { + dev_err(&pdev->dev, "failed to request mediatek dsi irq\n"); + return -EPROBE_DEFER; + } + + dsi->irq_data = 0; + dev_info(dev, "dsi irq num is 0x%x\n", irq_num); + platform_set_drvdata(pdev, dsi); + init_waitqueue_head(&_dsi_irq_wait_queue); + return component_add(&pdev->dev, &mtk_dsi_component_ops); } -- 1.9.1