All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
To: Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	James Liao <jamesjj.liao@mediatek.com>,
	Daniel Kurtz <djkurtz@chromium.org>
Cc: linaro-kernel@lists.linaro.org,
	Sascha Hauer <s.hauer@pengutronix.de>,
	linux-mediatek@lists.infradead.org,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6] clk: mediatek: Export CPU mux clocks for CPU frequency control
Date: Mon, 14 Sep 2015 19:27:52 +0800	[thread overview]
Message-ID: <1442230072-31593-1-git-send-email-pi-cheng.chen@linaro.org> (raw)

RnJvbTogInBpLWNoZW5nLmNoZW4iIDxwaS1jaGVuZy5jaGVuQGxpbmFyby5vcmc+CgpUaGlzIHBh
dGNoIGFkZHMgQ1BVIG11eCBjbG9ja3Mgd2hpY2ggYXJlIHVzZWQgYnkgTWVkaWF0ZWsgY3B1ZnJl
cSBkcml2ZXIKZm9yIGludGVybWVkaWF0ZSBjbG9jayBzb3VyY2Ugc3dpdGNoaW5nLgoKU2lnbmVk
LW9mZi1ieTogUGktQ2hlbmcgQ2hlbiA8cGktY2hlbmcuY2hlbkBsaW5hcm8ub3JnPgotLS0KQ2hh
bmdlcyBpbiB2NjoKLSBSZWxhY2UgX19jbGtfZ2V0X251bV9wYXJlbnRzIHdpdGggY2xrX2h3X2dl
dF9udW1fcGFyZW50cyB0byByZWZsZWN0CiAgQVBJIGNoYW5nZQoKQ2hhbmdlcyBpbiB2NToKLSBS
ZXBsYWNlIF9faW5pdGRhdGEgd2l0aCBfX2luaXRjb25zdCB0byBmaXggY29tcGlsaW5nIGVycm9y
CgpDaGFuZ2VzIGluIHY0OgotIEZpeCBzb21lIG1pbm9yIGlzc3VlcyBmb3IgdjMKLSBSZWJhc2Ug
dG8gdGhlIHBhdGNoIHRoYXQgYWRkcyAxM21oeiBjbG9jayBmb3IgTVQ4MTczWzFdCgpDaGFuZ2Vz
IGluIHYzOgotIFJlYmFzZSB0byA0LjItcmMxCi0gRml4IHNvbWUgaXNzdWVzIG9mIHYyCgpDaGFu
Z2VzIGluIHYyOgotIFJlbW92ZSB1c2Ugb2YgLmRldGVybWluZV9yYXRlIGNhbGxiYWNrCi0tLQog
ZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUgICAgICAgICAgfCAgIDIgKy0KIGRyaXZlcnMv
Y2xrL21lZGlhdGVrL2Nsay1jcHVtdXguYyAgICAgIHwgMTI3ICsrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKwogZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWNwdW11eC5oICAgICAgfCAg
MjIgKysrKysrCiBkcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTczLmMgICAgICB8ICAyMyAr
KysrKysKIGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbXQ4MTczLWNsay5oIHwgICA0ICstCiA1
IGZpbGVzIGNoYW5nZWQsIDE3NiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQogY3JlYXRl
IG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1jcHVtdXguYwogY3JlYXRlIG1v
ZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1jcHVtdXguaAoKZGlmZiAtLWdpdCBh
L2RyaXZlcnMvY2xrL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFr
ZWZpbGUKaW5kZXggOGU0YjJhNC4uMjk5OTE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVk
aWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUKQEAgLTEs
NCArMSw0IEBACi1vYmoteSArPSBjbGstbXRrLm8gY2xrLXBsbC5vIGNsay1nYXRlLm8KK29iai15
ICs9IGNsay1tdGsubyBjbGstcGxsLm8gY2xrLWdhdGUubyBjbGstY3B1bXV4Lm8KIG9iai0kKENP
TkZJR19SRVNFVF9DT05UUk9MTEVSKSArPSByZXNldC5vCiBvYmoteSArPSBjbGstbXQ4MTM1Lm8K
IG9iai15ICs9IGNsay1tdDgxNzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsv
Y2xrLWNwdW11eC5jIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWNwdW11eC5jCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjUyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9k
cml2ZXJzL2Nsay9tZWRpYXRlay9jbGstY3B1bXV4LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKGMpIDIwMTUgTGluYXJvIEx0ZC4KKyAqIEF1dGhvcjogUGktQ2hlbmcgQ2hl
biA8cGktY2hlbmcuY2hlbkBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24g
MiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgor
ICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVy
Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIu
aD4KKworI2luY2x1ZGUgImNsay1tdGsuaCIKKyNpbmNsdWRlICJjbGstY3B1bXV4LmgiCisKK3N0
cnVjdCBtdGtfY2xrX2NwdW11eCB7CisJc3RydWN0IGNsa19odwlodzsKKwlzdHJ1Y3QgcmVnbWFw
CSpyZWdtYXA7CisJdTMyCQlyZWc7CisJdTMyCQltYXNrOworCXU4CQlzaGlmdDsKK307CisKK3N0
YXRpYyBpbmxpbmUgc3RydWN0IG10a19jbGtfY3B1bXV4ICp0b19jbGtfbXV4KHN0cnVjdCBjbGtf
aHcgKl9odykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKF9odywgc3RydWN0IG10a19jbGtfY3B1
bXV4LCBodyk7Cit9CisKK3N0YXRpYyB1OCBjbGtfY3B1bXV4X2dldF9wYXJlbnQoc3RydWN0IGNs
a19odyAqaHcpCit7CisJc3RydWN0IG10a19jbGtfY3B1bXV4ICptdXggPSB0b19jbGtfbXV4KGh3
KTsKKwlpbnQgbnVtX3BhcmVudHMgPSBjbGtfaHdfZ2V0X251bV9wYXJlbnRzKGh3KTsKKwl1bnNp
Z25lZCBpbnQgdmFsOworCisJcmVnbWFwX3JlYWQobXV4LT5yZWdtYXAsIG11eC0+cmVnLCAmdmFs
KTsKKworCXZhbCA+Pj0gbXV4LT5zaGlmdDsKKwl2YWwgJj0gbXV4LT5tYXNrOworCisJaWYgKHZh
bCA+PSBudW1fcGFyZW50cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmFsOworfQor
CitzdGF0aWMgaW50IGNsa19jcHVtdXhfc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTgg
aW5kZXgpCit7CisJc3RydWN0IG10a19jbGtfY3B1bXV4ICptdXggPSB0b19jbGtfbXV4KGh3KTsK
Kwl1MzIgbWFzaywgdmFsOworCisJdmFsID0gaW5kZXggPDwgbXV4LT5zaGlmdDsKKwltYXNrID0g
bXV4LT5tYXNrIDw8IG11eC0+c2hpZnQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG11
eC0+cmVnbWFwLCBtdXgtPnJlZywgbWFzaywgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj
dCBjbGtfb3BzIGNsa19jcHVtdXhfb3BzID0geworCS5nZXRfcGFyZW50ID0gY2xrX2NwdW11eF9n
ZXRfcGFyZW50LAorCS5zZXRfcGFyZW50ID0gY2xrX2NwdW11eF9zZXRfcGFyZW50LAorfTsKKwor
c3RhdGljIHN0cnVjdCBjbGsgX19pbml0ICptdGtfY2xrX3JlZ2lzdGVyX2NwdW11eChjb25zdCBz
dHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqbXV4LAorCQkJCQkgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAp
Cit7CisJc3RydWN0IG10a19jbGtfY3B1bXV4ICpjcHVtdXg7CisJc3RydWN0IGNsayAqY2xrOwor
CXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisKKwljcHVtdXggPSBremFsbG9jKHNpemVvZigq
Y3B1bXV4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcHVtdXgpCisJCXJldHVybiBFUlJfUFRSKC1F
Tk9NRU0pOworCisJaW5pdC5uYW1lID0gbXV4LT5uYW1lOworCWluaXQub3BzID0gJmNsa19jcHVt
dXhfb3BzOworCWluaXQucGFyZW50X25hbWVzID0gbXV4LT5wYXJlbnRfbmFtZXM7CisJaW5pdC5u
dW1fcGFyZW50cyA9IG11eC0+bnVtX3BhcmVudHM7CisJaW5pdC5mbGFncyA9IG11eC0+ZmxhZ3M7
CisKKwljcHVtdXgtPnJlZyA9IG11eC0+bXV4X3JlZzsKKwljcHVtdXgtPnNoaWZ0ID0gbXV4LT5t
dXhfc2hpZnQ7CisJY3B1bXV4LT5tYXNrID0gQklUKG11eC0+bXV4X3dpZHRoKSAtIDE7CisJY3B1
bXV4LT5yZWdtYXAgPSByZWdtYXA7CisJY3B1bXV4LT5ody5pbml0ID0gJmluaXQ7CisKKwljbGsg
PSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmNwdW11eC0+aHcpOworCWlmIChJU19FUlIoY2xrKSkKKwkJ
a2ZyZWUoY3B1bXV4KTsKKworCXJldHVybiBjbGs7Cit9CisKK2ludCBfX2luaXQgbXRrX2Nsa19y
ZWdpc3Rlcl9jcHVtdXhlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBjb25z
dCBzdHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqY2xrcywgaW50IG51bSwKKwkJCSAgICAgIHN0cnVjdCBj
bGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2xrICpjbGs7
CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVn
bWFwKG5vZGUpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlwcl9lcnIoIkNhbm5vdCBmaW5k
IHJlZ21hcCBmb3IgJXM6ICVsZFxuIiwgbm9kZS0+ZnVsbF9uYW1lLAorCQkgICAgICAgUFRSX0VS
UihyZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlmb3IgKGkgPSAw
OyBpIDwgbnVtOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgKm11eCA9ICZj
bGtzW2ldOworCisJCWNsayA9IG10a19jbGtfcmVnaXN0ZXJfY3B1bXV4KG11eCwgcmVnbWFwKTsK
KwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBjbGsg
JXM6ICVsZFxuIiwKKwkJCSAgICAgICBtdXgtPm5hbWUsIFBUUl9FUlIoY2xrKSk7CisJCQljb250
aW51ZTsKKwkJfQorCisJCWNsa19kYXRhLT5jbGtzW211eC0+aWRdID0gY2xrOworCX0KKworCXJl
dHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWNwdW11eC5o
IGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWNwdW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjUyYzc2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9t
ZWRpYXRlay9jbGstY3B1bXV4LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAo
YykgMjAxNSBMaW5hcm8gTHRkLgorICogQXV0aG9yOiBQaS1DaGVuZyBDaGVuIDxwaS1jaGVuZy5j
aGVuQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dy
YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19EUlZfQ0xLX0NQVU1VWF9ICisjZGVmaW5lIF9fRFJW
X0NMS19DUFVNVVhfSAorCitpbnQgbXRrX2Nsa19yZWdpc3Rlcl9jcHVtdXhlcyhzdHJ1Y3QgZGV2
aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqY2xr
cywgaW50IG51bSwKKwkJCSAgICAgIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YSk7
CisKKyNlbmRpZiAvKiBfX0RSVl9DTEtfQ1BVTVVYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMv
Y2xrL21lZGlhdGVrL2Nsay1tdDgxNzMuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgx
NzMuYwppbmRleCA5ZWE2YWExLi5iMDJkMzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRp
YXRlay9jbGstbXQ4MTczLmMKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE3My5j
CkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJjbGstbXRrLmgiCiAjaW5jbHVkZSAiY2xr
LWdhdGUuaCIKKyNpbmNsdWRlICJjbGstY3B1bXV4LmgiCiAKICNpbmNsdWRlIDxkdC1iaW5kaW5n
cy9jbG9jay9tdDgxNzMtY2xrLmg+CiAKQEAgLTUxOCw2ICs1MTksMjUgQEAgc3RhdGljIGNvbnN0
IGNoYXIgKiBjb25zdCBpMnMzX2JfY2tfcGFyZW50c1tdIF9faW5pdGNvbnN0ID0gewogCSJhcGxs
Ml9kaXY1IgogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYTUzX3BhcmVudHNbXSBf
X2luaXRjb25zdCA9IHsKKwkiY2xrMjZtIiwKKwkiYXJtY2E3cGxsIiwKKwkibWFpbnBsbCIsCisJ
InVuaXZwbGwiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhNTdfcGFyZW50c1td
IF9faW5pdGNvbnN0ID0geworCSJjbGsyNm0iLAorCSJhcm1jYTE1cGxsIiwKKwkibWFpbnBsbCIs
CisJInVuaXZwbGwiCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgY3B1
X211eGVzW10gX19pbml0Y29uc3QgPSB7CisJTVVYKENMS19JTkZSQV9DQTUzU0VMLCAiaW5mcmFf
Y2E1M19zZWwiLCBjYTUzX3BhcmVudHMsIDB4MDAwMCwgMCwgMiksCisJTVVYKENMS19JTkZSQV9D
QTU3U0VMLCAiaW5mcmFfY2E1N19zZWwiLCBjYTU3X3BhcmVudHMsIDB4MDAwMCwgMiwgMiksCit9
OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgdG9wX211eGVzW10gX19pbml0
Y29uc3QgPSB7CiAJLyogQ0xLX0NGR18wICovCiAJTVVYKENMS19UT1BfQVhJX1NFTCwgImF4aV9z
ZWwiLCBheGlfcGFyZW50cywgMHgwMDQwLCAwLCAzKSwKQEAgLTc2MCw2ICs3ODAsOSBAQCBzdGF0
aWMgdm9pZCBfX2luaXQgbXRrX2luZnJhc3lzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2Rl
KQogCQkJCQkJY2xrX2RhdGEpOwogCW10a19jbGtfcmVnaXN0ZXJfZmFjdG9ycyhpbmZyYV9kaXZz
LCBBUlJBWV9TSVpFKGluZnJhX2RpdnMpLCBjbGtfZGF0YSk7CiAKKwltdGtfY2xrX3JlZ2lzdGVy
X2NwdW11eGVzKG5vZGUsIGNwdV9tdXhlcywgQVJSQVlfU0laRShjcHVfbXV4ZXMpLAorCQkJCQkJ
Y2xrX2RhdGEpOworCiAJciA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19v
bmVjZWxsX2dldCwgY2xrX2RhdGEpOwogCWlmIChyKQogCQlwcl9lcnIoIiVzKCk6IGNvdWxkIG5v
dCByZWdpc3RlciBjbG9jayBwcm92aWRlcjogJWRcbiIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0
LWJpbmRpbmdzL2Nsb2NrL210ODE3My1jbGsuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2sv
bXQ4MTczLWNsay5oCmluZGV4IGZhMmEyYmIuLmExN2NiYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUv
ZHQtYmluZGluZ3MvY2xvY2svbXQ4MTczLWNsay5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3Mv
Y2xvY2svbXQ4MTczLWNsay5oCkBAIC0xODgsNyArMTg4LDkgQEAKICNkZWZpbmUgQ0xLX0lORlJB
X1BNSUNTUEkJCTEwCiAjZGVmaW5lIENMS19JTkZSQV9QTUlDV1JBUAkJMTEKICNkZWZpbmUgQ0xL
X0lORlJBX0NMS18xM00JCTEyCi0jZGVmaW5lIENMS19JTkZSQV9OUl9DTEsJCTEzCisjZGVmaW5l
IENMS19JTkZSQV9DQTUzU0VMCQkxMworI2RlZmluZSBDTEtfSU5GUkFfQ0E1N1NFTAkJMTQKKyNk
ZWZpbmUgQ0xLX0lORlJBX05SX0NMSwkJMTUKIAogLyogUEVSSV9TWVMgKi8KIAotLSAKMS45LjEK
Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbmFyby1r
ZXJuZWwgbWFpbGluZyBsaXN0CmxpbmFyby1rZXJuZWxAbGlzdHMubGluYXJvLm9yZwpodHRwczov
L2xpc3RzLmxpbmFyby5vcmcvbWFpbG1hbi9saXN0aW5mby9saW5hcm8ta2VybmVsCg==

WARNING: multiple messages have this Message-ID (diff)
From: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
To: Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>,
	James Liao <jamesjj.liao@mediatek.com>,
	Daniel Kurtz <djkurtz@chromium.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-clk@vger.kernel.org, linux-mediatek@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	linaro-kernel@lists.linaro.org,
	"pi-cheng.chen" <pi-cheng.chen@linaro.org>
Subject: [PATCH v6] clk: mediatek: Export CPU mux clocks for CPU frequency control
Date: Mon, 14 Sep 2015 19:27:52 +0800	[thread overview]
Message-ID: <1442230072-31593-1-git-send-email-pi-cheng.chen@linaro.org> (raw)

From: "pi-cheng.chen" <pi-cheng.chen@linaro.org>

This patch adds CPU mux clocks which are used by Mediatek cpufreq driver
for intermediate clock source switching.

Signed-off-by: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
---
Changes in v6:
- Relace __clk_get_num_parents with clk_hw_get_num_parents to reflect
  API change

Changes in v5:
- Replace __initdata with __initconst to fix compiling error

Changes in v4:
- Fix some minor issues for v3
- Rebase to the patch that adds 13mhz clock for MT8173[1]

Changes in v3:
- Rebase to 4.2-rc1
- Fix some issues of v2

Changes in v2:
- Remove use of .determine_rate callback
---
 drivers/clk/mediatek/Makefile          |   2 +-
 drivers/clk/mediatek/clk-cpumux.c      | 127 +++++++++++++++++++++++++++++++++
 drivers/clk/mediatek/clk-cpumux.h      |  22 ++++++
 drivers/clk/mediatek/clk-mt8173.c      |  23 ++++++
 include/dt-bindings/clock/mt8173-clk.h |   4 +-
 5 files changed, 176 insertions(+), 2 deletions(-)
 create mode 100644 drivers/clk/mediatek/clk-cpumux.c
 create mode 100644 drivers/clk/mediatek/clk-cpumux.h

diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile
index 8e4b2a4..299917a 100644
--- a/drivers/clk/mediatek/Makefile
+++ b/drivers/clk/mediatek/Makefile
@@ -1,4 +1,4 @@
-obj-y += clk-mtk.o clk-pll.o clk-gate.o
+obj-y += clk-mtk.o clk-pll.o clk-gate.o clk-cpumux.o
 obj-$(CONFIG_RESET_CONTROLLER) += reset.o
 obj-y += clk-mt8135.o
 obj-y += clk-mt8173.o
diff --git a/drivers/clk/mediatek/clk-cpumux.c b/drivers/clk/mediatek/clk-cpumux.c
new file mode 100644
index 0000000..91b5238
--- /dev/null
+++ b/drivers/clk/mediatek/clk-cpumux.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015 Linaro Ltd.
+ * Author: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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 <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include "clk-mtk.h"
+#include "clk-cpumux.h"
+
+struct mtk_clk_cpumux {
+	struct clk_hw	hw;
+	struct regmap	*regmap;
+	u32		reg;
+	u32		mask;
+	u8		shift;
+};
+
+static inline struct mtk_clk_cpumux *to_clk_mux(struct clk_hw *_hw)
+{
+	return container_of(_hw, struct mtk_clk_cpumux, hw);
+}
+
+static u8 clk_cpumux_get_parent(struct clk_hw *hw)
+{
+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
+	int num_parents = clk_hw_get_num_parents(hw);
+	unsigned int val;
+
+	regmap_read(mux->regmap, mux->reg, &val);
+
+	val >>= mux->shift;
+	val &= mux->mask;
+
+	if (val >= num_parents)
+		return -EINVAL;
+
+	return val;
+}
+
+static int clk_cpumux_set_parent(struct clk_hw *hw, u8 index)
+{
+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
+	u32 mask, val;
+
+	val = index << mux->shift;
+	mask = mux->mask << mux->shift;
+
+	return regmap_update_bits(mux->regmap, mux->reg, mask, val);
+}
+
+static const struct clk_ops clk_cpumux_ops = {
+	.get_parent = clk_cpumux_get_parent,
+	.set_parent = clk_cpumux_set_parent,
+};
+
+static struct clk __init *mtk_clk_register_cpumux(const struct mtk_composite *mux,
+					   struct regmap *regmap)
+{
+	struct mtk_clk_cpumux *cpumux;
+	struct clk *clk;
+	struct clk_init_data init;
+
+	cpumux = kzalloc(sizeof(*cpumux), GFP_KERNEL);
+	if (!cpumux)
+		return ERR_PTR(-ENOMEM);
+
+	init.name = mux->name;
+	init.ops = &clk_cpumux_ops;
+	init.parent_names = mux->parent_names;
+	init.num_parents = mux->num_parents;
+	init.flags = mux->flags;
+
+	cpumux->reg = mux->mux_reg;
+	cpumux->shift = mux->mux_shift;
+	cpumux->mask = BIT(mux->mux_width) - 1;
+	cpumux->regmap = regmap;
+	cpumux->hw.init = &init;
+
+	clk = clk_register(NULL, &cpumux->hw);
+	if (IS_ERR(clk))
+		kfree(cpumux);
+
+	return clk;
+}
+
+int __init mtk_clk_register_cpumuxes(struct device_node *node,
+			      const struct mtk_composite *clks, int num,
+			      struct clk_onecell_data *clk_data)
+{
+	int i;
+	struct clk *clk;
+	struct regmap *regmap;
+
+	regmap = syscon_node_to_regmap(node);
+	if (IS_ERR(regmap)) {
+		pr_err("Cannot find regmap for %s: %ld\n", node->full_name,
+		       PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	for (i = 0; i < num; i++) {
+		const struct mtk_composite *mux = &clks[i];
+
+		clk = mtk_clk_register_cpumux(mux, regmap);
+		if (IS_ERR(clk)) {
+			pr_err("Failed to register clk %s: %ld\n",
+			       mux->name, PTR_ERR(clk));
+			continue;
+		}
+
+		clk_data->clks[mux->id] = clk;
+	}
+
+	return 0;
+}
diff --git a/drivers/clk/mediatek/clk-cpumux.h b/drivers/clk/mediatek/clk-cpumux.h
new file mode 100644
index 0000000..52c769f
--- /dev/null
+++ b/drivers/clk/mediatek/clk-cpumux.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2015 Linaro Ltd.
+ * Author: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#ifndef __DRV_CLK_CPUMUX_H
+#define __DRV_CLK_CPUMUX_H
+
+int mtk_clk_register_cpumuxes(struct device_node *node,
+			      const struct mtk_composite *clks, int num,
+			      struct clk_onecell_data *clk_data);
+
+#endif /* __DRV_CLK_CPUMUX_H */
diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-mt8173.c
index 9ea6aa1..b02d310 100644
--- a/drivers/clk/mediatek/clk-mt8173.c
+++ b/drivers/clk/mediatek/clk-mt8173.c
@@ -20,6 +20,7 @@
 
 #include "clk-mtk.h"
 #include "clk-gate.h"
+#include "clk-cpumux.h"
 
 #include <dt-bindings/clock/mt8173-clk.h>
 
@@ -518,6 +519,25 @@ static const char * const i2s3_b_ck_parents[] __initconst = {
 	"apll2_div5"
 };
 
+static const char * const ca53_parents[] __initconst = {
+	"clk26m",
+	"armca7pll",
+	"mainpll",
+	"univpll"
+};
+
+static const char * const ca57_parents[] __initconst = {
+	"clk26m",
+	"armca15pll",
+	"mainpll",
+	"univpll"
+};
+
+static const struct mtk_composite cpu_muxes[] __initconst = {
+	MUX(CLK_INFRA_CA53SEL, "infra_ca53_sel", ca53_parents, 0x0000, 0, 2),
+	MUX(CLK_INFRA_CA57SEL, "infra_ca57_sel", ca57_parents, 0x0000, 2, 2),
+};
+
 static const struct mtk_composite top_muxes[] __initconst = {
 	/* CLK_CFG_0 */
 	MUX(CLK_TOP_AXI_SEL, "axi_sel", axi_parents, 0x0040, 0, 3),
@@ -760,6 +780,9 @@ static void __init mtk_infrasys_init(struct device_node *node)
 						clk_data);
 	mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
 
+	mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
+						clk_data);
+
 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
 	if (r)
 		pr_err("%s(): could not register clock provider: %d\n",
diff --git a/include/dt-bindings/clock/mt8173-clk.h b/include/dt-bindings/clock/mt8173-clk.h
index fa2a2bb..a17cbaa 100644
--- a/include/dt-bindings/clock/mt8173-clk.h
+++ b/include/dt-bindings/clock/mt8173-clk.h
@@ -188,7 +188,9 @@
 #define CLK_INFRA_PMICSPI		10
 #define CLK_INFRA_PMICWRAP		11
 #define CLK_INFRA_CLK_13M		12
-#define CLK_INFRA_NR_CLK		13
+#define CLK_INFRA_CA53SEL		13
+#define CLK_INFRA_CA57SEL		14
+#define CLK_INFRA_NR_CLK		15
 
 /* PERI_SYS */
 
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: pi-cheng.chen@linaro.org (Pi-Cheng Chen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6] clk: mediatek: Export CPU mux clocks for CPU frequency control
Date: Mon, 14 Sep 2015 19:27:52 +0800	[thread overview]
Message-ID: <1442230072-31593-1-git-send-email-pi-cheng.chen@linaro.org> (raw)

From: "pi-cheng.chen" <pi-cheng.chen@linaro.org>

This patch adds CPU mux clocks which are used by Mediatek cpufreq driver
for intermediate clock source switching.

Signed-off-by: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
---
Changes in v6:
- Relace __clk_get_num_parents with clk_hw_get_num_parents to reflect
  API change

Changes in v5:
- Replace __initdata with __initconst to fix compiling error

Changes in v4:
- Fix some minor issues for v3
- Rebase to the patch that adds 13mhz clock for MT8173[1]

Changes in v3:
- Rebase to 4.2-rc1
- Fix some issues of v2

Changes in v2:
- Remove use of .determine_rate callback
---
 drivers/clk/mediatek/Makefile          |   2 +-
 drivers/clk/mediatek/clk-cpumux.c      | 127 +++++++++++++++++++++++++++++++++
 drivers/clk/mediatek/clk-cpumux.h      |  22 ++++++
 drivers/clk/mediatek/clk-mt8173.c      |  23 ++++++
 include/dt-bindings/clock/mt8173-clk.h |   4 +-
 5 files changed, 176 insertions(+), 2 deletions(-)
 create mode 100644 drivers/clk/mediatek/clk-cpumux.c
 create mode 100644 drivers/clk/mediatek/clk-cpumux.h

diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile
index 8e4b2a4..299917a 100644
--- a/drivers/clk/mediatek/Makefile
+++ b/drivers/clk/mediatek/Makefile
@@ -1,4 +1,4 @@
-obj-y += clk-mtk.o clk-pll.o clk-gate.o
+obj-y += clk-mtk.o clk-pll.o clk-gate.o clk-cpumux.o
 obj-$(CONFIG_RESET_CONTROLLER) += reset.o
 obj-y += clk-mt8135.o
 obj-y += clk-mt8173.o
diff --git a/drivers/clk/mediatek/clk-cpumux.c b/drivers/clk/mediatek/clk-cpumux.c
new file mode 100644
index 0000000..91b5238
--- /dev/null
+++ b/drivers/clk/mediatek/clk-cpumux.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2015 Linaro Ltd.
+ * Author: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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 <linux/clk-provider.h>
+#include <linux/mfd/syscon.h>
+#include <linux/slab.h>
+
+#include "clk-mtk.h"
+#include "clk-cpumux.h"
+
+struct mtk_clk_cpumux {
+	struct clk_hw	hw;
+	struct regmap	*regmap;
+	u32		reg;
+	u32		mask;
+	u8		shift;
+};
+
+static inline struct mtk_clk_cpumux *to_clk_mux(struct clk_hw *_hw)
+{
+	return container_of(_hw, struct mtk_clk_cpumux, hw);
+}
+
+static u8 clk_cpumux_get_parent(struct clk_hw *hw)
+{
+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
+	int num_parents = clk_hw_get_num_parents(hw);
+	unsigned int val;
+
+	regmap_read(mux->regmap, mux->reg, &val);
+
+	val >>= mux->shift;
+	val &= mux->mask;
+
+	if (val >= num_parents)
+		return -EINVAL;
+
+	return val;
+}
+
+static int clk_cpumux_set_parent(struct clk_hw *hw, u8 index)
+{
+	struct mtk_clk_cpumux *mux = to_clk_mux(hw);
+	u32 mask, val;
+
+	val = index << mux->shift;
+	mask = mux->mask << mux->shift;
+
+	return regmap_update_bits(mux->regmap, mux->reg, mask, val);
+}
+
+static const struct clk_ops clk_cpumux_ops = {
+	.get_parent = clk_cpumux_get_parent,
+	.set_parent = clk_cpumux_set_parent,
+};
+
+static struct clk __init *mtk_clk_register_cpumux(const struct mtk_composite *mux,
+					   struct regmap *regmap)
+{
+	struct mtk_clk_cpumux *cpumux;
+	struct clk *clk;
+	struct clk_init_data init;
+
+	cpumux = kzalloc(sizeof(*cpumux), GFP_KERNEL);
+	if (!cpumux)
+		return ERR_PTR(-ENOMEM);
+
+	init.name = mux->name;
+	init.ops = &clk_cpumux_ops;
+	init.parent_names = mux->parent_names;
+	init.num_parents = mux->num_parents;
+	init.flags = mux->flags;
+
+	cpumux->reg = mux->mux_reg;
+	cpumux->shift = mux->mux_shift;
+	cpumux->mask = BIT(mux->mux_width) - 1;
+	cpumux->regmap = regmap;
+	cpumux->hw.init = &init;
+
+	clk = clk_register(NULL, &cpumux->hw);
+	if (IS_ERR(clk))
+		kfree(cpumux);
+
+	return clk;
+}
+
+int __init mtk_clk_register_cpumuxes(struct device_node *node,
+			      const struct mtk_composite *clks, int num,
+			      struct clk_onecell_data *clk_data)
+{
+	int i;
+	struct clk *clk;
+	struct regmap *regmap;
+
+	regmap = syscon_node_to_regmap(node);
+	if (IS_ERR(regmap)) {
+		pr_err("Cannot find regmap for %s: %ld\n", node->full_name,
+		       PTR_ERR(regmap));
+		return PTR_ERR(regmap);
+	}
+
+	for (i = 0; i < num; i++) {
+		const struct mtk_composite *mux = &clks[i];
+
+		clk = mtk_clk_register_cpumux(mux, regmap);
+		if (IS_ERR(clk)) {
+			pr_err("Failed to register clk %s: %ld\n",
+			       mux->name, PTR_ERR(clk));
+			continue;
+		}
+
+		clk_data->clks[mux->id] = clk;
+	}
+
+	return 0;
+}
diff --git a/drivers/clk/mediatek/clk-cpumux.h b/drivers/clk/mediatek/clk-cpumux.h
new file mode 100644
index 0000000..52c769f
--- /dev/null
+++ b/drivers/clk/mediatek/clk-cpumux.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2015 Linaro Ltd.
+ * Author: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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.
+ */
+
+#ifndef __DRV_CLK_CPUMUX_H
+#define __DRV_CLK_CPUMUX_H
+
+int mtk_clk_register_cpumuxes(struct device_node *node,
+			      const struct mtk_composite *clks, int num,
+			      struct clk_onecell_data *clk_data);
+
+#endif /* __DRV_CLK_CPUMUX_H */
diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-mt8173.c
index 9ea6aa1..b02d310 100644
--- a/drivers/clk/mediatek/clk-mt8173.c
+++ b/drivers/clk/mediatek/clk-mt8173.c
@@ -20,6 +20,7 @@
 
 #include "clk-mtk.h"
 #include "clk-gate.h"
+#include "clk-cpumux.h"
 
 #include <dt-bindings/clock/mt8173-clk.h>
 
@@ -518,6 +519,25 @@ static const char * const i2s3_b_ck_parents[] __initconst = {
 	"apll2_div5"
 };
 
+static const char * const ca53_parents[] __initconst = {
+	"clk26m",
+	"armca7pll",
+	"mainpll",
+	"univpll"
+};
+
+static const char * const ca57_parents[] __initconst = {
+	"clk26m",
+	"armca15pll",
+	"mainpll",
+	"univpll"
+};
+
+static const struct mtk_composite cpu_muxes[] __initconst = {
+	MUX(CLK_INFRA_CA53SEL, "infra_ca53_sel", ca53_parents, 0x0000, 0, 2),
+	MUX(CLK_INFRA_CA57SEL, "infra_ca57_sel", ca57_parents, 0x0000, 2, 2),
+};
+
 static const struct mtk_composite top_muxes[] __initconst = {
 	/* CLK_CFG_0 */
 	MUX(CLK_TOP_AXI_SEL, "axi_sel", axi_parents, 0x0040, 0, 3),
@@ -760,6 +780,9 @@ static void __init mtk_infrasys_init(struct device_node *node)
 						clk_data);
 	mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
 
+	mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
+						clk_data);
+
 	r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
 	if (r)
 		pr_err("%s(): could not register clock provider: %d\n",
diff --git a/include/dt-bindings/clock/mt8173-clk.h b/include/dt-bindings/clock/mt8173-clk.h
index fa2a2bb..a17cbaa 100644
--- a/include/dt-bindings/clock/mt8173-clk.h
+++ b/include/dt-bindings/clock/mt8173-clk.h
@@ -188,7 +188,9 @@
 #define CLK_INFRA_PMICSPI		10
 #define CLK_INFRA_PMICWRAP		11
 #define CLK_INFRA_CLK_13M		12
-#define CLK_INFRA_NR_CLK		13
+#define CLK_INFRA_CA53SEL		13
+#define CLK_INFRA_CA57SEL		14
+#define CLK_INFRA_NR_CLK		15
 
 /* PERI_SYS */
 
-- 
1.9.1

             reply	other threads:[~2015-09-14 11:27 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-14 11:27 Pi-Cheng Chen [this message]
2015-09-14 11:27 ` [PATCH v6] clk: mediatek: Export CPU mux clocks for CPU frequency control Pi-Cheng Chen
2015-09-14 11:27 ` Pi-Cheng Chen
2015-11-30  3:48 ` Daniel Kurtz
2015-11-30  3:48   ` Daniel Kurtz
2015-12-01 15:09   ` Pi-Cheng Chen
2015-12-01 15:09     ` Pi-Cheng Chen
2015-12-17  9:06     ` Michael Turquette
2015-12-17  9:06       ` Michael Turquette
2016-01-26 10:23       ` Daniel Kurtz
2016-01-26 10:23         ` Daniel Kurtz
2016-02-01 11:46         ` Matthias Brugger
2016-02-01 11:46           ` Matthias Brugger
2016-02-01 11:48           ` Daniel Kurtz
2016-02-01 11:48             ` Daniel Kurtz
2016-02-15  3:28       ` Daniel Kurtz
2016-02-15  3:28         ` Daniel Kurtz
2017-02-12  3:31         ` Daniel Kurtz
2017-02-12  3:31           ` Daniel Kurtz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1442230072-31593-1-git-send-email-pi-cheng.chen@linaro.org \
    --to=pi-cheng.chen@linaro.org \
    --cc=djkurtz@chromium.org \
    --cc=jamesjj.liao@mediatek.com \
    --cc=linaro-kernel@lists.linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=matthias.bgg@gmail.com \
    --cc=mturquette@baylibre.com \
    --cc=s.hauer@pengutronix.de \
    --cc=sboyd@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.