From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lee Jones Subject: Re: [PATCH 01/17] ASoC: Ux500: Move MSP pinctrl setup into the MSP driver Date: Mon, 10 Sep 2012 17:46:29 +0100 Message-ID: <20120910164628.GG24506@gmail.com> References: <1345816913-4113-1-git-send-email-lee.jones@linaro.org> <1345816913-4113-2-git-send-email-lee.jones@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) by alsa0.perex.cz (Postfix) with ESMTP id 49700265127 for ; Mon, 10 Sep 2012 18:46:33 +0200 (CEST) Received: by eeke50 with SMTP id e50so1103711eek.38 for ; Mon, 10 Sep 2012 09:46:33 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1345816913-4113-2-git-send-email-lee.jones@linaro.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: ola.o.lilja@stericsson.com, alsa-devel@alsa-project.org, linus.walleij@stericsson.com, arnd@arndb.de, roger.xr.nilsson@stericsson.com, broonie@opensource.wolfsonmicro.com, STEricsson_nomadik_linux@list.st.com List-Id: alsa-devel@alsa-project.org T2xhIHBva2UuCgpPbiBGcmksIEF1ZyAyNCwgMjAxMiBhdCAwMzowMTozN1BNICswMTAwLCBMZWUg Sm9uZXMgd3JvdGU6Cj4gSW4gdGhlIGluaXRpYWwgc3VibWlzc2lvbiBvZiB0aGUgTVNQIGRyaXZl ciBtc3AxIGFuZCBtc3AzJ3MgYXNzb2NpYXRlZAo+IHBpbmN0cmwgbWVjaGFuaXNtIHdhcyBwYXNz ZWQgYmFjayB0byBwbGF0Zm9ybSBjb2RlIHVzaW5nIGEgcGxhdF9pbml0KCkKPiBjYWxsLWJhY2sg cm91dGluZSwgYnV0IGl0IGhhcyBubyBwbGFjZSBpbiBwbGF0Zm9ybSBjb2RlLiBUaGUgTVNQIGRy aXZlcgo+IHNob3VsZCBzZXQgdGhpcyB1cCBmb3IgdGhlIGFwcHJvcHJpYXRlIHBvcnRzLiBJbnN0 ZWFkIHdlIHVzZSBhIHVzZV9waW5jdHJsCj4gaWRlbnRpZmllciB3aGljaCBpcyBwYXNzZWQgZnJv bSBwbGF0Zm9ybV9kYXRhL0RldmljZSBUcmVlIHdoaWNoIGluZGljYXRlcwo+IHdoaWNoIHBvcnRz IHNob3VsZCB1c2UgcGluY3RybC4KPiAKPiBDQzogYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3Jn Cj4gU2lnbmVkLW9mZi1ieTogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4KPiAtLS0K PiAgYXJjaC9hcm0vbWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtbXNwLmMgfCAgIDc1ICstLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIGFyY2gvYXJtL21hY2gtdXg1MDAvaW5jbHVkZS9t YWNoL21zcC5oIHwgICAgMiAtCj4gIHNvdW5kL3NvYy91eDUwMC91eDUwMF9tc3BfaTJzLmMgICAg ICAgIHwgICA2NyArKysrKysrKysrKysrKysrKysrKystLS0tLS0tCj4gIHNvdW5kL3NvYy91eDUw MC91eDUwMF9tc3BfaTJzLmggICAgICAgIHwgICAgOCArKystCj4gIDQgZmlsZXMgY2hhbmdlZCwg NTggaW5zZXJ0aW9ucygrKSwgOTQgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2FyY2gv YXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLW1zcC5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9i b2FyZC1tb3A1MDAtbXNwLmMKPiBpbmRleCBkZjE1NjQ2Li5mYzc4ZDVkIDEwMDY0NAo+IC0tLSBh L2FyY2gvYXJtL21hY2gtdXg1MDAvYm9hcmQtbW9wNTAwLW1zcC5jCj4gKysrIGIvYXJjaC9hcm0v bWFjaC11eDUwMC9ib2FyZC1tb3A1MDAtbXNwLmMKPiBAQCAtMjMsNTMgKzIzLDYgQEAKPiAgI2lu Y2x1ZGUgImRldmljZXMtZGI4NTAwLmgiCj4gICNpbmNsdWRlICJwaW5zLWRiODUwMC5oIgo+ICAK PiAtLyogTVNQMS8zIFR4L1J4IHVzYWdlIHByb3RlY3Rpb24gKi8KPiAtc3RhdGljIERFRklORV9T UElOTE9DSyhtc3Bfcnh0eF9sb2NrKTsKPiAtCj4gLS8qIFJlZmVyZW5jZSBDb3VudCAqLwo+IC1z dGF0aWMgaW50IG1zcF9yeHR4X3JlZjsKPiAtCj4gLS8qIFBpbiBtb2RlcyAqLwo+IC1zdHJ1Y3Qg cGluY3RybCAqbXNwMV9wOwo+IC1zdHJ1Y3QgcGluY3RybF9zdGF0ZSAqbXNwMV9kZWY7Cj4gLXN0 cnVjdCBwaW5jdHJsX3N0YXRlICptc3AxX3NsZWVwOwo+IC0KPiAtaW50IG1zcDEzX2kyc19pbml0 KHZvaWQpCj4gLXsKPiAtCWludCByZXR2YWwgPSAwOwo+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsK PiAtCj4gLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNwX3J4dHhfbG9jaywgZmxhZ3MpOwo+IC0JaWYg KG1zcF9yeHR4X3JlZiA9PSAwICYmICEoSVNfRVJSKG1zcDFfcCkgfHwgSVNfRVJSKG1zcDFfZGVm KSkpIHsKPiAtCQlyZXR2YWwgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShtc3AxX3AsIG1zcDFfZGVm KTsKPiAtCQlpZiAocmV0dmFsKQo+IC0JCQlwcl9lcnIoImNvdWxkIG5vdCBzZXQgTVNQMSBkZWZz dGF0ZVxuIik7Cj4gLQl9Cj4gLQlpZiAoIXJldHZhbCkKPiAtCQltc3Bfcnh0eF9yZWYrKzsKPiAt CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zcF9yeHR4X2xvY2ssIGZsYWdzKTsKPiAtCj4gLQly ZXR1cm4gcmV0dmFsOwo+IC19Cj4gLQo+IC1pbnQgbXNwMTNfaTJzX2V4aXQodm9pZCkKPiAtewo+ IC0JaW50IHJldHZhbCA9IDA7Cj4gLQl1bnNpZ25lZCBsb25nIGZsYWdzOwo+IC0KPiAtCXNwaW5f bG9ja19pcnFzYXZlKCZtc3Bfcnh0eF9sb2NrLCBmbGFncyk7Cj4gLQlXQVJOX09OKCFtc3Bfcnh0 eF9yZWYpOwo+IC0JbXNwX3J4dHhfcmVmLS07Cj4gLQlpZiAobXNwX3J4dHhfcmVmID09IDAgJiYg IShJU19FUlIobXNwMV9wKSB8fCBJU19FUlIobXNwMV9zbGVlcCkpKSB7Cj4gLQkJcmV0dmFsID0g cGluY3RybF9zZWxlY3Rfc3RhdGUobXNwMV9wLCBtc3AxX3NsZWVwKTsKPiAtCQlpZiAocmV0dmFs KQo+IC0JCQlwcl9lcnIoImNvdWxkIG5vdCBzZXQgTVNQMSBzbGVlcHN0YXRlXG4iKTsKPiAtCX0K PiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zcF9yeHR4X2xvY2ssIGZsYWdzKTsKPiAtCj4g LQlyZXR1cm4gcmV0dmFsOwo+IC19Cj4gLQo+ICBzdGF0aWMgc3RydWN0IHN0ZWRtYTQwX2NoYW5f Y2ZnIG1zcDBfZG1hX3J4ID0gewo+ICAJLmhpZ2hfcHJpb3JpdHkgPSB0cnVlLAo+ICAJLmRpciA9 IFNURURNQTQwX1BFUklQSF9UT19NRU0sCj4gQEAgLTEzMiw4ICs4NSw2IEBAIHN0YXRpYyBzdHJ1 Y3QgbXNwX2kyc19wbGF0Zm9ybV9kYXRhIG1zcDFfcGxhdGZvcm1fZGF0YSA9IHsKPiAgCS5pZCA9 IE1TUF9JMlNfMSwKPiAgCS5tc3BfaTJzX2RtYV9yeCA9IE5VTEwsCj4gIAkubXNwX2kyc19kbWFf dHggPSAmbXNwMV9kbWFfdHgsCj4gLQkubXNwX2kyc19pbml0ID0gbXNwMTNfaTJzX2luaXQsCj4g LQkubXNwX2kyc19leGl0ID0gbXNwMTNfaTJzX2V4aXQsCj4gIH07Cj4gIAo+ICBzdGF0aWMgc3Ry dWN0IHN0ZWRtYTQwX2NoYW5fY2ZnIG1zcDJfZG1hX3J4ID0gewo+IEBAIC0yMTksNDcgKzE3MCwy MyBAQCBzdGF0aWMgc3RydWN0IG1zcF9pMnNfcGxhdGZvcm1fZGF0YSBtc3AzX3BsYXRmb3JtX2Rh dGEgPSB7Cj4gIAkuaWQJCT0gTVNQX0kyU18zLAo+ICAJLm1zcF9pMnNfZG1hX3J4CT0gJm1zcDFf ZG1hX3J4LAo+ICAJLm1zcF9pMnNfZG1hX3R4CT0gTlVMTCwKPiAtCS5tc3BfaTJzX2luaXQgPSBt c3AxM19pMnNfaW5pdCwKPiAtCS5tc3BfaTJzX2V4aXQgPSBtc3AxM19pMnNfZXhpdCwKPiAgfTsK PiAgCj4gIGludCBtb3A1MDBfbXNwX2luaXQoc3RydWN0IGRldmljZSAqcGFyZW50KQo+ICB7Cj4g LQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptc3AxOwo+IC0KPiAgCXByX2luZm8oIiVzOiBSZWdp c3RlciBwbGF0Zm9ybS1kZXZpY2UgJ3NuZC1zb2MtbW9wNTAwJy5cbiIsIF9fZnVuY19fKTsKPiAg CXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc25kX3NvY19tb3A1MDApOwo+ICAKPiAgCXByX2lu Zm8oIkluaXRpYWxpemUgTVNQIEkyUy1kZXZpY2VzLlxuIik7Cj4gIAlkYjg1MDBfYWRkX21zcF9p MnMocGFyZW50LCAwLCBVODUwMF9NU1AwX0JBU0UsIElSUV9EQjg1MDBfTVNQMCwKPiAgCQkJICAg Jm1zcDBfcGxhdGZvcm1fZGF0YSk7Cj4gLQltc3AxID0gZGI4NTAwX2FkZF9tc3BfaTJzKHBhcmVu dCwgMSwgVTg1MDBfTVNQMV9CQVNFLCBJUlFfREI4NTAwX01TUDEsCj4gKwlkYjg1MDBfYWRkX21z cF9pMnMocGFyZW50LCAxLCBVODUwMF9NU1AxX0JBU0UsIElSUV9EQjg1MDBfTVNQMSwKPiAgCQkJ ICAgJm1zcDFfcGxhdGZvcm1fZGF0YSk7Cj4gIAlkYjg1MDBfYWRkX21zcF9pMnMocGFyZW50LCAy LCBVODUwMF9NU1AyX0JBU0UsIElSUV9EQjg1MDBfTVNQMiwKPiAgCQkJICAgJm1zcDJfcGxhdGZv cm1fZGF0YSk7Cj4gIAlkYjg1MDBfYWRkX21zcF9pMnMocGFyZW50LCAzLCBVODUwMF9NU1AzX0JB U0UsIElSUV9EQjg1MDBfTVNQMSwKPiAgCQkJICAgJm1zcDNfcGxhdGZvcm1fZGF0YSk7Cj4gIAo+ IC0JLyogR2V0IHRoZSBwaW5jdHJsIGhhbmRsZSBmb3IgTVNQMSAqLwo+IC0JaWYgKG1zcDEpIHsK PiAtCQltc3AxX3AgPSBwaW5jdHJsX2dldCgmbXNwMS0+ZGV2KTsKPiAtCQlpZiAoSVNfRVJSKG1z cDFfcCkpCj4gLQkJCWRldl9lcnIoJm1zcDEtPmRldiwgImNvdWxkIG5vdCBnZXQgTVNQMSBwaW5j dHJsXG4iKTsKPiAtCQllbHNlIHsKPiAtCQkJbXNwMV9kZWYgPSBwaW5jdHJsX2xvb2t1cF9zdGF0 ZShtc3AxX3AsCj4gLQkJCQkJCQlQSU5DVFJMX1NUQVRFX0RFRkFVTFQpOwo+IC0JCQlpZiAoSVNf RVJSKG1zcDFfZGVmKSkgewo+IC0JCQkJZGV2X2VycigmbXNwMS0+ZGV2LAo+IC0JCQkJCSJjb3Vs ZCBub3QgZ2V0IE1TUDEgZGVmc3RhdGVcbiIpOwo+IC0JCQl9Cj4gLQkJCW1zcDFfc2xlZXAgPSBw aW5jdHJsX2xvb2t1cF9zdGF0ZShtc3AxX3AsCj4gLQkJCQkJCQkgIFBJTkNUUkxfU1RBVEVfU0xF RVApOwo+IC0JCQlpZiAoSVNfRVJSKG1zcDFfc2xlZXApKQo+IC0JCQkJZGV2X2VycigmbXNwMS0+ ZGV2LAo+IC0JCQkJCSJjb3VsZCBub3QgZ2V0IE1TUDEgaWRsZXN0YXRlXG4iKTsKPiAtCQl9Cj4g LQl9Cj4gLQo+ICAJcHJfaW5mbygiJXM6IFJlZ2lzdGVyIHBsYXRmb3JtLWRldmljZSAndXg1MDAt cGNtJ1xuIiwgX19mdW5jX18pOwo+ICAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ1eDUwMF9w Y20pOwo+ICAKPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRlL21hY2gv bXNwLmggYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9tc3AuaAo+IGluZGV4IDc5 OGJlMTkuLjNjYzcxNDIgMTAwNjQ0Cj4gLS0tIGEvYXJjaC9hcm0vbWFjaC11eDUwMC9pbmNsdWRl L21hY2gvbXNwLmgKPiArKysgYi9hcmNoL2FybS9tYWNoLXV4NTAwL2luY2x1ZGUvbWFjaC9tc3Au aAo+IEBAIC0yMiw4ICsyMiw2IEBAIHN0cnVjdCBtc3BfaTJzX3BsYXRmb3JtX2RhdGEgewo+ICAJ ZW51bSBtc3BfaTJzX2lkIGlkOwo+ICAJc3RydWN0IHN0ZWRtYTQwX2NoYW5fY2ZnICptc3BfaTJz X2RtYV9yeDsKPiAgCXN0cnVjdCBzdGVkbWE0MF9jaGFuX2NmZyAqbXNwX2kyc19kbWFfdHg7Cj4g LQlpbnQgKCptc3BfaTJzX2luaXQpICh2b2lkKTsKPiAtCWludCAoKm1zcF9pMnNfZXhpdCkgKHZv aWQpOwo+ICB9Owo+ICAKPiAgI2VuZGlmCj4gZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy91eDUwMC91 eDUwMF9tc3BfaTJzLmMgYi9zb3VuZC9zb2MvdXg1MDAvdXg1MDBfbXNwX2kycy5jCj4gaW5kZXgg MzZiZTExZS4uMDg4MTNjNSAxMDA2NDQKPiAtLS0gYS9zb3VuZC9zb2MvdXg1MDAvdXg1MDBfbXNw X2kycy5jCj4gKysrIGIvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9pMnMuYwo+IEBAIC0xNSw2 ICsxNSw3IEBACj4gIAo+ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gICNpbmNsdWRlIDxs aW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3Vt ZXIuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+Cj4gIAo+IEBAIC0yNSw2ICsyNiw5IEBACj4gIAo+ICAjaW5jbHVkZSAidXg1MDBfbXNwX2ky cy5oIgo+ICAKPiArLyogTVNQMS8zIFR4L1J4IHVzYWdlIHByb3RlY3Rpb24gKi8KPiArc3RhdGlj IERFRklORV9TUElOTE9DSyhtc3Bfcnh0eF9sb2NrKTsKPiArCj4gICAvKiBQcm90b2NvbCBkZXNj aXB0b3JzICovCj4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbXNwX3Byb3RkZXNjIHByb3RfZGVzY3Nb XSA9IHsKPiAgCXsgLyogSTJTICovCj4gQEAgLTM1MiwxNyArMzU2LDIzIEBAIHN0YXRpYyBpbnQg Y29uZmlndXJlX211bHRpY2hhbm5lbChzdHJ1Y3QgdXg1MDBfbXNwICptc3AsCj4gIAo+ICBzdGF0 aWMgaW50IGVuYWJsZV9tc3Aoc3RydWN0IHV4NTAwX21zcCAqbXNwLCBzdHJ1Y3QgdXg1MDBfbXNw X2NvbmZpZyAqY29uZmlnKQo+ICB7Cj4gLQlpbnQgc3RhdHVzID0gMDsKPiArCWludCBzdGF0dXMg PSAwLCByZXR2YWwgPSAwOwo+ICAJdTMyIHJlZ192YWxfRE1BQ1IsIHJlZ192YWxfR0NSOwo+ICsJ dW5zaWduZWQgbG9uZyBmbGFnczsKPiAgCj4gIAkvKiBDaGVjayBtc3Agc3RhdGUgd2hldGhlciBp biBSVU4gb3IgQ09ORklHVVJFRCBNb2RlICovCj4gLQlpZiAoKG1zcC0+bXNwX3N0YXRlID09IE1T UF9TVEFURV9JRExFKSAmJiAobXNwLT5wbGF0X2luaXQpKSB7Cj4gLQkJc3RhdHVzID0gbXNwLT5w bGF0X2luaXQoKTsKPiAtCQlpZiAoc3RhdHVzKSB7Cj4gLQkJCWRldl9lcnIobXNwLT5kZXYsICIl czogRVJST1I6IEZhaWxlZCB0byBpbml0IE1TUCAoJWQpIVxuIiwKPiAtCQkJCV9fZnVuY19fLCBz dGF0dXMpOwo+IC0JCQlyZXR1cm4gc3RhdHVzOwo+ICsJaWYgKG1zcC0+bXNwX3N0YXRlID09IE1T UF9TVEFURV9JRExFKSB7Cj4gKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zcF9yeHR4X2xvY2ssIGZs YWdzKTsKPiArCQlpZiAobXNwLT5waW5jdHJsX3J4dHhfcmVmID09IDAgJiYKPiArCQkJIShJU19F UlIobXNwLT5waW5jdHJsX3ApIHx8IElTX0VSUihtc3AtPnBpbmN0cmxfZGVmKSkpIHsKPiArCQkJ cmV0dmFsID0gcGluY3RybF9zZWxlY3Rfc3RhdGUobXNwLT5waW5jdHJsX3AsCj4gKwkJCQkJCW1z cC0+cGluY3RybF9kZWYpOwo+ICsJCQlpZiAocmV0dmFsKQo+ICsJCQkJcHJfZXJyKCJjb3VsZCBu b3Qgc2V0IE1TUCBkZWZzdGF0ZVxuIik7Cj4gIAkJfQo+ICsJCWlmICghcmV0dmFsKQo+ICsJCQlt c3AtPnBpbmN0cmxfcnh0eF9yZWYrKzsKPiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc3Bf cnh0eF9sb2NrLCBmbGFncyk7Cj4gIAl9Cj4gIAo+ICAJLyogQ29uZmlndXJlIG1zcCB3aXRoIHBy b3RvY29sIGRlcGVuZGVudCBzZXR0aW5ncyAqLwo+IEBAIC02MjAsNyArNjMwLDggQEAgaW50IHV4 NTAwX21zcF9pMnNfdHJpZ2dlcihzdHJ1Y3QgdXg1MDBfbXNwICptc3AsIGludCBjbWQsIGludCBk aXJlY3Rpb24pCj4gIAo+ICBpbnQgdXg1MDBfbXNwX2kyc19jbG9zZShzdHJ1Y3QgdXg1MDBfbXNw ICptc3AsIHVuc2lnbmVkIGludCBkaXIpCj4gIHsKPiAtCWludCBzdGF0dXMgPSAwOwo+ICsJaW50 IHN0YXR1cyA9IDAsIHJldHZhbCA9IDA7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICAKPiAg CWRldl9kYmcobXNwLT5kZXYsICIlczogRW50ZXIgKGRpciA9IDB4JTAxeCkuXG4iLCBfX2Z1bmNf XywgZGlyKTsKPiAgCj4gQEAgLTYzMSwxMiArNjQyLDE5IEBAIGludCB1eDUwMF9tc3BfaTJzX2Ns b3NlKHN0cnVjdCB1eDUwMF9tc3AgKm1zcCwgdW5zaWduZWQgaW50IGRpcikKPiAgCQl3cml0ZWwo KHJlYWRsKG1zcC0+cmVnaXN0ZXJzICsgTVNQX0dDUikgJgo+ICAJCQkgICAgICAgKH4oRlJBTUVf R0VOX0VOQUJMRSB8IFNSR19FTkFCTEUpKSksCj4gIAkJCSAgICAgIG1zcC0+cmVnaXN0ZXJzICsg TVNQX0dDUik7Cj4gLQkJaWYgKG1zcC0+cGxhdF9leGl0KQo+IC0JCQlzdGF0dXMgPSBtc3AtPnBs YXRfZXhpdCgpOwo+IC0JCQlpZiAoc3RhdHVzKQo+IC0JCQkJZGV2X3dhcm4obXNwLT5kZXYsCj4g LQkJCQkJIiVzOiBXQVJOOiB1eDUwMF9tc3BfaTJzX2V4aXQgZmFpbGVkICglZCkhXG4iLAo+IC0J CQkJCV9fZnVuY19fLCBzdGF0dXMpOwo+ICsKPiArCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNwX3J4 dHhfbG9jaywgZmxhZ3MpOwo+ICsJCVdBUk5fT04oIW1zcC0+cGluY3RybF9yeHR4X3JlZik7Cj4g KwkJbXNwLT5waW5jdHJsX3J4dHhfcmVmLS07Cj4gKwkJaWYgKG1zcC0+cGluY3RybF9yeHR4X3Jl ZiA9PSAwICYmCj4gKwkJCSEoSVNfRVJSKG1zcC0+cGluY3RybF9wKSB8fCBJU19FUlIobXNwLT5w aW5jdHJsX3NsZWVwKSkpIHsKPiArCQkJcmV0dmFsID0gcGluY3RybF9zZWxlY3Rfc3RhdGUobXNw LT5waW5jdHJsX3AsCj4gKwkJCQkJCW1zcC0+cGluY3RybF9zbGVlcCk7Cj4gKwkJCWlmIChyZXR2 YWwpCj4gKwkJCQlwcl9lcnIoImNvdWxkIG5vdCBzZXQgTVNQIHNsZWVwc3RhdGVcbiIpOwo+ICsJ CX0KPiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc3Bfcnh0eF9sb2NrLCBmbGFncyk7Cj4g Kwo+ICAJCXdyaXRlbCgwLCBtc3AtPnJlZ2lzdGVycyArIE1TUF9HQ1IpOwo+ICAJCXdyaXRlbCgw LCBtc3AtPnJlZ2lzdGVycyArIE1TUF9UQ0YpOwo+ICAJCXdyaXRlbCgwLCBtc3AtPnJlZ2lzdGVy cyArIE1TUF9SQ0YpOwo+IEBAIC02NzgsOCArNjk2LDYgQEAgaW50IHV4NTAwX21zcF9pMnNfaW5p dF9tc3Aoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiAgCj4gIAltc3AtPmlkID0gcGxh dGZvcm1fZGF0YS0+aWQ7Cj4gIAltc3AtPmRldiA9ICZwZGV2LT5kZXY7Cj4gLQltc3AtPnBsYXRf aW5pdCA9IHBsYXRmb3JtX2RhdGEtPm1zcF9pMnNfaW5pdDsKPiAtCW1zcC0+cGxhdF9leGl0ID0g cGxhdGZvcm1fZGF0YS0+bXNwX2kyc19leGl0Owo+ICAJbXNwLT5kbWFfY2ZnX3J4ID0gcGxhdGZv cm1fZGF0YS0+bXNwX2kyc19kbWFfcng7Cj4gIAltc3AtPmRtYV9jZmdfdHggPSBwbGF0Zm9ybV9k YXRhLT5tc3BfaTJzX2RtYV90eDsKPiAgCj4gQEAgLTcxNyw2ICs3MzMsMjUgQEAgaW50IHV4NTAw X21zcF9pMnNfaW5pdF9tc3Aoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPiAgCWRldl9k YmcoJnBkZXYtPmRldiwgIkkyUyBkZXZpY2UtbmFtZTogJyVzJ1xuIiwgaTJzX2NvbnQtPm5hbWUp Owo+ICAJbXNwLT5pMnNfY29udCA9IGkyc19jb250Owo+ICAKPiArCW1zcC0+cGluY3RybF9wID0g cGluY3RybF9nZXQobXNwLT5kZXYpOwo+ICsJaWYgKElTX0VSUihtc3AtPnBpbmN0cmxfcCkpCj4g KwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBNU1AgcGluY3RybFxuIik7Cj4g KwllbHNlIHsKPiArCQltc3AtPnBpbmN0cmxfZGVmID0gcGluY3RybF9sb29rdXBfc3RhdGUobXNw LT5waW5jdHJsX3AsCj4gKwkJCQkJCVBJTkNUUkxfU1RBVEVfREVGQVVMVCk7Cj4gKwkJaWYgKElT X0VSUihtc3AtPnBpbmN0cmxfZGVmKSkgewo+ICsJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCj4gKwkJ CQkiY291bGQgbm90IGdldCBNU1AgZGVmc3RhdGUgKCVsaSlcbiIsCj4gKwkJCQlQVFJfRVJSKG1z cC0+cGluY3RybF9kZWYpKTsKPiArCQl9Cj4gKwkJbXNwLT5waW5jdHJsX3NsZWVwID0gcGluY3Ry bF9sb29rdXBfc3RhdGUobXNwLT5waW5jdHJsX3AsCj4gKwkJCQkJCVBJTkNUUkxfU1RBVEVfU0xF RVApOwo+ICsJCWlmIChJU19FUlIobXNwLT5waW5jdHJsX3NsZWVwKSkKPiArCQkJZGV2X2Vycigm cGRldi0+ZGV2LAo+ICsJCQkJImNvdWxkIG5vdCBnZXQgTVNQIGlkbGVzdGF0ZSAoJWxpKVxuIiwK PiArCQkJCVBUUl9FUlIobXNwLT5waW5jdHJsX2RlZikpOwo+ICsJfQo+ICsKPiAgCXJldHVybiAw Owo+ICAKPiAgZXJyX2kyc19jb250Ogo+IGRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdXg1MDAvdXg1 MDBfbXNwX2kycy5oIGIvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9pMnMuaAo+IGluZGV4IDJk OTEzNmQuLjEzMTFjMGQgMTAwNjQ0Cj4gLS0tIGEvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9p MnMuaAo+ICsrKyBiL3NvdW5kL3NvYy91eDUwMC91eDUwMF9tc3BfaTJzLmgKPiBAQCAtNTI0LDE0 ICs1MjQsMTggQEAgc3RydWN0IHV4NTAwX21zcCB7Cj4gIAlzdHJ1Y3QgZG1hX2NoYW4gKnJ4X3Bp cGVpZDsKPiAgCWVudW0gbXNwX3N0YXRlIG1zcF9zdGF0ZTsKPiAgCWludCAoKnRyYW5zZmVyKSAo c3RydWN0IHV4NTAwX21zcCAqbXNwLCBzdHJ1Y3QgaTJzX21lc3NhZ2UgKm1lc3NhZ2UpOwo+IC0J aW50ICgqcGxhdF9pbml0KSAodm9pZCk7Cj4gLQlpbnQgKCpwbGF0X2V4aXQpICh2b2lkKTsKPiAg CXN0cnVjdCB0aW1lcl9saXN0IG5vdGlmeV90aW1lcjsKPiAgCWludCBkZWZfZWxlbV9sZW47Cj4g IAl1bnNpZ25lZCBpbnQgZGlyX2J1c3k7Cj4gIAlpbnQgbG9vcGJhY2tfZW5hYmxlOwo+ICAJdTMy IGJhY2t1cF9yZWdzW01BWF9NU1BfQkFDS1VQX1JFR1NdOwo+ICAJdW5zaWduZWQgaW50IGZfYml0 Y2xrOwo+ICsJLyogUGluIG1vZGVzICovCj4gKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybF9wOwo+ ICsJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnBpbmN0cmxfZGVmOwo+ICsJc3RydWN0IHBpbmN0cmxf c3RhdGUgKnBpbmN0cmxfc2xlZXA7Cj4gKwkvKiBSZWZlcmVuY2UgQ291bnQgKi8KPiArCWludCBw aW5jdHJsX3J4dHhfcmVmOwo+ICB9Owo+ICAKPiAgc3RydWN0IHV4NTAwX21zcF9kbWFfcGFyYW1z IHsKPiAtLSAKPiAxLjcuOS41Cj4gCgotLSAKTGVlIEpvbmVzCkxpbmFybyBTVC1Fcmljc3NvbiBM YW5kaW5nIFRlYW0gTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBzb2Z0d2FyZSBmb3Ig QVJNIFNvQ3MKRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVyIHwgQmxvZwpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVsIG1haWxp bmcgbGlzdApBbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcKaHR0cDovL21haWxtYW4uYWxzYS1w cm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Fsc2EtZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: lee.jones@linaro.org (Lee Jones) Date: Mon, 10 Sep 2012 17:46:29 +0100 Subject: [PATCH 01/17] ASoC: Ux500: Move MSP pinctrl setup into the MSP driver In-Reply-To: <1345816913-4113-2-git-send-email-lee.jones@linaro.org> References: <1345816913-4113-1-git-send-email-lee.jones@linaro.org> <1345816913-4113-2-git-send-email-lee.jones@linaro.org> Message-ID: <20120910164628.GG24506@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Ola poke. On Fri, Aug 24, 2012 at 03:01:37PM +0100, Lee Jones wrote: > In the initial submission of the MSP driver msp1 and msp3's associated > pinctrl mechanism was passed back to platform code using a plat_init() > call-back routine, but it has no place in platform code. The MSP driver > should set this up for the appropriate ports. Instead we use a use_pinctrl > identifier which is passed from platform_data/Device Tree which indicates > which ports should use pinctrl. > > CC: alsa-devel at alsa-project.org > Signed-off-by: Lee Jones > --- > arch/arm/mach-ux500/board-mop500-msp.c | 75 +------------------------------- > arch/arm/mach-ux500/include/mach/msp.h | 2 - > sound/soc/ux500/ux500_msp_i2s.c | 67 +++++++++++++++++++++------- > sound/soc/ux500/ux500_msp_i2s.h | 8 +++- > 4 files changed, 58 insertions(+), 94 deletions(-) > > diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c > index df15646..fc78d5d 100644 > --- a/arch/arm/mach-ux500/board-mop500-msp.c > +++ b/arch/arm/mach-ux500/board-mop500-msp.c > @@ -23,53 +23,6 @@ > #include "devices-db8500.h" > #include "pins-db8500.h" > > -/* MSP1/3 Tx/Rx usage protection */ > -static DEFINE_SPINLOCK(msp_rxtx_lock); > - > -/* Reference Count */ > -static int msp_rxtx_ref; > - > -/* Pin modes */ > -struct pinctrl *msp1_p; > -struct pinctrl_state *msp1_def; > -struct pinctrl_state *msp1_sleep; > - > -int msp13_i2s_init(void) > -{ > - int retval = 0; > - unsigned long flags; > - > - spin_lock_irqsave(&msp_rxtx_lock, flags); > - if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_def))) { > - retval = pinctrl_select_state(msp1_p, msp1_def); > - if (retval) > - pr_err("could not set MSP1 defstate\n"); > - } > - if (!retval) > - msp_rxtx_ref++; > - spin_unlock_irqrestore(&msp_rxtx_lock, flags); > - > - return retval; > -} > - > -int msp13_i2s_exit(void) > -{ > - int retval = 0; > - unsigned long flags; > - > - spin_lock_irqsave(&msp_rxtx_lock, flags); > - WARN_ON(!msp_rxtx_ref); > - msp_rxtx_ref--; > - if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_sleep))) { > - retval = pinctrl_select_state(msp1_p, msp1_sleep); > - if (retval) > - pr_err("could not set MSP1 sleepstate\n"); > - } > - spin_unlock_irqrestore(&msp_rxtx_lock, flags); > - > - return retval; > -} > - > static struct stedma40_chan_cfg msp0_dma_rx = { > .high_priority = true, > .dir = STEDMA40_PERIPH_TO_MEM, > @@ -132,8 +85,6 @@ static struct msp_i2s_platform_data msp1_platform_data = { > .id = MSP_I2S_1, > .msp_i2s_dma_rx = NULL, > .msp_i2s_dma_tx = &msp1_dma_tx, > - .msp_i2s_init = msp13_i2s_init, > - .msp_i2s_exit = msp13_i2s_exit, > }; > > static struct stedma40_chan_cfg msp2_dma_rx = { > @@ -219,47 +170,23 @@ static struct msp_i2s_platform_data msp3_platform_data = { > .id = MSP_I2S_3, > .msp_i2s_dma_rx = &msp1_dma_rx, > .msp_i2s_dma_tx = NULL, > - .msp_i2s_init = msp13_i2s_init, > - .msp_i2s_exit = msp13_i2s_exit, > }; > > int mop500_msp_init(struct device *parent) > { > - struct platform_device *msp1; > - > pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__); > platform_device_register(&snd_soc_mop500); > > pr_info("Initialize MSP I2S-devices.\n"); > db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, > &msp0_platform_data); > - msp1 = db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, > + db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, > &msp1_platform_data); > db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2, > &msp2_platform_data); > db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1, > &msp3_platform_data); > > - /* Get the pinctrl handle for MSP1 */ > - if (msp1) { > - msp1_p = pinctrl_get(&msp1->dev); > - if (IS_ERR(msp1_p)) > - dev_err(&msp1->dev, "could not get MSP1 pinctrl\n"); > - else { > - msp1_def = pinctrl_lookup_state(msp1_p, > - PINCTRL_STATE_DEFAULT); > - if (IS_ERR(msp1_def)) { > - dev_err(&msp1->dev, > - "could not get MSP1 defstate\n"); > - } > - msp1_sleep = pinctrl_lookup_state(msp1_p, > - PINCTRL_STATE_SLEEP); > - if (IS_ERR(msp1_sleep)) > - dev_err(&msp1->dev, > - "could not get MSP1 idlestate\n"); > - } > - } > - > pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__); > platform_device_register(&ux500_pcm); > > diff --git a/arch/arm/mach-ux500/include/mach/msp.h b/arch/arm/mach-ux500/include/mach/msp.h > index 798be19..3cc7142 100644 > --- a/arch/arm/mach-ux500/include/mach/msp.h > +++ b/arch/arm/mach-ux500/include/mach/msp.h > @@ -22,8 +22,6 @@ struct msp_i2s_platform_data { > enum msp_i2s_id id; > struct stedma40_chan_cfg *msp_i2s_dma_rx; > struct stedma40_chan_cfg *msp_i2s_dma_tx; > - int (*msp_i2s_init) (void); > - int (*msp_i2s_exit) (void); > }; > > #endif > diff --git a/sound/soc/ux500/ux500_msp_i2s.c b/sound/soc/ux500/ux500_msp_i2s.c > index 36be11e..08813c5 100644 > --- a/sound/soc/ux500/ux500_msp_i2s.c > +++ b/sound/soc/ux500/ux500_msp_i2s.c > @@ -15,6 +15,7 @@ > > #include > #include > +#include > #include > #include > > @@ -25,6 +26,9 @@ > > #include "ux500_msp_i2s.h" > > +/* MSP1/3 Tx/Rx usage protection */ > +static DEFINE_SPINLOCK(msp_rxtx_lock); > + > /* Protocol desciptors */ > static const struct msp_protdesc prot_descs[] = { > { /* I2S */ > @@ -352,17 +356,23 @@ static int configure_multichannel(struct ux500_msp *msp, > > static int enable_msp(struct ux500_msp *msp, struct ux500_msp_config *config) > { > - int status = 0; > + int status = 0, retval = 0; > u32 reg_val_DMACR, reg_val_GCR; > + unsigned long flags; > > /* Check msp state whether in RUN or CONFIGURED Mode */ > - if ((msp->msp_state == MSP_STATE_IDLE) && (msp->plat_init)) { > - status = msp->plat_init(); > - if (status) { > - dev_err(msp->dev, "%s: ERROR: Failed to init MSP (%d)!\n", > - __func__, status); > - return status; > + if (msp->msp_state == MSP_STATE_IDLE) { > + spin_lock_irqsave(&msp_rxtx_lock, flags); > + if (msp->pinctrl_rxtx_ref == 0 && > + !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_def))) { > + retval = pinctrl_select_state(msp->pinctrl_p, > + msp->pinctrl_def); > + if (retval) > + pr_err("could not set MSP defstate\n"); > } > + if (!retval) > + msp->pinctrl_rxtx_ref++; > + spin_unlock_irqrestore(&msp_rxtx_lock, flags); > } > > /* Configure msp with protocol dependent settings */ > @@ -620,7 +630,8 @@ int ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd, int direction) > > int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) > { > - int status = 0; > + int status = 0, retval = 0; > + unsigned long flags; > > dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir); > > @@ -631,12 +642,19 @@ int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) > writel((readl(msp->registers + MSP_GCR) & > (~(FRAME_GEN_ENABLE | SRG_ENABLE))), > msp->registers + MSP_GCR); > - if (msp->plat_exit) > - status = msp->plat_exit(); > - if (status) > - dev_warn(msp->dev, > - "%s: WARN: ux500_msp_i2s_exit failed (%d)!\n", > - __func__, status); > + > + spin_lock_irqsave(&msp_rxtx_lock, flags); > + WARN_ON(!msp->pinctrl_rxtx_ref); > + msp->pinctrl_rxtx_ref--; > + if (msp->pinctrl_rxtx_ref == 0 && > + !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_sleep))) { > + retval = pinctrl_select_state(msp->pinctrl_p, > + msp->pinctrl_sleep); > + if (retval) > + pr_err("could not set MSP sleepstate\n"); > + } > + spin_unlock_irqrestore(&msp_rxtx_lock, flags); > + > writel(0, msp->registers + MSP_GCR); > writel(0, msp->registers + MSP_TCF); > writel(0, msp->registers + MSP_RCF); > @@ -678,8 +696,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, > > msp->id = platform_data->id; > msp->dev = &pdev->dev; > - msp->plat_init = platform_data->msp_i2s_init; > - msp->plat_exit = platform_data->msp_i2s_exit; > msp->dma_cfg_rx = platform_data->msp_i2s_dma_rx; > msp->dma_cfg_tx = platform_data->msp_i2s_dma_tx; > > @@ -717,6 +733,25 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, > dev_dbg(&pdev->dev, "I2S device-name: '%s'\n", i2s_cont->name); > msp->i2s_cont = i2s_cont; > > + msp->pinctrl_p = pinctrl_get(msp->dev); > + if (IS_ERR(msp->pinctrl_p)) > + dev_err(&pdev->dev, "could not get MSP pinctrl\n"); > + else { > + msp->pinctrl_def = pinctrl_lookup_state(msp->pinctrl_p, > + PINCTRL_STATE_DEFAULT); > + if (IS_ERR(msp->pinctrl_def)) { > + dev_err(&pdev->dev, > + "could not get MSP defstate (%li)\n", > + PTR_ERR(msp->pinctrl_def)); > + } > + msp->pinctrl_sleep = pinctrl_lookup_state(msp->pinctrl_p, > + PINCTRL_STATE_SLEEP); > + if (IS_ERR(msp->pinctrl_sleep)) > + dev_err(&pdev->dev, > + "could not get MSP idlestate (%li)\n", > + PTR_ERR(msp->pinctrl_def)); > + } > + > return 0; > > err_i2s_cont: > diff --git a/sound/soc/ux500/ux500_msp_i2s.h b/sound/soc/ux500/ux500_msp_i2s.h > index 2d9136d..1311c0d 100644 > --- a/sound/soc/ux500/ux500_msp_i2s.h > +++ b/sound/soc/ux500/ux500_msp_i2s.h > @@ -524,14 +524,18 @@ struct ux500_msp { > struct dma_chan *rx_pipeid; > enum msp_state msp_state; > int (*transfer) (struct ux500_msp *msp, struct i2s_message *message); > - int (*plat_init) (void); > - int (*plat_exit) (void); > struct timer_list notify_timer; > int def_elem_len; > unsigned int dir_busy; > int loopback_enable; > u32 backup_regs[MAX_MSP_BACKUP_REGS]; > unsigned int f_bitclk; > + /* Pin modes */ > + struct pinctrl *pinctrl_p; > + struct pinctrl_state *pinctrl_def; > + struct pinctrl_state *pinctrl_sleep; > + /* Reference Count */ > + int pinctrl_rxtx_ref; > }; > > struct ux500_msp_dma_params { > -- > 1.7.9.5 > -- Lee Jones Linaro ST-Ericsson Landing Team Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755895Ab2IJQqg (ORCPT ); Mon, 10 Sep 2012 12:46:36 -0400 Received: from mail-ee0-f46.google.com ([74.125.83.46]:45563 "EHLO mail-ee0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753265Ab2IJQqe (ORCPT ); Mon, 10 Sep 2012 12:46:34 -0400 Date: Mon, 10 Sep 2012 17:46:29 +0100 From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: STEricsson_nomadik_linux@list.st.com, linus.walleij@stericsson.com, arnd@arndb.de, broonie@opensource.wolfsonmicro.com, ola.o.lilja@stericsson.com, roger.xr.nilsson@stericsson.com, alsa-devel@alsa-project.org Subject: Re: [PATCH 01/17] ASoC: Ux500: Move MSP pinctrl setup into the MSP driver Message-ID: <20120910164628.GG24506@gmail.com> References: <1345816913-4113-1-git-send-email-lee.jones@linaro.org> <1345816913-4113-2-git-send-email-lee.jones@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1345816913-4113-2-git-send-email-lee.jones@linaro.org> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ola poke. On Fri, Aug 24, 2012 at 03:01:37PM +0100, Lee Jones wrote: > In the initial submission of the MSP driver msp1 and msp3's associated > pinctrl mechanism was passed back to platform code using a plat_init() > call-back routine, but it has no place in platform code. The MSP driver > should set this up for the appropriate ports. Instead we use a use_pinctrl > identifier which is passed from platform_data/Device Tree which indicates > which ports should use pinctrl. > > CC: alsa-devel@alsa-project.org > Signed-off-by: Lee Jones > --- > arch/arm/mach-ux500/board-mop500-msp.c | 75 +------------------------------- > arch/arm/mach-ux500/include/mach/msp.h | 2 - > sound/soc/ux500/ux500_msp_i2s.c | 67 +++++++++++++++++++++------- > sound/soc/ux500/ux500_msp_i2s.h | 8 +++- > 4 files changed, 58 insertions(+), 94 deletions(-) > > diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c > index df15646..fc78d5d 100644 > --- a/arch/arm/mach-ux500/board-mop500-msp.c > +++ b/arch/arm/mach-ux500/board-mop500-msp.c > @@ -23,53 +23,6 @@ > #include "devices-db8500.h" > #include "pins-db8500.h" > > -/* MSP1/3 Tx/Rx usage protection */ > -static DEFINE_SPINLOCK(msp_rxtx_lock); > - > -/* Reference Count */ > -static int msp_rxtx_ref; > - > -/* Pin modes */ > -struct pinctrl *msp1_p; > -struct pinctrl_state *msp1_def; > -struct pinctrl_state *msp1_sleep; > - > -int msp13_i2s_init(void) > -{ > - int retval = 0; > - unsigned long flags; > - > - spin_lock_irqsave(&msp_rxtx_lock, flags); > - if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_def))) { > - retval = pinctrl_select_state(msp1_p, msp1_def); > - if (retval) > - pr_err("could not set MSP1 defstate\n"); > - } > - if (!retval) > - msp_rxtx_ref++; > - spin_unlock_irqrestore(&msp_rxtx_lock, flags); > - > - return retval; > -} > - > -int msp13_i2s_exit(void) > -{ > - int retval = 0; > - unsigned long flags; > - > - spin_lock_irqsave(&msp_rxtx_lock, flags); > - WARN_ON(!msp_rxtx_ref); > - msp_rxtx_ref--; > - if (msp_rxtx_ref == 0 && !(IS_ERR(msp1_p) || IS_ERR(msp1_sleep))) { > - retval = pinctrl_select_state(msp1_p, msp1_sleep); > - if (retval) > - pr_err("could not set MSP1 sleepstate\n"); > - } > - spin_unlock_irqrestore(&msp_rxtx_lock, flags); > - > - return retval; > -} > - > static struct stedma40_chan_cfg msp0_dma_rx = { > .high_priority = true, > .dir = STEDMA40_PERIPH_TO_MEM, > @@ -132,8 +85,6 @@ static struct msp_i2s_platform_data msp1_platform_data = { > .id = MSP_I2S_1, > .msp_i2s_dma_rx = NULL, > .msp_i2s_dma_tx = &msp1_dma_tx, > - .msp_i2s_init = msp13_i2s_init, > - .msp_i2s_exit = msp13_i2s_exit, > }; > > static struct stedma40_chan_cfg msp2_dma_rx = { > @@ -219,47 +170,23 @@ static struct msp_i2s_platform_data msp3_platform_data = { > .id = MSP_I2S_3, > .msp_i2s_dma_rx = &msp1_dma_rx, > .msp_i2s_dma_tx = NULL, > - .msp_i2s_init = msp13_i2s_init, > - .msp_i2s_exit = msp13_i2s_exit, > }; > > int mop500_msp_init(struct device *parent) > { > - struct platform_device *msp1; > - > pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__); > platform_device_register(&snd_soc_mop500); > > pr_info("Initialize MSP I2S-devices.\n"); > db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, > &msp0_platform_data); > - msp1 = db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, > + db8500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, > &msp1_platform_data); > db8500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2, > &msp2_platform_data); > db8500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1, > &msp3_platform_data); > > - /* Get the pinctrl handle for MSP1 */ > - if (msp1) { > - msp1_p = pinctrl_get(&msp1->dev); > - if (IS_ERR(msp1_p)) > - dev_err(&msp1->dev, "could not get MSP1 pinctrl\n"); > - else { > - msp1_def = pinctrl_lookup_state(msp1_p, > - PINCTRL_STATE_DEFAULT); > - if (IS_ERR(msp1_def)) { > - dev_err(&msp1->dev, > - "could not get MSP1 defstate\n"); > - } > - msp1_sleep = pinctrl_lookup_state(msp1_p, > - PINCTRL_STATE_SLEEP); > - if (IS_ERR(msp1_sleep)) > - dev_err(&msp1->dev, > - "could not get MSP1 idlestate\n"); > - } > - } > - > pr_info("%s: Register platform-device 'ux500-pcm'\n", __func__); > platform_device_register(&ux500_pcm); > > diff --git a/arch/arm/mach-ux500/include/mach/msp.h b/arch/arm/mach-ux500/include/mach/msp.h > index 798be19..3cc7142 100644 > --- a/arch/arm/mach-ux500/include/mach/msp.h > +++ b/arch/arm/mach-ux500/include/mach/msp.h > @@ -22,8 +22,6 @@ struct msp_i2s_platform_data { > enum msp_i2s_id id; > struct stedma40_chan_cfg *msp_i2s_dma_rx; > struct stedma40_chan_cfg *msp_i2s_dma_tx; > - int (*msp_i2s_init) (void); > - int (*msp_i2s_exit) (void); > }; > > #endif > diff --git a/sound/soc/ux500/ux500_msp_i2s.c b/sound/soc/ux500/ux500_msp_i2s.c > index 36be11e..08813c5 100644 > --- a/sound/soc/ux500/ux500_msp_i2s.c > +++ b/sound/soc/ux500/ux500_msp_i2s.c > @@ -15,6 +15,7 @@ > > #include > #include > +#include > #include > #include > > @@ -25,6 +26,9 @@ > > #include "ux500_msp_i2s.h" > > +/* MSP1/3 Tx/Rx usage protection */ > +static DEFINE_SPINLOCK(msp_rxtx_lock); > + > /* Protocol desciptors */ > static const struct msp_protdesc prot_descs[] = { > { /* I2S */ > @@ -352,17 +356,23 @@ static int configure_multichannel(struct ux500_msp *msp, > > static int enable_msp(struct ux500_msp *msp, struct ux500_msp_config *config) > { > - int status = 0; > + int status = 0, retval = 0; > u32 reg_val_DMACR, reg_val_GCR; > + unsigned long flags; > > /* Check msp state whether in RUN or CONFIGURED Mode */ > - if ((msp->msp_state == MSP_STATE_IDLE) && (msp->plat_init)) { > - status = msp->plat_init(); > - if (status) { > - dev_err(msp->dev, "%s: ERROR: Failed to init MSP (%d)!\n", > - __func__, status); > - return status; > + if (msp->msp_state == MSP_STATE_IDLE) { > + spin_lock_irqsave(&msp_rxtx_lock, flags); > + if (msp->pinctrl_rxtx_ref == 0 && > + !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_def))) { > + retval = pinctrl_select_state(msp->pinctrl_p, > + msp->pinctrl_def); > + if (retval) > + pr_err("could not set MSP defstate\n"); > } > + if (!retval) > + msp->pinctrl_rxtx_ref++; > + spin_unlock_irqrestore(&msp_rxtx_lock, flags); > } > > /* Configure msp with protocol dependent settings */ > @@ -620,7 +630,8 @@ int ux500_msp_i2s_trigger(struct ux500_msp *msp, int cmd, int direction) > > int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) > { > - int status = 0; > + int status = 0, retval = 0; > + unsigned long flags; > > dev_dbg(msp->dev, "%s: Enter (dir = 0x%01x).\n", __func__, dir); > > @@ -631,12 +642,19 @@ int ux500_msp_i2s_close(struct ux500_msp *msp, unsigned int dir) > writel((readl(msp->registers + MSP_GCR) & > (~(FRAME_GEN_ENABLE | SRG_ENABLE))), > msp->registers + MSP_GCR); > - if (msp->plat_exit) > - status = msp->plat_exit(); > - if (status) > - dev_warn(msp->dev, > - "%s: WARN: ux500_msp_i2s_exit failed (%d)!\n", > - __func__, status); > + > + spin_lock_irqsave(&msp_rxtx_lock, flags); > + WARN_ON(!msp->pinctrl_rxtx_ref); > + msp->pinctrl_rxtx_ref--; > + if (msp->pinctrl_rxtx_ref == 0 && > + !(IS_ERR(msp->pinctrl_p) || IS_ERR(msp->pinctrl_sleep))) { > + retval = pinctrl_select_state(msp->pinctrl_p, > + msp->pinctrl_sleep); > + if (retval) > + pr_err("could not set MSP sleepstate\n"); > + } > + spin_unlock_irqrestore(&msp_rxtx_lock, flags); > + > writel(0, msp->registers + MSP_GCR); > writel(0, msp->registers + MSP_TCF); > writel(0, msp->registers + MSP_RCF); > @@ -678,8 +696,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, > > msp->id = platform_data->id; > msp->dev = &pdev->dev; > - msp->plat_init = platform_data->msp_i2s_init; > - msp->plat_exit = platform_data->msp_i2s_exit; > msp->dma_cfg_rx = platform_data->msp_i2s_dma_rx; > msp->dma_cfg_tx = platform_data->msp_i2s_dma_tx; > > @@ -717,6 +733,25 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, > dev_dbg(&pdev->dev, "I2S device-name: '%s'\n", i2s_cont->name); > msp->i2s_cont = i2s_cont; > > + msp->pinctrl_p = pinctrl_get(msp->dev); > + if (IS_ERR(msp->pinctrl_p)) > + dev_err(&pdev->dev, "could not get MSP pinctrl\n"); > + else { > + msp->pinctrl_def = pinctrl_lookup_state(msp->pinctrl_p, > + PINCTRL_STATE_DEFAULT); > + if (IS_ERR(msp->pinctrl_def)) { > + dev_err(&pdev->dev, > + "could not get MSP defstate (%li)\n", > + PTR_ERR(msp->pinctrl_def)); > + } > + msp->pinctrl_sleep = pinctrl_lookup_state(msp->pinctrl_p, > + PINCTRL_STATE_SLEEP); > + if (IS_ERR(msp->pinctrl_sleep)) > + dev_err(&pdev->dev, > + "could not get MSP idlestate (%li)\n", > + PTR_ERR(msp->pinctrl_def)); > + } > + > return 0; > > err_i2s_cont: > diff --git a/sound/soc/ux500/ux500_msp_i2s.h b/sound/soc/ux500/ux500_msp_i2s.h > index 2d9136d..1311c0d 100644 > --- a/sound/soc/ux500/ux500_msp_i2s.h > +++ b/sound/soc/ux500/ux500_msp_i2s.h > @@ -524,14 +524,18 @@ struct ux500_msp { > struct dma_chan *rx_pipeid; > enum msp_state msp_state; > int (*transfer) (struct ux500_msp *msp, struct i2s_message *message); > - int (*plat_init) (void); > - int (*plat_exit) (void); > struct timer_list notify_timer; > int def_elem_len; > unsigned int dir_busy; > int loopback_enable; > u32 backup_regs[MAX_MSP_BACKUP_REGS]; > unsigned int f_bitclk; > + /* Pin modes */ > + struct pinctrl *pinctrl_p; > + struct pinctrl_state *pinctrl_def; > + struct pinctrl_state *pinctrl_sleep; > + /* Reference Count */ > + int pinctrl_rxtx_ref; > }; > > struct ux500_msp_dma_params { > -- > 1.7.9.5 > -- Lee Jones Linaro ST-Ericsson Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog