From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Subject: [PATCH V3 2/2] pinctrl: bcm: add Northstar driver Date: Wed, 26 Sep 2018 21:31:03 +0200 Message-ID: <20180926193103.21241-2-zajec5@gmail.com> References: <20180926193103.21241-1-zajec5@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180926193103.21241-1-zajec5@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Linus Walleij , linux-gpio@vger.kernel.org, Rob Herring , devicetree@vger.kernel.org Cc: Mark Rutland , Florian Fainelli , Scott Branden , Ray Jui , bcm-kernel-feedback-list@broadcom.com, =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , linux-arm-kernel@lists.infradead.org List-Id: linux-gpio@vger.kernel.org RnJvbTogUmFmYcWCIE1pxYJlY2tpIDxyYWZhbEBtaWxlY2tpLnBsPgoKVGhpcyBkcml2ZXIgcHJv dmlkZXMgc3VwcG9ydCBmb3IgTm9ydGhzdGFyIG11eCBjb250cm9sbGVyLiBJdCBkaWZmZXJzCmZy b20gTm9ydGhzdGFyIFBsdXMgb25lIHNvIGEgbmV3IGJpbmRpbmcgYW5kIGRyaXZlciB3ZXJlIG5l ZWRlZC4KClNpZ25lZC1vZmYtYnk6IFJhZmHFgiBNacWCZWNraSA8cmFmYWxAbWlsZWNraS5wbD4K LS0tClYyOiBEZWZpbmUgbW9yZSBwaW5zLCBncm91cHMsIGZ1bmN0aW9ucwogICAgU2ltcGxpZnkg bnNfcGluY3RybF9zZXRfbXV4KCkgYXMgTm9ydGhzdGFyIHVzZXMgMToxIG1hcHBpbmcKVjM6IFN1 cHBvcnQgMyBkaWZmZXJlbnQgYmluZGluZ3MgYW5kIGRpZmZlcmVudCBzZXRzIG9mIHBpbnMsIGdy b3VwcwogICAgYW5kIGZ1bmN0aW9ucy4gVGhpcyByZXF1aXJlcyBidWlsZGluZyBhcnJheXMgZHlu YW1pY2FsbHkgb24gaW5pdC4KLS0tCiBkcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWcgICAgICB8 ICAxMyArKwogZHJpdmVycy9waW5jdHJsL2JjbS9NYWtlZmlsZSAgICAgfCAgIDEgKwogZHJpdmVy cy9waW5jdHJsL2JjbS9waW5jdHJsLW5zLmMgfCAzNzIgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDM4NiBpbnNlcnRpb25zKCspCiBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zLmMKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL0tj b25maWcKaW5kZXggMGYzOGQ1MWY0N2M2Li5jODU3NTM5OWQ2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvcGluY3RybC9iY20vS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWcK QEAgLTczLDYgKzczLDE5IEBAIGNvbmZpZyBQSU5DVFJMX0NZR05VU19NVVgKIAkgIGNvbmZpZ3Vy YXRpb24sIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGNlcnRhaW4gaW5kaXZpZHVhbCBwaW5zCiAJ ICBjYW4gYmUgb3ZlcnJpZGRlbiB0byBHUElPIGZ1bmN0aW9uCiAKK2NvbmZpZyBQSU5DVFJMX05T CisJYm9vbCAiQnJvYWRjb20gTm9ydGhzdGFyIHBpbnMgZHJpdmVyIgorCWRlcGVuZHMgb24gT0Yg JiYgKEFSQ0hfQkNNXzUzMDFYIHx8IENPTVBJTEVfVEVTVCkKKwlzZWxlY3QgUElOTVVYCisJc2Vs ZWN0IEdFTkVSSUNfUElOQ09ORgorCWRlZmF1bHQgQVJDSF9CQ01fNTMwMVgKKwloZWxwCisJICBT YXkgeWVzIGhlcmUgdG8gZW5hYmxlIHRoZSBCcm9hZGNvbSBOUyBTb0MgcGlucyBkcml2ZXIuCisK KwkgIFRoZSBCcm9hZGNvbSBOb3J0aHN0YXIgcGlucyBkcml2ZXIgc3VwcG9ydHMgbXV4aW5nIG11 bHRpLXB1cnBvc2UgcGlucworCSAgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFyaW91cyBmdW5jdGlv bnMgKGUuZy4gU1BJLCBJMkMsIFVBUlQpIGFzIHdlbGwKKwkgIGFzIEdQSU9zLgorCiBjb25maWcg UElOQ1RSTF9OU1BfR1BJTwogCWJvb2wgIkJyb2FkY29tIE5TUCBHUElPICh3aXRoIFBJTkNPTkYp IGRyaXZlciIKIAlkZXBlbmRzIG9uIE9GX0dQSU8gJiYgKEFSQ0hfQkNNX05TUCB8fCBDT01QSUxF X1RFU1QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL01ha2VmaWxlIGIvZHJpdmVy cy9waW5jdHJsL2JjbS9NYWtlZmlsZQppbmRleCA4MGNlYjlkYWU5NDQuLjc5ZDVlNDlmZGQ5YSAx MDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bp bmN0cmwvYmNtL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQCBvYmotJChDT05GSUdfUElOQ1RSTF9C Q00yODFYWCkJCSs9IHBpbmN0cmwtYmNtMjgxeHgubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNN MjgzNSkJCSs9IHBpbmN0cmwtYmNtMjgzNS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9JUFJPQ19H UElPKQkrPSBwaW5jdHJsLWlwcm9jLWdwaW8ubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQ1lHTlVT X01VWCkJKz0gcGluY3RybC1jeWdudXMtbXV4Lm8KK29iai0kKENPTkZJR19QSU5DVFJMX05TKQkJ Kz0gcGluY3RybC1ucy5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9OU1BfR1BJTykJCSs9IHBpbmN0 cmwtbnNwLWdwaW8ubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfTlMyX01VWCkJCSs9IHBpbmN0cmwt bnMyLW11eC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9OU1BfTVVYKQkJKz0gcGluY3RybC1uc3At bXV4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1ucy5jIGIvZHJp dmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi5hZWRiYjI4MTNjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bp bmN0cmwvYmNtL3BpbmN0cmwtbnMuYwpAQCAtMCwwICsxLDM3MiBAQAorLy8gU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggUmFmYcWCIE1p xYJlY2tpIDxyYWZhbEBtaWxlY2tpLnBsPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4K KyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8 bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJs L3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2Rl ZmluZSBGTEFHX0JDTTQ3MDgJCUJJVCgxKQorI2RlZmluZSBGTEFHX0JDTTQ3MDkJCUJJVCgyKQor I2RlZmluZSBGTEFHX0JDTTUzMDEyCQlCSVQoMykKKworc3RydWN0IG5zX3BpbmN0cmwgeworCXN0 cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgY2hpcHNldF9mbGFnOworCXN0cnVjdCBw aW5jdHJsX2RldiAqcGN0bGRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwlzdHJ1Y3QgcGlu Y3RybF9kZXNjIHBjdGxkZXNjOworCXN0cnVjdCBuc19waW5jdHJsX2dyb3VwICpncm91cHM7CisJ dW5zaWduZWQgaW50IG51bV9ncm91cHM7CisJc3RydWN0IG5zX3BpbmN0cmxfZnVuY3Rpb24gKmZ1 bmN0aW9uczsKKwl1bnNpZ25lZCBpbnQgbnVtX2Z1bmN0aW9uczsKK307CisKKy8qCisgKiBQaW5z CisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIG5zX3BpbmN0cmxf cGluc1tdID0geworCXsgMCwgInNwaV9jbGsiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDggfCBGTEFH X0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSB9LAorCXsgMSwgInNwaV9zcyIsICh2b2lkICopKEZM QUdfQkNNNDcwOCB8IEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpIH0sCisJeyAyLCAic3Bp X21vc2kiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUz MDEyKSB9LAorCXsgMywgInNwaV9taXNvIiwgKHZvaWQgKikoRkxBR19CQ000NzA4IHwgRkxBR19C Q000NzA5IHwgRkxBR19CQ001MzAxMikgfSwKKwl7IDQsICJpMmNfc2NsIiwgKHZvaWQgKikoRkxB R19CQ000NzA4IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMikgfSwKKwl7IDUsICJpMmNf c2RhIiwgKHZvaWQgKikoRkxBR19CQ000NzA4IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAx MikgfSwKKwl7IDYsICJtZGMiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEy KSB9LAorCXsgNywgIm1kaW8iLCAodm9pZCAqKShGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEy KSB9LAorCXsgOCwgInB3bTAiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkg fCBGTEFHX0JDTTUzMDEyKSB9LAorCXsgOSwgInB3bTEiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDgg fCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSB9LAorCXsgMTAsICJwd20yIiwgKHZvaWQg KikoRkxBR19CQ000NzA4IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMikgfSwKKwl7IDEx LCAicHdtMyIsICh2b2lkICopKEZMQUdfQkNNNDcwOCB8IEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNN NTMwMTIpIH0sCisJeyAxMiwgInVhcnQxX3J4IiwgKHZvaWQgKikoRkxBR19CQ000NzA4IHwgRkxB R19CQ000NzA5IHwgRkxBR19CQ001MzAxMikgfSwKKwl7IDEzLCAidWFydDFfdHgiLCAodm9pZCAq KShGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSB9LAorCXsgMTQs ICJ1YXJ0MV9jdHMiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBGTEFH X0JDTTUzMDEyKSB9LAorCXsgMTUsICJ1YXJ0MV9ydHMiLCAodm9pZCAqKShGTEFHX0JDTTQ3MDgg fCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSB9LAorCXsgMTYsICJ1YXJ0Ml9yeCIsICh2 b2lkICopKEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpIH0sCisJeyAxNywgInVhcnQyX3R4 IiwgKHZvaWQgKikoRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMikgfSwKKy8qIFRPRE8geyA/ PywgInh0YWxfb3V0IiwgKHZvaWQgKikoRkxBR19CQ000NzA5KSB9LCAqLworCXsgMjIsICJzZGlv X3B3ciIsICh2b2lkICopKEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpIH0sCisJeyAyMywg InNkaW9fZW5fMXA4diIsICh2b2lkICopKEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpIH0s Cit9OworCisvKgorICogR3JvdXBzCisgKi8KKworc3RydWN0IG5zX3BpbmN0cmxfZ3JvdXAgewor CWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgaW50ICpwaW5zOworCWNvbnN0IHVu c2lnbmVkIGludCBudW1fcGluczsKKwl1bnNpZ25lZCBpbnQgY2hpcHNldHM7Cit9OworCitzdGF0 aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9waW5zW10gPSB7IDAsIDEsIDIsIDMgfTsKK3N0YXRp YyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3BpbnNbXSA9IHsgNCwgNSB9Oworc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGludCBtZGlvX3BpbnNbXSA9IHsgNiwgNyB9Oworc3RhdGljIGNvbnN0IHVuc2ln bmVkIGludCBwd20wX3BpbnNbXSA9IHsgOCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBw d20xX3BpbnNbXSA9IHsgOSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd20yX3BpbnNb XSA9IHsgMTAgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtM19waW5zW10gPSB7IDEx IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnQxX3BpbnNbXSA9IHsgMTIsIDEzLCAx NCwgMTUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydDJfcGluc1tdID0geyAxNiwg MTcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19wd3JfcGluc1tdID0geyAyMiB9 Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvXzFwOHZfcGluc1tdID0geyAyMyB9Owor CisjZGVmaW5lIE5TX0dST1VQKF9uYW1lLCBfcGlucywgX2NoaXBzZXRzKQkJXAorewkJCQkJCQlc CisJLm5hbWUgPSBfbmFtZSwJCQkJCVwKKwkucGlucyA9IF9waW5zLAkJCQkJXAorCS5udW1fcGlu cyA9IEFSUkFZX1NJWkUoX3BpbnMpLAkJCVwKKwkuY2hpcHNldHMgPSBfY2hpcHNldHMsCQkJCVwK K30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuc19waW5jdHJsX2dyb3VwIG5zX3BpbmN0cmxfZ3Jv dXBzW10gPSB7CisJTlNfR1JPVVAoInNwaV9ncnAiLCBzcGlfcGlucywgRkxBR19CQ000NzA4IHwg RkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNfR1JPVVAoImkyY19ncnAiLCBpMmNf cGlucywgRkxBR19CQ000NzA4IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNf R1JPVVAoIm1kaW9fZ3JwIiwgbWRpb19waW5zLCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEy KSwKKwlOU19HUk9VUCgicHdtMF9ncnAiLCBwd20wX3BpbnMsIEZMQUdfQkNNNDcwOCB8IEZMQUdf QkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpLAorCU5TX0dST1VQKCJwd20xX2dycCIsIHB3bTFfcGlu cywgRkxBR19CQ000NzA4IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNfR1JP VVAoInB3bTJfZ3JwIiwgcHdtMl9waW5zLCBGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBG TEFHX0JDTTUzMDEyKSwKKwlOU19HUk9VUCgicHdtM19ncnAiLCBwd20zX3BpbnMsIEZMQUdfQkNN NDcwOCB8IEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpLAorCU5TX0dST1VQKCJ1YXJ0MV9n cnAiLCB1YXJ0MV9waW5zLCBGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUz MDEyKSwKKwlOU19HUk9VUCgidWFydDJfZ3JwIiwgdWFydDJfcGlucywgRkxBR19CQ000NzA5IHwg RkxBR19CQ001MzAxMiksCisJTlNfR1JPVVAoInNkaW9fcHdyX2dycCIsIHNkaW9fcHdyX3BpbnMs IEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpLAorCU5TX0dST1VQKCJzZGlvXzFwOHZfZ3Jw Iiwgc2Rpb18xcDh2X3BpbnMsIEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNNNTMwMTIpLAorfTsKKwor LyoKKyAqIEZ1bmN0aW9ucworICovCisKK3N0cnVjdCBuc19waW5jdHJsX2Z1bmN0aW9uIHsKKwlj b25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOworCWNvbnN0IHVu c2lnbmVkIGludCBudW1fZ3JvdXBzOworCXVuc2lnbmVkIGludCBjaGlwc2V0czsKK307CisKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpX2dyb3Vwc1tdID0geyAic3BpX2dycCIgfTsKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjX2dyb3Vwc1tdID0geyAiaTJjX2dycCIgfTsKK3N0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRpb19ncm91cHNbXSA9IHsgIm1kaW9fZ3JwIiB9Owor c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZ3JvdXBzW10gPSB7ICJwd20wX2dycCIsICJw d20xX2dycCIsICJwd20yX2dycCIsCisJCQkJCSAgICJwd20zX2dycCIgfTsKK3N0YXRpYyBjb25z dCBjaGFyICogY29uc3QgdWFydDFfZ3JvdXBzW10gPSB7ICJ1YXJ0MV9ncnAiIH07CitzdGF0aWMg Y29uc3QgY2hhciAqIGNvbnN0IHVhcnQyX2dyb3Vwc1tdID0geyAidWFydDJfZ3JwIiB9Oworc3Rh dGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGlvX2dyb3Vwc1tdID0geyAic2Rpb19wd3JfZ3JwIiwg InNkaW9fMXA4dl9ncnAiIH07CisKKyNkZWZpbmUgTlNfRlVOQ1RJT04oX25hbWUsIF9ncm91cHMs IF9jaGlwc2V0cykJCVwKK3sJCQkJCQkJXAorCS5uYW1lID0gX25hbWUsCQkJCQlcCisJLmdyb3Vw cyA9IF9ncm91cHMsCQkJCVwKKwkubnVtX2dyb3VwcyA9IEFSUkFZX1NJWkUoX2dyb3VwcyksCQlc CisJLmNoaXBzZXRzID0gX2NoaXBzZXRzLAkJCQlcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bnNfcGluY3RybF9mdW5jdGlvbiBuc19waW5jdHJsX2Z1bmN0aW9uc1tdID0geworCU5TX0ZVTkNU SU9OKCJzcGkiLCBzcGlfZ3JvdXBzLCBGTEFHX0JDTTQ3MDggfCBGTEFHX0JDTTQ3MDkgfCBGTEFH X0JDTTUzMDEyKSwKKwlOU19GVU5DVElPTigiaTJjIiwgaTJjX2dyb3VwcywgRkxBR19CQ000NzA4 IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNfRlVOQ1RJT04oIm1kaW8iLCBt ZGlvX2dyb3VwcywgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNfRlVOQ1RJT04o InB3bSIsIHB3bV9ncm91cHMsIEZMQUdfQkNNNDcwOCB8IEZMQUdfQkNNNDcwOSB8IEZMQUdfQkNN NTMwMTIpLAorCU5TX0ZVTkNUSU9OKCJ1YXJ0MSIsIHVhcnQxX2dyb3VwcywgRkxBR19CQ000NzA4 IHwgRkxBR19CQ000NzA5IHwgRkxBR19CQ001MzAxMiksCisJTlNfRlVOQ1RJT04oInVhcnQyIiwg dWFydDJfZ3JvdXBzLCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSwKKwlOU19GVU5DVElP Tigic2RpbyIsIHNkaW9fZ3JvdXBzLCBGTEFHX0JDTTQ3MDkgfCBGTEFHX0JDTTUzMDEyKSwKK307 CisKKy8qCisgKiBHcm91cHMgY29kZQorICovCisKK3N0YXRpYyBpbnQgbnNfcGluY3RybF9nZXRf Z3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2KQoreworCXN0cnVjdCBu c19waW5jdHJsICpuc19waW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxfZGV2 KTsKKworCXJldHVybiBuc19waW5jdHJsLT5udW1fZ3JvdXBzOworfQorCitzdGF0aWMgY29uc3Qg Y2hhciAqbnNfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdHJs X2RldiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2VsZWN0b3IpCit7CisJc3RydWN0IG5zX3Bp bmN0cmwgKm5zX3BpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOwor CisJcmV0dXJuIG5zX3BpbmN0cmwtPmdyb3Vwc1tzZWxlY3Rvcl0ubmFtZTsKK30KKworc3RhdGlj IGludCBuc19waW5jdHJsX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxf ZGV2LAorCQkJCSAgICAgdW5zaWduZWQgaW50IHNlbGVjdG9yLAorCQkJCSAgICAgY29uc3QgdW5z aWduZWQgaW50ICoqcGlucywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqbnVtX3BpbnMpCit7CisJ c3RydWN0IG5zX3BpbmN0cmwgKm5zX3BpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShw Y3RybF9kZXYpOworCisJKnBpbnMgPSBuc19waW5jdHJsLT5ncm91cHNbc2VsZWN0b3JdLnBpbnM7 CisJKm51bV9waW5zID0gbnNfcGluY3RybC0+Z3JvdXBzW3NlbGVjdG9yXS5udW1fcGluczsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIG5zX3BpbmN0 cmxfb3BzID0geworCS5nZXRfZ3JvdXBzX2NvdW50ID0gbnNfcGluY3RybF9nZXRfZ3JvdXBzX2Nv dW50LAorCS5nZXRfZ3JvdXBfbmFtZSA9IG5zX3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCisJLmdl dF9ncm91cF9waW5zID0gbnNfcGluY3RybF9nZXRfZ3JvdXBfcGlucywKKwkuZHRfbm9kZV90b19t YXAgPSBwaW5jb25mX2dlbmVyaWNfZHRfbm9kZV90b19tYXBfZ3JvdXAsCisJLmR0X2ZyZWVfbWFw ID0gcGluY29uZl9nZW5lcmljX2R0X2ZyZWVfbWFwLAorfTsKKworLyoKKyAqIEZ1bmN0aW9ucyBj b2RlCisgKi8KKworc3RhdGljIGludCBuc19waW5jdHJsX2dldF9mdW5jdGlvbnNfY291bnQoc3Ry dWN0IHBpbmN0cmxfZGV2ICpwY3RybF9kZXYpCit7CisJc3RydWN0IG5zX3BpbmN0cmwgKm5zX3Bp bmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCisJcmV0dXJuIG5z X3BpbmN0cmwtPm51bV9mdW5jdGlvbnM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuc19waW5j dHJsX2dldF9mdW5jdGlvbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAorCQkJ CQkJdW5zaWduZWQgaW50IHNlbGVjdG9yKQoreworCXN0cnVjdCBuc19waW5jdHJsICpuc19waW5j dHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxfZGV2KTsKKworCXJldHVybiBuc19w aW5jdHJsLT5mdW5jdGlvbnNbc2VsZWN0b3JdLm5hbWU7Cit9CisKK3N0YXRpYyBpbnQgbnNfcGlu Y3RybF9nZXRfZnVuY3Rpb25fZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAor CQkJCQkgIHVuc2lnbmVkIGludCBzZWxlY3RvciwKKwkJCQkJICBjb25zdCBjaGFyICogY29uc3Qg Kipncm91cHMsCisJCQkJCSAgdW5zaWduZWQgKiBjb25zdCBudW1fZ3JvdXBzKQoreworCXN0cnVj dCBuc19waW5jdHJsICpuc19waW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxf ZGV2KTsKKworCSpncm91cHMgPSBuc19waW5jdHJsLT5mdW5jdGlvbnNbc2VsZWN0b3JdLmdyb3Vw czsKKwkqbnVtX2dyb3VwcyA9IG5zX3BpbmN0cmwtPmZ1bmN0aW9uc1tzZWxlY3Rvcl0ubnVtX2dy b3VwczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5zX3BpbmN0cmxfc2V0X211eChz dHJ1Y3QgcGluY3RybF9kZXYgKnBjdHJsX2RldiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBmdW5j X3NlbGVjdCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBncnBfc2VsZWN0KQoreworCXN0cnVjdCBu c19waW5jdHJsICpuc19waW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxfZGV2 KTsKKwl1MzIgdW5zZXQgPSAwOworCXUzMiB0bXA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnNfcGluY3RybC0+Z3JvdXBzW2dycF9zZWxlY3RdLm51bV9waW5zOyBpKyspIHsKKwkJaW50 IHBpbl9udW1iZXIgPSBuc19waW5jdHJsLT5ncm91cHNbZ3JwX3NlbGVjdF0ucGluc1tpXTsKKwor CQl1bnNldCB8PSBCSVQocGluX251bWJlcik7CisJfQorCisJdG1wID0gcmVhZGwobnNfcGluY3Ry bC0+YmFzZSk7CisJdG1wICY9IH51bnNldDsKKwl3cml0ZWwodG1wLCBuc19waW5jdHJsLT5iYXNl KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgbnNf cGluY3RybF9wbXhvcHMgPSB7CisJLmdldF9mdW5jdGlvbnNfY291bnQgPSBuc19waW5jdHJsX2dl dF9mdW5jdGlvbnNfY291bnQsCisJLmdldF9mdW5jdGlvbl9uYW1lID0gbnNfcGluY3RybF9nZXRf ZnVuY3Rpb25fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IG5zX3BpbmN0cmxfZ2V0X2Z1 bmN0aW9uX2dyb3VwcywKKwkuc2V0X211eCA9IG5zX3BpbmN0cmxfc2V0X211eCwKK307CisKKy8q CisgKiBDb250cm9sbGVyIGNvZGUKKyAqLworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBu c19waW5jdHJsX2Rlc2MgPSB7CisJLm5hbWUgPSAicGluY3RybC1ucyIsCisJLnBjdGxvcHMgPSAm bnNfcGluY3RybF9vcHMsCisJLnBteG9wcyA9ICZuc19waW5jdHJsX3BteG9wcywKK307CisKK3N0 YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG5zX3BpbmN0cmxfb2ZfbWF0Y2hfdGFibGVb XSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNDcwOC1waW5tdXgiLCAuZGF0YSA9ICh2 b2lkICopRkxBR19CQ000NzA4LCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY200NzA5LXBp bm11eCIsIC5kYXRhID0gKHZvaWQgKilGTEFHX0JDTTQ3MDksIH0sCisJeyAuY29tcGF0aWJsZSA9 ICJicmNtLGJjbTUzMDEyLXBpbm11eCIsIC5kYXRhID0gKHZvaWQgKilGTEFHX0JDTTUzMDEyLCB9 LAorCXsgfQorfTsKKworc3RhdGljIGludCBuc19waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdHJ1Y3QgbnNfcGluY3RybCAqbnNf cGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9kZXNjICpwY3RsZGVzYzsKKwlzdHJ1Y3QgcGluY3Ry bF9waW5fZGVzYyAqcGluOworCXN0cnVjdCBuc19waW5jdHJsX2dyb3VwICpncm91cDsKKwlzdHJ1 Y3QgbnNfcGluY3RybF9mdW5jdGlvbiAqZnVuY3Rpb247CisJc3RydWN0IHJlc291cmNlICpyZXM7 CisJaW50IGk7CisKKwluc19waW5jdHJsID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpuc19w aW5jdHJsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuc19waW5jdHJsKQorCQlyZXR1cm4gLUVOT01F TTsKKwlwY3RsZGVzYyA9ICZuc19waW5jdHJsLT5wY3RsZGVzYzsKKwlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBuc19waW5jdHJsKTsKKworCS8qIFNldCBiYXNpYyBwcm9wZXJ0aWVzICovCisK Kwluc19waW5jdHJsLT5kZXYgPSBkZXY7CisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShuc19w aW5jdHJsX29mX21hdGNoX3RhYmxlLCBkZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlO VkFMOworCW5zX3BpbmN0cmwtPmNoaXBzZXRfZmxhZyA9ICh1bnNpZ25lZCBpbnQpb2ZfaWQtPmRh dGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VS Q0VfTUVNLAorCQkJCQkgICAiY3J1X2dwaW9fY29udHJvbCIpOworCW5zX3BpbmN0cmwtPmJhc2Ug PSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIobnNfcGluY3Ry bC0+YmFzZSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIHBpbmN0cmwgcmVnc1xu Iik7CisJCXJldHVybiBQVFJfRVJSKG5zX3BpbmN0cmwtPmJhc2UpOworCX0KKworCW1lbWNweShw Y3RsZGVzYywgJm5zX3BpbmN0cmxfZGVzYywgc2l6ZW9mKCpwY3RsZGVzYykpOworCisJLyogU2V0 IHBpbmN0cmwgcHJvcGVydGllcyAqLworCisJcGN0bGRlc2MtPnBpbnMgPSBkZXZtX2tjYWxsb2Mo ZGV2LCBBUlJBWV9TSVpFKG5zX3BpbmN0cmxfcGlucyksCisJCQkJICAgICAgc2l6ZW9mKHN0cnVj dCBwaW5jdHJsX3Bpbl9kZXNjKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjdGxk ZXNjLT5waW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwLCBwaW4gPSAoc3RydWN0 IHBpbmN0cmxfcGluX2Rlc2MgKikmcGN0bGRlc2MtPnBpbnNbMF07CisJICAgICBpIDwgQVJSQVlf U0laRShuc19waW5jdHJsX3BpbnMpOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGlu X2Rlc2MgKnNyYyA9ICZuc19waW5jdHJsX3BpbnNbaV07CisJCXVuc2lnbmVkIGludCBjaGlwc2V0 cyA9ICh1bnNpZ25lZCBpbnQpc3JjLT5kcnZfZGF0YTsKKworCQlpZiAoY2hpcHNldHMgJiBuc19w aW5jdHJsLT5jaGlwc2V0X2ZsYWcpIHsKKwkJCW1lbWNweShwaW4rKywgc3JjLCBzaXplb2YoKnNy YykpOworCQkJcGN0bGRlc2MtPm5waW5zKys7CisJCX0KKwl9CisKKwluc19waW5jdHJsLT5ncm91 cHMgPSBkZXZtX2tjYWxsb2MoZGV2LCBBUlJBWV9TSVpFKG5zX3BpbmN0cmxfZ3JvdXBzKSwKKwkJ CQkJICBzaXplb2Yoc3RydWN0IG5zX3BpbmN0cmxfZ3JvdXApLAorCQkJCQkgIEdGUF9LRVJORUwp OworCWlmICghbnNfcGluY3RybC0+Z3JvdXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkg PSAwLCBncm91cCA9ICZuc19waW5jdHJsLT5ncm91cHNbMF07CisJICAgICBpIDwgQVJSQVlfU0la RShuc19waW5jdHJsX2dyb3Vwcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbnNfcGluY3RybF9n cm91cCAqc3JjID0gJm5zX3BpbmN0cmxfZ3JvdXBzW2ldOworCisJCWlmIChzcmMtPmNoaXBzZXRz ICYgbnNfcGluY3RybC0+Y2hpcHNldF9mbGFnKSB7CisJCQltZW1jcHkoZ3JvdXArKywgc3JjLCBz aXplb2YoKnNyYykpOworCQkJbnNfcGluY3RybC0+bnVtX2dyb3VwcysrOworCQl9CisJfQorCisJ bnNfcGluY3RybC0+ZnVuY3Rpb25zID0gZGV2bV9rY2FsbG9jKGRldiwKKwkJCQkJICAgICBBUlJB WV9TSVpFKG5zX3BpbmN0cmxfZnVuY3Rpb25zKSwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5z X3BpbmN0cmxfZnVuY3Rpb24pLAorCQkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghbnNfcGlu Y3RybC0+ZnVuY3Rpb25zKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwLCBmdW5jdGlv biA9ICZuc19waW5jdHJsLT5mdW5jdGlvbnNbMF07CisJICAgICBpIDwgQVJSQVlfU0laRShuc19w aW5jdHJsX2Z1bmN0aW9ucyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbnNfcGluY3RybF9mdW5j dGlvbiAqc3JjID0gJm5zX3BpbmN0cmxfZnVuY3Rpb25zW2ldOworCisJCWlmIChzcmMtPmNoaXBz ZXRzICYgbnNfcGluY3RybC0+Y2hpcHNldF9mbGFnKSB7CisJCQltZW1jcHkoZnVuY3Rpb24rKywg c3JjLCBzaXplb2YoKnNyYykpOworCQkJbnNfcGluY3RybC0+bnVtX2Z1bmN0aW9ucysrOworCQl9 CisJfQorCisJLyogUmVnaXN0ZXIgKi8KKworCW5zX3BpbmN0cmwtPnBjdGxkZXYgPSBkZXZtX3Bp bmN0cmxfcmVnaXN0ZXIoZGV2LCBwY3RsZGVzYywgbnNfcGluY3RybCk7CisJaWYgKElTX0VSUihu c19waW5jdHJsLT5wY3RsZGV2KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3Rl ciBwaW5jdHJsXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobnNfcGluY3RybC0+cGN0bGRldik7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5zX3Bp bmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IG5zX3BpbmN0cmxfcHJvYmUsCisJLmRyaXZlciA9 IHsKKwkJLm5hbWUgPSAibnMtcGlubXV4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gbnNfcGluY3Ry bF9vZl9tYXRjaF90YWJsZSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihuc19w aW5jdHJsX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJhZmHFgiBNacWCZWNraSIpOworTU9E VUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbnNfcGluY3Ry bF9vZl9tYXRjaF90YWJsZSk7Ci0tIAoyLjEzLjcKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51 eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5v cmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: zajec5@gmail.com (=?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?=) Date: Wed, 26 Sep 2018 21:31:03 +0200 Subject: [PATCH V3 2/2] pinctrl: bcm: add Northstar driver In-Reply-To: <20180926193103.21241-1-zajec5@gmail.com> References: <20180926193103.21241-1-zajec5@gmail.com> Message-ID: <20180926193103.21241-2-zajec5@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org From: Rafa? Mi?ecki This driver provides support for Northstar mux controller. It differs from Northstar Plus one so a new binding and driver were needed. Signed-off-by: Rafa? Mi?ecki --- V2: Define more pins, groups, functions Simplify ns_pinctrl_set_mux() as Northstar uses 1:1 mapping V3: Support 3 different bindings and different sets of pins, groups and functions. This requires building arrays dynamically on init. --- drivers/pinctrl/bcm/Kconfig | 13 ++ drivers/pinctrl/bcm/Makefile | 1 + drivers/pinctrl/bcm/pinctrl-ns.c | 372 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 386 insertions(+) create mode 100644 drivers/pinctrl/bcm/pinctrl-ns.c diff --git a/drivers/pinctrl/bcm/Kconfig b/drivers/pinctrl/bcm/Kconfig index 0f38d51f47c6..c8575399d6f7 100644 --- a/drivers/pinctrl/bcm/Kconfig +++ b/drivers/pinctrl/bcm/Kconfig @@ -73,6 +73,19 @@ config PINCTRL_CYGNUS_MUX configuration, with the exception that certain individual pins can be overridden to GPIO function +config PINCTRL_NS + bool "Broadcom Northstar pins driver" + depends on OF && (ARCH_BCM_5301X || COMPILE_TEST) + select PINMUX + select GENERIC_PINCONF + default ARCH_BCM_5301X + help + Say yes here to enable the Broadcom NS SoC pins driver. + + The Broadcom Northstar pins driver supports muxing multi-purpose pins + that can be used for various functions (e.g. SPI, I2C, UART) as well + as GPIOs. + config PINCTRL_NSP_GPIO bool "Broadcom NSP GPIO (with PINCONF) driver" depends on OF_GPIO && (ARCH_BCM_NSP || COMPILE_TEST) diff --git a/drivers/pinctrl/bcm/Makefile b/drivers/pinctrl/bcm/Makefile index 80ceb9dae944..79d5e49fdd9a 100644 --- a/drivers/pinctrl/bcm/Makefile +++ b/drivers/pinctrl/bcm/Makefile @@ -5,6 +5,7 @@ obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o obj-$(CONFIG_PINCTRL_IPROC_GPIO) += pinctrl-iproc-gpio.o obj-$(CONFIG_PINCTRL_CYGNUS_MUX) += pinctrl-cygnus-mux.o +obj-$(CONFIG_PINCTRL_NS) += pinctrl-ns.o obj-$(CONFIG_PINCTRL_NSP_GPIO) += pinctrl-nsp-gpio.o obj-$(CONFIG_PINCTRL_NS2_MUX) += pinctrl-ns2-mux.o obj-$(CONFIG_PINCTRL_NSP_MUX) += pinctrl-nsp-mux.o diff --git a/drivers/pinctrl/bcm/pinctrl-ns.c b/drivers/pinctrl/bcm/pinctrl-ns.c new file mode 100644 index 000000000000..aedbb2813c50 --- /dev/null +++ b/drivers/pinctrl/bcm/pinctrl-ns.c @@ -0,0 +1,372 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Rafa? Mi?ecki + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FLAG_BCM4708 BIT(1) +#define FLAG_BCM4709 BIT(2) +#define FLAG_BCM53012 BIT(3) + +struct ns_pinctrl { + struct device *dev; + unsigned int chipset_flag; + struct pinctrl_dev *pctldev; + void __iomem *base; + + struct pinctrl_desc pctldesc; + struct ns_pinctrl_group *groups; + unsigned int num_groups; + struct ns_pinctrl_function *functions; + unsigned int num_functions; +}; + +/* + * Pins + */ + +static const struct pinctrl_pin_desc ns_pinctrl_pins[] = { + { 0, "spi_clk", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 1, "spi_ss", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 2, "spi_mosi", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 3, "spi_miso", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 4, "i2c_scl", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 5, "i2c_sda", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 6, "mdc", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, + { 7, "mdio", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, + { 8, "pwm0", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 9, "pwm1", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 10, "pwm2", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 11, "pwm3", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 12, "uart1_rx", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 13, "uart1_tx", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 14, "uart1_cts", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 15, "uart1_rts", (void *)(FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012) }, + { 16, "uart2_rx", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, + { 17, "uart2_tx", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, +/* TODO { ??, "xtal_out", (void *)(FLAG_BCM4709) }, */ + { 22, "sdio_pwr", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, + { 23, "sdio_en_1p8v", (void *)(FLAG_BCM4709 | FLAG_BCM53012) }, +}; + +/* + * Groups + */ + +struct ns_pinctrl_group { + const char *name; + const unsigned int *pins; + const unsigned int num_pins; + unsigned int chipsets; +}; + +static const unsigned int spi_pins[] = { 0, 1, 2, 3 }; +static const unsigned int i2c_pins[] = { 4, 5 }; +static const unsigned int mdio_pins[] = { 6, 7 }; +static const unsigned int pwm0_pins[] = { 8 }; +static const unsigned int pwm1_pins[] = { 9 }; +static const unsigned int pwm2_pins[] = { 10 }; +static const unsigned int pwm3_pins[] = { 11 }; +static const unsigned int uart1_pins[] = { 12, 13, 14, 15 }; +static const unsigned int uart2_pins[] = { 16, 17 }; +static const unsigned int sdio_pwr_pins[] = { 22 }; +static const unsigned int sdio_1p8v_pins[] = { 23 }; + +#define NS_GROUP(_name, _pins, _chipsets) \ +{ \ + .name = _name, \ + .pins = _pins, \ + .num_pins = ARRAY_SIZE(_pins), \ + .chipsets = _chipsets, \ +} + +static const struct ns_pinctrl_group ns_pinctrl_groups[] = { + NS_GROUP("spi_grp", spi_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("i2c_grp", i2c_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("mdio_grp", mdio_pins, FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("pwm0_grp", pwm0_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("pwm1_grp", pwm1_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("pwm2_grp", pwm2_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("pwm3_grp", pwm3_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("uart1_grp", uart1_pins, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("uart2_grp", uart2_pins, FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("sdio_pwr_grp", sdio_pwr_pins, FLAG_BCM4709 | FLAG_BCM53012), + NS_GROUP("sdio_1p8v_grp", sdio_1p8v_pins, FLAG_BCM4709 | FLAG_BCM53012), +}; + +/* + * Functions + */ + +struct ns_pinctrl_function { + const char *name; + const char * const *groups; + const unsigned int num_groups; + unsigned int chipsets; +}; + +static const char * const spi_groups[] = { "spi_grp" }; +static const char * const i2c_groups[] = { "i2c_grp" }; +static const char * const mdio_groups[] = { "mdio_grp" }; +static const char * const pwm_groups[] = { "pwm0_grp", "pwm1_grp", "pwm2_grp", + "pwm3_grp" }; +static const char * const uart1_groups[] = { "uart1_grp" }; +static const char * const uart2_groups[] = { "uart2_grp" }; +static const char * const sdio_groups[] = { "sdio_pwr_grp", "sdio_1p8v_grp" }; + +#define NS_FUNCTION(_name, _groups, _chipsets) \ +{ \ + .name = _name, \ + .groups = _groups, \ + .num_groups = ARRAY_SIZE(_groups), \ + .chipsets = _chipsets, \ +} + +static const struct ns_pinctrl_function ns_pinctrl_functions[] = { + NS_FUNCTION("spi", spi_groups, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("i2c", i2c_groups, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("mdio", mdio_groups, FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("pwm", pwm_groups, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("uart1", uart1_groups, FLAG_BCM4708 | FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("uart2", uart2_groups, FLAG_BCM4709 | FLAG_BCM53012), + NS_FUNCTION("sdio", sdio_groups, FLAG_BCM4709 | FLAG_BCM53012), +}; + +/* + * Groups code + */ + +static int ns_pinctrl_get_groups_count(struct pinctrl_dev *pctrl_dev) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + return ns_pinctrl->num_groups; +} + +static const char *ns_pinctrl_get_group_name(struct pinctrl_dev *pctrl_dev, + unsigned int selector) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + return ns_pinctrl->groups[selector].name; +} + +static int ns_pinctrl_get_group_pins(struct pinctrl_dev *pctrl_dev, + unsigned int selector, + const unsigned int **pins, + unsigned int *num_pins) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + *pins = ns_pinctrl->groups[selector].pins; + *num_pins = ns_pinctrl->groups[selector].num_pins; + + return 0; +} + +static const struct pinctrl_ops ns_pinctrl_ops = { + .get_groups_count = ns_pinctrl_get_groups_count, + .get_group_name = ns_pinctrl_get_group_name, + .get_group_pins = ns_pinctrl_get_group_pins, + .dt_node_to_map = pinconf_generic_dt_node_to_map_group, + .dt_free_map = pinconf_generic_dt_free_map, +}; + +/* + * Functions code + */ + +static int ns_pinctrl_get_functions_count(struct pinctrl_dev *pctrl_dev) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + return ns_pinctrl->num_functions; +} + +static const char *ns_pinctrl_get_function_name(struct pinctrl_dev *pctrl_dev, + unsigned int selector) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + return ns_pinctrl->functions[selector].name; +} + +static int ns_pinctrl_get_function_groups(struct pinctrl_dev *pctrl_dev, + unsigned int selector, + const char * const **groups, + unsigned * const num_groups) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + + *groups = ns_pinctrl->functions[selector].groups; + *num_groups = ns_pinctrl->functions[selector].num_groups; + + return 0; +} + +static int ns_pinctrl_set_mux(struct pinctrl_dev *pctrl_dev, + unsigned int func_select, + unsigned int grp_select) +{ + struct ns_pinctrl *ns_pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); + u32 unset = 0; + u32 tmp; + int i; + + for (i = 0; i < ns_pinctrl->groups[grp_select].num_pins; i++) { + int pin_number = ns_pinctrl->groups[grp_select].pins[i]; + + unset |= BIT(pin_number); + } + + tmp = readl(ns_pinctrl->base); + tmp &= ~unset; + writel(tmp, ns_pinctrl->base); + + return 0; +} + +static const struct pinmux_ops ns_pinctrl_pmxops = { + .get_functions_count = ns_pinctrl_get_functions_count, + .get_function_name = ns_pinctrl_get_function_name, + .get_function_groups = ns_pinctrl_get_function_groups, + .set_mux = ns_pinctrl_set_mux, +}; + +/* + * Controller code + */ + +static struct pinctrl_desc ns_pinctrl_desc = { + .name = "pinctrl-ns", + .pctlops = &ns_pinctrl_ops, + .pmxops = &ns_pinctrl_pmxops, +}; + +static const struct of_device_id ns_pinctrl_of_match_table[] = { + { .compatible = "brcm,bcm4708-pinmux", .data = (void *)FLAG_BCM4708, }, + { .compatible = "brcm,bcm4709-pinmux", .data = (void *)FLAG_BCM4709, }, + { .compatible = "brcm,bcm53012-pinmux", .data = (void *)FLAG_BCM53012, }, + { } +}; + +static int ns_pinctrl_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + const struct of_device_id *of_id; + struct ns_pinctrl *ns_pinctrl; + struct pinctrl_desc *pctldesc; + struct pinctrl_pin_desc *pin; + struct ns_pinctrl_group *group; + struct ns_pinctrl_function *function; + struct resource *res; + int i; + + ns_pinctrl = devm_kzalloc(dev, sizeof(*ns_pinctrl), GFP_KERNEL); + if (!ns_pinctrl) + return -ENOMEM; + pctldesc = &ns_pinctrl->pctldesc; + platform_set_drvdata(pdev, ns_pinctrl); + + /* Set basic properties */ + + ns_pinctrl->dev = dev; + + of_id = of_match_device(ns_pinctrl_of_match_table, dev); + if (!of_id) + return -EINVAL; + ns_pinctrl->chipset_flag = (unsigned int)of_id->data; + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "cru_gpio_control"); + ns_pinctrl->base = devm_ioremap_resource(dev, res); + if (IS_ERR(ns_pinctrl->base)) { + dev_err(dev, "Failed to map pinctrl regs\n"); + return PTR_ERR(ns_pinctrl->base); + } + + memcpy(pctldesc, &ns_pinctrl_desc, sizeof(*pctldesc)); + + /* Set pinctrl properties */ + + pctldesc->pins = devm_kcalloc(dev, ARRAY_SIZE(ns_pinctrl_pins), + sizeof(struct pinctrl_pin_desc), + GFP_KERNEL); + if (!pctldesc->pins) + return -ENOMEM; + for (i = 0, pin = (struct pinctrl_pin_desc *)&pctldesc->pins[0]; + i < ARRAY_SIZE(ns_pinctrl_pins); i++) { + const struct pinctrl_pin_desc *src = &ns_pinctrl_pins[i]; + unsigned int chipsets = (unsigned int)src->drv_data; + + if (chipsets & ns_pinctrl->chipset_flag) { + memcpy(pin++, src, sizeof(*src)); + pctldesc->npins++; + } + } + + ns_pinctrl->groups = devm_kcalloc(dev, ARRAY_SIZE(ns_pinctrl_groups), + sizeof(struct ns_pinctrl_group), + GFP_KERNEL); + if (!ns_pinctrl->groups) + return -ENOMEM; + for (i = 0, group = &ns_pinctrl->groups[0]; + i < ARRAY_SIZE(ns_pinctrl_groups); i++) { + const struct ns_pinctrl_group *src = &ns_pinctrl_groups[i]; + + if (src->chipsets & ns_pinctrl->chipset_flag) { + memcpy(group++, src, sizeof(*src)); + ns_pinctrl->num_groups++; + } + } + + ns_pinctrl->functions = devm_kcalloc(dev, + ARRAY_SIZE(ns_pinctrl_functions), + sizeof(struct ns_pinctrl_function), + GFP_KERNEL); + if (!ns_pinctrl->functions) + return -ENOMEM; + for (i = 0, function = &ns_pinctrl->functions[0]; + i < ARRAY_SIZE(ns_pinctrl_functions); i++) { + const struct ns_pinctrl_function *src = &ns_pinctrl_functions[i]; + + if (src->chipsets & ns_pinctrl->chipset_flag) { + memcpy(function++, src, sizeof(*src)); + ns_pinctrl->num_functions++; + } + } + + /* Register */ + + ns_pinctrl->pctldev = devm_pinctrl_register(dev, pctldesc, ns_pinctrl); + if (IS_ERR(ns_pinctrl->pctldev)) { + dev_err(dev, "Failed to register pinctrl\n"); + return PTR_ERR(ns_pinctrl->pctldev); + } + + return 0; +} + +static struct platform_driver ns_pinctrl_driver = { + .probe = ns_pinctrl_probe, + .driver = { + .name = "ns-pinmux", + .of_match_table = ns_pinctrl_of_match_table, + }, +}; + +module_platform_driver(ns_pinctrl_driver); + +MODULE_AUTHOR("Rafa? Mi?ecki"); +MODULE_LICENSE("GPL v2"); +MODULE_DEVICE_TABLE(of, ns_pinctrl_of_match_table); -- 2.13.7