From mboxrd@z Thu Jan 1 00:00:00 1970 From: CK Hu Subject: Re: [PATCH v5 06/10] drm/mediatek: add dsi interrupt control Date: Tue, 2 Aug 2016 14:07:37 +0800 Message-ID: <1470118057.16554.5.camel@mtksdaap41> References: <1469698084-20185-1-git-send-email-yt.shen@mediatek.com> <1469698084-20185-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: <1469698084-20185-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 SGksIFlUOgoKT24gVGh1LCAyMDE2LTA3LTI4IGF0IDE3OjI4ICswODAwLCBZVCBTaGVuIHdyb3Rl Ogo+IEZyb206IHNoYW9taW5nIGNoZW4gPHNoYW9taW5nLmNoZW5AbWVkaWF0ZWsuY29tPgo+IAo+ IGFkZCBkc2kgaW50ZXJydXB0IGNvbnRyb2wKPiAKPiBTaWduZWQtb2ZmLWJ5OiBzaGFvbWluZyBj aGVuIDxzaGFvbWluZy5jaGVuQG1lZGlhdGVrLmNvbT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJt L21lZGlhdGVrL210a19kc2kuYyB8ICAgOTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4gIDEgZmlsZSBjaGFuZ2VkLCA5MiBpbnNlcnRpb25zKCspCj4gCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0v bWVkaWF0ZWsvbXRrX2RzaS5jCj4gaW5kZXggYTljZjVhMS4uNTUzNDQzYSAxMDA2NDQKPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RzaS5jCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL21lZGlhdGVrL210a19kc2kuYwo+IEBAIC0xOCw2ICsxOCw3IEBACj4gICNpbmNsdWRlIDxk cm0vZHJtX3BhbmVsLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiAgI2luY2x1ZGUgPGxp bnV4L2NvbXBvbmVudC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaXJxLmg+Cj4gICNpbmNsdWRlIDxs aW51eC9vZi5oPgo+ICAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPiAgI2luY2x1ZGUg PGxpbnV4L29mX2dyYXBoLmg+Cj4gQEAgLTI5LDYgKzMwLDE3IEBACj4gIAo+ICAjZGVmaW5lIERT SV9TVEFSVAkJMHgwMAo+ICAKPiArI2RlZmluZSBEU0lfSU5URU4JCTB4MDgKPiArCj4gKyNkZWZp bmUgRFNJX0lOVFNUQQkJMHgwYwo+ICsjZGVmaW5lIExQUlhfUkRfUkRZX0lOVF9GTEFHCQlCSVQo MCkKPiArI2RlZmluZSBDTURfRE9ORV9JTlRfRkxBRwkJQklUKDEpCj4gKyNkZWZpbmUgVEVfUkRZ X0lOVF9GTEFHCQkJQklUKDIpCj4gKyNkZWZpbmUgVk1fRE9ORV9JTlRfRkxBRwkJQklUKDMpCj4g KyNkZWZpbmUgRVhUX1RFX1JEWV9JTlRfRkxBRwkJQklUKDQpCj4gKyNkZWZpbmUgRFNJX0lOVF9B TExfQklUUwkJMHg3Zgo+ICsjZGVmaW5lIERTSV9CVVNZCQkJQklUKDMxKQo+ICsKPiAgI2RlZmlu ZSBEU0lfQ09OX0NUUkwJCTB4MTAKPiAgI2RlZmluZSBEU0lfUkVTRVQJCQlCSVQoMCkKPiAgI2Rl ZmluZSBEU0lfRU4JCQkJQklUKDEpCj4gQEAgLTcxLDYgKzgzLDkgQEAKPiAgCj4gICNkZWZpbmUg RFNJX0hTVFhfQ0tMX1dDCQkweDY0Cj4gIAo+ICsjZGVmaW5lIERTSV9SQUNLCQkweDg0Cj4gKyNk ZWZpbmUgUkFDSwkJCQlCSVQoMCkKPiArCj4gICNkZWZpbmUgRFNJX1BIWV9MQ0NPTgkJMHgxMDQK PiAgI2RlZmluZSBMQ19IU19UWF9FTgkJCUJJVCgwKQo+ICAjZGVmaW5lIExDX1VMUE1fRU4JCQlC SVQoMSkKPiBAQCAtMTMxLDggKzE0NiwxMyBAQCBzdHJ1Y3QgbXRrX2RzaSB7Cj4gIAlzdHJ1Y3Qg dmlkZW9tb2RlIHZtOwo+ICAJaW50IHJlZmNvdW50Owo+ICAJYm9vbCBlbmFibGVkOwo+ICsJaW50 IGlycV9kYXRhOwo+ICB9Owo+ICAKPiArc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IF9kc2lfY21k X2RvbmVfd2FpdF9xdWV1ZTsKPiArc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IF9kc2lfZGNzX3Jl YWRfd2FpdF9xdWV1ZTsKPiArc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IF9kc2lfd2FpdF92bV9k b25lX3F1ZXVlOwoKSSB0aGluayBmb3IgZGlmZmVyZW5jZSBpcnEgc3RhdHVzIHdlIGNhbiB1c2Ug b25seSBvbmUgd2FpdCBxdWV1ZS4gU28KbXVsdGlwbGUgY2xpZW50IHdhaXQgb24gdGhlIHNhbWUg d2FpdCBxdWV1ZSwgYnV0IGVhY2ggY2xpZW50IGhhcwpkaWZmZXJlbnQgd2FrZSB1cCBjb25kaXRp b24uCgo+ICsKPiAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX2RzaSAqZW5jb2Rlcl90b19kc2ko c3RydWN0IGRybV9lbmNvZGVyICplKQo+ICB7Cj4gIAlyZXR1cm4gY29udGFpbmVyX29mKGUsIHN0 cnVjdCBtdGtfZHNpLCBlbmNvZGVyKTsKPiBAQCAtNDM3LDYgKzQ1Nyw1NSBAQCBzdGF0aWMgdm9p ZCBtdGtfZHNpX3N0YXJ0KHN0cnVjdCBtdGtfZHNpICpkc2kpCj4gIAl3cml0ZWwoMSwgZHNpLT5y ZWdzICsgRFNJX1NUQVJUKTsKPiAgfQo+ICAKPiArc3RhdGljIHZvaWQgbXRrX2RzaV9zZXRfaW50 ZXJydXB0X2VuYWJsZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQo+ICt7Cj4gKwl1MzIgaW50ZW4gPSBE U0lfSU5UX0FMTF9CSVRTOwo+ICsKPiArCWlmIChkc2ktPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9N T0RFX1ZJREVPKQo+ICsJCWludGVuICY9IH4oVEVfUkRZX0lOVF9GTEFHIHwgRVhUX1RFX1JEWV9J TlRfRkxBRyk7Cj4gKwo+ICsJd3JpdGVsKGludGVuLCBkc2ktPnJlZ3MgKyBEU0lfSU5URU4pOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBtdGtfZHNpX2lycV93YWtldXAoc3RydWN0IG10a19kc2kg KmRzaSwgdTMyIGlycV9iaXQpCj4gK3sKPiArCWRzaS0+aXJxX2RhdGEgfD0gaXJxX2JpdDsKPiAr fQo+ICsKPiArc3RhdGljIGlycXJldHVybl90IG10a19kc2lfaXJxKGludCBpcnEsIHZvaWQgKmRl dl9pZCkKPiArewo+ICsJc3RydWN0IG10a19kc2kgKmRzaSA9IGRldl9pZDsKPiArCj4gKwl1MzIg c3RhdHVzLCB0bXA7Cj4gKwo+ICsJc3RhdHVzID0gcmVhZGwoZHNpLT5yZWdzICsgRFNJX0lOVFNU QSk7Cj4gKwo+ICsJaWYgKHN0YXR1cyAmIExQUlhfUkRfUkRZX0lOVF9GTEFHKSB7Cj4gKwkJZG8g ewo+ICsJCQltdGtfZHNpX21hc2soZHNpLCBEU0lfUkFDSywgUkFDSywgUkFDSyk7Cj4gKwkJCXRt cCA9IHJlYWRsKGRzaS0+cmVncyArIERTSV9JTlRTVEEpOwo+ICsJCX0gd2hpbGUgKHRtcCAmIERT SV9CVVNZKTsKPiArCj4gKwkJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX0lOVFNUQSwgTFBSWF9SRF9S RFlfSU5UX0ZMQUcsIDApOwo+ICsJCW10a19kc2lfaXJxX3dha2V1cChkc2ksIExQUlhfUkRfUkRZ X0lOVF9GTEFHKTsKPiArCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJl9kc2lfZGNzX3JlYWRfd2Fp dF9xdWV1ZSk7Cj4gKwl9Cj4gKwo+ICsJaWYgKHN0YXR1cyAmIENNRF9ET05FX0lOVF9GTEFHKSB7 Cj4gKwkJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX0lOVFNUQSwgQ01EX0RPTkVfSU5UX0ZMQUcsIDAp Owo+ICsJCW10a19kc2lfaXJxX3dha2V1cChkc2ksIENNRF9ET05FX0lOVF9GTEFHKTsKPiArCQl3 YWtlX3VwX2ludGVycnVwdGlibGUoJl9kc2lfY21kX2RvbmVfd2FpdF9xdWV1ZSk7Cj4gKwl9Cj4g Kwo+ICsJaWYgKHN0YXR1cyAmIFZNX0RPTkVfSU5UX0ZMQUcpIHsKPiArCQltdGtfZHNpX21hc2so ZHNpLCBEU0lfSU5UU1RBLCBWTV9ET05FX0lOVF9GTEFHLCAwKTsKPiArCQltdGtfZHNpX2lycV93 YWtldXAoZHNpLCBWTV9ET05FX0lOVF9GTEFHKTsKPiArCQl3YWtlX3VwX2ludGVycnVwdGlibGUo Jl9kc2lfd2FpdF92bV9kb25lX3F1ZXVlKTsKPiArCX0KCkkgdGhpbmsgdGhlc2UgdGhyZWUgcGFy dCBjYW4gYmUgbWVyZ2VkIGludG8gb25lLgp1MzIgZGVhbF9zdGF0dXMgPSBMUFJYX1JEX1JEWV9J TlRfRkxBRyB8IENNRF9ET05FX0lOVF9GTEFHIHwKVk1fRE9ORV9JTlRfRkxBRzsKaWYgKHN0YXR1 cyAmIGRlYWxfc3RhdHVzKSB7CiAgICBtdGtfZHNpX21hc2soZHNpLCBEU0lfSU5UU1RBLCBkZWFs X3N0YXR1cywgMCk7CiAgICBtdGtfZHNpX2lycV93YWtldXAoZHNpLCBzdGF0dXMgJiBkZWFsX3N0 YXR1cyk7CiAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJl9kc2lfaXJxX3dhaXRfcXVldWUpOwp9 CgpPdGhlcndpc2UsIHdoeSBlbmFibGUgRFNJX0lOVF9BTExfQklUUywgYnV0IGRlYWwgb25seQpM UFJYX1JEX1JEWV9JTlRfRkxBRywgQ01EX0RPTkVfSU5UX0ZMQUcsIGFuZCBWTV9ET05FX0lOVF9G TEFHPwoKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lk IG10a19kc2lfcG93ZXJvZmYoc3RydWN0IG10a19kc2kgKmRzaSkKPiAgewo+ICAJaWYgKFdBUk5f T04oZHNpLT5yZWZjb3VudCA9PSAwKSkKPiBAQCAtNDg1LDYgKzU1NCw3IEBAIHN0YXRpYyB2b2lk IG10a19vdXRwdXRfZHNpX2VuYWJsZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQo+ICAKPiAgCW10a19k c2lfcHNfY29udHJvbF92YWN0KGRzaSk7Cj4gIAltdGtfZHNpX2NvbmZpZ192ZG9fdGltaW5nKGRz aSk7Cj4gKwltdGtfZHNpX3NldF9pbnRlcnJ1cHRfZW5hYmxlKGRzaSk7Cj4gIAo+ICAJbXRrX2Rz aV9zZXRfbW9kZShkc2kpOwo+ICAJbXRrX2RzaV9jbGtfaHNfbW9kZShkc2ksIDEpOwo+IEBAIC04 MDQsNiArODc0LDcgQEAgc3RhdGljIGludCBtdGtfZHNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCj4gIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+ICAJc3Ry dWN0IGRldmljZV9ub2RlICpyZW1vdGVfbm9kZSwgKmVuZHBvaW50Owo+ICAJc3RydWN0IHJlc291 cmNlICpyZWdzOwo+ICsJaW50IGlycV9udW07Cj4gIAlpbnQgY29tcF9pZDsKPiAgCWludCByZXQ7 Cj4gIAo+IEBAIC04ODAsOCArOTUxLDI5IEBAIHN0YXRpYyBpbnQgbXRrX2RzaV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJCXJldHVybiByZXQ7Cj4gIAl9Cj4gIAo+ICsJ aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Cj4gKwlpZiAoaXJxX251bSA8IDAp IHsKPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBkc2kgaXJxIHJl c291cmNlXG4iKTsKPiArCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKPiArCX0KPiArCj4gKwlpcnFf c2V0X3N0YXR1c19mbGFncyhpcnFfbnVtLCBJUlFfVFlQRV9MRVZFTF9MT1cpOwo+ICsJcmV0ID0g ZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnFfbnVtLCBtdGtfZHNpX2lycSwKPiArCQkJ ICAgICAgIElSUUZfVFJJR0dFUl9MT1csIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBkc2kpOwo+ICsJ aWYgKHJldCkgewo+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1l ZGlhdGVrIGRzaSBpcnFcbiIpOwo+ICsJCXJldHVybiAtRVBST0JFX0RFRkVSOwo+ICsJfQo+ICsK PiArCWRzaS0+aXJxX2RhdGEgPSAwOwo+ICsJZGV2X2luZm8oZGV2LCAiZHNpIGlycSBudW0gaXMg MHgleFxuIiwgaXJxX251bSk7Cj4gKwo+ICAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHNp KTsKPiAgCj4gKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZfZHNpX2NtZF9kb25lX3dhaXRfcXVldWUp Owo+ICsJaW5pdF93YWl0cXVldWVfaGVhZCgmX2RzaV9kY3NfcmVhZF93YWl0X3F1ZXVlKTsKPiAr CWluaXRfd2FpdHF1ZXVlX2hlYWQoJl9kc2lfd2FpdF92bV9kb25lX3F1ZXVlKTsKPiArCj4gIAly ZXR1cm4gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmbXRrX2RzaV9jb21wb25lbnRfb3BzKTsK PiAgfQo+ICAKClJlZ2FyZHMsCkNLCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: ck.hu@mediatek.com (CK Hu) Date: Tue, 2 Aug 2016 14:07:37 +0800 Subject: [PATCH v5 06/10] drm/mediatek: add dsi interrupt control In-Reply-To: <1469698084-20185-7-git-send-email-yt.shen@mediatek.com> References: <1469698084-20185-1-git-send-email-yt.shen@mediatek.com> <1469698084-20185-7-git-send-email-yt.shen@mediatek.com> Message-ID: <1470118057.16554.5.camel@mtksdaap41> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, YT: On Thu, 2016-07-28 at 17:28 +0800, YT Shen wrote: > From: shaoming chen > > add dsi interrupt control > > Signed-off-by: shaoming chen > --- > drivers/gpu/drm/mediatek/mtk_dsi.c | 92 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 92 insertions(+) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c > index a9cf5a1..553443a 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 0x7f > +#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,13 @@ struct mtk_dsi { > struct videomode vm; > int refcount; > bool enabled; > + int irq_data; > }; > > +static wait_queue_head_t _dsi_cmd_done_wait_queue; > +static wait_queue_head_t _dsi_dcs_read_wait_queue; > +static wait_queue_head_t _dsi_wait_vm_done_queue; I think for difference irq status we can use only one wait queue. So multiple client wait on the same wait queue, but each client has different wake up condition. > + > static inline struct mtk_dsi *encoder_to_dsi(struct drm_encoder *e) > { > return container_of(e, struct mtk_dsi, encoder); > @@ -437,6 +457,55 @@ 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; > + > + status = readl(dsi->regs + DSI_INTSTA); > + > + if (status & LPRX_RD_RDY_INT_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, LPRX_RD_RDY_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, LPRX_RD_RDY_INT_FLAG); > + wake_up_interruptible(&_dsi_dcs_read_wait_queue); > + } > + > + if (status & CMD_DONE_INT_FLAG) { > + mtk_dsi_mask(dsi, DSI_INTSTA, CMD_DONE_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, CMD_DONE_INT_FLAG); > + wake_up_interruptible(&_dsi_cmd_done_wait_queue); > + } > + > + if (status & VM_DONE_INT_FLAG) { > + mtk_dsi_mask(dsi, DSI_INTSTA, VM_DONE_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, VM_DONE_INT_FLAG); > + wake_up_interruptible(&_dsi_wait_vm_done_queue); > + } I think these three part can be merged into one. u32 deal_status = LPRX_RD_RDY_INT_FLAG | CMD_DONE_INT_FLAG | VM_DONE_INT_FLAG; if (status & deal_status) { mtk_dsi_mask(dsi, DSI_INTSTA, deal_status, 0); mtk_dsi_irq_wakeup(dsi, status & deal_status); wake_up_interruptible(&_dsi_irq_wait_queue); } Otherwise, why enable DSI_INT_ALL_BITS, but deal only LPRX_RD_RDY_INT_FLAG, CMD_DONE_INT_FLAG, and VM_DONE_INT_FLAG? > + > + return IRQ_HANDLED; > +} > + > static void mtk_dsi_poweroff(struct mtk_dsi *dsi) > { > if (WARN_ON(dsi->refcount == 0)) > @@ -485,6 +554,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 +874,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 +951,29 @@ 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_cmd_done_wait_queue); > + init_waitqueue_head(&_dsi_dcs_read_wait_queue); > + init_waitqueue_head(&_dsi_wait_vm_done_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 S1756193AbcHBG00 (ORCPT ); Tue, 2 Aug 2016 02:26:26 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:18562 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751643AbcHBG0Q (ORCPT ); Tue, 2 Aug 2016 02:26:16 -0400 Message-ID: <1470118057.16554.5.camel@mtksdaap41> Subject: Re: [PATCH v5 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: Tue, 2 Aug 2016 14:07:37 +0800 In-Reply-To: <1469698084-20185-7-git-send-email-yt.shen@mediatek.com> References: <1469698084-20185-1-git-send-email-yt.shen@mediatek.com> <1469698084-20185-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-07-28 at 17:28 +0800, YT Shen wrote: > From: shaoming chen > > add dsi interrupt control > > Signed-off-by: shaoming chen > --- > drivers/gpu/drm/mediatek/mtk_dsi.c | 92 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 92 insertions(+) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c > index a9cf5a1..553443a 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 0x7f > +#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,13 @@ struct mtk_dsi { > struct videomode vm; > int refcount; > bool enabled; > + int irq_data; > }; > > +static wait_queue_head_t _dsi_cmd_done_wait_queue; > +static wait_queue_head_t _dsi_dcs_read_wait_queue; > +static wait_queue_head_t _dsi_wait_vm_done_queue; I think for difference irq status we can use only one wait queue. So multiple client wait on the same wait queue, but each client has different wake up condition. > + > static inline struct mtk_dsi *encoder_to_dsi(struct drm_encoder *e) > { > return container_of(e, struct mtk_dsi, encoder); > @@ -437,6 +457,55 @@ 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; > + > + status = readl(dsi->regs + DSI_INTSTA); > + > + if (status & LPRX_RD_RDY_INT_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, LPRX_RD_RDY_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, LPRX_RD_RDY_INT_FLAG); > + wake_up_interruptible(&_dsi_dcs_read_wait_queue); > + } > + > + if (status & CMD_DONE_INT_FLAG) { > + mtk_dsi_mask(dsi, DSI_INTSTA, CMD_DONE_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, CMD_DONE_INT_FLAG); > + wake_up_interruptible(&_dsi_cmd_done_wait_queue); > + } > + > + if (status & VM_DONE_INT_FLAG) { > + mtk_dsi_mask(dsi, DSI_INTSTA, VM_DONE_INT_FLAG, 0); > + mtk_dsi_irq_wakeup(dsi, VM_DONE_INT_FLAG); > + wake_up_interruptible(&_dsi_wait_vm_done_queue); > + } I think these three part can be merged into one. u32 deal_status = LPRX_RD_RDY_INT_FLAG | CMD_DONE_INT_FLAG | VM_DONE_INT_FLAG; if (status & deal_status) { mtk_dsi_mask(dsi, DSI_INTSTA, deal_status, 0); mtk_dsi_irq_wakeup(dsi, status & deal_status); wake_up_interruptible(&_dsi_irq_wait_queue); } Otherwise, why enable DSI_INT_ALL_BITS, but deal only LPRX_RD_RDY_INT_FLAG, CMD_DONE_INT_FLAG, and VM_DONE_INT_FLAG? > + > + return IRQ_HANDLED; > +} > + > static void mtk_dsi_poweroff(struct mtk_dsi *dsi) > { > if (WARN_ON(dsi->refcount == 0)) > @@ -485,6 +554,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 +874,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 +951,29 @@ 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_cmd_done_wait_queue); > + init_waitqueue_head(&_dsi_dcs_read_wait_queue); > + init_waitqueue_head(&_dsi_wait_vm_done_queue); > + > return component_add(&pdev->dev, &mtk_dsi_component_ops); > } > Regards, CK