From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chanwoo Choi Subject: Re: [PATCH v5 8/8] drm/rockchip: Add dmc notifier in vop driver Date: Wed, 10 Aug 2016 14:07:39 +0900 Message-ID: <57AAB69B.2000102@samsung.com> References: <1470799604-12877-1-git-send-email-hl@rock-chips.com> <1470799604-12877-9-git-send-email-hl@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-reply-to: <1470799604-12877-9-git-send-email-hl-TNX95d0MmH7DzftRWevZcw@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+glpar-linux-rockchip=m.gmane.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: Lin Huang , heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org Cc: tixy-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org, mark.rutland-5wv7dgnIgG8@public.gmane.org, typ-TNX95d0MmH7DzftRWevZcw@public.gmane.org, linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, airlied-cv59FeDIM0c@public.gmane.org, mturquette-rdvid1DuHRBWk0Htik3J/w@public.gmane.org, dbasehore-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, sboyd-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org, myungjoo.ham-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org, sudeep.holla-5wv7dgnIgG8@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, mark.yao-TNX95d0MmH7DzftRWevZcw@public.gmane.org List-Id: linux-pm@vger.kernel.org SGkgTGluLAoKTG9va3MgZ29vZCB0byBtZSBhYm91dCB0aGUgZGV2ZnJlcS9kZXZmcmVxLWV2ZW50 IHVzYWdlLgoKW1VzYWdlIG9mIHRoZSBkZXZmcmVxL2RldmZyZXEtZXZlbnQgQVBJc10KUmV2aWV3 ZWQtYnk6IENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgoKUmVnYXJkcywKQ2hh bndvbyBDaG9pCgpPbiAyMDE264WEIDA47JuUIDEw7J28IDEyOjI2LCBMaW4gSHVhbmcgd3JvdGU6 Cj4gd2hlbiBpbiBkZHIgZnJlcXVlbmN5IHNjYWxpbmcgcHJvY2Vzcywgdm9wIGNhbiBub3QgZG8K PiBlbmFibGUgb3IgZGlzYWJsZSBvcGVyYXRpb24sIHNpbmNlIGRjZiB3aWxsIGJhc2Ugb24gdm9w IHZibGFuawo+IHRpbWUgdG8gZG8gZnJlcXVlbmN5IHNjYWxpbmcgYW5kIG5lZWQgdG8gZ2V0IHZv cCBpcnEgaWYgdGhlcmUKPiBoYXZlIHZvcCBlbmFibGVkLiBTbyBuZWVkIHJlZ2lzdGVyIHRvIGRl dmZyZXEgbm90aWZpZXIsIGFuZCB3ZSBjYW4KPiBnZXQgdGhlIGRtYyBzdGF0dXMuIEFsc28sIHdo ZW4gdGhlcmUgaGF2ZSB0d28gdm9wIGVuYWJsZWQsIHdlIG5lZWQKPiB0byBkaXNhYmxlIGRtYywg c2luY2UgZGNmIG9ubHkgYmFzZSBvbiBvbmUgdm9wIHZibGFuayB0aW1lLCBzbyB0aGUKPiBvdGhl ciBwYW5lbCB3aWxsIGZsaWNrZXIgd2hlbiBkbyBkZHIgZnJlcXVlbmN5IHNjYWxpbmcuCj4gCj4g U2lnbmVkLW9mZi1ieTogTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4KPiAtLS0KPiBDaGFu Z2VzIGluIHY1Ogo+IC0gaW1wcm92ZSBzb21lIG5pdHMKPiAKPiBDaGFuZ2VzIGluIHY0Ogo+IC0g cmVnaXN0ZXIgbm90aWZpZXIgdG8gZGV2ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcgo+IC0gdXNlIERF VkZSRVFfUFJFQ0hBTkdFIGFuZCBERVZGUkVRX1BPU1RDSEFOR0UgdG8gZ2V0IGRtYyBzdGF0dXMK PiAtIHdoZW4gdHdvIHZvcCBlbmFibGUsIGRpc2FibGUgZG1jCj4gLSB3aGVuIHR3byB2b3AgYmFj ayB0byBvbmUgdm9wLCBlbmFibGUgZG1jCj4gCj4gQ2hhbmdlcyBpbiB2MzoKPiAtIHdoZW4gZG8g dm9wIGVhbmJsZS9kaXNhYmxlLCBkbWMgd2lsbCB3YWl0IHVudGlsIGl0IGZpbmlzaAo+IAo+IENo YW5nZXMgaW4gdjI6Cj4gLSBOb25lCj4gCj4gQ2hhbmdlcyBpbiB2MToKPiAtIHVzZSB3YWl0X2V2 ZW50IGluc3RlYWQgdXNsZWVwCj4gCj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hp cF9kcm1fdm9wLmMgfCAxMjggKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ICAxIGZpbGUg Y2hhbmdlZCwgMTI1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1fdm9wLmMgYi9kcml2ZXJz L2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4gaW5kZXggMzE3NDRmZS4uN2Nl Mzg5MCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJt X3ZvcC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3Au Ywo+IEBAIC0xMiw2ICsxMiw4IEBACj4gICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuCj4gICAqLwo+ICAKPiArI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEuaD4K PiArI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEtZXZlbnQuaD4KPiAgI2luY2x1ZGUgPGRybS9kcm0u aD4KPiAgI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4gICNpbmNsdWRlIDxkcm0vZHJtX2F0b21pYy5o Pgo+IEBAIC0xMTgsNiArMTIwLDEzIEBAIHN0cnVjdCB2b3Agewo+ICAKPiAgCWNvbnN0IHN0cnVj dCB2b3BfZGF0YSAqZGF0YTsKPiAgCj4gKwlzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcTsKPiArCXN0 cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZGV2ZnJlcV9ldmVudF9kZXY7Cj4gKwlzdHJ1Y3Qgbm90 aWZpZXJfYmxvY2sgZG1jX25iOwo+ICsJaW50IGRtY19pbl9wcm9jZXNzOwo+ICsJaW50IHZvcF9z d2l0Y2hfc3RhdHVzOwo+ICsJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9kbWNfcXVldWU7Cj4gKwl3 YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3ZvcF9zd2l0Y2hfcXVldWU7Cj4gIAl1aW50MzJfdCAqcmVn c2JhazsKPiAgCXZvaWQgX19pb21lbSAqcmVnczsKPiAgCj4gQEAgLTQyOCwyMSArNDM3LDU5IEBA IHN0YXRpYyB2b2lkIHZvcF9kc3BfaG9sZF92YWxpZF9pcnFfZGlzYWJsZShzdHJ1Y3Qgdm9wICp2 b3ApCj4gIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2b3AtPmlycV9sb2NrLCBmbGFncyk7Cj4g IH0KPiAgCj4gK3N0YXRpYyBpbnQgZG1jX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5i LCB1bnNpZ25lZCBsb25nIGV2ZW50LAo+ICsJCSAgICAgIHZvaWQgKmRhdGEpCj4gK3sKPiArCXN0 cnVjdCB2b3AgKnZvcCA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHZvcCwgZG1jX25iKTsKPiAr Cj4gKwlpZiAoZXZlbnQgPT0gREVWRlJFUV9QUkVDSEFOR0UpIHsKPiArCQkvKgo+ICsJCSAqIGNo ZWNrIGlmIHZvcCBpbiBlbmFibGUgb3IgZGlzYWJsZSBwcm9jZXNzLAo+ICsJCSAqIGlmIHllcywg d2FpdCB1bnRpbCBpdCBmaW5pc2hlcywgdXNlIDIwMG1zIGFzCj4gKwkJICogdGltZW91dC4KPiAr CQkgKi8KPiArCQlpZiAoIXdhaXRfZXZlbnRfdGltZW91dCh2b3AtPndhaXRfdm9wX3N3aXRjaF9x dWV1ZSwKPiArCQkJCQkhdm9wLT52b3Bfc3dpdGNoX3N0YXR1cywgSFogLyA1KSkKPiArCQkJZGV2 X3dhcm4odm9wLT5kZXYsCj4gKwkJCQkgIlRpbWVvdXQgd2FpdGluZyBmb3Igdm9wIHN3dGljaCBz dGF0dXNcbiIpOwo+ICsJCXZvcC0+ZG1jX2luX3Byb2Nlc3MgPSAxOwo+ICsJfSBlbHNlIGlmIChl dmVudCA9PSBERVZGUkVRX1BPU1RDSEFOR0UpIHsKPiArCQl2b3AtPmRtY19pbl9wcm9jZXNzID0g MDsKPiArCQl3YWtlX3VwKCZ2b3AtPndhaXRfZG1jX3F1ZXVlKTsKPiArCX0KPiArCj4gKwlyZXR1 cm4gTk9USUZZX09LOwo+ICt9Cj4gKwo+ICBzdGF0aWMgdm9pZCB2b3BfZW5hYmxlKHN0cnVjdCBk cm1fY3J0YyAqY3J0YykKPiAgewo+ICAJc3RydWN0IHZvcCAqdm9wID0gdG9fdm9wKGNydGMpOwo+ ICsJaW50IG51bV9lbmFibGVkX2NydGMgPSAwOwo+ICAJaW50IHJldDsKPiAgCj4gKwlpZiAodm9w LT5pc19lbmFibGVkKQo+ICsJCXJldHVybjsKPiArCj4gKwkvKgo+ICsJICogaWYgaW4gZG1jIHNj YWxpbmcgZnJlcXVlbmN5IHByb2Nlc3MsIHdhaXQgdW50aWwgaXQgZmluaXNoZXMKPiArCSAqIHVz ZSAxMDBtcyBhcyB0aW1lb3V0IHRpbWUuCj4gKwkgKi8KPiArCWlmICghd2FpdF9ldmVudF90aW1l b3V0KHZvcC0+d2FpdF9kbWNfcXVldWUsCj4gKwkJCQkhdm9wLT5kbWNfaW5fcHJvY2VzcywgSFog LyA1KSkKPiArCQlkZXZfd2Fybih2b3AtPmRldiwKPiArCQkJICJUaW1lb3V0IHdhaXRpbmcgZm9y IGRtYyB3aGVuIHZvcCBlbmFibGVcbiIpOwo+ICsKPiArCXZvcC0+dm9wX3N3aXRjaF9zdGF0dXMg PSAxOwo+ICAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh2b3AtPmRldik7Cj4gIAlpZiAocmV0 IDwgMCkgewo+ICAJCWRldl9lcnIodm9wLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBtIHJ1bnRpbWU6 ICVkXG4iLCByZXQpOwo+IC0JCXJldHVybjsKPiArCQlnb3RvIGVycjsKPiAgCX0KPiAgCj4gIAly ZXQgPSBjbGtfZW5hYmxlKHZvcC0+aGNsayk7Cj4gIAlpZiAocmV0IDwgMCkgewo+ICAJCWRldl9l cnIodm9wLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGhjbGsgLSAlZFxuIiwgcmV0KTsKPiAtCQly ZXR1cm47Cj4gKwkJZ290byBlcnI7Cj4gIAl9Cj4gIAo+ICAJcmV0ID0gY2xrX2VuYWJsZSh2b3At PmRjbGspOwo+IEBAIC00NTYsNyArNTAzLDYgQEAgc3RhdGljIHZvaWQgdm9wX2VuYWJsZShzdHJ1 Y3QgZHJtX2NydGMgKmNydGMpCj4gIAkJZGV2X2Vycih2b3AtPmRldiwgImZhaWxlZCB0byBlbmFi bGUgYWNsayAtICVkXG4iLCByZXQpOwo+ICAJCWdvdG8gZXJyX2Rpc2FibGVfZGNsazsKPiAgCX0K PiAtCj4gIAkvKgo+ICAJICogU2xhdmUgaW9tbXUgc2hhcmVzIHBvd2VyLCBpcnEgYW5kIGNsb2Nr IHdpdGggdm9wLiAgSXQgd2FzIGFzc29jaWF0ZWQKPiAgCSAqIGF1dG9tYXRpY2FsbHkgd2l0aCB0 aGlzIG1hc3RlciBkZXZpY2UgdmlhIGNvbW1vbiBkcml2ZXIgY29kZS4KPiBAQCAtNDg1LDYgKzUz MSwyMSBAQCBzdGF0aWMgdm9pZCB2b3BfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiAg Cj4gIAlkcm1fY3J0Y192Ymxhbmtfb24oY3J0Yyk7Cj4gIAo+ICsJdm9wLT52b3Bfc3dpdGNoX3N0 YXR1cyA9IDA7Cj4gKwl3YWtlX3VwKCZ2b3AtPndhaXRfdm9wX3N3aXRjaF9xdWV1ZSk7Cj4gKwo+ ICsJLyogY2hlY2sgaG93IG1hbnkgdm9wIHdlIHVzZSBub3cgKi8KPiArCWRybV9mb3JfZWFjaF9j cnRjKGNydGMsIHZvcC0+ZHJtX2Rldikgewo+ICsJCWlmIChjcnRjLT5zdGF0ZS0+ZW5hYmxlKQo+ ICsJCQludW1fZW5hYmxlZF9jcnRjKys7Cj4gKwl9Cj4gKwo+ICsJLyogaWYgZW5hYmxlIHR3byB2 b3AsIG5lZWQgdG8gZGlzYWJsZSBkbWMgKi8KPiArCWlmICgobnVtX2VuYWJsZWRfY3J0YyA+IDEp ICYmIHZvcC0+ZGV2ZnJlcSkgewo+ICsJCWlmICh2b3AtPmRldmZyZXFfZXZlbnRfZGV2KQo+ICsJ CQlkZXZmcmVxX2V2ZW50X2Rpc2FibGVfZWRldih2b3AtPmRldmZyZXFfZXZlbnRfZGV2KTsKPiAr CQlkZXZmcmVxX3N1c3BlbmRfZGV2aWNlKHZvcC0+ZGV2ZnJlcSk7Cj4gKwl9Cj4gIAlyZXR1cm47 Cj4gIAo+ICBlcnJfZGlzYWJsZV9hY2xrOgo+IEBAIC00OTMsMTYgKzU1NCwzMiBAQCBlcnJfZGlz YWJsZV9kY2xrOgo+ICAJY2xrX2Rpc2FibGUodm9wLT5kY2xrKTsKPiAgZXJyX2Rpc2FibGVfaGNs azoKPiAgCWNsa19kaXNhYmxlKHZvcC0+aGNsayk7Cj4gK2VycjoKPiArCXZvcC0+dm9wX3N3aXRj aF9zdGF0dXMgPSAwOwo+ICsJd2FrZV91cCgmdm9wLT53YWl0X3ZvcF9zd2l0Y2hfcXVldWUpOwo+ ICsJcmV0dXJuOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdm9pZCB2b3BfY3J0Y19kaXNhYmxlKHN0cnVj dCBkcm1fY3J0YyAqY3J0YykKPiAgewo+ICAJc3RydWN0IHZvcCAqdm9wID0gdG9fdm9wKGNydGMp Owo+ICsJaW50IG51bV9lbmFibGVkX2NydGMgPSAwOwo+ICAJaW50IGk7Cj4gIAo+ICAJV0FSTl9P Tih2b3AtPmV2ZW50KTsKPiAgCj4gIAkvKgo+ICsJICogaWYgaW4gZG1jIHNjYWxpbmcgZnJlcXVl bmN5IHByb2Nlc3MsIHdhaXQgdW50aWwgaXQgZmluaXNoCj4gKwkgKiB1c2UgMTAwbXMgYXMgdGlt ZW91dCB0aW1lLgo+ICsJICovCj4gKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dCh2b3AtPndhaXRf ZG1jX3F1ZXVlLAo+ICsJCQkJIXZvcC0+ZG1jX2luX3Byb2Nlc3MsIEhaIC8gNSkpCj4gKwkJZGV2 X3dhcm4odm9wLT5kZXYsCj4gKwkJCSAiVGltZW91dCB3YWl0aW5nIGZvciBkbWMgd2hlbiB2b3Ag ZGlzYWJsZVxuIik7Cj4gKwo+ICsJdm9wLT52b3Bfc3dpdGNoX3N0YXR1cyA9IDE7Cj4gKwo+ICsJ LyoKPiAgCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHdpbmRvd3MgYXJlIGRpc2Fi bGVkIGJlZm9yZSB3ZQo+ICAJICogZGlzYWJsZSB0aGF0IGNydGMuIE90aGVyd2lzZSB3ZSBtaWdo dCB0cnkgdG8gc2NhbiBmcm9tIGEgZGVzdHJveWVkCj4gIAkgKiBidWZmZXIgbGF0ZXIuCj4gQEAg LTU1OSw2ICs2MzYsMjUgQEAgc3RhdGljIHZvaWQgdm9wX2NydGNfZGlzYWJsZShzdHJ1Y3QgZHJt X2NydGMgKmNydGMpCj4gIAo+ICAJCWNydGMtPnN0YXRlLT5ldmVudCA9IE5VTEw7Cj4gIAl9Cj4g Kwo+ICsJdm9wLT52b3Bfc3dpdGNoX3N0YXR1cyA9IDA7Cj4gKwl3YWtlX3VwKCZ2b3AtPndhaXRf dm9wX3N3aXRjaF9xdWV1ZSk7Cj4gKwo+ICsJLyogY2hlY2sgaG93IG1hbnkgdm9wIHVzZSBub3cg Ki8KPiArCWRybV9mb3JfZWFjaF9jcnRjKGNydGMsIHZvcC0+ZHJtX2Rldikgewo+ICsJCWlmIChj cnRjLT5zdGF0ZS0+ZW5hYmxlKQo+ICsJCQludW1fZW5hYmxlZF9jcnRjKys7Cj4gKwl9Cj4gKwo+ ICsJLyoKPiArCSAqIGlmIG51bV9lbmFibGVkX2NydGMgPSAxIG5vdywgaXQgbWVhbnMgMiB2b3Ag ZW5hYmxlZAo+ICsJICogY2hhbmdlIHRvIDEgdm9wIGVuYWJsZWQgIG5lZWQgdG8gZW5hYmxlIGRt YyBhZ2Fpbi4KPiArCSAqLwo+ICsJaWYgKChudW1fZW5hYmxlZF9jcnRjID09IDEpICYmIHZvcC0+ ZGV2ZnJlcSkgewo+ICsJCWlmICh2b3AtPmRldmZyZXFfZXZlbnRfZGV2KQo+ICsJCQlkZXZmcmVx X2V2ZW50X2VuYWJsZV9lZGV2KHZvcC0+ZGV2ZnJlcV9ldmVudF9kZXYpOwo+ICsJCWRldmZyZXFf cmVzdW1lX2RldmljZSh2b3AtPmRldmZyZXEpOwo+ICsJfQo+ICB9Cj4gIAo+ICBzdGF0aWMgdm9p ZCB2b3BfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSkKPiBAQCAtMTQwNiw2 ICsxNTAyLDggQEAgc3RhdGljIGludCB2b3BfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj dCBkZXZpY2UgKm1hc3Rlciwgdm9pZCAqZGF0YSkKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1f ZGV2ID0gZGF0YTsKPiAgCXN0cnVjdCB2b3AgKnZvcDsKPiAgCXN0cnVjdCByZXNvdXJjZSAqcmVz Owo+ICsJc3RydWN0IGRldmZyZXEgKmRldmZyZXE7Cj4gKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9k ZXYgKmV2ZW50X2RldjsKPiAgCXNpemVfdCBhbGxvY19zaXplOwo+ICAJaW50IHJldCwgaXJxOwo+ ICAKPiBAQCAtMTQ2Nyw2ICsxNTY1LDMwIEBAIHN0YXRpYyBpbnQgdm9wX2JpbmQoc3RydWN0IGRl dmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpCj4gIAkJcmV0dXJu IHJldDsKPiAgCj4gIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKPiArCj4gKwl2b3At PnBzcl9lbmFibGVkID0gZmFsc2U7Cj4gKwlJTklUX0RFTEFZRURfV09SSygmdm9wLT5wc3Jfd29y aywgdm9wX3Bzcl93b3JrKTsKPiArCj4gKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2b3AtPndhaXRf dm9wX3N3aXRjaF9xdWV1ZSk7Cj4gKwl2b3AtPnZvcF9zd2l0Y2hfc3RhdHVzID0gMDsKPiArCWlu aXRfd2FpdHF1ZXVlX2hlYWQoJnZvcC0+d2FpdF9kbWNfcXVldWUpOwo+ICsJdm9wLT5kbWNfaW5f cHJvY2VzcyA9IDA7Cj4gKwo+ICsJZGV2ZnJlcSA9IGRldmZyZXFfZ2V0X2RldmZyZXFfYnlfcGhh bmRsZShkZXYsIDApOwo+ICsJaWYgKElTX0VSUihkZXZmcmVxKSkKPiArCQlnb3RvIG91dDsKPiAr Cj4gKwl2b3AtPmRldmZyZXEgPSBkZXZmcmVxOwo+ICsJdm9wLT5kbWNfbmIubm90aWZpZXJfY2Fs bCA9IGRtY19ub3RpZnk7Cj4gKwlkZXZmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKHZvcC0+ZGV2ZnJl cSwgJnZvcC0+ZG1jX25iLAo+ICsJCQkJICBERVZGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwo+ ICsKPiArCWV2ZW50X2RldiA9IGRldmZyZXFfZXZlbnRfZ2V0X2VkZXZfYnlfcGhhbmRsZSh2b3At PmRldmZyZXEtPmRldi5wYXJlbnQsCj4gKwkJCQkJCSAgICAgIDApOwo+ICsJaWYgKElTX0VSUihl dmVudF9kZXYpKQo+ICsJCWdvdG8gb3V0Owo+ICsJdm9wLT5kZXZmcmVxX2V2ZW50X2RldiA9IGV2 ZW50X2RldjsKPiArb3V0Ogo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtcm9ja2NoaXAgbWFpbGlu ZyBsaXN0CkxpbnV4LXJvY2tjaGlwQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yb2NrY2hpcAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: cw00.choi@samsung.com (Chanwoo Choi) Date: Wed, 10 Aug 2016 14:07:39 +0900 Subject: [PATCH v5 8/8] drm/rockchip: Add dmc notifier in vop driver In-Reply-To: <1470799604-12877-9-git-send-email-hl@rock-chips.com> References: <1470799604-12877-1-git-send-email-hl@rock-chips.com> <1470799604-12877-9-git-send-email-hl@rock-chips.com> Message-ID: <57AAB69B.2000102@samsung.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Lin, Looks good to me about the devfreq/devfreq-event usage. [Usage of the devfreq/devfreq-event APIs] Reviewed-by: Chanwoo Choi Regards, Chanwoo Choi On 2016? 08? 10? 12:26, Lin Huang wrote: > when in ddr frequency scaling process, vop can not do > enable or disable operation, since dcf will base on vop vblank > time to do frequency scaling and need to get vop irq if there > have vop enabled. So need register to devfreq notifier, and we can > get the dmc status. Also, when there have two vop enabled, we need > to disable dmc, since dcf only base on one vop vblank time, so the > other panel will flicker when do ddr frequency scaling. > > Signed-off-by: Lin Huang > --- > Changes in v5: > - improve some nits > > Changes in v4: > - register notifier to devfreq_register_notifier > - use DEVFREQ_PRECHANGE and DEVFREQ_POSTCHANGE to get dmc status > - when two vop enable, disable dmc > - when two vop back to one vop, enable dmc > > Changes in v3: > - when do vop eanble/disable, dmc will wait until it finish > > Changes in v2: > - None > > Changes in v1: > - use wait_event instead usleep > > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 128 +++++++++++++++++++++++++++- > 1 file changed, 125 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index 31744fe..7ce3890 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -12,6 +12,8 @@ > * GNU General Public License for more details. > */ > > +#include > +#include > #include > #include > #include > @@ -118,6 +120,13 @@ struct vop { > > const struct vop_data *data; > > + struct devfreq *devfreq; > + struct devfreq_event_dev *devfreq_event_dev; > + struct notifier_block dmc_nb; > + int dmc_in_process; > + int vop_switch_status; > + wait_queue_head_t wait_dmc_queue; > + wait_queue_head_t wait_vop_switch_queue; > uint32_t *regsbak; > void __iomem *regs; > > @@ -428,21 +437,59 @@ static void vop_dsp_hold_valid_irq_disable(struct vop *vop) > spin_unlock_irqrestore(&vop->irq_lock, flags); > } > > +static int dmc_notify(struct notifier_block *nb, unsigned long event, > + void *data) > +{ > + struct vop *vop = container_of(nb, struct vop, dmc_nb); > + > + if (event == DEVFREQ_PRECHANGE) { > + /* > + * check if vop in enable or disable process, > + * if yes, wait until it finishes, use 200ms as > + * timeout. > + */ > + if (!wait_event_timeout(vop->wait_vop_switch_queue, > + !vop->vop_switch_status, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for vop swtich status\n"); > + vop->dmc_in_process = 1; > + } else if (event == DEVFREQ_POSTCHANGE) { > + vop->dmc_in_process = 0; > + wake_up(&vop->wait_dmc_queue); > + } > + > + return NOTIFY_OK; > +} > + > static void vop_enable(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > + int num_enabled_crtc = 0; > int ret; > > + if (vop->is_enabled) > + return; > + > + /* > + * if in dmc scaling frequency process, wait until it finishes > + * use 100ms as timeout time. > + */ > + if (!wait_event_timeout(vop->wait_dmc_queue, > + !vop->dmc_in_process, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for dmc when vop enable\n"); > + > + vop->vop_switch_status = 1; > ret = pm_runtime_get_sync(vop->dev); > if (ret < 0) { > dev_err(vop->dev, "failed to get pm runtime: %d\n", ret); > - return; > + goto err; > } > > ret = clk_enable(vop->hclk); > if (ret < 0) { > dev_err(vop->dev, "failed to enable hclk - %d\n", ret); > - return; > + goto err; > } > > ret = clk_enable(vop->dclk); > @@ -456,7 +503,6 @@ static void vop_enable(struct drm_crtc *crtc) > dev_err(vop->dev, "failed to enable aclk - %d\n", ret); > goto err_disable_dclk; > } > - > /* > * Slave iommu shares power, irq and clock with vop. It was associated > * automatically with this master device via common driver code. > @@ -485,6 +531,21 @@ static void vop_enable(struct drm_crtc *crtc) > > drm_crtc_vblank_on(crtc); > > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + > + /* check how many vop we use now */ > + drm_for_each_crtc(crtc, vop->drm_dev) { > + if (crtc->state->enable) > + num_enabled_crtc++; > + } > + > + /* if enable two vop, need to disable dmc */ > + if ((num_enabled_crtc > 1) && vop->devfreq) { > + if (vop->devfreq_event_dev) > + devfreq_event_disable_edev(vop->devfreq_event_dev); > + devfreq_suspend_device(vop->devfreq); > + } > return; > > err_disable_aclk: > @@ -493,16 +554,32 @@ err_disable_dclk: > clk_disable(vop->dclk); > err_disable_hclk: > clk_disable(vop->hclk); > +err: > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + return; > } > > static void vop_crtc_disable(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > + int num_enabled_crtc = 0; > int i; > > WARN_ON(vop->event); > > /* > + * if in dmc scaling frequency process, wait until it finish > + * use 100ms as timeout time. > + */ > + if (!wait_event_timeout(vop->wait_dmc_queue, > + !vop->dmc_in_process, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for dmc when vop disable\n"); > + > + vop->vop_switch_status = 1; > + > + /* > * We need to make sure that all windows are disabled before we > * disable that crtc. Otherwise we might try to scan from a destroyed > * buffer later. > @@ -559,6 +636,25 @@ static void vop_crtc_disable(struct drm_crtc *crtc) > > crtc->state->event = NULL; > } > + > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + > + /* check how many vop use now */ > + drm_for_each_crtc(crtc, vop->drm_dev) { > + if (crtc->state->enable) > + num_enabled_crtc++; > + } > + > + /* > + * if num_enabled_crtc = 1 now, it means 2 vop enabled > + * change to 1 vop enabled need to enable dmc again. > + */ > + if ((num_enabled_crtc == 1) && vop->devfreq) { > + if (vop->devfreq_event_dev) > + devfreq_event_enable_edev(vop->devfreq_event_dev); > + devfreq_resume_device(vop->devfreq); > + } > } > > static void vop_plane_destroy(struct drm_plane *plane) > @@ -1406,6 +1502,8 @@ static int vop_bind(struct device *dev, struct device *master, void *data) > struct drm_device *drm_dev = data; > struct vop *vop; > struct resource *res; > + struct devfreq *devfreq; > + struct devfreq_event_dev *event_dev; > size_t alloc_size; > int ret, irq; > > @@ -1467,6 +1565,30 @@ static int vop_bind(struct device *dev, struct device *master, void *data) > return ret; > > pm_runtime_enable(&pdev->dev); > + > + vop->psr_enabled = false; > + INIT_DELAYED_WORK(&vop->psr_work, vop_psr_work); > + > + init_waitqueue_head(&vop->wait_vop_switch_queue); > + vop->vop_switch_status = 0; > + init_waitqueue_head(&vop->wait_dmc_queue); > + vop->dmc_in_process = 0; > + > + devfreq = devfreq_get_devfreq_by_phandle(dev, 0); > + if (IS_ERR(devfreq)) > + goto out; > + > + vop->devfreq = devfreq; > + vop->dmc_nb.notifier_call = dmc_notify; > + devfreq_register_notifier(vop->devfreq, &vop->dmc_nb, > + DEVFREQ_TRANSITION_NOTIFIER); > + > + event_dev = devfreq_event_get_edev_by_phandle(vop->devfreq->dev.parent, > + 0); > + if (IS_ERR(event_dev)) > + goto out; > + vop->devfreq_event_dev = event_dev; > +out: > return 0; > } > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S941301AbcHJTTA (ORCPT ); Wed, 10 Aug 2016 15:19:00 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:44863 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934345AbcHJTSd (ORCPT ); Wed, 10 Aug 2016 15:18:33 -0400 MIME-version: 1.0 Content-type: text/plain; charset=UTF-8 X-AuditID: cbfee68d-f79286d000007a9a-96-57aab69ca56e Content-transfer-encoding: 8BIT Message-id: <57AAB69B.2000102@samsung.com> Date: Wed, 10 Aug 2016 14:07:39 +0900 From: Chanwoo Choi Organization: Samsung Electronics User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 To: Lin Huang , heiko@sntech.de Cc: myungjoo.ham@samsung.com, mark.yao@rock-chips.com, airlied@linux.ie, mturquette@baylibre.com, dbasehore@chromium.org, sboyd@codeaurora.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, dianders@chromium.org, linux-rockchip@lists.infradead.org, kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org, tixy@linaro.org, typ@rock-chips.com, sudeep.holla@arm.com, mark.rutland@arm.com, linux-pm@vger.kernel.org Subject: Re: [PATCH v5 8/8] drm/rockchip: Add dmc notifier in vop driver References: <1470799604-12877-1-git-send-email-hl@rock-chips.com> <1470799604-12877-9-git-send-email-hl@rock-chips.com> In-reply-to: <1470799604-12877-9-git-send-email-hl@rock-chips.com> X-Brightmail-Tracker: H4sIAAAAAAAAA02Sa0hTYRzGeXfOzo5D83Vqvk67aFgipc5br5RSgnTIDwl+MIrQZQcV75ta huWSAlNmppkxZdPoIjYwp6WEMRXBS87bysTbpoKZGUbepWVuFvntz/M88P898NCE4D5XSCem ZrKSVHGyO8Un1Q4BGSeq3tZF++onIJb393DwQmMrhXUv2in8cXWJwtsz37h443UvgXX5izys mR3hYv27KgovyzsB/mncJvDzz0Mc3PKojYOHesPx+J1aCm/0FZH4ZW8LiWtUBh6ufHX7jD2j VqoBszR6j8dUyoZIRl8s5zATI60U07xm5DKGoi4O0/gsjzEptCRT3FQHmOYRJcEsaw5GWl/i n77GJidmsxKf0Fh+wkBFPZn+OOTG1hMTkIE5n0JgRSMYgPSLBu7uvR8NTtVThYBPC2AtQPmm Pupf6M303b+GAqB6ZTHPbNhAO7RRNkUWApom4CHUOZxklgl4DJUqnxLmWwCNABVPXtmNe6H8 8k1gjpPQA8kGLQzUjqydH7W8soVu6NPGrCXiCC+iou4cs+wA/ZBuRcUxExCwjUCqrQcWAnvI INP2HNhF0wFkkDVYDCsYhppM3VyzgeA8jcoHpjlmg4QQrZV1WJgRPIA0bcRuR2fUXjtKlgAn xZ5miv/NFHuaVQOiDjiy6XHp0qvxEpG3VJwizUqN945LS9GAnYV8+D0nbwHjbac6AKSBu7UN E1IXLeCKs6U5KR0gcAfiISF0jEvbGVVqZozIP8gPBwYE+vudDA5yd7JxE25GCWC8OJNNYtl0 VhIjyUpmpR2AQ1sJZUBvVcPXJlaftfsuKhCtl9nbFvgaaWHUjNs5T51Hhazyq6r9smtV8GzY mDHKFd06fHOsoVSedNSWHBiKjTifkDHZJbwOer7EVYW6BOS+71sdCFdFZue7NC0khO0LMtSs /cotOa5W85z7I7S1WlJ5YXqlYpg9IlrXxI7pPIPzfriT0gSxyIuQSMV/AKKgFaYcAwAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrGKsWRmVeSWpSXmKPExsVy+t9jQd0521aFG/z9yGHRe+4kk8WrzXvY LM4uO8hmceXrezaL/49es1r82HCK2eJs0xt2i02Pr7FaXN41h83ic+8RRotPD/4zWyy9fpHJ YseUA0wWF0+5WtxuXMFm8eNMN4vF8lM7WCwWzr/PbjF7dZ2DsMeaeWsYPd7faGX3mN1wkcXj cl8vk8eda3vYPLZ/e8Dqcb/7OJPH5iX1Hn9n7Wfx6NuyitFj+7V5zB6fN8kF8EQ1MNpkpCam pBYppOYl56dk5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAP2opFCWmFMKFApI LC5W0rfDNCE0xE3XAqYxQtc3JAiux8gADSSsYcw4P309S8E024pfM/4yNjA+0+9i5OSQEDCR 2PqwhQ3CFpO4cG89kM3FISQwi1Fi/bw+dpAEr4CgxI/J91i6GDk4mAXkJY5cygYJMwuoS0ya t4gZxBYSeMAo0Xc3FqJcS6Jp6k9GkHIWAVWJhgtgq9iAwvtf3ABbxS+gKHH1x2OwElGBCInu E5UgYREBI4mzX+YzgVzALHCAWWL+r36wC4QFPCT+/n/GCHHaWUaJ+w0bwRKcAk4SW/6eYJ3A KDgLyaWzEC6dheTSBYzMqxglUguSC4qT0nMN81LL9YoTc4tL89L1kvNzNzGC09QzqR2MB3e5 H2IU4GBU4uGN8F4VLsSaWFZcmXuIUYKDWUmEt24rUIg3JbGyKrUoP76oNCe1+BCjKdCvE5ml RJPzgSk0ryTe0NjEzMjSyNzQwsjYXEmc9/H/dWFCAumJJanZqakFqUUwfUwcnFINjHwX/Da0 hSy/nvpdLvHFtueb0lk5/Ow32ob9zLRubZwSaz3zKduRn6eOHNLI47zsmfZetObHb72GLM8U fWGlfRvD7t/1/1sV1af5MP23aoN25j5N6zlzPq7a9N3qwp3HPoE+Mr/nHbDkjY/Yupn/XG+Q TKK5OuPlw8vsPWp7/8YebN8imVvVpcRSnJFoqMVcVJwIAE7/QbBpAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Lin, Looks good to me about the devfreq/devfreq-event usage. [Usage of the devfreq/devfreq-event APIs] Reviewed-by: Chanwoo Choi Regards, Chanwoo Choi On 2016년 08월 10일 12:26, Lin Huang wrote: > when in ddr frequency scaling process, vop can not do > enable or disable operation, since dcf will base on vop vblank > time to do frequency scaling and need to get vop irq if there > have vop enabled. So need register to devfreq notifier, and we can > get the dmc status. Also, when there have two vop enabled, we need > to disable dmc, since dcf only base on one vop vblank time, so the > other panel will flicker when do ddr frequency scaling. > > Signed-off-by: Lin Huang > --- > Changes in v5: > - improve some nits > > Changes in v4: > - register notifier to devfreq_register_notifier > - use DEVFREQ_PRECHANGE and DEVFREQ_POSTCHANGE to get dmc status > - when two vop enable, disable dmc > - when two vop back to one vop, enable dmc > > Changes in v3: > - when do vop eanble/disable, dmc will wait until it finish > > Changes in v2: > - None > > Changes in v1: > - use wait_event instead usleep > > drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 128 +++++++++++++++++++++++++++- > 1 file changed, 125 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > index 31744fe..7ce3890 100644 > --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c > @@ -12,6 +12,8 @@ > * GNU General Public License for more details. > */ > > +#include > +#include > #include > #include > #include > @@ -118,6 +120,13 @@ struct vop { > > const struct vop_data *data; > > + struct devfreq *devfreq; > + struct devfreq_event_dev *devfreq_event_dev; > + struct notifier_block dmc_nb; > + int dmc_in_process; > + int vop_switch_status; > + wait_queue_head_t wait_dmc_queue; > + wait_queue_head_t wait_vop_switch_queue; > uint32_t *regsbak; > void __iomem *regs; > > @@ -428,21 +437,59 @@ static void vop_dsp_hold_valid_irq_disable(struct vop *vop) > spin_unlock_irqrestore(&vop->irq_lock, flags); > } > > +static int dmc_notify(struct notifier_block *nb, unsigned long event, > + void *data) > +{ > + struct vop *vop = container_of(nb, struct vop, dmc_nb); > + > + if (event == DEVFREQ_PRECHANGE) { > + /* > + * check if vop in enable or disable process, > + * if yes, wait until it finishes, use 200ms as > + * timeout. > + */ > + if (!wait_event_timeout(vop->wait_vop_switch_queue, > + !vop->vop_switch_status, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for vop swtich status\n"); > + vop->dmc_in_process = 1; > + } else if (event == DEVFREQ_POSTCHANGE) { > + vop->dmc_in_process = 0; > + wake_up(&vop->wait_dmc_queue); > + } > + > + return NOTIFY_OK; > +} > + > static void vop_enable(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > + int num_enabled_crtc = 0; > int ret; > > + if (vop->is_enabled) > + return; > + > + /* > + * if in dmc scaling frequency process, wait until it finishes > + * use 100ms as timeout time. > + */ > + if (!wait_event_timeout(vop->wait_dmc_queue, > + !vop->dmc_in_process, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for dmc when vop enable\n"); > + > + vop->vop_switch_status = 1; > ret = pm_runtime_get_sync(vop->dev); > if (ret < 0) { > dev_err(vop->dev, "failed to get pm runtime: %d\n", ret); > - return; > + goto err; > } > > ret = clk_enable(vop->hclk); > if (ret < 0) { > dev_err(vop->dev, "failed to enable hclk - %d\n", ret); > - return; > + goto err; > } > > ret = clk_enable(vop->dclk); > @@ -456,7 +503,6 @@ static void vop_enable(struct drm_crtc *crtc) > dev_err(vop->dev, "failed to enable aclk - %d\n", ret); > goto err_disable_dclk; > } > - > /* > * Slave iommu shares power, irq and clock with vop. It was associated > * automatically with this master device via common driver code. > @@ -485,6 +531,21 @@ static void vop_enable(struct drm_crtc *crtc) > > drm_crtc_vblank_on(crtc); > > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + > + /* check how many vop we use now */ > + drm_for_each_crtc(crtc, vop->drm_dev) { > + if (crtc->state->enable) > + num_enabled_crtc++; > + } > + > + /* if enable two vop, need to disable dmc */ > + if ((num_enabled_crtc > 1) && vop->devfreq) { > + if (vop->devfreq_event_dev) > + devfreq_event_disable_edev(vop->devfreq_event_dev); > + devfreq_suspend_device(vop->devfreq); > + } > return; > > err_disable_aclk: > @@ -493,16 +554,32 @@ err_disable_dclk: > clk_disable(vop->dclk); > err_disable_hclk: > clk_disable(vop->hclk); > +err: > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + return; > } > > static void vop_crtc_disable(struct drm_crtc *crtc) > { > struct vop *vop = to_vop(crtc); > + int num_enabled_crtc = 0; > int i; > > WARN_ON(vop->event); > > /* > + * if in dmc scaling frequency process, wait until it finish > + * use 100ms as timeout time. > + */ > + if (!wait_event_timeout(vop->wait_dmc_queue, > + !vop->dmc_in_process, HZ / 5)) > + dev_warn(vop->dev, > + "Timeout waiting for dmc when vop disable\n"); > + > + vop->vop_switch_status = 1; > + > + /* > * We need to make sure that all windows are disabled before we > * disable that crtc. Otherwise we might try to scan from a destroyed > * buffer later. > @@ -559,6 +636,25 @@ static void vop_crtc_disable(struct drm_crtc *crtc) > > crtc->state->event = NULL; > } > + > + vop->vop_switch_status = 0; > + wake_up(&vop->wait_vop_switch_queue); > + > + /* check how many vop use now */ > + drm_for_each_crtc(crtc, vop->drm_dev) { > + if (crtc->state->enable) > + num_enabled_crtc++; > + } > + > + /* > + * if num_enabled_crtc = 1 now, it means 2 vop enabled > + * change to 1 vop enabled need to enable dmc again. > + */ > + if ((num_enabled_crtc == 1) && vop->devfreq) { > + if (vop->devfreq_event_dev) > + devfreq_event_enable_edev(vop->devfreq_event_dev); > + devfreq_resume_device(vop->devfreq); > + } > } > > static void vop_plane_destroy(struct drm_plane *plane) > @@ -1406,6 +1502,8 @@ static int vop_bind(struct device *dev, struct device *master, void *data) > struct drm_device *drm_dev = data; > struct vop *vop; > struct resource *res; > + struct devfreq *devfreq; > + struct devfreq_event_dev *event_dev; > size_t alloc_size; > int ret, irq; > > @@ -1467,6 +1565,30 @@ static int vop_bind(struct device *dev, struct device *master, void *data) > return ret; > > pm_runtime_enable(&pdev->dev); > + > + vop->psr_enabled = false; > + INIT_DELAYED_WORK(&vop->psr_work, vop_psr_work); > + > + init_waitqueue_head(&vop->wait_vop_switch_queue); > + vop->vop_switch_status = 0; > + init_waitqueue_head(&vop->wait_dmc_queue); > + vop->dmc_in_process = 0; > + > + devfreq = devfreq_get_devfreq_by_phandle(dev, 0); > + if (IS_ERR(devfreq)) > + goto out; > + > + vop->devfreq = devfreq; > + vop->dmc_nb.notifier_call = dmc_notify; > + devfreq_register_notifier(vop->devfreq, &vop->dmc_nb, > + DEVFREQ_TRANSITION_NOTIFIER); > + > + event_dev = devfreq_event_get_edev_by_phandle(vop->devfreq->dev.parent, > + 0); > + if (IS_ERR(event_dev)) > + goto out; > + vop->devfreq_event_dev = event_dev; > +out: > return 0; > } > >