From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: Re: [PATCH] drm/rockchip: vop: Correct enabled clocks during setup Date: Tue, 29 Sep 2015 18:58:07 +0800 Message-ID: <560A6EBF.4080902@rock-chips.com> References: <1443518893-28142-1-git-send-email-sjoerd.simons@collabora.co.uk> <560A600C.8060203@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <560A600C.8060203@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Sjoerd Simons , Mark Yao Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org CgpPbiAwOS8yOS8yMDE1IDA1OjU1IFBNLCBZYWtpciBZYW5nIHdyb3RlOgo+Cj4KPiBPbiAwOS8y OS8yMDE1IDA1OjI4IFBNLCBTam9lcmQgU2ltb25zIHdyb3RlOgo+PiBXaGVuIGRvaW5nIHRoZSBp bml0aWFsIHNldHVwIGJvdGggdGhlIGhjbGsgYW5kIHRoZSBhY2xrIG5lZWQgdG8gYmUKPj4gZW5h YmxlZCBvdGhlcndpc2UgdGhlIGJvYXJkIHdpbGwgc2ltcGx5IGhhbmcuIFRoaXMgb25seSBvY2N1 cnMgd2hlbgo+PiBidWlsZGluZyB0aGUgdm9wIGRyaXZlciBhcyBhIG1vZHVsZSwgd2hlbiBpdHMg YnVpbHQtaW4gdGhlIGluaXRpYWwgc2V0dXAKCkhtbS4uLiBNeSBwcmV2aW91cyB0ZXN0IHdhcyBi dWlsdC1pbiB0aGUgdm9wIGRyaXZlciwgYW5kIGp1c3Qgbm90aWNlIHRoYXQKeW91IHNheSBwcm9i bGVtIG9ubHkgb2NjdXJyZWQgd2hlbiBidWlsZGluZyB0aGUgdm9wIGRyaXZlciBhcyBtb2R1bGUu ClRoYXQncyB0byBzYXkgbXkgdGVzdCB3YXMgd3JvbmcsIHNvIEkgdHJ5IHRvIGRvIHRoZSByaWdo dCB0aGluZ3MuCgpCdXQgSSBmb3VuZCB0aGF0IHZvcCBkcml2ZXIgbW9kdWxlIGFuZCByb2NrY2hp cGRybSBkcml2ZXIgbW9kdWxlIGluCmRlcGVuZGVuY3kgY3ljbGVzLCBoZXJlIGFyZSB0aGUgYnVp bGQgbWVzc2FnZToKICAgICBkZXBtb2Q6IEVSUk9SOiBGb3VuZCAyIG1vZHVsZXMgaW4gZGVwZW5k ZW5jeSBjeWNsZXMhCiAgICAgZGVwbW9kOiBFUlJPUjogQ3ljbGUgZGV0ZWN0ZWQ6IHJvY2tjaGlw X2RybV92b3AgLT4gcm9ja2NoaXBkcm0gLT4gCnJvY2tjaGlwX2RybV92b3AKICAgICBNYWtlZmls ZToxMDU0OiByZWNpcGUgZm9yIHRhcmdldCAnX21vZGluc3RfcG9zdCcgZmFpbGVkCgpBbmQgcGFz dCBteSBNYWtlZmlsZToKdm9wLXkgOj0gcm9ja2NoaXBfZHJtX2Rydi5vIHJvY2tjaGlwX2RybV9m Yi5vIHJvY2tjaGlwX2RybV9mYmRldi5vIApyb2NrY2hpcF9kcm1fZ2VtLm8Kb2JqLW0gPSByb2Nr Y2hpcF9kcm1fdm9wLm8gdm9wLm8KClZlcnkgbGlrZSB0byBrbm93IGhvdyB5b3UgaGFuZGxlIHRo aXMgZGVwZW5kZW5jeSBjeWNsZXMgOikKClRoYW5rcywKLSBZYWtpcgoKPj4gaGFwcGVucyB0byBy dW4gYmVmb3JlIHRoZSBjbG9jayBmcmFtZXdvcmsgc2h1dHMgb2YgdW51c2VkIGNsb2Nrcwo+PiAo aW5jbHVkaW5nIHRoZSBhY2xrKS4KPj4KPj4gV2hpbGUgdGhlcmUgYWxzbyBzd2l0Y2ggdG8gZG9p bmcgcHJlcGFyZSBhbmQgZW5hYmxlIGluIG9uZSBzdGVwIHJhdGhlcgo+PiB0aGVuIHNlcGFyYXRl IHN0ZXBzIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQuCj4+Cj4+IFNpZ25l ZC1vZmYtYnk6IFNqb2VyZCBTaW1vbnMgPHNqb2VyZC5zaW1vbnNAY29sbGFib3JhLmNvLnVrPgo+ Cj4gTG9va3MgZ29vZCBhbmQgdGVzdCBvbiBjaHJvbWVvcy0zLjE0IHRyZWUsIG5vIHByb2JsZW0s IHNvCj4KPiBUZXN0ZWQtYnk6IFlha2lyIFlhbmcgPHlra0Byb2NrLWNoaXBzLmNvbT4KPgo+PiAt LS0KPj4KPj4gICBkcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jIHwg MzYgCj4+ICsrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICAgMSBmaWxlIGNoYW5nZWQs IDE0IGluc2VydGlvbnMoKyksIDIyIGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3AuYyAKPj4gYi9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvcm9ja2NoaXBfZHJtX3ZvcC5jCj4+IGluZGV4IDVkOGFlNWUuLjQ4NzE5 ZGYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9yb2NrY2hpcF9kcm1f dm9wLmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL3JvY2tjaGlwX2RybV92b3Au Ywo+PiBAQCAtMTU3NSwzMiArMTU3NSwyNSBAQCBzdGF0aWMgaW50IHZvcF9pbml0aWFsKHN0cnVj dCB2b3AgKnZvcCkKPj4gICAgICAgICAgIHJldHVybiBQVFJfRVJSKHZvcC0+ZGNsayk7Cj4+ICAg ICAgIH0KPj4gICAtICAgIHJldCA9IGNsa19wcmVwYXJlKHZvcC0+aGNsayk7Cj4+IC0gICAgaWYg KHJldCA8IDApIHsKPj4gLSAgICAgICAgZGV2X2Vycih2b3AtPmRldiwgImZhaWxlZCB0byBwcmVw YXJlIGhjbGtcbiIpOwo+PiAtICAgICAgICByZXR1cm4gcmV0Owo+PiAtICAgIH0KPj4gLQo+PiAg ICAgICByZXQgPSBjbGtfcHJlcGFyZSh2b3AtPmRjbGspOwo+PiAgICAgICBpZiAocmV0IDwgMCkg ewo+PiAgICAgICAgICAgZGV2X2Vycih2b3AtPmRldiwgImZhaWxlZCB0byBwcmVwYXJlIGRjbGtc biIpOwo+PiAtICAgICAgICBnb3RvIGVycl91bnByZXBhcmVfaGNsazsKPj4gKyAgICAgICAgcmV0 dXJuIHJldDsKPj4gICAgICAgfQo+PiAgIC0gICAgcmV0ID0gY2xrX3ByZXBhcmUodm9wLT5hY2xr KTsKPj4gKyAgICAvKiBFbmFibGUgYm90aCB0aGUgaGNsayBhbmQgYWNsayB0byBzZXR1cCB0aGUg dm9wICovCj4+ICsgICAgcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHZvcC0+aGNsayk7Cj4+ICAg ICAgIGlmIChyZXQgPCAwKSB7Cj4+IC0gICAgICAgIGRldl9lcnIodm9wLT5kZXYsICJmYWlsZWQg dG8gcHJlcGFyZSBhY2xrXG4iKTsKPj4gKyAgICAgICAgZGV2X2Vycih2b3AtPmRldiwgImZhaWxl ZCB0byBwcmVwYXJlL2VuYWJsZSBoY2xrXG4iKTsKPj4gICAgICAgICAgIGdvdG8gZXJyX3VucHJl cGFyZV9kY2xrOwo+PiAgICAgICB9Cj4+ICAgLSAgICAvKgo+PiAtICAgICAqIGVuYWJsZSBoY2xr LCBzbyB0aGF0IHdlIGNhbiBjb25maWcgdm9wIHJlZ2lzdGVyLgo+PiAtICAgICAqLwo+PiAtICAg IHJldCA9IGNsa19lbmFibGUodm9wLT5oY2xrKTsKPj4gKyAgICByZXQgPSBjbGtfcHJlcGFyZV9l bmFibGUodm9wLT5hY2xrKTsKPj4gICAgICAgaWYgKHJldCA8IDApIHsKPj4gLSAgICAgICAgZGV2 X2Vycih2b3AtPmRldiwgImZhaWxlZCB0byBwcmVwYXJlIGFjbGtcbiIpOwo+PiAtICAgICAgICBn b3RvIGVycl91bnByZXBhcmVfYWNsazsKPj4gKyAgICAgICAgZGV2X2Vycih2b3AtPmRldiwgImZh aWxlZCB0byBwcmVwYXJlL2VuYWJsZSBhY2xrXG4iKTsKPj4gKyAgICAgICAgZ290byBlcnJfZGlz YWJsZV9oY2xrOwo+PiAgICAgICB9Cj4+ICsKPj4gICAgICAgLyoKPj4gICAgICAgICogZG8gaGNs a19yZXNldCwgcmVzZXQgYWxsIHZvcCByZWdpc3RlcnMuCj4+ICAgICAgICAqLwo+PiBAQCAtMTYw OCw3ICsxNjAxLDcgQEAgc3RhdGljIGludCB2b3BfaW5pdGlhbChzdHJ1Y3Qgdm9wICp2b3ApCj4+ ICAgICAgIGlmIChJU19FUlIoYWhiX3JzdCkpIHsKPj4gICAgICAgICAgIGRldl9lcnIodm9wLT5k ZXYsICJmYWlsZWQgdG8gZ2V0IGFoYiByZXNldFxuIik7Cj4+ICAgICAgICAgICByZXQgPSBQVFJf RVJSKGFoYl9yc3QpOwo+PiAtICAgICAgICBnb3RvIGVycl9kaXNhYmxlX2hjbGs7Cj4+ICsgICAg ICAgIGdvdG8gZXJyX2Rpc2FibGVfYWNsazsKPj4gICAgICAgfQo+PiAgICAgICByZXNldF9jb250 cm9sX2Fzc2VydChhaGJfcnN0KTsKPj4gICAgICAgdXNsZWVwX3JhbmdlKDEwLCAyMCk7Cj4+IEBA IC0xNjM0LDI2ICsxNjI3LDI1IEBAIHN0YXRpYyBpbnQgdm9wX2luaXRpYWwoc3RydWN0IHZvcCAq dm9wKQo+PiAgICAgICBpZiAoSVNfRVJSKHZvcC0+ZGNsa19yc3QpKSB7Cj4+ICAgICAgICAgICBk ZXZfZXJyKHZvcC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBkY2xrIHJlc2V0XG4iKTsKPj4gICAgICAg ICAgIHJldCA9IFBUUl9FUlIodm9wLT5kY2xrX3JzdCk7Cj4+IC0gICAgICAgIGdvdG8gZXJyX3Vu cHJlcGFyZV9hY2xrOwo+PiArICAgICAgICBnb3RvIGVycl9kaXNhYmxlX2FjbGs7Cj4+ICAgICAg IH0KPj4gICAgICAgcmVzZXRfY29udHJvbF9hc3NlcnQodm9wLT5kY2xrX3JzdCk7Cj4+ICAgICAg IHVzbGVlcF9yYW5nZSgxMCwgMjApOwo+PiAgICAgICByZXNldF9jb250cm9sX2RlYXNzZXJ0KHZv cC0+ZGNsa19yc3QpOwo+PiAgICAgICAgIGNsa19kaXNhYmxlKHZvcC0+aGNsayk7Cj4+ICsgICAg Y2xrX2Rpc2FibGUodm9wLT5hY2xrKTsKPj4gICAgICAgICB2b3AtPmlzX2VuYWJsZWQgPSBmYWxz ZTsKPj4gICAgICAgICByZXR1cm4gMDsKPj4gICArZXJyX2Rpc2FibGVfYWNsazoKPj4gKyAgICBj bGtfZGlzYWJsZV91bnByZXBhcmUodm9wLT5hY2xrKTsKPj4gICBlcnJfZGlzYWJsZV9oY2xrOgo+ PiAtICAgIGNsa19kaXNhYmxlKHZvcC0+aGNsayk7Cj4+IC1lcnJfdW5wcmVwYXJlX2FjbGs6Cj4+ IC0gICAgY2xrX3VucHJlcGFyZSh2b3AtPmFjbGspOwo+PiArICAgIGNsa19kaXNhYmxlX3VucHJl cGFyZSh2b3AtPmhjbGspOwo+PiAgIGVycl91bnByZXBhcmVfZGNsazoKPj4gICAgICAgY2xrX3Vu cHJlcGFyZSh2b3AtPmRjbGspOwo+PiAtZXJyX3VucHJlcGFyZV9oY2xrOgo+PiAtICAgIGNsa191 bnByZXBhcmUodm9wLT5oY2xrKTsKPj4gICAgICAgcmV0dXJuIHJldDsKPj4gICB9Cj4KCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFp bGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: ykk@rock-chips.com (Yakir Yang) Date: Tue, 29 Sep 2015 18:58:07 +0800 Subject: [PATCH] drm/rockchip: vop: Correct enabled clocks during setup In-Reply-To: <560A600C.8060203@rock-chips.com> References: <1443518893-28142-1-git-send-email-sjoerd.simons@collabora.co.uk> <560A600C.8060203@rock-chips.com> Message-ID: <560A6EBF.4080902@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 09/29/2015 05:55 PM, Yakir Yang wrote: > > > On 09/29/2015 05:28 PM, Sjoerd Simons wrote: >> When doing the initial setup both the hclk and the aclk need to be >> enabled otherwise the board will simply hang. This only occurs when >> building the vop driver as a module, when its built-in the initial setup Hmm... My previous test was built-in the vop driver, and just notice that you say problem only occurred when building the vop driver as module. That's to say my test was wrong, so I try to do the right things. But I found that vop driver module and rockchipdrm driver module in dependency cycles, here are the build message: depmod: ERROR: Found 2 modules in dependency cycles! depmod: ERROR: Cycle detected: rockchip_drm_vop -> rockchipdrm -> rockchip_drm_vop Makefile:1054: recipe for target '_modinst_post' failed And past my Makefile: vop-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o rockchip_drm_gem.o obj-m = rockchip_drm_vop.o vop.o Very like to know how you handle this dependency cycles :) Thanks, - Yakir >> happens to run before the clock framework shuts of unused clocks >> (including the aclk). >> >> While there also switch to doing prepare and enable in one step rather >> then separate steps to reduce the amount of code required. >> >> Signed-off-by: Sjoerd Simons > > Looks good and test on chromeos-3.14 tree, no problem, so > > Tested-by: Yakir Yang > >> --- >> >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 36 >> +++++++++++------------------ >> 1 file changed, 14 insertions(+), 22 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> index 5d8ae5e..48719df 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> @@ -1575,32 +1575,25 @@ static int vop_initial(struct vop *vop) >> return PTR_ERR(vop->dclk); >> } >> - ret = clk_prepare(vop->hclk); >> - if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare hclk\n"); >> - return ret; >> - } >> - >> ret = clk_prepare(vop->dclk); >> if (ret < 0) { >> dev_err(vop->dev, "failed to prepare dclk\n"); >> - goto err_unprepare_hclk; >> + return ret; >> } >> - ret = clk_prepare(vop->aclk); >> + /* Enable both the hclk and aclk to setup the vop */ >> + ret = clk_prepare_enable(vop->hclk); >> if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare aclk\n"); >> + dev_err(vop->dev, "failed to prepare/enable hclk\n"); >> goto err_unprepare_dclk; >> } >> - /* >> - * enable hclk, so that we can config vop register. >> - */ >> - ret = clk_enable(vop->hclk); >> + ret = clk_prepare_enable(vop->aclk); >> if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare aclk\n"); >> - goto err_unprepare_aclk; >> + dev_err(vop->dev, "failed to prepare/enable aclk\n"); >> + goto err_disable_hclk; >> } >> + >> /* >> * do hclk_reset, reset all vop registers. >> */ >> @@ -1608,7 +1601,7 @@ static int vop_initial(struct vop *vop) >> if (IS_ERR(ahb_rst)) { >> dev_err(vop->dev, "failed to get ahb reset\n"); >> ret = PTR_ERR(ahb_rst); >> - goto err_disable_hclk; >> + goto err_disable_aclk; >> } >> reset_control_assert(ahb_rst); >> usleep_range(10, 20); >> @@ -1634,26 +1627,25 @@ static int vop_initial(struct vop *vop) >> if (IS_ERR(vop->dclk_rst)) { >> dev_err(vop->dev, "failed to get dclk reset\n"); >> ret = PTR_ERR(vop->dclk_rst); >> - goto err_unprepare_aclk; >> + goto err_disable_aclk; >> } >> reset_control_assert(vop->dclk_rst); >> usleep_range(10, 20); >> reset_control_deassert(vop->dclk_rst); >> clk_disable(vop->hclk); >> + clk_disable(vop->aclk); >> vop->is_enabled = false; >> return 0; >> +err_disable_aclk: >> + clk_disable_unprepare(vop->aclk); >> err_disable_hclk: >> - clk_disable(vop->hclk); >> -err_unprepare_aclk: >> - clk_unprepare(vop->aclk); >> + clk_disable_unprepare(vop->hclk); >> err_unprepare_dclk: >> clk_unprepare(vop->dclk); >> -err_unprepare_hclk: >> - clk_unprepare(vop->hclk); >> return ret; >> } > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934644AbbI2K6g (ORCPT ); Tue, 29 Sep 2015 06:58:36 -0400 Received: from lucky1.263xmail.com ([211.157.147.131]:54069 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934243AbbI2K62 (ORCPT ); Tue, 29 Sep 2015 06:58:28 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: linux-arm-kernel@lists.infradead.org X-SENDER-IP: 172.245.164.78 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <560A6EBF.4080902@rock-chips.com> Date: Tue, 29 Sep 2015 18:58:07 +0800 From: Yakir Yang User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Sjoerd Simons , Mark Yao CC: Heiko Stuebner , David Airlie , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH] drm/rockchip: vop: Correct enabled clocks during setup References: <1443518893-28142-1-git-send-email-sjoerd.simons@collabora.co.uk> <560A600C.8060203@rock-chips.com> In-Reply-To: <560A600C.8060203@rock-chips.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/29/2015 05:55 PM, Yakir Yang wrote: > > > On 09/29/2015 05:28 PM, Sjoerd Simons wrote: >> When doing the initial setup both the hclk and the aclk need to be >> enabled otherwise the board will simply hang. This only occurs when >> building the vop driver as a module, when its built-in the initial setup Hmm... My previous test was built-in the vop driver, and just notice that you say problem only occurred when building the vop driver as module. That's to say my test was wrong, so I try to do the right things. But I found that vop driver module and rockchipdrm driver module in dependency cycles, here are the build message: depmod: ERROR: Found 2 modules in dependency cycles! depmod: ERROR: Cycle detected: rockchip_drm_vop -> rockchipdrm -> rockchip_drm_vop Makefile:1054: recipe for target '_modinst_post' failed And past my Makefile: vop-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o rockchip_drm_gem.o obj-m = rockchip_drm_vop.o vop.o Very like to know how you handle this dependency cycles :) Thanks, - Yakir >> happens to run before the clock framework shuts of unused clocks >> (including the aclk). >> >> While there also switch to doing prepare and enable in one step rather >> then separate steps to reduce the amount of code required. >> >> Signed-off-by: Sjoerd Simons > > Looks good and test on chromeos-3.14 tree, no problem, so > > Tested-by: Yakir Yang > >> --- >> >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 36 >> +++++++++++------------------ >> 1 file changed, 14 insertions(+), 22 deletions(-) >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> index 5d8ae5e..48719df 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> @@ -1575,32 +1575,25 @@ static int vop_initial(struct vop *vop) >> return PTR_ERR(vop->dclk); >> } >> - ret = clk_prepare(vop->hclk); >> - if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare hclk\n"); >> - return ret; >> - } >> - >> ret = clk_prepare(vop->dclk); >> if (ret < 0) { >> dev_err(vop->dev, "failed to prepare dclk\n"); >> - goto err_unprepare_hclk; >> + return ret; >> } >> - ret = clk_prepare(vop->aclk); >> + /* Enable both the hclk and aclk to setup the vop */ >> + ret = clk_prepare_enable(vop->hclk); >> if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare aclk\n"); >> + dev_err(vop->dev, "failed to prepare/enable hclk\n"); >> goto err_unprepare_dclk; >> } >> - /* >> - * enable hclk, so that we can config vop register. >> - */ >> - ret = clk_enable(vop->hclk); >> + ret = clk_prepare_enable(vop->aclk); >> if (ret < 0) { >> - dev_err(vop->dev, "failed to prepare aclk\n"); >> - goto err_unprepare_aclk; >> + dev_err(vop->dev, "failed to prepare/enable aclk\n"); >> + goto err_disable_hclk; >> } >> + >> /* >> * do hclk_reset, reset all vop registers. >> */ >> @@ -1608,7 +1601,7 @@ static int vop_initial(struct vop *vop) >> if (IS_ERR(ahb_rst)) { >> dev_err(vop->dev, "failed to get ahb reset\n"); >> ret = PTR_ERR(ahb_rst); >> - goto err_disable_hclk; >> + goto err_disable_aclk; >> } >> reset_control_assert(ahb_rst); >> usleep_range(10, 20); >> @@ -1634,26 +1627,25 @@ static int vop_initial(struct vop *vop) >> if (IS_ERR(vop->dclk_rst)) { >> dev_err(vop->dev, "failed to get dclk reset\n"); >> ret = PTR_ERR(vop->dclk_rst); >> - goto err_unprepare_aclk; >> + goto err_disable_aclk; >> } >> reset_control_assert(vop->dclk_rst); >> usleep_range(10, 20); >> reset_control_deassert(vop->dclk_rst); >> clk_disable(vop->hclk); >> + clk_disable(vop->aclk); >> vop->is_enabled = false; >> return 0; >> +err_disable_aclk: >> + clk_disable_unprepare(vop->aclk); >> err_disable_hclk: >> - clk_disable(vop->hclk); >> -err_unprepare_aclk: >> - clk_unprepare(vop->aclk); >> + clk_disable_unprepare(vop->hclk); >> err_unprepare_dclk: >> clk_unprepare(vop->dclk); >> -err_unprepare_hclk: >> - clk_unprepare(vop->hclk); >> return ret; >> } >