From mboxrd@z Thu Jan 1 00:00:00 1970 From: CK Hu Subject: Re: [PATCH v6 06/10] drm/mediatek: add dsi interrupt control Date: Fri, 5 Aug 2016 18:24:26 +0800 Message-ID: <1470392666.16554.61.camel@mtksdaap41> References: <1470308844-20895-1-git-send-email-yt.shen@mediatek.com> <1470308844-20895-7-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: <1470308844-20895-7-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: YT Shen Cc: Mark Rutland , dri-devel@lists.freedesktop.org, Russell King , Mao Huang , yingjoe.chen@mediatek.com, devicetree@vger.kernel.org, Sascha Hauer , Pawel Moll , Ian Campbell , Rob Herring , 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, Kumar Gala List-Id: linux-mediatek@lists.infradead.org SGksIFlUOgoKT24gVGh1LCAyMDE2LTA4LTA0IGF0IDE5OjA3ICswODAwLCBZVCBTaGVuIHdyb3Rl Ogo+IEZyb206IHNoYW9taW5nIGNoZW4gPHNoYW9taW5nLmNoZW5AbWVkaWF0ZWsuY29tPgo+IAo+ IGFkZCBkc2kgaW50ZXJydXB0IGNvbnRyb2wKPiAKPiBTaWduZWQtb2ZmLWJ5OiBzaGFvbWluZyBj aGVuIDxzaGFvbWluZy5jaGVuQG1lZGlhdGVrLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJt L21lZGlhdGVrL210a19kc2kuYyB8ICAgNzYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4gIDEgZmlsZSBjaGFuZ2VkLCA3NiBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0v bWVkaWF0ZWsvbXRrX2RzaS5jCj4gaW5kZXggYTljZjVhMS4uZWVhNjE5MiAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RzaS5jCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21lZGlhdGVrL210a19kc2kuYwo+IEBAIC0xOCw2ICsxOCw3IEBACj4gICNpbmNsdWRlIDxk cm0vZHJtX3BhbmVsLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiAgI2luY2x1ZGUgPGxp bnV4L2NvbXBvbmVudC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaXJxLmg+Cj4gICNpbmNsdWRlIDxs aW51eC9vZi5oPgo+ICAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPiAgI2luY2x1ZGUg PGxpbnV4L29mX2dyYXBoLmg+Cj4gQEAgLTI5LDYgKzMwLDE3IEBACj4gIAo+ICAjZGVmaW5lIERT SV9TVEFSVAkJMHgwMAo+ICAKPiArI2RlZmluZSBEU0lfSU5URU4JCTB4MDgKPiArCj4gKyNkZWZp bmUgRFNJX0lOVFNUQQkJMHgwYwo+ICsjZGVmaW5lIExQUlhfUkRfUkRZX0lOVF9GTEFHCQlCSVQo MCkKPiArI2RlZmluZSBDTURfRE9ORV9JTlRfRkxBRwkJQklUKDEpCj4gKyNkZWZpbmUgVEVfUkRZ X0lOVF9GTEFHCQkJQklUKDIpCj4gKyNkZWZpbmUgVk1fRE9ORV9JTlRfRkxBRwkJQklUKDMpCj4g KyNkZWZpbmUgRVhUX1RFX1JEWV9JTlRfRkxBRwkJQklUKDQpCj4gKyNkZWZpbmUgRFNJX0lOVF9B TExfQklUUwkJMHgxZgo+ICsjZGVmaW5lIERTSV9CVVNZCQkJQklUKDMxKQo+ICsKPiAgI2RlZmlu ZSBEU0lfQ09OX0NUUkwJCTB4MTAKPiAgI2RlZmluZSBEU0lfUkVTRVQJCQlCSVQoMCkKPiAgI2Rl ZmluZSBEU0lfRU4JCQkJQklUKDEpCj4gQEAgLTcxLDYgKzgzLDkgQEAKPiAgCj4gICNkZWZpbmUg RFNJX0hTVFhfQ0tMX1dDCQkweDY0Cj4gIAo+ICsjZGVmaW5lIERTSV9SQUNLCQkweDg0Cj4gKyNk ZWZpbmUgUkFDSwkJCQlCSVQoMCkKPiArCj4gICNkZWZpbmUgRFNJX1BIWV9MQ0NPTgkJMHgxMDQK PiAgI2RlZmluZSBMQ19IU19UWF9FTgkJCUJJVCgwKQo+ICAjZGVmaW5lIExDX1VMUE1fRU4JCQlC SVQoMSkKPiBAQCAtMTMxLDggKzE0NiwxMSBAQCBzdHJ1Y3QgbXRrX2RzaSB7Cj4gIAlzdHJ1Y3Qg dmlkZW9tb2RlIHZtOwo+ICAJaW50IHJlZmNvdW50Owo+ICAJYm9vbCBlbmFibGVkOwo+ICsJaW50 IGlycV9kYXRhOwoKdTMyIGlycV9kYXRhOwoKPiAgfTsKPiAgCj4gK3N0YXRpYyB3YWl0X3F1ZXVl X2hlYWRfdCBfZHNpX2lycV93YWl0X3F1ZXVlOwo+ICsKPiAgc3RhdGljIGlubGluZSBzdHJ1Y3Qg bXRrX2RzaSAqZW5jb2Rlcl90b19kc2koc3RydWN0IGRybV9lbmNvZGVyICplKQo+ICB7Cj4gIAly ZXR1cm4gY29udGFpbmVyX29mKGUsIHN0cnVjdCBtdGtfZHNpLCBlbmNvZGVyKTsKPiBAQCAtNDM3 LDYgKzQ1NSw0MyBAQCBzdGF0aWMgdm9pZCBtdGtfZHNpX3N0YXJ0KHN0cnVjdCBtdGtfZHNpICpk c2kpCj4gIAl3cml0ZWwoMSwgZHNpLT5yZWdzICsgRFNJX1NUQVJUKTsKPiAgfQo+ICAKPiArc3Rh dGljIHZvaWQgbXRrX2RzaV9zZXRfaW50ZXJydXB0X2VuYWJsZShzdHJ1Y3QgbXRrX2RzaSAqZHNp KQo+ICt7Cj4gKwl1MzIgaW50ZW4gPSBEU0lfSU5UX0FMTF9CSVRTOwo+ICsKPiArCWlmIChkc2kt Pm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKQo+ICsJCWludGVuICY9IH4oVEVfUkRZ X0lOVF9GTEFHIHwgRVhUX1RFX1JEWV9JTlRfRkxBRyk7Cj4gKwo+ICsJd3JpdGVsKGludGVuLCBk c2ktPnJlZ3MgKyBEU0lfSU5URU4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBtdGtfZHNpX2ly cV93YWtldXAoc3RydWN0IG10a19kc2kgKmRzaSwgdTMyIGlycV9iaXQpCj4gK3sKPiArCWRzaS0+ aXJxX2RhdGEgfD0gaXJxX2JpdDsKPiArfQo+ICsKPiArc3RhdGljIGlycXJldHVybl90IG10a19k c2lfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKPiArewo+ICsJc3RydWN0IG10a19kc2kgKmRz aSA9IGRldl9pZDsKPiArCXUzMiBzdGF0dXMsIHRtcDsKPiArCXUzMiBmbGFnID0gTFBSWF9SRF9S RFlfSU5UX0ZMQUcgfCBDTURfRE9ORV9JTlRfRkxBRyB8IFZNX0RPTkVfSU5UX0ZMQUc7Cj4gKwo+ ICsJc3RhdHVzID0gcmVhZGwoZHNpLT5yZWdzICsgRFNJX0lOVFNUQSk7Cj4gKwo+ICsJaWYgKHN0 YXR1cyAmIGZsYWcpIHsKPiArCQlkbyB7Cj4gKwkJCW10a19kc2lfbWFzayhkc2ksIERTSV9SQUNL LCBSQUNLLCBSQUNLKTsKPiArCQkJdG1wID0gcmVhZGwoZHNpLT5yZWdzICsgRFNJX0lOVFNUQSk7 Cj4gKwkJfSB3aGlsZSAodG1wICYgRFNJX0JVU1kpOwo+ICsKPiArCQltdGtfZHNpX21hc2soZHNp LCBEU0lfSU5UU1RBLCBzdGF0dXMgJiBmbGFnLCAwKTsKPiArCQltdGtfZHNpX2lycV93YWtldXAo ZHNpLCBzdGF0dXMgJiBmbGFnKTsKPiArCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJl9kc2lfaXJx X3dhaXRfcXVldWUpOwo+ICsJfQo+ICsKPiArCXJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsK PiAgc3RhdGljIHZvaWQgbXRrX2RzaV9wb3dlcm9mZihzdHJ1Y3QgbXRrX2RzaSAqZHNpKQo+ICB7 Cj4gIAlpZiAoV0FSTl9PTihkc2ktPnJlZmNvdW50ID09IDApKQo+IEBAIC00ODUsNiArNTQwLDcg QEAgc3RhdGljIHZvaWQgbXRrX291dHB1dF9kc2lfZW5hYmxlKHN0cnVjdCBtdGtfZHNpICpkc2kp Cj4gIAo+ICAJbXRrX2RzaV9wc19jb250cm9sX3ZhY3QoZHNpKTsKPiAgCW10a19kc2lfY29uZmln X3Zkb190aW1pbmcoZHNpKTsKPiArCW10a19kc2lfc2V0X2ludGVycnVwdF9lbmFibGUoZHNpKTsK PiAgCj4gIAltdGtfZHNpX3NldF9tb2RlKGRzaSk7Cj4gIAltdGtfZHNpX2Nsa19oc19tb2RlKGRz aSwgMSk7Cj4gQEAgLTgwNCw2ICs4NjAsNyBAQCBzdGF0aWMgaW50IG10a19kc2lfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2 LT5kZXY7Cj4gIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlbW90ZV9ub2RlLCAqZW5kcG9pbnQ7Cj4g IAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7Cj4gKwlpbnQgaXJxX251bTsKPiAgCWludCBjb21wX2lk Owo+ICAJaW50IHJldDsKPiAgCj4gQEAgLTg4MCw4ICs5MzcsMjcgQEAgc3RhdGljIGludCBtdGtf ZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gIAkJcmV0dXJuIHJldDsK PiAgCX0KPiAgCj4gKwlpcnFfbnVtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPiArCWlm IChpcnFfbnVtIDwgMCkgewo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1 ZXN0IGRzaSBpcnEgcmVzb3VyY2VcbiIpOwo+ICsJCXJldHVybiAtRVBST0JFX0RFRkVSOwo+ICsJ fQo+ICsKPiArCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycV9udW0sIElSUV9UWVBFX0xFVkVMX0xP Vyk7Cj4gKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycV9udW0sIG10a19k c2lfaXJxLAo+ICsJCQkgICAgICAgSVJRRl9UUklHR0VSX0xPVywgZGV2X25hbWUoJnBkZXYtPmRl diksIGRzaSk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVk IHRvIHJlcXVlc3QgbWVkaWF0ZWsgZHNpIGlycVxuIik7Cj4gKwkJcmV0dXJuIC1FUFJPQkVfREVG RVI7Cj4gKwl9Cj4gKwo+ICsJZHNpLT5pcnFfZGF0YSA9IDA7Cj4gKwlkZXZfaW5mbyhkZXYsICJk c2kgaXJxIG51bSBpcyAweCV4XG4iLCBpcnFfbnVtKTsKPiArCj4gIAlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBkc2kpOwo+ICAKPiArCWluaXRfd2FpdHF1ZXVlX2hlYWQoJl9kc2lfaXJxX3dh aXRfcXVldWUpOwo+ICsKPiAgCXJldHVybiBjb21wb25lbnRfYWRkKCZwZGV2LT5kZXYsICZtdGtf ZHNpX2NvbXBvbmVudF9vcHMpOwo+ICB9Cj4gIAoKUmVnYXJkcywKQ0sKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QK ZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: ck.hu@mediatek.com (CK Hu) Date: Fri, 5 Aug 2016 18:24:26 +0800 Subject: [PATCH v6 06/10] drm/mediatek: add dsi interrupt control In-Reply-To: <1470308844-20895-7-git-send-email-yt.shen@mediatek.com> References: <1470308844-20895-1-git-send-email-yt.shen@mediatek.com> <1470308844-20895-7-git-send-email-yt.shen@mediatek.com> Message-ID: <1470392666.16554.61.camel@mtksdaap41> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, YT: On Thu, 2016-08-04 at 19:07 +0800, YT Shen wrote: > 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 a9cf5a1..eea6192 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; > + int irq_data; 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_wakeup(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_wakeup(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); > @@ -804,6 +860,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; > > @@ -880,8 +937,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); > } > Regards, CK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030399AbcHEKYq (ORCPT ); Fri, 5 Aug 2016 06:24:46 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:22256 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1030246AbcHEKYn (ORCPT ); Fri, 5 Aug 2016 06:24:43 -0400 Message-ID: <1470392666.16554.61.camel@mtksdaap41> Subject: Re: [PATCH v6 06/10] drm/mediatek: add dsi interrupt control From: CK Hu To: YT Shen CC: , Philipp Zabel , Rob Herring , Pawel Moll , "Mark Rutland" , Ian Campbell , Kumar Gala , "Russell King" , David Airlie , "Matthias Brugger" , Mao Huang , "Bibby Hsieh" , , , , , , "Sascha Hauer" , , , , shaoming chen Date: Fri, 5 Aug 2016 18:24:26 +0800 In-Reply-To: <1470308844-20895-7-git-send-email-yt.shen@mediatek.com> References: <1470308844-20895-1-git-send-email-yt.shen@mediatek.com> <1470308844-20895-7-git-send-email-yt.shen@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, YT: On Thu, 2016-08-04 at 19:07 +0800, YT Shen wrote: > 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 a9cf5a1..eea6192 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; > + int irq_data; 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_wakeup(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_wakeup(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); > @@ -804,6 +860,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; > > @@ -880,8 +937,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); > } > Regards, CK