From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko =?utf-8?q?St=C3=BCbner?= Subject: Re: [PATCH v3 5/7] clk: add basic Rockchip rk3066a clock support Date: Thu, 13 Jun 2013 00:45:41 +0200 Message-ID: <201306130045.41723.heiko@sntech.de> References: <201306111328.52679.heiko@sntech.de> <201306111331.31517.heiko@sntech.de> <20130611200610.8816.68285@quantum> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20130611200610.8816.68285@quantum> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: "devicetree-discuss" To: Mike Turquette Cc: Russell King , Seungwon Jeon , linux-mmc-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, "linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , Rob Herring , Jaehoon Chung , Andy Shevchenko , Grant Likely , Chris Ball , devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, "linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org" List-Id: linux-mmc@vger.kernel.org QW0gRGllbnN0YWcsIDExLiBKdW5pIDIwMTMsIDIyOjA2OjEwIHNjaHJpZWIgTWlrZSBUdXJxdWV0 dGU6Cj4gUXVvdGluZyBIZWlrbyBTdMO8Ym5lciAoMjAxMy0wNi0xMSAwNDozMTozMSkKPiAKPiA+ IFRoaXMgYWRkcyBiYXNpYyBzdXBwb3J0IGZvciBjbG9ja3Mgb24gUm9ja2NoaXAgcmszMDY2IFNv Q3MuCj4gPiBUaGUgY2xvY2sgaGFuZGxpbmcgdGhydSBzbWFsbCBkdCBub2RlcyBpcyBoZWF2aWx5 IGluc3BpcmVkIGJ5IHRoZQo+ID4gc3VueGkgY2xrIGNvZGUuCj4gPiAKPiA+IFRoZSBwbGxzIGFy ZSBjdXJyZW50bHkgcmVhZC1vbmx5LCBhcyB0aGVpciBzZXR0aW5nIG5lZWRzIG1vcmUKPiA+IGlu dmVzdGlnYXRpb24uIFRoaXMgYWxzbyByZXN1bHRzIGluIHNsb3cgY3B1IHNwZWVkcywgYXMgdGhl IGFwbGwgc3RhcnRzCj4gPiBhdCBhIGRlZmF1bHQgb2YgNjAwbWh6Lgo+ID4gCj4gPiBTaWduZWQt b2ZmLWJ5OiBIZWlrbyBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgo+ID4gLS0tCj4gPiAKPiA+ ICBhcmNoL2FybS9ib290L2R0cy9yazMwNjZhLWNsb2Nrcy5kdHNpICAgfCAgNDY3Cj4gPiAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+IAo+IEl0J3MgYmVzdCB0byBzZXBhcmF0ZSB0 aGUgRFQgZGF0YSBjaGFuZ2VzIGZyb20gdGhlIGNsb2NrIGRyaXZlci4gIFRoZQo+IG5ldyBkdHNp IGNhbiBiZSBhIHNlcGFyYXRlIHBhdGNoLgo+IAo+IEFsc28gdGhlIHJvY2tjaGlwIGNsb2NrIGJp bmRpbmdzIG5lZWQgdG8gYmUgZG9jdW1lbnRlZCBpbgo+IERvY3VtZW50YXRpb24vZGV2aWNldHJl ZS9iaW5kaW5ncy9jbG9jay4KPiAKPiA8c25pcD4KPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2Nsay9yb2NrY2hpcC9jbGstcm9ja2NoaXAtcGxsLmMKPiA+IGIvZHJpdmVycy9jbGsvcm9ja2No aXAvY2xrLXJvY2tjaGlwLXBsbC5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAw MDAwLi40NDU2NDQ1Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJzL2Nsay9yb2Nr Y2hpcC9jbGstcm9ja2NoaXAtcGxsLmMKPiA+IEBAIC0wLDAgKzEsMTMxIEBACj4gPiArLyoKPiA+ ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTMgTXVuZG9SZWFkZXIgUy5MLgo+ID4gKyAqIEF1dGhvcjog SGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5Cj4gPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKPiA+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ID4gKyAqIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gPiArICoKPiA+ICsgKiBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiA+ICsg KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgo+ID4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUKPiA+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgo+ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlIDxhc20vZGl2NjQu aD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pby5o Pgo+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvY2xrLXBy aXZhdGUuaD4KPiAKPiBOQUNLLiAgUGxlYXNlIHVzZSBjbGstcHJvdmlkZXIuaC4gIERvIHlvdSBy ZWFsbHkgbmVlZCBzb21ldGhpbmcgZnJvbQo+IGNsay1wcml2YXRlLmg/CgpvaywgY2xrLXByaXZh dGUgaXMgdW5uZWNlc3NhcnksIEknbGwgcmVtb3ZlIGl0CgpbLi4uXQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yb2NrY2hpcC5jCj4gPiBiL2RyaXZlcnMvY2xrL3Jv Y2tjaGlwL2Nsay1yb2NrY2hpcC5jIG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAw MDAwLi42NjBiMDBmCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJzL2Nsay9yb2Nr Y2hpcC9jbGstcm9ja2NoaXAuYwo+ID4gQEAgLTAsMCArMSwzMzAgQEAKPiA+ICsvKgo+ID4gKyAq IENvcHlyaWdodCAoYykgMjAxMyBNdW5kb1JlYWRlciBTLkwuCj4gPiArICogQXV0aG9yOiBIZWlr byBTdHVlYm5lciA8aGVpa29Ac250ZWNoLmRlPgo+ID4gKyAqCj4gPiArICogVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK PiA+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQo+ID4gKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCj4gPiArICogKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiA+ICsgKgo+ID4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ID4gKyAqIGJ1 dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5 IG9mCj4gPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZQo+ID4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCj4gPiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92 aWRlci5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KPiA+ICsjaW5jbHVkZSA8bGlu dXgvb2YuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgo+ID4gKwo+ID4gKyNp bmNsdWRlICJjbGstcm9ja2NoaXAtcGxsLmgiCj4gPiArCj4gPiArc3RhdGljIERFRklORV9TUElO TE9DSyhjbGtfbG9jayk7Cj4gPiArCj4gPiArc3RydWN0IHJvY2tjaGlwX3BsbF9kYXRhIHsKPiA+ ICsgICAgICAgaW50IG1vZGVfc2hpZnQ7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3Qgcm9ja2No aXBfcGxsX2RhdGEgcmszMDY2YV9hcGxsX2RhdGEgPSB7Cj4gPiArICAgICAgIC5tb2RlX3NoaWZ0 ID0gMCwKPiA+ICt9Owo+ID4gKwo+ID4gK3N0cnVjdCByb2NrY2hpcF9wbGxfZGF0YSByazMwNjZh X2RwbGxfZGF0YSA9IHsKPiA+ICsgICAgICAgLm1vZGVfc2hpZnQgPSA0LAo+ID4gK307Cj4gPiAr Cj4gPiArc3RydWN0IHJvY2tjaGlwX3BsbF9kYXRhIHJrMzA2NmFfY3BsbF9kYXRhID0gewo+ID4g KyAgICAgICAubW9kZV9zaGlmdCA9IDgsCj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3Qgcm9ja2No aXBfcGxsX2RhdGEgcmszMDY2YV9ncGxsX2RhdGEgPSB7Cj4gPiArICAgICAgIC5tb2RlX3NoaWZ0 ID0gMTIsCj4gPiArfTsKPiA+ICsKPiA+ICsvKiBNYXRjaGVzIGZvciBwbGxzICovCj4gPiArc3Rh dGljIGNvbnN0IF9faW5pdGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2xrX3BsbF9tYXRjaFtd ID0gewo+ID4gKyAgICAgICB7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzA2NmEtYXBsbCIs IC5kYXRhID0KPiA+ICZyazMwNjZhX2FwbGxfZGF0YSB9LCArICAgICAgIHsgLmNvbXBhdGlibGUg PSAicm9ja2NoaXAscmszMDY2YS1kcGxsIiwKPiA+IC5kYXRhID0gJnJrMzA2NmFfZHBsbF9kYXRh IH0sICsgICAgICAgeyAuY29tcGF0aWJsZSA9Cj4gPiAicm9ja2NoaXAscmszMDY2YS1jcGxsIiwg LmRhdGEgPSAmcmszMDY2YV9jcGxsX2RhdGEgfSwgKyAgICAgICB7Cj4gPiAuY29tcGF0aWJsZSA9 ICJyb2NrY2hpcCxyazMwNjZhLWdwbGwiLCAuZGF0YSA9ICZyazMwNjZhX2dwbGxfZGF0YSB9LCAr ICAKPiA+ICAgICB7fQo+ID4gK307Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgX19pbml0IHJvY2tj aGlwX3BsbF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByb2NrY2hpcF9wbGxfZGF0YSAqZGF0YSkK PiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBjbGsgKmNsazsKPiA+ICsgICAgICAgY29uc3QgY2hh ciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwo+ID4gKyAgICAgICBjb25zdCBjaGFyICpjbGtfcGFy ZW50Owo+ID4gKyAgICAgICB2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwo+ID4gKyAgICAgICB2b2lk IF9faW9tZW0gKnJlZ19tb2RlOwo+ID4gKyAgICAgICB1MzIgcmF0ZTsKPiA+ICsKPiA+ICsgICAg ICAgcmVnX2Jhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKPiA+ICsgICAgICAgcmVnX21vZGUgPSBv Zl9pb21hcChub2RlLCAxKTsKPiA+ICsKPiA+ICsgICAgICAgY2xrX3BhcmVudCA9IG9mX2Nsa19n ZXRfcGFyZW50X25hbWUobm9kZSwgMCk7Cj4gPiArCj4gPiArICAgICAgIHByX2RlYnVnKCIlczog YWRkaW5nICVzIGFzIGNoaWxkIG9mICVzXG4iLAo+ID4gKyAgICAgICAgICAgICAgIF9fZnVuY19f LCBjbGtfbmFtZSwgY2xrX3BhcmVudCk7Cj4gPiArCj4gPiArICAgICAgIGNsayA9IHJvY2tjaGlw X2Nsa19yZWdpc3Rlcl9yazN4X3BsbChjbGtfbmFtZSwgY2xrX3BhcmVudCwKPiA+IHJlZ19iYXNl LCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfbW9kZSwK PiA+IGRhdGEtPm1vZGVfc2hpZnQsICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCj4gPiAmY2xrX2xvY2spOwo+ID4gKyAgICAgICBpZiAoY2xrKSB7Cj4gPiArICAg ICAgICAgICAgICAgb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9n ZXQsIGNsayk7Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgLyogb3B0aW9uYWxseSBzZXQgYSB0 YXJnZXQgZnJlcXVlbmN5IGZvciB0aGUgcGxsICovCj4gPiArICAgICAgICAgICAgICAgaWYgKCFv Zl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKPiA+ICZyYXRlKSkg KyAgICAgICAgICAgICAgICAgICAgICAgY2xrX3NldF9yYXRlKGNsaywgcmF0ZSk7Cj4gPiArICAg ICAgIH0KPiA+ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsgKiBNdXggY2xvY2tzCj4gPiArICovCj4g PiArCj4gPiArc3RydWN0IHJvY2tjaGlwX211eF9kYXRhIHsKPiA+ICsgICAgICAgaW50IHNoaWZ0 Owo+ID4gKyAgICAgICBpbnQgd2lkdGg7Cj4gPiArfTsKPiA+ICsKPiA+ICsjZGVmaW5lIFJLX01V WChuLCBzLCB3KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAr c3RhdGljIGNvbnN0IF9faW5pdGNvbnN0IHN0cnVjdCByb2NrY2hpcF9tdXhfZGF0YSBuID0geyAg ICAgICAgXAo+ID4gKyAgICAgICAuc2hpZnQgPSBzLCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiArICAgICAgIC53aWR0aCA9IHcsICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKPiA+ICt9Cj4gPiArCj4gPiArUktfTVVYKGdwbGxfY3BsbF8xNV9t dXhfZGF0YSwgMTUsIDEpOwo+ID4gK1JLX01VWCh1YXJ0X211eF9kYXRhLCA4LCAyKTsKPiA+ICtS S19NVVgoY3B1X211eF9kYXRhLCA4LCAxKTsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgX19pbml0 Y29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbGtfbXV4X21hdGNoW10gPSB7Cj4gPiArICAgICAg IHsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmsyOTI4LWdwbGwtY3BsbC1iaXQxNS1tdXgiLAo+ ID4gKyAgICAgICAgICAgICAgIC5kYXRhID0gJmdwbGxfY3BsbF8xNV9tdXhfZGF0YSB9LAo+ID4g KyAgICAgICB7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMjkyOC11YXJ0LW11eCIsCj4gPiAr ICAgICAgICAgICAgICAgLmRhdGEgPSAmdWFydF9tdXhfZGF0YSB9LAo+ID4gKyAgICAgICB7IC5j b21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzA2Ni1jcHUtbXV4IiwKPiA+ICsgICAgICAgICAgICAg ICAuZGF0YSA9ICZjcHVfbXV4X2RhdGEgfSwKPiA+ICsgICAgICAge30KPiA+ICt9Owo+ID4gKwo+ ID4gK3N0YXRpYyB2b2lkIF9faW5pdCByb2NrY2hpcF9tdXhfY2xrX3NldHVwKHN0cnVjdCBkZXZp Y2Vfbm9kZSAqbm9kZSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHN0cnVjdCByb2NrY2hpcF9tdXhfZGF0YSAqZGF0YSkKPiA+ICt7Cj4gPiArICAgICAgIHN0 cnVjdCBjbGsgKmNsazsKPiA+ICsgICAgICAgY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5u YW1lOwo+ID4gKyAgICAgICB2b2lkIF9faW9tZW0gKnJlZzsKPiA+ICsgICAgICAgaW50IG1heF9w YXJlbnRzID0gKDEgPDwgZGF0YS0+d2lkdGgpOwo+ID4gKyAgICAgICBjb25zdCBjaGFyICpwYXJl bnRzW21heF9wYXJlbnRzXTsKPiA+ICsgICAgICAgaW50IGZsYWdzOwo+ID4gKyAgICAgICBpbnQg aSA9IDA7Cj4gPiArCj4gPiArICAgICAgIHJlZyA9IG9mX2lvbWFwKG5vZGUsIDApOwo+ID4gKwo+ ID4gKyAgICAgICB3aGlsZSAoaSA8IG1heF9wYXJlbnRzICYmCj4gPiArICAgICAgICAgICAgICAo cGFyZW50c1tpXSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobm9kZSwgaSkpICE9IE5VTEwpCj4g PiArICAgICAgICAgICAgICAgaSsrOwo+ID4gKwo+ID4gKyAgICAgICBmbGFncyA9IENMS19NVVhf SElXT1JEX01BU0s7Cj4gPiArCj4gPiArICAgICAgIGNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVM TCwgY2xrX25hbWUsIHBhcmVudHMsIGksIDAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVnLCBkYXRhLT5zaGlmdCwgZGF0YS0+d2lkdGgsCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZmxhZ3MsICZjbGtfbG9jayk7Cj4gPiArICAgICAgIGlmIChjbGspCj4g PiArICAgICAgICAgICAgICAgb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3Np bXBsZV9nZXQsIGNsayk7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICogRGl2aWRlciBjbG9j a3MKPiA+ICsgKi8KPiA+ICsKPiA+ICtzdHJ1Y3Qgcm9ja2NoaXBfZGl2X2RhdGEgewo+ID4gKyAg ICAgICBpbnQgc2hpZnQ7Cj4gPiArICAgICAgIGludCB3aWR0aDsKPiA+ICsgICAgICAgaW50IGZs YWdzOwo+ID4gKyAgICAgICBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSAqdGFibGU7Cj4gPiArfTsKPiA+ ICsKPiA+ICsjZGVmaW5lIFJLX0RJVihuLCBzLCB3LCBmLCB0KSAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+ID4gK3N0YXRpYyBjb25zdCBfX2luaXRjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfZGl2 X2RhdGEgbiA9IHsgICAgICAgIFwKPiA+ICsgICAgICAgLnNoaWZ0ID0gcywgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICAud2lkdGggPSB3LCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgIC5mbGFncyA9IGYsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgLnRhYmxlID0g dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gK30KPiA+ICsKPiA+ ICtSS19ESVYoY3B1X2Rpdl9kYXRhLCAwLCA1LCAwLCBOVUxMKTsKPiA+ICtSS19ESVYoYWNsa19w ZXJpcGhfZGl2X2RhdGEsIDAsIDUsIDAsIE5VTEwpOwo+ID4gK1JLX0RJVihhY2xrX2NwdV9kaXZf ZGF0YSwgMCwgMywgMCwgTlVMTCk7Cj4gPiArUktfRElWKGhjbGtfZGl2X2RhdGEsIDgsIDIsIENM S19ESVZJREVSX1BPV0VSX09GX1RXTywgTlVMTCk7Cj4gPiArUktfRElWKHBjbGtfZGl2X2RhdGEs IDEyLCAyLCBDTEtfRElWSURFUl9QT1dFUl9PRl9UV08sIE5VTEwpOwo+ID4gK1JLX0RJVihtbWNf ZGl2X2RhdGEsIDAsIDYsIENMS19ESVZJREVSX0VWRU4sIE5VTEwpOwo+ID4gK1JLX0RJVih1YXJ0 X2Rpdl9kYXRhLCAwLCA3LCAwLCBOVUxMKTsKPiA+ICsKPiA+ICtzdHJ1Y3QgY2xrX2Rpdl90YWJs ZSBjb3JlX3BlcmlwaF90YWJsZVtdID0gewo+ID4gKyAgICAgICB7IDAsIDIgfSwKPiA+ICsgICAg ICAgeyAxLCA0IH0sCj4gPiArICAgICAgIHsgMiwgOCB9LAo+ID4gKyAgICAgICB7IDMsIDE2IH0s Cj4gPiArICAgICAgIHsgMCwgMCB9LAo+ID4gK307Cj4gPiArUktfRElWKGNvcmVfcGVyaXBoX2Rp dl9kYXRhLCA2LCAyLCAwLCBjb3JlX3BlcmlwaF90YWJsZSk7Cj4gPiArCj4gPiArc3RhdGljIGNv bnN0IF9faW5pdGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2xrX2RpdmlkZXJfbWF0Y2hbXSA9 IHsKPiA+ICsgICAgICAgeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMwNjZhLWNwdS1kaXZp ZGVyIiwKPiA+ICsgICAgICAgICAgICAgICAuZGF0YSA9ICZjcHVfZGl2X2RhdGEgfSwKPiA+ICsg ICAgICAgeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMwNjZhLWNvcmUtcGVyaXBoLWRpdmlk ZXIiLAo+ID4gKyAgICAgICAgICAgICAgIC5kYXRhID0gJmNvcmVfcGVyaXBoX2Rpdl9kYXRhIH0s Cj4gPiArICAgICAgIHsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmsyOTI4LWFjbGstcGVyaXBo LWRpdmlkZXIiLAo+ID4gKyAgICAgICAgICAgICAgIC5kYXRhID0gJmFjbGtfcGVyaXBoX2Rpdl9k YXRhIH0sCj4gPiArICAgICAgIHsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMDY2YS1hY2xr LWNwdS1kaXZpZGVyIiwKPiA+ICsgICAgICAgICAgICAgICAuZGF0YSA9ICZhY2xrX2NwdV9kaXZf ZGF0YSB9LAo+ID4gKyAgICAgICB7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMjkyOC1oY2xr LWRpdmlkZXIiLAo+ID4gKyAgICAgICAgICAgICAgIC5kYXRhID0gJmhjbGtfZGl2X2RhdGEgfSwK PiA+ICsgICAgICAgeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtcGNsay1kaXZpZGVy IiwKPiA+ICsgICAgICAgICAgICAgICAuZGF0YSA9ICZwY2xrX2Rpdl9kYXRhIH0sCj4gPiArICAg ICAgIHsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmsyOTI4LW1tYy1kaXZpZGVyIiwKPiA+ICsg ICAgICAgICAgICAgICAuZGF0YSA9ICZtbWNfZGl2X2RhdGEgfSwKPiA+ICsgICAgICAgeyAuY29t cGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtdWFydC1kaXZpZGVyIiwKPiA+ICsgICAgICAgICAg ICAgICAuZGF0YSA9ICZ1YXJ0X2Rpdl9kYXRhIH0sCj4gPiArICAgICAgIHt9Cj4gPiArfTsKPiA+ ICsKPiA+ICtzdGF0aWMgdm9pZCBfX2luaXQgcm9ja2NoaXBfZGl2aWRlcl9jbGtfc2V0dXAoc3Ry dWN0IGRldmljZV9ub2RlICpub2RlLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCByb2NrY2hpcF9kaXZfZGF0YQo+ID4gKmRhdGEpICt7Cj4g PiArICAgICAgIHN0cnVjdCBjbGsgKmNsazsKPiA+ICsgICAgICAgY29uc3QgY2hhciAqY2xrX25h bWUgPSBub2RlLT5uYW1lOwo+ID4gKyAgICAgICBjb25zdCBjaGFyICpjbGtfcGFyZW50Owo+ID4g KyAgICAgICB2b2lkIF9faW9tZW0gKnJlZzsKPiA+ICsgICAgICAgaW50IGZsYWdzOwo+ID4gKwo+ ID4gKyAgICAgICByZWcgPSBvZl9pb21hcChub2RlLCAwKTsKPiA+ICsKPiA+ICsgICAgICAgY2xr X3BhcmVudCA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobm9kZSwgMCk7Cj4gPiArCj4gPiArICAg ICAgIGZsYWdzID0gZGF0YS0+ZmxhZ3M7Cj4gPiArICAgICAgIGZsYWdzIHw9IENMS19ESVZJREVS X0hJV09SRF9NQVNLOwo+ID4gKwo+ID4gKyAgICAgICBpZiAoZGF0YS0+dGFibGUpCj4gPiArICAg ICAgICAgICAgICAgY2xrID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgY2xrX25h bWUsCj4gPiBjbGtfcGFyZW50LCAwLCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByZWcsCj4gPiBkYXRhLT5zaGlmdCwgZGF0YS0+d2lkdGgsICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPiA+ICBmbGFncywgZGF0YS0+ dGFibGUsICZjbGtfbG9jayk7ICsgICAgICAgZWxzZQo+ID4gKyAgICAgICAgICAgICAgIGNsayA9 IGNsa19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsIGNsa19uYW1lLCBjbGtfcGFyZW50LCAwLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLCBkYXRh LT5zaGlmdCwKPiA+IGRhdGEtPndpZHRoLCArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBmbGFncywKPiA+ICZjbGtfbG9jayk7ICsgICAgICAgaWYgKGNsaykK PiA+ICsgICAgICAgICAgICAgICBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNf c2ltcGxlX2dldCwgY2xrKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsgKiBHYXRlIGNsb2Nr cwo+ID4gKyAqLwo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCByb2NrY2hpcF9nYXRlX2Ns a19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAgICAgICBz dHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Cj4gPiArICAgICAgIGNvbnN0IGNoYXIg KmNsa19wYXJlbnQ7Cj4gPiArICAgICAgIGNvbnN0IGNoYXIgKmNsa19uYW1lOwo+ID4gKyAgICAg ICB2b2lkIF9faW9tZW0gKnJlZzsKPiA+ICsgICAgICAgdm9pZCBfX2lvbWVtICpyZWdfaWR4Owo+ ID4gKyAgICAgICBpbnQgZmxhZ3M7Cj4gPiArICAgICAgIGludCBxdHk7Cj4gPiArICAgICAgIGlu dCByZWdfYml0Owo+ID4gKyAgICAgICBpbnQgY2xrZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5U Owo+ID4gKyAgICAgICBpbnQgaTsKPiA+ICsKPiA+ICsgICAgICAgcXR5ID0gb2ZfcHJvcGVydHlf Y291bnRfc3RyaW5ncyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIik7Cj4gPiArICAgICAgIGlm IChxdHkgPCAwKSB7Cj4gPiArICAgICAgICAgICAgICAgcHJfZXJyKCIlczogZXJyb3IgaW4gY2xv Y2stb3V0cHV0LW5hbWVzICVkXG4iLCBfX2Z1bmNfXywKPiA+IHF0eSk7ICsgICAgICAgICAgICAg ICByZXR1cm47Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYgKHF0eSA9PSAwKSB7 Cj4gPiArICAgICAgICAgICAgICAgcHJfaW5mbygiJXM6IG5vdGhpbmcgdG8gZG9cbiIsIF9fZnVu Y19fKTsKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ ICsgICAgICAgcmVnID0gb2ZfaW9tYXAobm9kZSwgMCk7Cj4gPiArCj4gPiArICAgICAgIGNsa19k YXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNsa19vbmVjZWxsX2RhdGEpLCBHRlBfS0VSTkVM KTsKPiA+ICsgICAgICAgaWYgKCFjbGtfZGF0YSkKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47 Cj4gPiArCj4gPiArICAgICAgIGNsa19kYXRhLT5jbGtzID0ga3phbGxvYyhxdHkgKiBzaXplb2Yo c3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7Cj4gPiArICAgICAgIGlmICghY2xrX2RhdGEtPmNs a3MpIHsKPiA+ICsgICAgICAgICAgICAgICBrZnJlZShjbGtfZGF0YSk7Cj4gPiArICAgICAgICAg ICAgICAgcmV0dXJuOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIGZsYWdzID0gQ0xL X0dBVEVfSElXT1JEX01BU0sgfCBDTEtfR0FURV9TRVRfVE9fRElTQUJMRTsKPiA+ICsKPiA+ICsg ICAgICAgZm9yIChpID0gMDsgaSA8IHF0eTsgaSsrKSB7Cj4gPiArICAgICAgICAgICAgICAgb2Zf cHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgJmNsa19u YW1lKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKiBpZ25vcmUgZW1wdHkgc2xvdHMgKi8K PiA+ICsgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgicmVzZXJ2ZWQiLCBjbGtfbmFtZSkpCj4g PiArICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiA+ICsKPiA+ICsgICAgICAgICAg ICAgICBjbGtfcGFyZW50ID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShub2RlLCBpKTsKPiA+ICsK PiA+ICsgICAgICAgICAgICAgICAvKiBrZWVwIGFsbCBnYXRlcyB1bnRvdWNoZWQgZm9yIG5vdyAq Lwo+ID4gKyAgICAgICAgICAgICAgIGNsa2ZsYWdzIHw9IENMS19JR05PUkVfVU5VU0VEOwo+ID4g Kwo+ID4gKyAgICAgICAgICAgICAgIHJlZ19pZHggPSByZWcgKyAoNCAqIChpIC8gMTYpKTsKPiA+ ICsgICAgICAgICAgICAgICByZWdfYml0ID0gKGkgJSAxNik7Cj4gPiArCj4gPiArICAgICAgICAg ICAgICAgY2xrX2RhdGEtPmNsa3NbaV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBjbGtfbmFt ZSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNsa19wYXJlbnQsCj4gPiBjbGtmbGFncywgKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnX2lkeCwKPiA+IHJlZ19iaXQsICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNs a19sb2NrKTsKPiA+ICsgICAgICAgICAgICAgICBXQVJOX09OKElTX0VSUihjbGtfZGF0YS0+Y2xr c1tpXSkpOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIGNsa19kYXRhLT5jbGtfbnVt ID0gcXR5Owo+ID4gKwo+ID4gKyAgICAgICBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Ns a19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGNv bnN0IF9faW5pdGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2xrX2dhdGVfbWF0Y2hbXSA9IHsK PiA+ICsgICAgICAgeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazI5MjgtZ2F0ZS1jbGsiIH0s Cj4gPiArICAgICAgIHt9Cj4gPiArfTsKPiA+ICsKPiA+ICt2b2lkIF9faW5pdCBvZl9yb2NrY2hp cF9jbGtfdGFibGVfY2xvY2tfc2V0dXAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZAo+ID4gKmNsa19tYXRjaCwgKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmZ1bmN0aW9uKQo+ID4g K3sKPiA+ICsgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucDsKPiA+ICsgICAgICAgY29uc3Qg c3RydWN0IGRpdl9kYXRhICpkYXRhOwo+ID4gKyAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkICptYXRjaDsKPiA+ICsgICAgICAgdm9pZCAoKnNldHVwX2Z1bmN0aW9uKShzdHJ1Y3QgZGV2 aWNlX25vZGUgKiwgY29uc3Qgdm9pZCAqKSA9Cj4gPiBmdW5jdGlvbjsgKwo+ID4gKyAgICAgICBm b3JfZWFjaF9tYXRjaGluZ19ub2RlKG5wLCBjbGtfbWF0Y2gpIHsKPiA+ICsgICAgICAgICAgICAg ICBtYXRjaCA9IG9mX21hdGNoX25vZGUoY2xrX21hdGNoLCBucCk7Cj4gPiArICAgICAgICAgICAg ICAgZGF0YSA9IG1hdGNoLT5kYXRhOwo+ID4gKyAgICAgICAgICAgICAgIHNldHVwX2Z1bmN0aW9u KG5wLCBkYXRhKTsKPiA+ICsgICAgICAgfQo+ID4gK30KPiAKPiBDYW4geW91IHVzZSBvZl9jbGtf aW5pdCBpbnN0ZWFkIG9mIHRoZSBhYm92ZSBmdW5jdGlvbj8KCkFzIGNhbiBiZSBzZWVuIGJlbG93 IEkgZGlkIHVzZSBDTEtfT0ZfREVDTEFSRSA6LSkgLiBUaGUgcmVhc29uIGZvciB0aGlzIApjaGVh dGluZyB3YXMgdG8gbm90IGludHJvZHVjZSBudW1lcm91cyBpbmRpdmlkdWFsIGNsb2NrcyB3aGVu IEkgd2FudCB0byByZW1vdmUgCmFsbCBvZiB0aGVtIGFnYWluLCBvbmNlIHlvdXIgZGl2aWRlciBh bmQgbXV4IGR0IHBhdGNoZXMgYXJlIHJlYWR5LCBiZWNhdXNlIHRoZSAKY2xvY2tzIGFib3ZlIGFu ZCBpbiB0aGUgZHQgZml0IHRoZSB1c2UtY2FzZSBvZiB0aG9zZSByZWFsbHkgd2VsbC4KClNvLCBJ J20gbm90IDEwMCUgc3VyZSBob3cgdG8gcHJvY2VlZCBoZXJlLCB1c2luZyBDTEtfT0ZfREVDTEFS RSBmb3IgZWFjaCAKaW5kaXZpZHVhbCBkaXZpZXIgYW5kIG11eCB3b3VsZCBuZWVkIHRoZSBjbG9j ayB0byBiZSBtYXRjaGVkIGFnYWluIHRvIGdldCB0aGUgCmNsb2NrIGRhdGEgW29yIHByb3ZpZGUg YW4gaW5pdCBmdW5jdGlvbiBmb3IgZWFjaCBjbG9ja10sIHdoaWNoIHNvbWVob3cgc2VlbXMgCm92 ZXJraWxsIGZvciBzdHVmZiB0aGF0IHdpbGwgYmUgaG9wZWZ1bGx5IGdvbmUgZm9yIDMuMTIoPykg d2hlbiB0aGUgbXV4IGFuZCAKZGl2aWRlciBjbG9ja3MgbWlnaHQgaGF2ZSB0aGVpciBvd24gZHQg c3VwcG9ydC4KCgpQYXJ0IG9mIG1lIHNpbXBseSB3YW50cyB0byB3YWl0IGZvciB0aGlzIC0gYnV0 IHJvY2tjaGlwIHN0dWZmIG1pZ2h0IGJlIHRvIGxhdGUgCmZvciAzLjExIGFueXdheSwgYXMgd2Un cmUgbmVhciByYzYuCgoKPiA+ICsKPiA+ICt2b2lkIF9faW5pdCByb2NrY2hpcF9pbml0X2Nsb2Nr cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCj4gPiArewo+ID4gKyAgICAgICBvZl9yb2NrY2hp cF9jbGtfdGFibGVfY2xvY2tfc2V0dXAoY2xrX3BsbF9tYXRjaCwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvY2tjaGlwX3BsbF9zZXR1cCk7Cj4gPiArCj4g PiArICAgICAgIG9mX3JvY2tjaGlwX2Nsa190YWJsZV9jbG9ja19zZXR1cChjbGtfbXV4X21hdGNo LAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9ja2NoaXBf bXV4X2Nsa19zZXR1cCk7Cj4gPiArCj4gPiArICAgICAgIG9mX3JvY2tjaGlwX2Nsa190YWJsZV9j bG9ja19zZXR1cChjbGtfZ2F0ZV9tYXRjaCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJvY2tjaGlwX2dhdGVfY2xrX3NldHVwKTsKPiA+ICsKPiA+ICsgICAg ICAgb2Zfcm9ja2NoaXBfY2xrX3RhYmxlX2Nsb2NrX3NldHVwKGNsa19kaXZpZGVyX21hdGNoLAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9ja2NoaXBfZGl2 aWRlcl9jbGtfc2V0dXApOwo+ID4gK30KPiA+ICtDTEtfT0ZfREVDTEFSRShyb2NrY2hpcF9jbG9j a3MsICJyb2NrY2hpcCxjbG9ja3MiLAo+ID4gcm9ja2NoaXBfaW5pdF9jbG9ja3MpOwoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZGV2aWNldHJlZS1kaXNj dXNzIG1haWxpbmcgbGlzdApkZXZpY2V0cmVlLWRpc2N1c3NAbGlzdHMub3psYWJzLm9yZwpodHRw czovL2xpc3RzLm96bGFicy5vcmcvbGlzdGluZm8vZGV2aWNldHJlZS1kaXNjdXNzCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: heiko@sntech.de (Heiko =?utf-8?q?St=C3=BCbner?=) Date: Thu, 13 Jun 2013 00:45:41 +0200 Subject: [PATCH v3 5/7] clk: add basic Rockchip rk3066a clock support In-Reply-To: <20130611200610.8816.68285@quantum> References: <201306111328.52679.heiko@sntech.de> <201306111331.31517.heiko@sntech.de> <20130611200610.8816.68285@quantum> Message-ID: <201306130045.41723.heiko@sntech.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Am Dienstag, 11. Juni 2013, 22:06:10 schrieb Mike Turquette: > Quoting Heiko St?bner (2013-06-11 04:31:31) > > > This adds basic support for clocks on Rockchip rk3066 SoCs. > > The clock handling thru small dt nodes is heavily inspired by the > > sunxi clk code. > > > > The plls are currently read-only, as their setting needs more > > investigation. This also results in slow cpu speeds, as the apll starts > > at a default of 600mhz. > > > > Signed-off-by: Heiko Stuebner > > --- > > > > arch/arm/boot/dts/rk3066a-clocks.dtsi | 467 > > +++++++++++++++++++++++++++++++ > > It's best to separate the DT data changes from the clock driver. The > new dtsi can be a separate patch. > > Also the rockchip clock bindings need to be documented in > Documentation/devicetree/bindings/clock. > > > > > diff --git a/drivers/clk/rockchip/clk-rockchip-pll.c > > b/drivers/clk/rockchip/clk-rockchip-pll.c new file mode 100644 > > index 0000000..4456445 > > --- /dev/null > > +++ b/drivers/clk/rockchip/clk-rockchip-pll.c > > @@ -0,0 +1,131 @@ > > +/* > > + * Copyright (c) 2013 MundoReader S.L. > > + * Author: Heiko Stuebner > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > NACK. Please use clk-provider.h. Do you really need something from > clk-private.h? ok, clk-private is unnecessary, I'll remove it [...] > > diff --git a/drivers/clk/rockchip/clk-rockchip.c > > b/drivers/clk/rockchip/clk-rockchip.c new file mode 100644 > > index 0000000..660b00f > > --- /dev/null > > +++ b/drivers/clk/rockchip/clk-rockchip.c > > @@ -0,0 +1,330 @@ > > +/* > > + * Copyright (c) 2013 MundoReader S.L. > > + * Author: Heiko Stuebner > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include "clk-rockchip-pll.h" > > + > > +static DEFINE_SPINLOCK(clk_lock); > > + > > +struct rockchip_pll_data { > > + int mode_shift; > > +}; > > + > > +struct rockchip_pll_data rk3066a_apll_data = { > > + .mode_shift = 0, > > +}; > > + > > +struct rockchip_pll_data rk3066a_dpll_data = { > > + .mode_shift = 4, > > +}; > > + > > +struct rockchip_pll_data rk3066a_cpll_data = { > > + .mode_shift = 8, > > +}; > > + > > +struct rockchip_pll_data rk3066a_gpll_data = { > > + .mode_shift = 12, > > +}; > > + > > +/* Matches for plls */ > > +static const __initconst struct of_device_id clk_pll_match[] = { > > + { .compatible = "rockchip,rk3066a-apll", .data = > > &rk3066a_apll_data }, + { .compatible = "rockchip,rk3066a-dpll", > > .data = &rk3066a_dpll_data }, + { .compatible = > > "rockchip,rk3066a-cpll", .data = &rk3066a_cpll_data }, + { > > .compatible = "rockchip,rk3066a-gpll", .data = &rk3066a_gpll_data }, + > > {} > > +}; > > + > > +static void __init rockchip_pll_setup(struct device_node *node, > > + struct rockchip_pll_data *data) > > +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + const char *clk_parent; > > + void __iomem *reg_base; > > + void __iomem *reg_mode; > > + u32 rate; > > + > > + reg_base = of_iomap(node, 0); > > + reg_mode = of_iomap(node, 1); > > + > > + clk_parent = of_clk_get_parent_name(node, 0); > > + > > + pr_debug("%s: adding %s as child of %s\n", > > + __func__, clk_name, clk_parent); > > + > > + clk = rockchip_clk_register_rk3x_pll(clk_name, clk_parent, > > reg_base, + reg_mode, > > data->mode_shift, + > > &clk_lock); > > + if (clk) { > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > + > > + /* optionally set a target frequency for the pll */ > > + if (!of_property_read_u32(node, "clock-frequency", > > &rate)) + clk_set_rate(clk, rate); > > + } > > +} > > + > > +/* > > + * Mux clocks > > + */ > > + > > +struct rockchip_mux_data { > > + int shift; > > + int width; > > +}; > > + > > +#define RK_MUX(n, s, w) \ > > +static const __initconst struct rockchip_mux_data n = { \ > > + .shift = s, \ > > + .width = w, \ > > +} > > + > > +RK_MUX(gpll_cpll_15_mux_data, 15, 1); > > +RK_MUX(uart_mux_data, 8, 2); > > +RK_MUX(cpu_mux_data, 8, 1); > > + > > +static const __initconst struct of_device_id clk_mux_match[] = { > > + { .compatible = "rockchip,rk2928-gpll-cpll-bit15-mux", > > + .data = &gpll_cpll_15_mux_data }, > > + { .compatible = "rockchip,rk2928-uart-mux", > > + .data = &uart_mux_data }, > > + { .compatible = "rockchip,rk3066-cpu-mux", > > + .data = &cpu_mux_data }, > > + {} > > +}; > > + > > +static void __init rockchip_mux_clk_setup(struct device_node *node, > > + struct rockchip_mux_data *data) > > +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + void __iomem *reg; > > + int max_parents = (1 << data->width); > > + const char *parents[max_parents]; > > + int flags; > > + int i = 0; > > + > > + reg = of_iomap(node, 0); > > + > > + while (i < max_parents && > > + (parents[i] = of_clk_get_parent_name(node, i)) != NULL) > > + i++; > > + > > + flags = CLK_MUX_HIWORD_MASK; > > + > > + clk = clk_register_mux(NULL, clk_name, parents, i, 0, > > + reg, data->shift, data->width, > > + flags, &clk_lock); > > + if (clk) > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > +} > > + > > +/* > > + * Divider clocks > > + */ > > + > > +struct rockchip_div_data { > > + int shift; > > + int width; > > + int flags; > > + struct clk_div_table *table; > > +}; > > + > > +#define RK_DIV(n, s, w, f, t) \ > > +static const __initconst struct rockchip_div_data n = { \ > > + .shift = s, \ > > + .width = w, \ > > + .flags = f, \ > > + .table = t, \ > > +} > > + > > +RK_DIV(cpu_div_data, 0, 5, 0, NULL); > > +RK_DIV(aclk_periph_div_data, 0, 5, 0, NULL); > > +RK_DIV(aclk_cpu_div_data, 0, 3, 0, NULL); > > +RK_DIV(hclk_div_data, 8, 2, CLK_DIVIDER_POWER_OF_TWO, NULL); > > +RK_DIV(pclk_div_data, 12, 2, CLK_DIVIDER_POWER_OF_TWO, NULL); > > +RK_DIV(mmc_div_data, 0, 6, CLK_DIVIDER_EVEN, NULL); > > +RK_DIV(uart_div_data, 0, 7, 0, NULL); > > + > > +struct clk_div_table core_periph_table[] = { > > + { 0, 2 }, > > + { 1, 4 }, > > + { 2, 8 }, > > + { 3, 16 }, > > + { 0, 0 }, > > +}; > > +RK_DIV(core_periph_div_data, 6, 2, 0, core_periph_table); > > + > > +static const __initconst struct of_device_id clk_divider_match[] = { > > + { .compatible = "rockchip,rk3066a-cpu-divider", > > + .data = &cpu_div_data }, > > + { .compatible = "rockchip,rk3066a-core-periph-divider", > > + .data = &core_periph_div_data }, > > + { .compatible = "rockchip,rk2928-aclk-periph-divider", > > + .data = &aclk_periph_div_data }, > > + { .compatible = "rockchip,rk3066a-aclk-cpu-divider", > > + .data = &aclk_cpu_div_data }, > > + { .compatible = "rockchip,rk2928-hclk-divider", > > + .data = &hclk_div_data }, > > + { .compatible = "rockchip,rk2928-pclk-divider", > > + .data = &pclk_div_data }, > > + { .compatible = "rockchip,rk2928-mmc-divider", > > + .data = &mmc_div_data }, > > + { .compatible = "rockchip,rk2928-uart-divider", > > + .data = &uart_div_data }, > > + {} > > +}; > > + > > +static void __init rockchip_divider_clk_setup(struct device_node *node, > > + struct rockchip_div_data > > *data) +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + const char *clk_parent; > > + void __iomem *reg; > > + int flags; > > + > > + reg = of_iomap(node, 0); > > + > > + clk_parent = of_clk_get_parent_name(node, 0); > > + > > + flags = data->flags; > > + flags |= CLK_DIVIDER_HIWORD_MASK; > > + > > + if (data->table) > > + clk = clk_register_divider_table(NULL, clk_name, > > clk_parent, 0, + reg, > > data->shift, data->width, + > > flags, data->table, &clk_lock); + else > > + clk = clk_register_divider(NULL, clk_name, clk_parent, 0, > > + reg, data->shift, > > data->width, + flags, > > &clk_lock); + if (clk) > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > +} > > + > > +/* > > + * Gate clocks > > + */ > > + > > +static void __init rockchip_gate_clk_setup(struct device_node *node, > > + void *data) > > +{ > > + struct clk_onecell_data *clk_data; > > + const char *clk_parent; > > + const char *clk_name; > > + void __iomem *reg; > > + void __iomem *reg_idx; > > + int flags; > > + int qty; > > + int reg_bit; > > + int clkflags = CLK_SET_RATE_PARENT; > > + int i; > > + > > + qty = of_property_count_strings(node, "clock-output-names"); > > + if (qty < 0) { > > + pr_err("%s: error in clock-output-names %d\n", __func__, > > qty); + return; > > + } > > + > > + if (qty == 0) { > > + pr_info("%s: nothing to do\n", __func__); > > + return; > > + } > > + > > + reg = of_iomap(node, 0); > > + > > + clk_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL); > > + if (!clk_data) > > + return; > > + > > + clk_data->clks = kzalloc(qty * sizeof(struct clk *), GFP_KERNEL); > > + if (!clk_data->clks) { > > + kfree(clk_data); > > + return; > > + } > > + > > + flags = CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE; > > + > > + for (i = 0; i < qty; i++) { > > + of_property_read_string_index(node, "clock-output-names", > > + i, &clk_name); > > + > > + /* ignore empty slots */ > > + if (!strcmp("reserved", clk_name)) > > + continue; > > + > > + clk_parent = of_clk_get_parent_name(node, i); > > + > > + /* keep all gates untouched for now */ > > + clkflags |= CLK_IGNORE_UNUSED; > > + > > + reg_idx = reg + (4 * (i / 16)); > > + reg_bit = (i % 16); > > + > > + clk_data->clks[i] = clk_register_gate(NULL, clk_name, > > + clk_parent, > > clkflags, + reg_idx, > > reg_bit, + flags, > > + &clk_lock); > > + WARN_ON(IS_ERR(clk_data->clks[i])); > > + } > > + > > + clk_data->clk_num = qty; > > + > > + of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); > > +} > > + > > +static const __initconst struct of_device_id clk_gate_match[] = { > > + { .compatible = "rockchip,rk2928-gate-clk" }, > > + {} > > +}; > > + > > +void __init of_rockchip_clk_table_clock_setup( > > + const struct of_device_id > > *clk_match, + void *function) > > +{ > > + struct device_node *np; > > + const struct div_data *data; > > + const struct of_device_id *match; > > + void (*setup_function)(struct device_node *, const void *) = > > function; + > > + for_each_matching_node(np, clk_match) { > > + match = of_match_node(clk_match, np); > > + data = match->data; > > + setup_function(np, data); > > + } > > +} > > Can you use of_clk_init instead of the above function? As can be seen below I did use CLK_OF_DECLARE :-) . The reason for this cheating was to not introduce numerous individual clocks when I want to remove all of them again, once your divider and mux dt patches are ready, because the clocks above and in the dt fit the use-case of those really well. So, I'm not 100% sure how to proceed here, using CLK_OF_DECLARE for each individual divier and mux would need the clock to be matched again to get the clock data [or provide an init function for each clock], which somehow seems overkill for stuff that will be hopefully gone for 3.12(?) when the mux and divider clocks might have their own dt support. Part of me simply wants to wait for this - but rockchip stuff might be to late for 3.11 anyway, as we're near rc6. > > + > > +void __init rockchip_init_clocks(struct device_node *node) > > +{ > > + of_rockchip_clk_table_clock_setup(clk_pll_match, > > + rockchip_pll_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_mux_match, > > + rockchip_mux_clk_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_gate_match, > > + rockchip_gate_clk_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_divider_match, > > + rockchip_divider_clk_setup); > > +} > > +CLK_OF_DECLARE(rockchip_clocks, "rockchip,clocks", > > rockchip_init_clocks); From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932238Ab3FLWp5 (ORCPT ); Wed, 12 Jun 2013 18:45:57 -0400 Received: from gloria.sntech.de ([95.129.55.99]:37337 "EHLO gloria.sntech.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758005Ab3FLWpy (ORCPT ); Wed, 12 Jun 2013 18:45:54 -0400 From: Heiko =?utf-8?q?St=C3=BCbner?= To: Mike Turquette Subject: Re: [PATCH v3 5/7] clk: add basic Rockchip rk3066a clock support Date: Thu, 13 Jun 2013 00:45:41 +0200 User-Agent: KMail/1.13.7 (Linux/3.2.0-3-686-pae; KDE/4.8.4; i686; ; ) Cc: "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Seungwon Jeon , Jaehoon Chung , Chris Ball , linux-mmc@vger.kernel.org, Grant Likely , Rob Herring , Linus Walleij , devicetree-discuss@lists.ozlabs.org, Russell King , Arnd Bergmann , Olof Johansson , Thomas Petazzoni , Andy Shevchenko References: <201306111328.52679.heiko@sntech.de> <201306111331.31517.heiko@sntech.de> <20130611200610.8816.68285@quantum> In-Reply-To: <20130611200610.8816.68285@quantum> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: 8bit Message-Id: <201306130045.41723.heiko@sntech.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Dienstag, 11. Juni 2013, 22:06:10 schrieb Mike Turquette: > Quoting Heiko Stübner (2013-06-11 04:31:31) > > > This adds basic support for clocks on Rockchip rk3066 SoCs. > > The clock handling thru small dt nodes is heavily inspired by the > > sunxi clk code. > > > > The plls are currently read-only, as their setting needs more > > investigation. This also results in slow cpu speeds, as the apll starts > > at a default of 600mhz. > > > > Signed-off-by: Heiko Stuebner > > --- > > > > arch/arm/boot/dts/rk3066a-clocks.dtsi | 467 > > +++++++++++++++++++++++++++++++ > > It's best to separate the DT data changes from the clock driver. The > new dtsi can be a separate patch. > > Also the rockchip clock bindings need to be documented in > Documentation/devicetree/bindings/clock. > > > > > diff --git a/drivers/clk/rockchip/clk-rockchip-pll.c > > b/drivers/clk/rockchip/clk-rockchip-pll.c new file mode 100644 > > index 0000000..4456445 > > --- /dev/null > > +++ b/drivers/clk/rockchip/clk-rockchip-pll.c > > @@ -0,0 +1,131 @@ > > +/* > > + * Copyright (c) 2013 MundoReader S.L. > > + * Author: Heiko Stuebner > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > NACK. Please use clk-provider.h. Do you really need something from > clk-private.h? ok, clk-private is unnecessary, I'll remove it [...] > > diff --git a/drivers/clk/rockchip/clk-rockchip.c > > b/drivers/clk/rockchip/clk-rockchip.c new file mode 100644 > > index 0000000..660b00f > > --- /dev/null > > +++ b/drivers/clk/rockchip/clk-rockchip.c > > @@ -0,0 +1,330 @@ > > +/* > > + * Copyright (c) 2013 MundoReader S.L. > > + * Author: Heiko Stuebner > > + * > > + * This program is free software; you can redistribute it and/or modify > > + * it under the terms of the GNU General Public License as published by > > + * the Free Software Foundation; either version 2 of the License, or > > + * (at your option) any later version. > > + * > > + * This program is distributed in the hope that it will be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > + > > +#include "clk-rockchip-pll.h" > > + > > +static DEFINE_SPINLOCK(clk_lock); > > + > > +struct rockchip_pll_data { > > + int mode_shift; > > +}; > > + > > +struct rockchip_pll_data rk3066a_apll_data = { > > + .mode_shift = 0, > > +}; > > + > > +struct rockchip_pll_data rk3066a_dpll_data = { > > + .mode_shift = 4, > > +}; > > + > > +struct rockchip_pll_data rk3066a_cpll_data = { > > + .mode_shift = 8, > > +}; > > + > > +struct rockchip_pll_data rk3066a_gpll_data = { > > + .mode_shift = 12, > > +}; > > + > > +/* Matches for plls */ > > +static const __initconst struct of_device_id clk_pll_match[] = { > > + { .compatible = "rockchip,rk3066a-apll", .data = > > &rk3066a_apll_data }, + { .compatible = "rockchip,rk3066a-dpll", > > .data = &rk3066a_dpll_data }, + { .compatible = > > "rockchip,rk3066a-cpll", .data = &rk3066a_cpll_data }, + { > > .compatible = "rockchip,rk3066a-gpll", .data = &rk3066a_gpll_data }, + > > {} > > +}; > > + > > +static void __init rockchip_pll_setup(struct device_node *node, > > + struct rockchip_pll_data *data) > > +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + const char *clk_parent; > > + void __iomem *reg_base; > > + void __iomem *reg_mode; > > + u32 rate; > > + > > + reg_base = of_iomap(node, 0); > > + reg_mode = of_iomap(node, 1); > > + > > + clk_parent = of_clk_get_parent_name(node, 0); > > + > > + pr_debug("%s: adding %s as child of %s\n", > > + __func__, clk_name, clk_parent); > > + > > + clk = rockchip_clk_register_rk3x_pll(clk_name, clk_parent, > > reg_base, + reg_mode, > > data->mode_shift, + > > &clk_lock); > > + if (clk) { > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > + > > + /* optionally set a target frequency for the pll */ > > + if (!of_property_read_u32(node, "clock-frequency", > > &rate)) + clk_set_rate(clk, rate); > > + } > > +} > > + > > +/* > > + * Mux clocks > > + */ > > + > > +struct rockchip_mux_data { > > + int shift; > > + int width; > > +}; > > + > > +#define RK_MUX(n, s, w) \ > > +static const __initconst struct rockchip_mux_data n = { \ > > + .shift = s, \ > > + .width = w, \ > > +} > > + > > +RK_MUX(gpll_cpll_15_mux_data, 15, 1); > > +RK_MUX(uart_mux_data, 8, 2); > > +RK_MUX(cpu_mux_data, 8, 1); > > + > > +static const __initconst struct of_device_id clk_mux_match[] = { > > + { .compatible = "rockchip,rk2928-gpll-cpll-bit15-mux", > > + .data = &gpll_cpll_15_mux_data }, > > + { .compatible = "rockchip,rk2928-uart-mux", > > + .data = &uart_mux_data }, > > + { .compatible = "rockchip,rk3066-cpu-mux", > > + .data = &cpu_mux_data }, > > + {} > > +}; > > + > > +static void __init rockchip_mux_clk_setup(struct device_node *node, > > + struct rockchip_mux_data *data) > > +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + void __iomem *reg; > > + int max_parents = (1 << data->width); > > + const char *parents[max_parents]; > > + int flags; > > + int i = 0; > > + > > + reg = of_iomap(node, 0); > > + > > + while (i < max_parents && > > + (parents[i] = of_clk_get_parent_name(node, i)) != NULL) > > + i++; > > + > > + flags = CLK_MUX_HIWORD_MASK; > > + > > + clk = clk_register_mux(NULL, clk_name, parents, i, 0, > > + reg, data->shift, data->width, > > + flags, &clk_lock); > > + if (clk) > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > +} > > + > > +/* > > + * Divider clocks > > + */ > > + > > +struct rockchip_div_data { > > + int shift; > > + int width; > > + int flags; > > + struct clk_div_table *table; > > +}; > > + > > +#define RK_DIV(n, s, w, f, t) \ > > +static const __initconst struct rockchip_div_data n = { \ > > + .shift = s, \ > > + .width = w, \ > > + .flags = f, \ > > + .table = t, \ > > +} > > + > > +RK_DIV(cpu_div_data, 0, 5, 0, NULL); > > +RK_DIV(aclk_periph_div_data, 0, 5, 0, NULL); > > +RK_DIV(aclk_cpu_div_data, 0, 3, 0, NULL); > > +RK_DIV(hclk_div_data, 8, 2, CLK_DIVIDER_POWER_OF_TWO, NULL); > > +RK_DIV(pclk_div_data, 12, 2, CLK_DIVIDER_POWER_OF_TWO, NULL); > > +RK_DIV(mmc_div_data, 0, 6, CLK_DIVIDER_EVEN, NULL); > > +RK_DIV(uart_div_data, 0, 7, 0, NULL); > > + > > +struct clk_div_table core_periph_table[] = { > > + { 0, 2 }, > > + { 1, 4 }, > > + { 2, 8 }, > > + { 3, 16 }, > > + { 0, 0 }, > > +}; > > +RK_DIV(core_periph_div_data, 6, 2, 0, core_periph_table); > > + > > +static const __initconst struct of_device_id clk_divider_match[] = { > > + { .compatible = "rockchip,rk3066a-cpu-divider", > > + .data = &cpu_div_data }, > > + { .compatible = "rockchip,rk3066a-core-periph-divider", > > + .data = &core_periph_div_data }, > > + { .compatible = "rockchip,rk2928-aclk-periph-divider", > > + .data = &aclk_periph_div_data }, > > + { .compatible = "rockchip,rk3066a-aclk-cpu-divider", > > + .data = &aclk_cpu_div_data }, > > + { .compatible = "rockchip,rk2928-hclk-divider", > > + .data = &hclk_div_data }, > > + { .compatible = "rockchip,rk2928-pclk-divider", > > + .data = &pclk_div_data }, > > + { .compatible = "rockchip,rk2928-mmc-divider", > > + .data = &mmc_div_data }, > > + { .compatible = "rockchip,rk2928-uart-divider", > > + .data = &uart_div_data }, > > + {} > > +}; > > + > > +static void __init rockchip_divider_clk_setup(struct device_node *node, > > + struct rockchip_div_data > > *data) +{ > > + struct clk *clk; > > + const char *clk_name = node->name; > > + const char *clk_parent; > > + void __iomem *reg; > > + int flags; > > + > > + reg = of_iomap(node, 0); > > + > > + clk_parent = of_clk_get_parent_name(node, 0); > > + > > + flags = data->flags; > > + flags |= CLK_DIVIDER_HIWORD_MASK; > > + > > + if (data->table) > > + clk = clk_register_divider_table(NULL, clk_name, > > clk_parent, 0, + reg, > > data->shift, data->width, + > > flags, data->table, &clk_lock); + else > > + clk = clk_register_divider(NULL, clk_name, clk_parent, 0, > > + reg, data->shift, > > data->width, + flags, > > &clk_lock); + if (clk) > > + of_clk_add_provider(node, of_clk_src_simple_get, clk); > > +} > > + > > +/* > > + * Gate clocks > > + */ > > + > > +static void __init rockchip_gate_clk_setup(struct device_node *node, > > + void *data) > > +{ > > + struct clk_onecell_data *clk_data; > > + const char *clk_parent; > > + const char *clk_name; > > + void __iomem *reg; > > + void __iomem *reg_idx; > > + int flags; > > + int qty; > > + int reg_bit; > > + int clkflags = CLK_SET_RATE_PARENT; > > + int i; > > + > > + qty = of_property_count_strings(node, "clock-output-names"); > > + if (qty < 0) { > > + pr_err("%s: error in clock-output-names %d\n", __func__, > > qty); + return; > > + } > > + > > + if (qty == 0) { > > + pr_info("%s: nothing to do\n", __func__); > > + return; > > + } > > + > > + reg = of_iomap(node, 0); > > + > > + clk_data = kzalloc(sizeof(struct clk_onecell_data), GFP_KERNEL); > > + if (!clk_data) > > + return; > > + > > + clk_data->clks = kzalloc(qty * sizeof(struct clk *), GFP_KERNEL); > > + if (!clk_data->clks) { > > + kfree(clk_data); > > + return; > > + } > > + > > + flags = CLK_GATE_HIWORD_MASK | CLK_GATE_SET_TO_DISABLE; > > + > > + for (i = 0; i < qty; i++) { > > + of_property_read_string_index(node, "clock-output-names", > > + i, &clk_name); > > + > > + /* ignore empty slots */ > > + if (!strcmp("reserved", clk_name)) > > + continue; > > + > > + clk_parent = of_clk_get_parent_name(node, i); > > + > > + /* keep all gates untouched for now */ > > + clkflags |= CLK_IGNORE_UNUSED; > > + > > + reg_idx = reg + (4 * (i / 16)); > > + reg_bit = (i % 16); > > + > > + clk_data->clks[i] = clk_register_gate(NULL, clk_name, > > + clk_parent, > > clkflags, + reg_idx, > > reg_bit, + flags, > > + &clk_lock); > > + WARN_ON(IS_ERR(clk_data->clks[i])); > > + } > > + > > + clk_data->clk_num = qty; > > + > > + of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); > > +} > > + > > +static const __initconst struct of_device_id clk_gate_match[] = { > > + { .compatible = "rockchip,rk2928-gate-clk" }, > > + {} > > +}; > > + > > +void __init of_rockchip_clk_table_clock_setup( > > + const struct of_device_id > > *clk_match, + void *function) > > +{ > > + struct device_node *np; > > + const struct div_data *data; > > + const struct of_device_id *match; > > + void (*setup_function)(struct device_node *, const void *) = > > function; + > > + for_each_matching_node(np, clk_match) { > > + match = of_match_node(clk_match, np); > > + data = match->data; > > + setup_function(np, data); > > + } > > +} > > Can you use of_clk_init instead of the above function? As can be seen below I did use CLK_OF_DECLARE :-) . The reason for this cheating was to not introduce numerous individual clocks when I want to remove all of them again, once your divider and mux dt patches are ready, because the clocks above and in the dt fit the use-case of those really well. So, I'm not 100% sure how to proceed here, using CLK_OF_DECLARE for each individual divier and mux would need the clock to be matched again to get the clock data [or provide an init function for each clock], which somehow seems overkill for stuff that will be hopefully gone for 3.12(?) when the mux and divider clocks might have their own dt support. Part of me simply wants to wait for this - but rockchip stuff might be to late for 3.11 anyway, as we're near rc6. > > + > > +void __init rockchip_init_clocks(struct device_node *node) > > +{ > > + of_rockchip_clk_table_clock_setup(clk_pll_match, > > + rockchip_pll_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_mux_match, > > + rockchip_mux_clk_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_gate_match, > > + rockchip_gate_clk_setup); > > + > > + of_rockchip_clk_table_clock_setup(clk_divider_match, > > + rockchip_divider_clk_setup); > > +} > > +CLK_OF_DECLARE(rockchip_clocks, "rockchip,clocks", > > rockchip_init_clocks);