From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Stuebner Subject: Re: [PATCH v5 3/4] phy: rockchip-typec: support variable phy config value Date: Fri, 18 May 2018 18:33:52 +0200 Message-ID: <3042646.xpzRv8Q1H3@phil> References: <1526548680-2552-1-git-send-email-hl@rock-chips.com> <1526548680-2552-3-git-send-email-hl@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1526548680-2552-3-git-send-email-hl@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Lin Huang Cc: devicetree@vger.kernel.org, airlied@linux.ie, briannorris@chromium.org, dianders@chromium.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, dri-devel@lists.freedesktop.org, zyw@rock-chips.com, daniel.vetter@intel.com, kishon@ti.com, linux-arm-kernel@lists.infradead.org List-Id: linux-rockchip.vger.kernel.org SGksCgpBbSBEb25uZXJzdGFnLCAxNy4gTWFpIDIwMTgsIDExOjE3OjU5IENFU1Qgc2NocmllYiBM aW4gSHVhbmc6Cj4gdGhlIHBoeSBjb25maWcgdmFsdWVzIHVzZWQgdG8gZml4IGluIGRwIGZpcm13 YXJlLCBidXQgc29tZSBib2FyZHMKPiBuZWVkIGNoYW5nZSB0aGVzZSB2YWx1ZXMgdG8gZG8gdHJh aW5pbmcgYW5kIGdldCB0aGUgYmV0dGVyIGV5ZSBkaWFncmFtCj4gcmVzdWx0LiBTbyBzdXBwb3J0 IHRoYXQgaW4gcGh5IGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBDaHJpcyBaaG9uZyA8enl3 QHJvY2stY2hpcHMuY29tPgo+IFNpZ25lZC1vZmYtYnk6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlw cy5jb20+CgpJIGRvbid0IHNlZSBhbnl0aGluZyBvYnZpb3VzLgoKT25lIGNvdWxkIGFyZ3VlLCB0 aGF0IHNwbGl0dGluZyBvdXQgb2YgdGhlIHN0cnVjdHMgaW50byB0aGUgaGVhZGVyIGNvdWxkCmJl IGEgc2VwYXJhdGUgcGF0Y2gsIGVzcGVjaWFsbHkgYXMgdGhlIHJlYXNvbiBmb3IgaXQgaXMgbm90 IHNwZWxsZWQgb3V0CmluIHRoZSBjb21taXQgbWVzc2FnZSBhdCBhbGwgLSBhbmQgdGhlIHJlYXNv biBvbmx5IGJlY29tZXMgdmlzaWJsZSB3aGVuCmFsc28gcmVhZGluZyBwYXRjaDQuCgpCdXQgd2hh dCBpcyBldmVuIG1vcmUgaW1wb3J0YW50IGlzIGtlZXBpbmcgS2lzaG9uIGFzIHRoZSBwaHktbWFp bnRhaW5lcgppbiB0aGUgbG9vcC4gSSd2ZSBkb25lIHRoYXQgaGVyZSwgYnV0IHBsZWFzZSBtYWtl IHN1cmUgdGhhdCBmb2xsb3dpbmcKdmVyc2lvbnMgYWxzbyBnZXQgYSBDYyB0bwoJCUtpc2hvbiBW aWpheSBBYnJhaGFtIEkgPGtpc2hvbkB0aS5jb20+CgpBcyB0aGUgcGF0Y2ggd2lsbCBwcm9iYWJs eSBuZWVkIGFuIEFjayB0byBnZXQgdGhyb3VnaCB0aGUgZHJtLXRyZWUuCgoKSGVpa28KCgoKPiAt LS0KPiBDaGFuZ2VzIGluIHYyOgo+IC0gdXBkYXRlIHBhdGNoIGZvbGxvd2luZyBFbnJpYyBzdWdn ZXN0Cj4gQ2hhbmdlcyBpbiB2MzoKPiAtIGRlbGV0ZSBuZWVkX3NvZnR3YXJlX3RyYWluaW5nIHZh cmlhYmxlCj4gLSBhZGQgZGVmYXVsdCBwaHkgY29uZmlnIHZhbHVlLCBpZiBkdHMgZG8gbm90IGRl ZmluZSBwaHkgY29uZmlnIHZhbHVlLCB1c2UgdGhlc2UgdmFsdWUKPiBDaGFuZ2VzIGluIHY0Ogo+ IC0gcmVuYW1lIHZhcmlhYmxlIGNvbmZpZyB0byB0Y3BoeV9kZWZhdWx0X2NvbmZpZwo+IENoYW5n ZXMgaW4gdjU6Cj4gLSBOb25lCj4gCj4gIGRyaXZlcnMvcGh5L3JvY2tjaGlwL3BoeS1yb2NrY2hp cC10eXBlYy5jIHwgMzA2ICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQo+ICBpbmNsdWRl L3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9waHlfdHlwZWMuaCB8ICA2MyArKysrKysKPiAgMiBmaWxl cyBjaGFuZ2VkLCAyNzEgaW5zZXJ0aW9ucygrKSwgOTggZGVsZXRpb25zKC0pCj4gIGNyZWF0ZSBt b2RlIDEwMDY0NCBpbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9waHlfdHlwZWMuaAo+IAo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9yb2NrY2hpcC9waHktcm9ja2NoaXAtdHlwZWMuYyBi L2RyaXZlcnMvcGh5L3JvY2tjaGlwL3BoeS1yb2NrY2hpcC10eXBlYy5jCj4gaW5kZXggNzZhNGI1 OC4uNWQ4NjkyZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL3BoeS9yb2NrY2hpcC9waHktcm9ja2No aXAtdHlwZWMuYwo+ICsrKyBiL2RyaXZlcnMvcGh5L3JvY2tjaGlwL3BoeS1yb2NrY2hpcC10eXBl Yy5jCj4gQEAgLTYzLDYgKzYzLDcgQEAKPiAgCj4gICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29u Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4gKyNpbmNsdWRlIDxzb2Mvcm9ja2No aXAvcm9ja2NoaXBfcGh5X3R5cGVjLmg+Cj4gIAo+ICAjZGVmaW5lIENNTl9TU01fQkFOREdBUAkJ CSgweDIxIDw8IDIpCj4gICNkZWZpbmUgQ01OX1NTTV9CSUFTCQkJKDB4MjIgPDwgMikKPiBAQCAt MzIzLDIxICszMjQsMjkgQEAKPiAgICogY2xvY2sgMDogUExMIDAgZGl2IDEKPiAgICogY2xvY2sg MTogUExMIDEgZGl2IDIKPiAgICovCj4gLSNkZWZpbmUgQ0xLX1BMTF9DT05GSUcJCQkwWDMwCj4g KyNkZWZpbmUgQ0xLX1BMTDFfRElWMQkJCTB4MjAKPiArI2RlZmluZSBDTEtfUExMMV9ESVYyCQkJ MHgzMAo+ICAjZGVmaW5lIENMS19QTExfTUFTSwkJCTB4MzMKPiAgCj4gICNkZWZpbmUgQ01OX1JF QURZCQkJQklUKDApCj4gIAo+ICsjZGVmaW5lIERQX1BMTF9DTE9DS19FTkFCTEVfQUNLCQlCSVQo MykKPiAgI2RlZmluZSBEUF9QTExfQ0xPQ0tfRU5BQkxFCQlCSVQoMikKPiArI2RlZmluZSBEUF9Q TExfRU5BQkxFX0FDSwkJQklUKDEpCj4gICNkZWZpbmUgRFBfUExMX0VOQUJMRQkJCUJJVCgwKQo+ ICAjZGVmaW5lIERQX1BMTF9EQVRBX1JBVEVfUkJSCQkoKDIgPDwgMTIpIHwgKDQgPDwgOCkpCj4g ICNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9IQlIJCSgoMiA8PCAxMikgfCAoNCA8PCA4KSkKPiAg I2RlZmluZSBEUF9QTExfREFUQV9SQVRFX0hCUjIJCSgoMSA8PCAxMikgfCAoMiA8PCA4KSkKPiAr I2RlZmluZSBEUF9QTExfREFUQV9SQVRFX01BU0sJCTB4ZmYwMAo+ICAKPiAtI2RlZmluZSBEUF9N T0RFX0EwCQkJQklUKDQpCj4gLSNkZWZpbmUgRFBfTU9ERV9BMgkJCUJJVCg2KQo+IC0jZGVmaW5l IERQX01PREVfRU5URVJfQTAJCTB4YzEwMQo+IC0jZGVmaW5lIERQX01PREVfRU5URVJfQTIJCTB4 YzEwNAo+ICsjZGVmaW5lIERQX01PREVfTUFTSwkJCTB4Zgo+ICsjZGVmaW5lIERQX01PREVfRU5U RVJfQTAJCUJJVCgwKQo+ICsjZGVmaW5lIERQX01PREVfRU5URVJfQTIJCUJJVCgyKQo+ICsjZGVm aW5lIERQX01PREVfRU5URVJfQTMJCUJJVCgzKQo+ICsjZGVmaW5lIERQX01PREVfQTBfQUNLCQkJ QklUKDQpCj4gKyNkZWZpbmUgRFBfTU9ERV9BMl9BQ0sJCQlCSVQoNikKPiArI2RlZmluZSBEUF9N T0RFX0EzX0FDSwkJCUJJVCg3KQo+ICsjZGVmaW5lIERQX0xJTktfUkVTRVRfREVBU1NFUlRFRAlC SVQoOCkKPiAgCj4gICNkZWZpbmUgUEhZX01PREVfU0VUX1RJTUVPVVQJCTEwMDAwMAo+ICAKPiBA QCAtMzQ5LDUxICszNTgsNyBAQAo+ICAjZGVmaW5lIE1PREVfREZQX1VTQgkJCUJJVCgxKQo+ICAj ZGVmaW5lIE1PREVfREZQX0RQCQkJQklUKDIpCj4gIAo+IC1zdHJ1Y3QgdXNiM3BoeV9yZWcgewo+ IC0JdTMyIG9mZnNldDsKPiAtCXUzMiBlbmFibGVfYml0Owo+IC0JdTMyIHdyaXRlX2VuYWJsZTsK PiAtfTsKPiAtCj4gLS8qKgo+IC0gKiBzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZzog dXNiMy1waHkgcG9ydCBjb25maWd1cmF0aW9uLgo+IC0gKiBAcmVnOiB0aGUgYmFzZSBhZGRyZXNz IGZvciB1c2IzLXBoeSBjb25maWcuCj4gLSAqIEB0eXBlY19jb25uX2RpcjogdGhlIHJlZ2lzdGVy IG9mIHR5cGUtYyBjb25uZWN0b3IgZGlyZWN0aW9uLgo+IC0gKiBAdXNiM3RvdXNiMl9lbjogdGhl IHJlZ2lzdGVyIG9mIHR5cGUtYyBmb3JjZSB1c2IyIHRvIHVzYjIgZW5hYmxlLgo+IC0gKiBAZXh0 ZXJuYWxfcHNtOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIHBoeSBleHRlcm5hbCBwc20gY2xvY2su Cj4gLSAqIEBwaXBlX3N0YXR1czogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyBwaHkgcGlwZSBzdGF0 dXMuCj4gLSAqIEB1c2IzX2hvc3RfZGlzYWJsZTogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyB1c2Iz IGhvc3QgZGlzYWJsZS4KPiAtICogQHVzYjNfaG9zdF9wb3J0OiB0aGUgcmVnaXN0ZXIgb2YgdHlw ZS1jIHVzYjMgaG9zdCBwb3J0Lgo+IC0gKiBAdXBoeV9kcF9zZWw6IHRoZSByZWdpc3RlciBvZiB0 eXBlLWMgcGh5IERQIHNlbGVjdCBjb250cm9sLgo+IC0gKi8KPiAtc3RydWN0IHJvY2tjaGlwX3Vz YjNwaHlfcG9ydF9jZmcgewo+IC0JdW5zaWduZWQgaW50IHJlZzsKPiAtCXN0cnVjdCB1c2IzcGh5 X3JlZyB0eXBlY19jb25uX2RpcjsKPiAtCXN0cnVjdCB1c2IzcGh5X3JlZyB1c2IzdG91c2IyX2Vu Owo+IC0Jc3RydWN0IHVzYjNwaHlfcmVnIGV4dGVybmFsX3BzbTsKPiAtCXN0cnVjdCB1c2IzcGh5 X3JlZyBwaXBlX3N0YXR1czsKPiAtCXN0cnVjdCB1c2IzcGh5X3JlZyB1c2IzX2hvc3RfZGlzYWJs ZTsKPiAtCXN0cnVjdCB1c2IzcGh5X3JlZyB1c2IzX2hvc3RfcG9ydDsKPiAtCXN0cnVjdCB1c2Iz cGh5X3JlZyB1cGh5X2RwX3NlbDsKPiAtfTsKPiAtCj4gLXN0cnVjdCByb2NrY2hpcF90eXBlY19w aHkgewo+IC0Jc3RydWN0IGRldmljZSAqZGV2Owo+IC0Jdm9pZCBfX2lvbWVtICpiYXNlOwo+IC0J c3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbjsKPiAtCXN0cnVjdCByZWdtYXAgKmdyZl9yZWdzOwo+ IC0Jc3RydWN0IGNsayAqY2xrX2NvcmU7Cj4gLQlzdHJ1Y3QgY2xrICpjbGtfcmVmOwo+IC0Jc3Ry dWN0IHJlc2V0X2NvbnRyb2wgKnVwaHlfcnN0Owo+IC0Jc3RydWN0IHJlc2V0X2NvbnRyb2wgKnBp cGVfcnN0Owo+IC0Jc3RydWN0IHJlc2V0X2NvbnRyb2wgKnRjcGh5X3JzdDsKPiAtCWNvbnN0IHN0 cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnICpwb3J0X2NmZ3M7Cj4gLQkvKiBtdXRleCB0 byBwcm90ZWN0IGFjY2VzcyB0byBpbmRpdmlkdWFsIFBIWXMgKi8KPiAtCXN0cnVjdCBtdXRleCBs b2NrOwo+IC0KPiAtCWJvb2wgZmxpcDsKPiAtCXU4IG1vZGU7Cj4gLX07Cj4gKyNkZWZpbmUgRFBf REVGQVVMVF9SQVRFCQkxNjIwMDAKPiAgCj4gIHN0cnVjdCBwaHlfcmVnIHsKPiAgCXUxNiB2YWx1 ZTsKPiBAQCAtNDE3LDE1ICszODIsMTUgQEAgc3RydWN0IHBoeV9yZWcgdXNiM19wbGxfY2ZnW10g PSB7Cj4gIAl7IDB4OCwJCUNNTl9ESUFHX1BMTDBfTEZfUFJPRyB9LAo+ICB9Owo+ICAKPiAtc3Ry dWN0IHBoeV9yZWcgZHBfcGxsX2NmZ1tdID0gewo+ICtzdHJ1Y3QgcGh5X3JlZyBkcF9wbGxfcmJy X2NmZ1tdID0gewo+ICAJeyAweGYwLAkJQ01OX1BMTDFfVkNPQ0FMX0lOSVQgfSwKPiAgCXsgMHgx OCwJCUNNTl9QTEwxX1ZDT0NBTF9JVEVSIH0sCj4gIAl7IDB4MzBiOSwJQ01OX1BMTDFfVkNPQ0FM X1NUQVJUIH0sCj4gLQl7IDB4MjFjLAlDTU5fUExMMV9JTlRESVYgfSwKPiArCXsgMHg4NywJCUNN Tl9QTEwxX0lOVERJViB9LAo+ICAJeyAwLAkJQ01OX1BMTDFfRlJBQ0RJViB9LAo+IC0JeyAweDUs CQlDTU5fUExMMV9ISUdIX1RIUiB9LAo+IC0JeyAweDM1LAkJQ01OX1BMTDFfU1NfQ1RSTDEgfSwK PiAtCXsgMHg3ZjFlLAlDTU5fUExMMV9TU19DVFJMMiB9LAo+ICsJeyAweDIyLAkJQ01OX1BMTDFf SElHSF9USFIgfSwKPiArCXsgMHg4MDAwLAlDTU5fUExMMV9TU19DVFJMMSB9LAo+ICsJeyAwLAkJ Q01OX1BMTDFfU1NfQ1RSTDIgfSwKPiAgCXsgMHgyMCwJCUNNTl9QTEwxX0RTTV9ESUFHIH0sCj4g IAl7IDAsCQlDTU5fUExMU00xX1VTRVJfREVGX0NUUkwgfSwKPiAgCXsgMCwJCUNNTl9ESUFHX1BM TDFfT1ZSRCB9LAo+IEBAIC00MzYsOSArNDAxLDUyIEBAIHN0cnVjdCBwaHlfcmVnIGRwX3BsbF9j ZmdbXSA9IHsKPiAgCXsgMHg4LAkJQ01OX0RJQUdfUExMMV9MRl9QUk9HIH0sCj4gIAl7IDB4MTAw LAlDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMSB9LAo+ICAJeyAweDcsCQlDTU5fRElBR19QTEwx X1BUQVRJU19UVU5FMiB9LAo+IC0JeyAweDQsCQlDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwgfSwK PiArCXsgMHgxLAkJQ01OX0RJQUdfUExMMV9JTkNMS19DVFJMIH0sCj4gK307Cj4gKwo+ICtzdHJ1 Y3QgcGh5X3JlZyBkcF9wbGxfaGJyX2NmZ1tdID0gewo+ICsJeyAweGYwLAkJQ01OX1BMTDFfVkNP Q0FMX0lOSVQgfSwKPiArCXsgMHgxOCwJCUNNTl9QTEwxX1ZDT0NBTF9JVEVSIH0sCj4gKwl7IDB4 MzBiNCwJQ01OX1BMTDFfVkNPQ0FMX1NUQVJUIH0sCj4gKwl7IDB4ZTEsCQlDTU5fUExMMV9JTlRE SVYgfSwKPiArCXsgMCwJCUNNTl9QTEwxX0ZSQUNESVYgfSwKPiArCXsgMHg1LAkJQ01OX1BMTDFf SElHSF9USFIgfSwKPiArCXsgMHg4MDAwLAlDTU5fUExMMV9TU19DVFJMMSB9LAo+ICsJeyAwLAkJ Q01OX1BMTDFfU1NfQ1RSTDIgfSwKPiArCXsgMHgyMCwJCUNNTl9QTEwxX0RTTV9ESUFHIH0sCj4g Kwl7IDB4MTAwMCwJQ01OX1BMTFNNMV9VU0VSX0RFRl9DVFJMIH0sCj4gKwl7IDAsCQlDTU5fRElB R19QTEwxX09WUkQgfSwKPiArCXsgMCwJCUNNTl9ESUFHX1BMTDFfRkJIX09WUkQgfSwKPiArCXsg MCwJCUNNTl9ESUFHX1BMTDFfRkJMX09WUkQgfSwKPiArCXsgMHg3LAkJQ01OX0RJQUdfUExMMV9W MklfVFVORSB9LAo+ICsJeyAweDQ1LAkJQ01OX0RJQUdfUExMMV9DUF9UVU5FIH0sCj4gKwl7IDB4 OCwJCUNNTl9ESUFHX1BMTDFfTEZfUFJPRyB9LAo+ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX1BU QVRJU19UVU5FMSB9LAo+ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMiB9LAo+ ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwgfSwKPiAgfTsKPiAgCj4gK3N0cnVj dCBwaHlfcmVnIGRwX3BsbF9oYnIyX2NmZ1tdID0gewo+ICsJeyAweGYwLAkJQ01OX1BMTDFfVkNP Q0FMX0lOSVQgfSwKPiArCXsgMHgxOCwJCUNNTl9QTEwxX1ZDT0NBTF9JVEVSIH0sCj4gKwl7IDB4 MzBiNCwJQ01OX1BMTDFfVkNPQ0FMX1NUQVJUIH0sCj4gKwl7IDB4ZTEsCQlDTU5fUExMMV9JTlRE SVYgfSwKPiArCXsgMCwJCUNNTl9QTEwxX0ZSQUNESVYgfSwKPiArCXsgMHg1LAkJQ01OX1BMTDFf SElHSF9USFIgfSwKPiArCXsgMHg4MDAwLAlDTU5fUExMMV9TU19DVFJMMSB9LAo+ICsJeyAwLAkJ Q01OX1BMTDFfU1NfQ1RSTDIgfSwKPiArCXsgMHgyMCwJCUNNTl9QTEwxX0RTTV9ESUFHIH0sCj4g Kwl7IDB4MTAwMCwJQ01OX1BMTFNNMV9VU0VSX0RFRl9DVFJMIH0sCj4gKwl7IDAsCQlDTU5fRElB R19QTEwxX09WUkQgfSwKPiArCXsgMCwJCUNNTl9ESUFHX1BMTDFfRkJIX09WUkQgfSwKPiArCXsg MCwJCUNNTl9ESUFHX1BMTDFfRkJMX09WUkQgfSwKPiArCXsgMHg3LAkJQ01OX0RJQUdfUExMMV9W MklfVFVORSB9LAo+ICsJeyAweDQ1LAkJQ01OX0RJQUdfUExMMV9DUF9UVU5FIH0sCj4gKwl7IDB4 OCwJCUNNTl9ESUFHX1BMTDFfTEZfUFJPRyB9LAo+ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX1BU QVRJU19UVU5FMSB9LAo+ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMiB9LAo+ ICsJeyAweDEsCQlDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwgfSwKPiArfTsKPiAgc3RhdGljIGNv bnN0IHN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnIHJrMzM5OV91c2IzcGh5X3BvcnRf Y2Znc1tdID0gewo+ICAJewo+ICAJCS5yZWcgPSAweGZmN2MwMDAwLAo+IEBAIC00NjMsNiArNDcx LDI0IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyByazMz OTlfdXNiM3BoeV9wb3J0X2NmZ3NbXSA9IHsKPiAgCXsgLyogc2VudGluZWwgKi8gfQo+ICB9Owo+ ICAKPiArLyogZGVmYXVsdCBwaHkgY29uZmlnICovCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5 X2NvbmZpZyB0Y3BoeV9kZWZhdWx0X2NvbmZpZ1szXVs0XSA9IHsKPiArCXt7IC5zd2luZyA9IDB4 MmEsIC5wZSA9IDB4MDAgfSwKPiArCSB7IC5zd2luZyA9IDB4MWYsIC5wZSA9IDB4MTUgfSwKPiAr CSB7IC5zd2luZyA9IDB4MTQsIC5wZSA9IDB4MjIgfSwKPiArCSB7IC5zd2luZyA9IDB4MDIsIC5w ZSA9IDB4MmIgfSB9LAo+ICsKPiArCXt7IC5zd2luZyA9IDB4MjEsIC5wZSA9IDB4MDAgfSwKPiAr CSB7IC5zd2luZyA9IDB4MTIsIC5wZSA9IDB4MTUgfSwKPiArCSB7IC5zd2luZyA9IDB4MDIsIC5w ZSA9IDB4MjIgfSwKPiArCSB7IC5zd2luZyA9IDAsICAgIC5wZSA9IDAgfSB9LAo+ICsKPiArCXt7 IC5zd2luZyA9IDB4MTUsIC5wZSA9IDB4MDAgfSwKPiArCSB7IC5zd2luZyA9IDB4MDAsIC5wZSA9 IDB4MTUgfSwKPiArCSB7IC5zd2luZyA9IDAsICAgIC5wZSA9IDAgfSwKPiArCSB7IC5zd2luZyA9 IDAsICAgIC5wZSA9IDAgfSB9LAo+ICt9Owo+ICsKPiAgc3RhdGljIHZvaWQgdGNwaHlfY2ZnXzI0 bShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKPiAgewo+ICAJdTMyIGksIHJkYXRh Owo+IEBAIC00ODQsNyArNTEwLDcgQEAgc3RhdGljIHZvaWQgdGNwaHlfY2ZnXzI0bShzdHJ1Y3Qg cm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKPiAgCj4gIAlyZGF0YSA9IHJlYWRsKHRjcGh5LT5i YXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKPiAgCXJkYXRhICY9IH5DTEtfUExMX01BU0s7Cj4g LQlyZGF0YSB8PSBDTEtfUExMX0NPTkZJRzsKPiArCXJkYXRhIHw9IENMS19QTEwxX0RJVjI7Cj4g IAl3cml0ZWwocmRhdGEsIHRjcGh5LT5iYXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKPiAgfQo+ ICAKPiBAQCAtNDk4LDE3ICs1MjQsNDQgQEAgc3RhdGljIHZvaWQgdGNwaHlfY2ZnX3VzYjNfcGxs KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5KQo+ICAJCSAgICAgICB0Y3BoeS0+YmFz ZSArIHVzYjNfcGxsX2NmZ1tpXS5hZGRyKTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgdGNwaHlf Y2ZnX2RwX3BsbChzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKPiArc3RhdGljIHZv aWQgdGNwaHlfY2ZnX2RwX3BsbChzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgaW50 IGxpbmtfcmF0ZSkKPiAgewo+IC0JdTMyIGk7Cj4gKwlzdHJ1Y3QgcGh5X3JlZyAqcGh5X2NmZzsK PiArCXUzMiBjbGtfY3RybDsKPiArCXUzMiBpLCBjZmdfc2l6ZSwgaHNjbGtfc2VsOwo+ICsKPiAr CWhzY2xrX3NlbCA9IHJlYWRsKHRjcGh5LT5iYXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKPiAr CWhzY2xrX3NlbCAmPSB+Q0xLX1BMTF9NQVNLOwo+ICsKPiArCXN3aXRjaCAobGlua19yYXRlKSB7 Cj4gKwljYXNlIDE2MjAwMDoKPiArCQljbGtfY3RybCA9IERQX1BMTF9EQVRBX1JBVEVfUkJSOwo+ ICsJCWhzY2xrX3NlbCB8PSBDTEtfUExMMV9ESVYyOwo+ICsJCXBoeV9jZmcgPSBkcF9wbGxfcmJy X2NmZzsKPiArCQljZmdfc2l6ZSA9IEFSUkFZX1NJWkUoZHBfcGxsX3Jicl9jZmcpOwo+ICsJCWJy ZWFrOwo+ICsJY2FzZSAyNzAwMDA6Cj4gKwkJY2xrX2N0cmwgPSBEUF9QTExfREFUQV9SQVRFX0hC UjsKPiArCQloc2Nsa19zZWwgfD0gQ0xLX1BMTDFfRElWMjsKPiArCQlwaHlfY2ZnID0gZHBfcGxs X2hicl9jZmc7Cj4gKwkJY2ZnX3NpemUgPSBBUlJBWV9TSVpFKGRwX3BsbF9oYnJfY2ZnKTsKPiAr CQlicmVhazsKPiArCWNhc2UgNTQwMDAwOgo+ICsJCWNsa19jdHJsID0gRFBfUExMX0RBVEFfUkFU RV9IQlIyOwo+ICsJCWhzY2xrX3NlbCB8PSBDTEtfUExMMV9ESVYxOwo+ICsJCXBoeV9jZmcgPSBk cF9wbGxfaGJyMl9jZmc7Cj4gKwkJY2ZnX3NpemUgPSBBUlJBWV9TSVpFKGRwX3BsbF9oYnIyX2Nm Zyk7Cj4gKwkJYnJlYWs7Cj4gKwl9Cj4gKwo+ICsJY2xrX2N0cmwgfD0gRFBfUExMX0NMT0NLX0VO QUJMRSB8IERQX1BMTF9FTkFCTEU7Cj4gKwl3cml0ZWwoY2xrX2N0cmwsIHRjcGh5LT5iYXNlICsg RFBfQ0xLX0NUTCk7Cj4gIAo+IC0JLyogc2V0IHRoZSBkZWZhdWx0IG1vZGUgdG8gUkJSICovCj4g LQl3cml0ZWwoRFBfUExMX0NMT0NLX0VOQUJMRSB8IERQX1BMTF9FTkFCTEUgfCBEUF9QTExfREFU QV9SQVRFX1JCUiwKPiAtCSAgICAgICB0Y3BoeS0+YmFzZSArIERQX0NMS19DVEwpOwo+ICsJd3Jp dGVsKGhzY2xrX3NlbCwgdGNwaHktPmJhc2UgKyBDTU5fRElBR19IU0NMS19TRUwpOwo+ICAKPiAg CS8qIGxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgUExMMSAqLwo+IC0JZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUoZHBfcGxsX2NmZyk7IGkrKykKPiAtCQl3cml0ZWwoZHBfcGxsX2NmZ1tpXS52 YWx1ZSwgdGNwaHktPmJhc2UgKyBkcF9wbGxfY2ZnW2ldLmFkZHIpOwo+ICsJZm9yIChpID0gMDsg aSA8IGNmZ19zaXplOyBpKyspCj4gKwkJd3JpdGVsKHBoeV9jZmdbaV0udmFsdWUsIHRjcGh5LT5i YXNlICsgcGh5X2NmZ1tpXS5hZGRyKTsKPiAgfQo+ICAKPiAgc3RhdGljIHZvaWQgdGNwaHlfdHhf dXNiM19jZmdfbGFuZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUp Cj4gQEAgLTUzNSw5ICs1ODgsMTAgQEAgc3RhdGljIHZvaWQgdGNwaHlfcnhfdXNiM19jZmdfbGFu ZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCj4gIAl3cml0ZWwo MHhmYiwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfQklESV9DVFJMKGxhbmUpKTsKPiAgfQo+ICAK PiAtc3RhdGljIHZvaWQgdGNwaHlfZHBfY2ZnX2xhbmUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3Bo eSAqdGNwaHksIHUzMiBsYW5lKQo+ICtzdGF0aWMgdm9pZCB0Y3BoeV9kcF9jZmdfbGFuZShzdHJ1 Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgaW50IGxpbmtfcmF0ZSwKPiArCQkJICAgICAg dTggc3dpbmcsIHU4IHByZV9lbXAsIHUzMiBsYW5lKQo+ICB7Cj4gLQl1MTYgcmRhdGE7Cj4gKwl1 MTYgdmFsOwo+ICAKPiAgCXdyaXRlbCgweGJlZmMsIHRjcGh5LT5iYXNlICsgWENWUl9QU01fUkNU UkwobGFuZSkpOwo+ICAJd3JpdGVsKDB4Njc5OSwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTAobGFu ZSkpOwo+IEBAIC01NDUsMjUgKzU5OSwzMSBAQCBzdGF0aWMgdm9pZCB0Y3BoeV9kcF9jZmdfbGFu ZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCj4gIAl3cml0ZWwo MHg5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTIobGFuZSkpOwo+ICAJd3JpdGVsKDB4OTgsIHRj cGh5LT5iYXNlICsgVFhfUFNDX0EzKGxhbmUpKTsKPiAgCj4gLQl3cml0ZWwoMCwgdGNwaHktPmJh c2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDAwKGxhbmUpKTsKPiAtCXdyaXRlbCgwLCB0Y3BoeS0+ YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDEobGFuZSkpOwo+IC0Jd3JpdGVsKDAsIHRjcGh5 LT5iYXNlICsgVFhfVFhDQ19NR05GU19NVUxUXzAxMChsYW5lKSk7Cj4gLQl3cml0ZWwoMCwgdGNw aHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDExKGxhbmUpKTsKPiAtCXdyaXRlbCgwLCB0 Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDAobGFuZSkpOwo+IC0Jd3JpdGVsKDAs IHRjcGh5LT5iYXNlICsgVFhfVFhDQ19NR05GU19NVUxUXzEwMShsYW5lKSk7Cj4gLQl3cml0ZWwo MCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMTEwKGxhbmUpKTsKPiAtCXdyaXRl bCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTEobGFuZSkpOwo+IC0Jd3Jp dGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DUE9TVF9NVUxUXzEwKGxhbmUpKTsKPiAtCXdy aXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8wMShsYW5lKSk7Cj4gLQl3 cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NQT1NUX01VTFRfMDAobGFuZSkpOwo+IC0J d3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DUE9TVF9NVUxUXzExKGxhbmUpKTsKPiAt Cj4gLQl3cml0ZWwoMHgxMjgsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DQUxfU0NMUl9NVUxUKGxh bmUpKTsKPiAtCXdyaXRlbCgweDQwMCwgdGNwaHktPmJhc2UgKyBUWF9ESUFHX1RYX0RSVihsYW5l KSk7Cj4gLQo+IC0JcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19QTExEUkNf Q1RSTChsYW5lKSk7Cj4gLQlyZGF0YSA9IChyZGF0YSAmIDB4OGZmZikgfCAweDYwMDA7Cj4gLQl3 cml0ZWwocmRhdGEsIHRjcGh5LT5iYXNlICsgWENWUl9ESUFHX1BMTERSQ19DVFJMKGxhbmUpKTsK PiArCXdyaXRlbCh0Y3BoeS0+Y29uZmlnW3N3aW5nXVtwcmVfZW1wXS5zd2luZywKPiArCSAgICAg ICB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDAobGFuZSkpOwo+ICsJd3JpdGVs KHRjcGh5LT5jb25maWdbc3dpbmddW3ByZV9lbXBdLnBlLAo+ICsJICAgICAgIHRjcGh5LT5iYXNl ICsgVFhfVFhDQ19DUE9TVF9NVUxUXzAwKGxhbmUpKTsKPiArCj4gKwlpZiAoc3dpbmcgPT0gMiAm JiBwcmVfZW1wID09IDAgJiYgbGlua19yYXRlICE9IDU0MDAwMCkgewo+ICsJCXdyaXRlbCgweDcw MCwgdGNwaHktPmJhc2UgKyBUWF9ESUFHX1RYX0RSVihsYW5lKSk7Cj4gKwkJd3JpdGVsKDB4MTNj LCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ0FMX1NDTFJfTVVMVChsYW5lKSk7Cj4gKwl9IGVsc2Ug ewo+ICsJCXdyaXRlbCgweDEyOCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NBTF9TQ0xSX01VTFQo bGFuZSkpOwo+ICsJCXdyaXRlbCgweDA0MDAsIHRjcGh5LT5iYXNlICsgVFhfRElBR19UWF9EUlYo bGFuZSkpOwo+ICsJfQo+ICsKPiArCXZhbCA9IHJlYWRsKHRjcGh5LT5iYXNlICsgWENWUl9ESUFH X1BMTERSQ19DVFJMKGxhbmUpKTsKPiArCXZhbCA9IHZhbCAmIDB4OGZmZjsKPiArCXN3aXRjaCAo bGlua19yYXRlKSB7Cj4gKwljYXNlIDE2MjAwMDoKPiArCWNhc2UgMjcwMDAwOgo+ICsJCXZhbCB8 PSAoNiA8PCAxMik7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlIDU0MDAwMDoKPiArCQl2YWwgfD0gKDQg PDwgMTIpOwo+ICsJCWJyZWFrOwo+ICsJfQo+ICsJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBY Q1ZSX0RJQUdfUExMRFJDX0NUUkwobGFuZSkpOwo+ICB9Cj4gIAo+ICBzdGF0aWMgaW5saW5lIGlu dCBwcm9wZXJ0eV9lbmFibGUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksCj4gQEAg LTc1NCwzMCArODE0LDMzIEBAIHN0YXRpYyBpbnQgdGNwaHlfcGh5X2luaXQoc3RydWN0IHJvY2tj aGlwX3R5cGVjX3BoeSAqdGNwaHksIHU4IG1vZGUpCj4gIAl0Y3BoeV9jZmdfMjRtKHRjcGh5KTsK PiAgCj4gIAlpZiAobW9kZSA9PSBNT0RFX0RGUF9EUCkgewo+IC0JCXRjcGh5X2NmZ19kcF9wbGwo dGNwaHkpOwo+ICsJCXRjcGh5X2NmZ19kcF9wbGwodGNwaHksIERQX0RFRkFVTFRfUkFURSk7Cj4g IAkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKPiAtCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHks IGkpOwo+ICsJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgRFBfREVGQVVMVF9SQVRFLCAwLCAw LCBpKTsKPiAgCj4gIAkJd3JpdGVsKFBJTl9BU1NJR05fQ19FLCB0Y3BoeS0+YmFzZSArIFBNQV9M QU5FX0NGRyk7Cj4gIAl9IGVsc2Ugewo+ICAJCXRjcGh5X2NmZ191c2IzX3BsbCh0Y3BoeSk7Cj4g LQkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSk7Cj4gKwkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSwg RFBfREVGQVVMVF9SQVRFKTsKPiAgCQlpZiAodGNwaHktPmZsaXApIHsKPiAgCQkJdGNwaHlfdHhf dXNiM19jZmdfbGFuZSh0Y3BoeSwgMyk7Cj4gIAkJCXRjcGh5X3J4X3VzYjNfY2ZnX2xhbmUodGNw aHksIDIpOwo+IC0JCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMCk7Cj4gLQkJCXRjcGh5X2Rw X2NmZ19sYW5lKHRjcGh5LCAxKTsKPiArCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIERQX0RF RkFVTFRfUkFURSwgMCwgMCwgMCk7Cj4gKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCBEUF9E RUZBVUxUX1JBVEUsIDAsIDAsIDEpOwo+ICAJCX0gZWxzZSB7Cj4gIAkJCXRjcGh5X3R4X3VzYjNf Y2ZnX2xhbmUodGNwaHksIDApOwo+ICAJCQl0Y3BoeV9yeF91c2IzX2NmZ19sYW5lKHRjcGh5LCAx KTsKPiAtCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIDIpOwo+IC0JCQl0Y3BoeV9kcF9jZmdf bGFuZSh0Y3BoeSwgMyk7Cj4gKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCBEUF9ERUZBVUxU X1JBVEUsIDAsIDAsIDIpOwo+ICsJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgRFBfREVGQVVM VF9SQVRFLCAwLCAwLCAzKTsKPiAgCQl9Cj4gIAo+ICAJCXdyaXRlbChQSU5fQVNTSUdOX0RfRiwg dGNwaHktPmJhc2UgKyBQTUFfTEFORV9DRkcpOwo+ICAJfQo+ICAKPiAtCXdyaXRlbChEUF9NT0RF X0VOVEVSX0EyLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMKTsKPiArCXZhbCA9IHJlYWRsKHRj cGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICsJdmFsICY9IH5EUF9NT0RFX01BU0s7Cj4gKwl2 YWwgfD0gRFBfTU9ERV9FTlRFUl9BMiB8IERQX0xJTktfUkVTRVRfREVBU1NFUlRFRDsKPiArCXdy aXRlbCh2YWwsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICAKPiAgCXJlc2V0X2NvbnRy b2xfZGVhc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKPiAgCj4gQEAgLTk5MCw3ICsxMDUzLDcgQEAg c3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQo+ICAJ cHJvcGVydHlfZW5hYmxlKHRjcGh5LCAmY2ZnLT51cGh5X2RwX3NlbCwgMSk7Cj4gIAo+ICAJcmV0 ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMLAo+ IC0JCQkJIHZhbCwgdmFsICYgRFBfTU9ERV9BMiwgMTAwMCwKPiArCQkJCSB2YWwsIHZhbCAmIERQ X01PREVfQTJfQUNLLCAxMDAwLAo+ICAJCQkJIFBIWV9NT0RFX1NFVF9USU1FT1VUKTsKPiAgCWlm IChyZXQgPCAwKSB7Cj4gIAkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiZmFpbGVkIHRvIHdhaXQgVENQ SFkgZW50ZXIgQTJcbiIpOwo+IEBAIC05OTksMTMgKzEwNjIsMTkgQEAgc3RhdGljIGludCByb2Nr Y2hpcF9kcF9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQo+ICAKPiAgCXRjcGh5X2RwX2F1 eF9jYWxpYnJhdGlvbih0Y3BoeSk7Cj4gIAo+IC0Jd3JpdGVsKERQX01PREVfRU5URVJfQTAsIHRj cGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICsJLyogZW50ZXIgQTAgbW9kZSAqLwo+ICsJdmFs ID0gcmVhZGwodGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7Cj4gKwl2YWwgJj0gfkRQX01PREVf TUFTSzsKPiArCXZhbCB8PSBEUF9NT0RFX0VOVEVSX0EwOwo+ICsJd3JpdGVsKHZhbCwgdGNwaHkt PmJhc2UgKyBEUF9NT0RFX0NUTCk7Cj4gIAo+ICAJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJl YWRsLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMLAo+IC0JCQkJIHZhbCwgdmFsICYgRFBfTU9E RV9BMCwgMTAwMCwKPiArCQkJCSB2YWwsIHZhbCAmIERQX01PREVfQTBfQUNLLCAxMDAwLAo+ICAJ CQkJIFBIWV9NT0RFX1NFVF9USU1FT1VUKTsKPiAgCWlmIChyZXQgPCAwKSB7Cj4gLQkJd3JpdGVs KERQX01PREVfRU5URVJfQTIsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICsJCXZhbCAm PSB+RFBfTU9ERV9NQVNLOwo+ICsJCXZhbCB8PSBEUF9NT0RFX0VOVEVSX0EyOwo+ICsJCXdyaXRl bCh2YWwsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICAJCWRldl9lcnIodGNwaHktPmRl diwgImZhaWxlZCB0byB3YWl0IFRDUEhZIGVudGVyIEEwXG4iKTsKPiAgCQlnb3RvIHBvd2VyX29u X2ZpbmlzaDsKPiAgCX0KPiBAQCAtMTAyMyw2ICsxMDkyLDcgQEAgc3RhdGljIGludCByb2NrY2hp cF9kcF9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQo+ICBzdGF0aWMgaW50IHJvY2tjaGlw X2RwX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQo+ICB7Cj4gIAlzdHJ1Y3Qgcm9ja2No aXBfdHlwZWNfcGh5ICp0Y3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ICsJdTMyIHZhbDsK PiAgCj4gIAltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7Cj4gIAo+IEBAIC0xMDMxLDcgKzExMDEs MTAgQEAgc3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBo eSkKPiAgCj4gIAl0Y3BoeS0+bW9kZSAmPSB+TU9ERV9ERlBfRFA7Cj4gIAo+IC0Jd3JpdGVsKERQ X01PREVfRU5URVJfQTIsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOwo+ICsJdmFsID0gcmVh ZGwodGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7Cj4gKwl2YWwgJj0gfkRQX01PREVfTUFTSzsK PiArCXZhbCB8PSBEUF9NT0RFX0VOVEVSX0EyOwo+ICsJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2Ug KyBEUF9NT0RFX0NUTCk7Cj4gIAo+ICAJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVD VCkKPiAgCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKPiBAQCAtMTA0Nyw5ICsxMTIwLDM1IEBA IHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyByb2NrY2hpcF9kcF9waHlfb3BzID0gewo+ICAJ Lm93bmVyCQk9IFRISVNfTU9EVUxFLAo+ICB9Owo+ICAKPiArc3RhdGljIGludCB0eXBlY19kcF9w aHlfY29uZmlnKHN0cnVjdCBwaHkgKnBoeSwgaW50IGxpbmtfcmF0ZSwKPiArCQkJIGludCBsYW5l cywgdTggc3dpbmcsIHU4IHByZV9lbXApCj4gK3sKPiArCXN0cnVjdCByb2NrY2hpcF90eXBlY19w aHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7Cj4gKwl1OCBpOwo+ICsKPiArCXRjcGh5 X2NmZ19kcF9wbGwodGNwaHksIGxpbmtfcmF0ZSk7Cj4gKwo+ICsJaWYgKHRjcGh5LT5tb2RlID09 IE1PREVfREZQX0RQKSB7Cj4gKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKPiArCQkJdGNwaHlf ZHBfY2ZnX2xhbmUodGNwaHksIGxpbmtfcmF0ZSwgc3dpbmcsIHByZV9lbXAsIGkpOwo+ICsJfSBl bHNlIHsKPiArCQlpZiAodGNwaHktPmZsaXApIHsKPiArCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNw aHksIGxpbmtfcmF0ZSwgc3dpbmcsIHByZV9lbXAsIDApOwo+ICsJCQl0Y3BoeV9kcF9jZmdfbGFu ZSh0Y3BoeSwgbGlua19yYXRlLCBzd2luZywgcHJlX2VtcCwgMSk7Cj4gKwkJfSBlbHNlIHsKPiAr CQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIGxpbmtfcmF0ZSwgc3dpbmcsIHByZV9lbXAsIDIp Owo+ICsJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgbGlua19yYXRlLCBzd2luZywgcHJlX2Vt cCwgMyk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICBzdGF0aWMg aW50IHRjcGh5X3BhcnNlX2R0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LAo+ICAJ CQkgIHN0cnVjdCBkZXZpY2UgKmRldikKPiAgewo+ICsJaW50IHJldDsKPiArCj4gIAl0Y3BoeS0+ Z3JmX3JlZ3MgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKGRldi0+b2Zfbm9kZSwK PiAgCQkJCQkJCSAgInJvY2tjaGlwLGdyZiIpOwo+ICAJaWYgKElTX0VSUih0Y3BoeS0+Z3JmX3Jl Z3MpKSB7Cj4gQEAgLTEwODcsNiArMTE4NiwxNiBAQCBzdGF0aWMgaW50IHRjcGh5X3BhcnNlX2R0 KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LAo+ICAJCXJldHVybiBQVFJfRVJSKHRj cGh5LT50Y3BoeV9yc3QpOwo+ICAJfQo+ICAKPiArCS8qCj4gKwkgKiBjaGVjayBpZiBwaHlfY29u ZmlnIHBhc3MgZnJvbSBkdHMsIGlmIG5vLAo+ICsJICogdXNlIGRlZmF1bHQgcGh5IGNvbmZpZyB2 YWx1ZS4KPiArCSAqLwo+ICsJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoZGV2LT5v Zl9ub2RlLCAicm9ja2NoaXAscGh5X2NvbmZpZyIsCj4gKwkJKHUzMiAqKXRjcGh5LT5jb25maWcs IHNpemVvZih0Y3BoeS0+Y29uZmlnKSAvIHNpemVvZih1MzIpKTsKPiArCWlmIChyZXQpCj4gKwkJ bWVtY3B5KHRjcGh5LT5jb25maWcsIHRjcGh5X2RlZmF1bHRfY29uZmlnLAo+ICsJCSAgICAgICBz aXplb2YodGNwaHktPmNvbmZpZykpOwo+ICsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+IEBAIC0x MTcxLDYgKzEyODAsNyBAQCBzdGF0aWMgaW50IHJvY2tjaGlwX3R5cGVjX3BoeV9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICAJCX0KPiAgCX0KPiAgCj4gKwl0Y3BoeS0+dHlw ZWNfcGh5X2NvbmZpZyA9IHR5cGVjX2RwX3BoeV9jb25maWc7Cj4gIAlwbV9ydW50aW1lX2VuYWJs ZShkZXYpOwo+ICAKPiAgCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGls ZF9ucCkgewo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9waHlf dHlwZWMuaCBiL2luY2x1ZGUvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3BoeV90eXBlYy5oCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5iZTZhZjBlCj4gLS0tIC9kZXYvbnVs bAo+ICsrKyBiL2luY2x1ZGUvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3BoeV90eXBlYy5oCj4gQEAg LTAsMCArMSw2MyBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwo+ ICsvKgo+ICsgKiBDb3B5cmlnaHQgKEMpIEZ1emhvdSBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby5M dGQKPiArICogQXV0aG9yOiBMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29tPgo+ICsgKi8KPiAr Cj4gKyNpZm5kZWYgX19TT0NfUk9DS0NISVBfUEhZX1RZUEVDX0gKPiArI2RlZmluZSBfX1NPQ19S T0NLQ0hJUF9QSFlfVFlQRUNfSAo+ICsKPiArc3RydWN0IHVzYjNwaHlfcmVnIHsKPiArCXUzMiBv ZmZzZXQ7Cj4gKwl1MzIgZW5hYmxlX2JpdDsKPiArCXUzMiB3cml0ZV9lbmFibGU7Cj4gK307Cj4g Kwo+ICsvKioKPiArICogc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmc6IHVzYjMtcGh5 IHBvcnQgY29uZmlndXJhdGlvbi4KPiArICogQHJlZzogdGhlIGJhc2UgYWRkcmVzcyBmb3IgdXNi My1waHkgY29uZmlnLgo+ICsgKiBAdHlwZWNfY29ubl9kaXI6IHRoZSByZWdpc3RlciBvZiB0eXBl LWMgY29ubmVjdG9yIGRpcmVjdGlvbi4KPiArICogQHVzYjN0b3VzYjJfZW46IHRoZSByZWdpc3Rl ciBvZiB0eXBlLWMgZm9yY2UgdXNiMiB0byB1c2IyIGVuYWJsZS4KPiArICogQGV4dGVybmFsX3Bz bTogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyBwaHkgZXh0ZXJuYWwgcHNtIGNsb2NrLgo+ICsgKiBA cGlwZV9zdGF0dXM6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgcGh5IHBpcGUgc3RhdHVzLgo+ICsg KiBAdXNiM19ob3N0X2Rpc2FibGU6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgdXNiMyBob3N0IGRp c2FibGUuCj4gKyAqIEB1c2IzX2hvc3RfcG9ydDogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyB1c2Iz IGhvc3QgcG9ydC4KPiArICogQHVwaHlfZHBfc2VsOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIHBo eSBEUCBzZWxlY3QgY29udHJvbC4KPiArICovCj4gK3N0cnVjdCByb2NrY2hpcF91c2IzcGh5X3Bv cnRfY2ZnIHsKPiArCXVuc2lnbmVkIGludCByZWc7Cj4gKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgdHlw ZWNfY29ubl9kaXI7Cj4gKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgdXNiM3RvdXNiMl9lbjsKPiArCXN0 cnVjdCB1c2IzcGh5X3JlZyBleHRlcm5hbF9wc207Cj4gKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgcGlw ZV9zdGF0dXM7Cj4gKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgdXNiM19ob3N0X2Rpc2FibGU7Cj4gKwlz dHJ1Y3QgdXNiM3BoeV9yZWcgdXNiM19ob3N0X3BvcnQ7Cj4gKwlzdHJ1Y3QgdXNiM3BoeV9yZWcg dXBoeV9kcF9zZWw7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgcGh5X2NvbmZpZyB7Cj4gKwlpbnQgc3dp bmc7Cj4gKwlpbnQgcGU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5IHsK PiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCXZvaWQgX19pb21lbSAqYmFzZTsKPiArCXN0cnVj dCBleHRjb25fZGV2ICpleHRjb247Cj4gKwlzdHJ1Y3QgcmVnbWFwICpncmZfcmVnczsKPiArCXN0 cnVjdCBjbGsgKmNsa19jb3JlOwo+ICsJc3RydWN0IGNsayAqY2xrX3JlZjsKPiArCXN0cnVjdCBy ZXNldF9jb250cm9sICp1cGh5X3JzdDsKPiArCXN0cnVjdCByZXNldF9jb250cm9sICpwaXBlX3Jz dDsKPiArCXN0cnVjdCByZXNldF9jb250cm9sICp0Y3BoeV9yc3Q7Cj4gKwljb25zdCBzdHJ1Y3Qg cm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyAqcG9ydF9jZmdzOwo+ICsJLyogbXV0ZXggdG8gcHJv dGVjdCBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBQSFlzICovCj4gKwlzdHJ1Y3QgbXV0ZXggbG9jazsK PiArCXN0cnVjdCBwaHlfY29uZmlnIGNvbmZpZ1szXVs0XTsKPiArCWJvb2wgZmxpcDsKPiArCXU4 IG1vZGU7Cj4gKwlpbnQgKCp0eXBlY19waHlfY29uZmlnKShzdHJ1Y3QgcGh5ICpwaHksIGludCBs aW5rX3JhdGUsCj4gKwkJCQlpbnQgbGFuZXMsIHU4IHN3aW5nLCB1OCBwcmVfZW1wKTsKPiArfTsK PiArCj4gKyNlbmRpZgo+IAoKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: heiko@sntech.de (Heiko Stuebner) Date: Fri, 18 May 2018 18:33:52 +0200 Subject: [PATCH v5 3/4] phy: rockchip-typec: support variable phy config value In-Reply-To: <1526548680-2552-3-git-send-email-hl@rock-chips.com> References: <1526548680-2552-1-git-send-email-hl@rock-chips.com> <1526548680-2552-3-git-send-email-hl@rock-chips.com> Message-ID: <3042646.xpzRv8Q1H3@phil> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi, Am Donnerstag, 17. Mai 2018, 11:17:59 CEST schrieb Lin Huang: > the phy config values used to fix in dp firmware, but some boards > need change these values to do training and get the better eye diagram > result. So support that in phy driver. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang I don't see anything obvious. One could argue, that splitting out of the structs into the header could be a separate patch, especially as the reason for it is not spelled out in the commit message at all - and the reason only becomes visible when also reading patch4. But what is even more important is keeping Kishon as the phy-maintainer in the loop. I've done that here, but please make sure that following versions also get a Cc to Kishon Vijay Abraham I As the patch will probably need an Ack to get through the drm-tree. Heiko > --- > Changes in v2: > - update patch following Enric suggest > Changes in v3: > - delete need_software_training variable > - add default phy config value, if dts do not define phy config value, use these value > Changes in v4: > - rename variable config to tcphy_default_config > Changes in v5: > - None > > drivers/phy/rockchip/phy-rockchip-typec.c | 306 ++++++++++++++++++++---------- > include/soc/rockchip/rockchip_phy_typec.h | 63 ++++++ > 2 files changed, 271 insertions(+), 98 deletions(-) > create mode 100644 include/soc/rockchip/rockchip_phy_typec.h > > diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockchip/phy-rockchip-typec.c > index 76a4b58..5d8692d 100644 > --- a/drivers/phy/rockchip/phy-rockchip-typec.c > +++ b/drivers/phy/rockchip/phy-rockchip-typec.c > @@ -63,6 +63,7 @@ > > #include > #include > +#include > > #define CMN_SSM_BANDGAP (0x21 << 2) > #define CMN_SSM_BIAS (0x22 << 2) > @@ -323,21 +324,29 @@ > * clock 0: PLL 0 div 1 > * clock 1: PLL 1 div 2 > */ > -#define CLK_PLL_CONFIG 0X30 > +#define CLK_PLL1_DIV1 0x20 > +#define CLK_PLL1_DIV2 0x30 > #define CLK_PLL_MASK 0x33 > > #define CMN_READY BIT(0) > > +#define DP_PLL_CLOCK_ENABLE_ACK BIT(3) > #define DP_PLL_CLOCK_ENABLE BIT(2) > +#define DP_PLL_ENABLE_ACK BIT(1) > #define DP_PLL_ENABLE BIT(0) > #define DP_PLL_DATA_RATE_RBR ((2 << 12) | (4 << 8)) > #define DP_PLL_DATA_RATE_HBR ((2 << 12) | (4 << 8)) > #define DP_PLL_DATA_RATE_HBR2 ((1 << 12) | (2 << 8)) > +#define DP_PLL_DATA_RATE_MASK 0xff00 > > -#define DP_MODE_A0 BIT(4) > -#define DP_MODE_A2 BIT(6) > -#define DP_MODE_ENTER_A0 0xc101 > -#define DP_MODE_ENTER_A2 0xc104 > +#define DP_MODE_MASK 0xf > +#define DP_MODE_ENTER_A0 BIT(0) > +#define DP_MODE_ENTER_A2 BIT(2) > +#define DP_MODE_ENTER_A3 BIT(3) > +#define DP_MODE_A0_ACK BIT(4) > +#define DP_MODE_A2_ACK BIT(6) > +#define DP_MODE_A3_ACK BIT(7) > +#define DP_LINK_RESET_DEASSERTED BIT(8) > > #define PHY_MODE_SET_TIMEOUT 100000 > > @@ -349,51 +358,7 @@ > #define MODE_DFP_USB BIT(1) > #define MODE_DFP_DP BIT(2) > > -struct usb3phy_reg { > - u32 offset; > - u32 enable_bit; > - u32 write_enable; > -}; > - > -/** > - * struct rockchip_usb3phy_port_cfg: usb3-phy port configuration. > - * @reg: the base address for usb3-phy config. > - * @typec_conn_dir: the register of type-c connector direction. > - * @usb3tousb2_en: the register of type-c force usb2 to usb2 enable. > - * @external_psm: the register of type-c phy external psm clock. > - * @pipe_status: the register of type-c phy pipe status. > - * @usb3_host_disable: the register of type-c usb3 host disable. > - * @usb3_host_port: the register of type-c usb3 host port. > - * @uphy_dp_sel: the register of type-c phy DP select control. > - */ > -struct rockchip_usb3phy_port_cfg { > - unsigned int reg; > - struct usb3phy_reg typec_conn_dir; > - struct usb3phy_reg usb3tousb2_en; > - struct usb3phy_reg external_psm; > - struct usb3phy_reg pipe_status; > - struct usb3phy_reg usb3_host_disable; > - struct usb3phy_reg usb3_host_port; > - struct usb3phy_reg uphy_dp_sel; > -}; > - > -struct rockchip_typec_phy { > - struct device *dev; > - void __iomem *base; > - struct extcon_dev *extcon; > - struct regmap *grf_regs; > - struct clk *clk_core; > - struct clk *clk_ref; > - struct reset_control *uphy_rst; > - struct reset_control *pipe_rst; > - struct reset_control *tcphy_rst; > - const struct rockchip_usb3phy_port_cfg *port_cfgs; > - /* mutex to protect access to individual PHYs */ > - struct mutex lock; > - > - bool flip; > - u8 mode; > -}; > +#define DP_DEFAULT_RATE 162000 > > struct phy_reg { > u16 value; > @@ -417,15 +382,15 @@ struct phy_reg usb3_pll_cfg[] = { > { 0x8, CMN_DIAG_PLL0_LF_PROG }, > }; > > -struct phy_reg dp_pll_cfg[] = { > +struct phy_reg dp_pll_rbr_cfg[] = { > { 0xf0, CMN_PLL1_VCOCAL_INIT }, > { 0x18, CMN_PLL1_VCOCAL_ITER }, > { 0x30b9, CMN_PLL1_VCOCAL_START }, > - { 0x21c, CMN_PLL1_INTDIV }, > + { 0x87, CMN_PLL1_INTDIV }, > { 0, CMN_PLL1_FRACDIV }, > - { 0x5, CMN_PLL1_HIGH_THR }, > - { 0x35, CMN_PLL1_SS_CTRL1 }, > - { 0x7f1e, CMN_PLL1_SS_CTRL2 }, > + { 0x22, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > { 0x20, CMN_PLL1_DSM_DIAG }, > { 0, CMN_PLLSM1_USER_DEF_CTRL }, > { 0, CMN_DIAG_PLL1_OVRD }, > @@ -436,9 +401,52 @@ struct phy_reg dp_pll_cfg[] = { > { 0x8, CMN_DIAG_PLL1_LF_PROG }, > { 0x100, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > { 0x7, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > - { 0x4, CMN_DIAG_PLL1_INCLK_CTRL }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > +}; > + > +struct phy_reg dp_pll_hbr_cfg[] = { > + { 0xf0, CMN_PLL1_VCOCAL_INIT }, > + { 0x18, CMN_PLL1_VCOCAL_ITER }, > + { 0x30b4, CMN_PLL1_VCOCAL_START }, > + { 0xe1, CMN_PLL1_INTDIV }, > + { 0, CMN_PLL1_FRACDIV }, > + { 0x5, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > + { 0x20, CMN_PLL1_DSM_DIAG }, > + { 0x1000, CMN_PLLSM1_USER_DEF_CTRL }, > + { 0, CMN_DIAG_PLL1_OVRD }, > + { 0, CMN_DIAG_PLL1_FBH_OVRD }, > + { 0, CMN_DIAG_PLL1_FBL_OVRD }, > + { 0x7, CMN_DIAG_PLL1_V2I_TUNE }, > + { 0x45, CMN_DIAG_PLL1_CP_TUNE }, > + { 0x8, CMN_DIAG_PLL1_LF_PROG }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > }; > > +struct phy_reg dp_pll_hbr2_cfg[] = { > + { 0xf0, CMN_PLL1_VCOCAL_INIT }, > + { 0x18, CMN_PLL1_VCOCAL_ITER }, > + { 0x30b4, CMN_PLL1_VCOCAL_START }, > + { 0xe1, CMN_PLL1_INTDIV }, > + { 0, CMN_PLL1_FRACDIV }, > + { 0x5, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > + { 0x20, CMN_PLL1_DSM_DIAG }, > + { 0x1000, CMN_PLLSM1_USER_DEF_CTRL }, > + { 0, CMN_DIAG_PLL1_OVRD }, > + { 0, CMN_DIAG_PLL1_FBH_OVRD }, > + { 0, CMN_DIAG_PLL1_FBL_OVRD }, > + { 0x7, CMN_DIAG_PLL1_V2I_TUNE }, > + { 0x45, CMN_DIAG_PLL1_CP_TUNE }, > + { 0x8, CMN_DIAG_PLL1_LF_PROG }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > +}; > static const struct rockchip_usb3phy_port_cfg rk3399_usb3phy_port_cfgs[] = { > { > .reg = 0xff7c0000, > @@ -463,6 +471,24 @@ static const struct rockchip_usb3phy_port_cfg rk3399_usb3phy_port_cfgs[] = { > { /* sentinel */ } > }; > > +/* default phy config */ > +static const struct phy_config tcphy_default_config[3][4] = { > + {{ .swing = 0x2a, .pe = 0x00 }, > + { .swing = 0x1f, .pe = 0x15 }, > + { .swing = 0x14, .pe = 0x22 }, > + { .swing = 0x02, .pe = 0x2b } }, > + > + {{ .swing = 0x21, .pe = 0x00 }, > + { .swing = 0x12, .pe = 0x15 }, > + { .swing = 0x02, .pe = 0x22 }, > + { .swing = 0, .pe = 0 } }, > + > + {{ .swing = 0x15, .pe = 0x00 }, > + { .swing = 0x00, .pe = 0x15 }, > + { .swing = 0, .pe = 0 }, > + { .swing = 0, .pe = 0 } }, > +}; > + > static void tcphy_cfg_24m(struct rockchip_typec_phy *tcphy) > { > u32 i, rdata; > @@ -484,7 +510,7 @@ static void tcphy_cfg_24m(struct rockchip_typec_phy *tcphy) > > rdata = readl(tcphy->base + CMN_DIAG_HSCLK_SEL); > rdata &= ~CLK_PLL_MASK; > - rdata |= CLK_PLL_CONFIG; > + rdata |= CLK_PLL1_DIV2; > writel(rdata, tcphy->base + CMN_DIAG_HSCLK_SEL); > } > > @@ -498,17 +524,44 @@ static void tcphy_cfg_usb3_pll(struct rockchip_typec_phy *tcphy) > tcphy->base + usb3_pll_cfg[i].addr); > } > > -static void tcphy_cfg_dp_pll(struct rockchip_typec_phy *tcphy) > +static void tcphy_cfg_dp_pll(struct rockchip_typec_phy *tcphy, int link_rate) > { > - u32 i; > + struct phy_reg *phy_cfg; > + u32 clk_ctrl; > + u32 i, cfg_size, hsclk_sel; > + > + hsclk_sel = readl(tcphy->base + CMN_DIAG_HSCLK_SEL); > + hsclk_sel &= ~CLK_PLL_MASK; > + > + switch (link_rate) { > + case 162000: > + clk_ctrl = DP_PLL_DATA_RATE_RBR; > + hsclk_sel |= CLK_PLL1_DIV2; > + phy_cfg = dp_pll_rbr_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_rbr_cfg); > + break; > + case 270000: > + clk_ctrl = DP_PLL_DATA_RATE_HBR; > + hsclk_sel |= CLK_PLL1_DIV2; > + phy_cfg = dp_pll_hbr_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_hbr_cfg); > + break; > + case 540000: > + clk_ctrl = DP_PLL_DATA_RATE_HBR2; > + hsclk_sel |= CLK_PLL1_DIV1; > + phy_cfg = dp_pll_hbr2_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_hbr2_cfg); > + break; > + } > + > + clk_ctrl |= DP_PLL_CLOCK_ENABLE | DP_PLL_ENABLE; > + writel(clk_ctrl, tcphy->base + DP_CLK_CTL); > > - /* set the default mode to RBR */ > - writel(DP_PLL_CLOCK_ENABLE | DP_PLL_ENABLE | DP_PLL_DATA_RATE_RBR, > - tcphy->base + DP_CLK_CTL); > + writel(hsclk_sel, tcphy->base + CMN_DIAG_HSCLK_SEL); > > /* load the configuration of PLL1 */ > - for (i = 0; i < ARRAY_SIZE(dp_pll_cfg); i++) > - writel(dp_pll_cfg[i].value, tcphy->base + dp_pll_cfg[i].addr); > + for (i = 0; i < cfg_size; i++) > + writel(phy_cfg[i].value, tcphy->base + phy_cfg[i].addr); > } > > static void tcphy_tx_usb3_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > @@ -535,9 +588,10 @@ static void tcphy_rx_usb3_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > writel(0xfb, tcphy->base + XCVR_DIAG_BIDI_CTRL(lane)); > } > > -static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > +static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, int link_rate, > + u8 swing, u8 pre_emp, u32 lane) > { > - u16 rdata; > + u16 val; > > writel(0xbefc, tcphy->base + XCVR_PSM_RCTRL(lane)); > writel(0x6799, tcphy->base + TX_PSC_A0(lane)); > @@ -545,25 +599,31 @@ static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > writel(0x98, tcphy->base + TX_PSC_A2(lane)); > writel(0x98, tcphy->base + TX_PSC_A3(lane)); > > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_000(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_001(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_010(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_011(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_100(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_101(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_110(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_111(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_10(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_01(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_00(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_11(lane)); > - > - writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > - writel(0x400, tcphy->base + TX_DIAG_TX_DRV(lane)); > - > - rdata = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > - rdata = (rdata & 0x8fff) | 0x6000; > - writel(rdata, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > + writel(tcphy->config[swing][pre_emp].swing, > + tcphy->base + TX_TXCC_MGNFS_MULT_000(lane)); > + writel(tcphy->config[swing][pre_emp].pe, > + tcphy->base + TX_TXCC_CPOST_MULT_00(lane)); > + > + if (swing == 2 && pre_emp == 0 && link_rate != 540000) { > + writel(0x700, tcphy->base + TX_DIAG_TX_DRV(lane)); > + writel(0x13c, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > + } else { > + writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > + writel(0x0400, tcphy->base + TX_DIAG_TX_DRV(lane)); > + } > + > + val = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > + val = val & 0x8fff; > + switch (link_rate) { > + case 162000: > + case 270000: > + val |= (6 << 12); > + break; > + case 540000: > + val |= (4 << 12); > + break; > + } > + writel(val, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > } > > static inline int property_enable(struct rockchip_typec_phy *tcphy, > @@ -754,30 +814,33 @@ static int tcphy_phy_init(struct rockchip_typec_phy *tcphy, u8 mode) > tcphy_cfg_24m(tcphy); > > if (mode == MODE_DFP_DP) { > - tcphy_cfg_dp_pll(tcphy); > + tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE); > for (i = 0; i < 4; i++) > - tcphy_dp_cfg_lane(tcphy, i); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, i); > > writel(PIN_ASSIGN_C_E, tcphy->base + PMA_LANE_CFG); > } else { > tcphy_cfg_usb3_pll(tcphy); > - tcphy_cfg_dp_pll(tcphy); > + tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE); > if (tcphy->flip) { > tcphy_tx_usb3_cfg_lane(tcphy, 3); > tcphy_rx_usb3_cfg_lane(tcphy, 2); > - tcphy_dp_cfg_lane(tcphy, 0); > - tcphy_dp_cfg_lane(tcphy, 1); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 0); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 1); > } else { > tcphy_tx_usb3_cfg_lane(tcphy, 0); > tcphy_rx_usb3_cfg_lane(tcphy, 1); > - tcphy_dp_cfg_lane(tcphy, 2); > - tcphy_dp_cfg_lane(tcphy, 3); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 2); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 3); > } > > writel(PIN_ASSIGN_D_F, tcphy->base + PMA_LANE_CFG); > } > > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2 | DP_LINK_RESET_DEASSERTED; > + writel(val, tcphy->base + DP_MODE_CTL); > > reset_control_deassert(tcphy->uphy_rst); > > @@ -990,7 +1053,7 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > property_enable(tcphy, &cfg->uphy_dp_sel, 1); > > ret = readx_poll_timeout(readl, tcphy->base + DP_MODE_CTL, > - val, val & DP_MODE_A2, 1000, > + val, val & DP_MODE_A2_ACK, 1000, > PHY_MODE_SET_TIMEOUT); > if (ret < 0) { > dev_err(tcphy->dev, "failed to wait TCPHY enter A2\n"); > @@ -999,13 +1062,19 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > > tcphy_dp_aux_calibration(tcphy); > > - writel(DP_MODE_ENTER_A0, tcphy->base + DP_MODE_CTL); > + /* enter A0 mode */ > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A0; > + writel(val, tcphy->base + DP_MODE_CTL); > > ret = readx_poll_timeout(readl, tcphy->base + DP_MODE_CTL, > - val, val & DP_MODE_A0, 1000, > + val, val & DP_MODE_A0_ACK, 1000, > PHY_MODE_SET_TIMEOUT); > if (ret < 0) { > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2; > + writel(val, tcphy->base + DP_MODE_CTL); > dev_err(tcphy->dev, "failed to wait TCPHY enter A0\n"); > goto power_on_finish; > } > @@ -1023,6 +1092,7 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > static int rockchip_dp_phy_power_off(struct phy *phy) > { > struct rockchip_typec_phy *tcphy = phy_get_drvdata(phy); > + u32 val; > > mutex_lock(&tcphy->lock); > > @@ -1031,7 +1101,10 @@ static int rockchip_dp_phy_power_off(struct phy *phy) > > tcphy->mode &= ~MODE_DFP_DP; > > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2; > + writel(val, tcphy->base + DP_MODE_CTL); > > if (tcphy->mode == MODE_DISCONNECT) > tcphy_phy_deinit(tcphy); > @@ -1047,9 +1120,35 @@ static const struct phy_ops rockchip_dp_phy_ops = { > .owner = THIS_MODULE, > }; > > +static int typec_dp_phy_config(struct phy *phy, int link_rate, > + int lanes, u8 swing, u8 pre_emp) > +{ > + struct rockchip_typec_phy *tcphy = phy_get_drvdata(phy); > + u8 i; > + > + tcphy_cfg_dp_pll(tcphy, link_rate); > + > + if (tcphy->mode == MODE_DFP_DP) { > + for (i = 0; i < 4; i++) > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, i); > + } else { > + if (tcphy->flip) { > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 0); > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 1); > + } else { > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 2); > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 3); > + } > + } > + > + return 0; > +} > + > static int tcphy_parse_dt(struct rockchip_typec_phy *tcphy, > struct device *dev) > { > + int ret; > + > tcphy->grf_regs = syscon_regmap_lookup_by_phandle(dev->of_node, > "rockchip,grf"); > if (IS_ERR(tcphy->grf_regs)) { > @@ -1087,6 +1186,16 @@ static int tcphy_parse_dt(struct rockchip_typec_phy *tcphy, > return PTR_ERR(tcphy->tcphy_rst); > } > > + /* > + * check if phy_config pass from dts, if no, > + * use default phy config value. > + */ > + ret = of_property_read_u32_array(dev->of_node, "rockchip,phy_config", > + (u32 *)tcphy->config, sizeof(tcphy->config) / sizeof(u32)); > + if (ret) > + memcpy(tcphy->config, tcphy_default_config, > + sizeof(tcphy->config)); > + > return 0; > } > > @@ -1171,6 +1280,7 @@ static int rockchip_typec_phy_probe(struct platform_device *pdev) > } > } > > + tcphy->typec_phy_config = typec_dp_phy_config; > pm_runtime_enable(dev); > > for_each_available_child_of_node(np, child_np) { > diff --git a/include/soc/rockchip/rockchip_phy_typec.h b/include/soc/rockchip/rockchip_phy_typec.h > new file mode 100644 > index 0000000..be6af0e > --- /dev/null > +++ b/include/soc/rockchip/rockchip_phy_typec.h > @@ -0,0 +1,63 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd > + * Author: Lin Huang > + */ > + > +#ifndef __SOC_ROCKCHIP_PHY_TYPEC_H > +#define __SOC_ROCKCHIP_PHY_TYPEC_H > + > +struct usb3phy_reg { > + u32 offset; > + u32 enable_bit; > + u32 write_enable; > +}; > + > +/** > + * struct rockchip_usb3phy_port_cfg: usb3-phy port configuration. > + * @reg: the base address for usb3-phy config. > + * @typec_conn_dir: the register of type-c connector direction. > + * @usb3tousb2_en: the register of type-c force usb2 to usb2 enable. > + * @external_psm: the register of type-c phy external psm clock. > + * @pipe_status: the register of type-c phy pipe status. > + * @usb3_host_disable: the register of type-c usb3 host disable. > + * @usb3_host_port: the register of type-c usb3 host port. > + * @uphy_dp_sel: the register of type-c phy DP select control. > + */ > +struct rockchip_usb3phy_port_cfg { > + unsigned int reg; > + struct usb3phy_reg typec_conn_dir; > + struct usb3phy_reg usb3tousb2_en; > + struct usb3phy_reg external_psm; > + struct usb3phy_reg pipe_status; > + struct usb3phy_reg usb3_host_disable; > + struct usb3phy_reg usb3_host_port; > + struct usb3phy_reg uphy_dp_sel; > +}; > + > +struct phy_config { > + int swing; > + int pe; > +}; > + > +struct rockchip_typec_phy { > + struct device *dev; > + void __iomem *base; > + struct extcon_dev *extcon; > + struct regmap *grf_regs; > + struct clk *clk_core; > + struct clk *clk_ref; > + struct reset_control *uphy_rst; > + struct reset_control *pipe_rst; > + struct reset_control *tcphy_rst; > + const struct rockchip_usb3phy_port_cfg *port_cfgs; > + /* mutex to protect access to individual PHYs */ > + struct mutex lock; > + struct phy_config config[3][4]; > + bool flip; > + u8 mode; > + int (*typec_phy_config)(struct phy *phy, int link_rate, > + int lanes, u8 swing, u8 pre_emp); > +}; > + > +#endif > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752153AbeERQek (ORCPT ); Fri, 18 May 2018 12:34:40 -0400 Received: from gloria.sntech.de ([95.129.55.99]:40790 "EHLO gloria.sntech.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750975AbeERQeh (ORCPT ); Fri, 18 May 2018 12:34:37 -0400 From: Heiko Stuebner To: Lin Huang Cc: seanpaul@chromium.org, airlied@linux.ie, zyw@rock-chips.com, dianders@chromium.org, briannorris@chromium.org, linux-rockchip@lists.infradead.org, daniel.vetter@intel.com, jani.nikula@linux.intel.com, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, eballetbo@gmail.com, robh+dt@kernel.org, devicetree@vger.kernel.org, kishon@ti.com Subject: Re: [PATCH v5 3/4] phy: rockchip-typec: support variable phy config value Date: Fri, 18 May 2018 18:33:52 +0200 Message-ID: <3042646.xpzRv8Q1H3@phil> In-Reply-To: <1526548680-2552-3-git-send-email-hl@rock-chips.com> References: <1526548680-2552-1-git-send-email-hl@rock-chips.com> <1526548680-2552-3-git-send-email-hl@rock-chips.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Am Donnerstag, 17. Mai 2018, 11:17:59 CEST schrieb Lin Huang: > the phy config values used to fix in dp firmware, but some boards > need change these values to do training and get the better eye diagram > result. So support that in phy driver. > > Signed-off-by: Chris Zhong > Signed-off-by: Lin Huang I don't see anything obvious. One could argue, that splitting out of the structs into the header could be a separate patch, especially as the reason for it is not spelled out in the commit message at all - and the reason only becomes visible when also reading patch4. But what is even more important is keeping Kishon as the phy-maintainer in the loop. I've done that here, but please make sure that following versions also get a Cc to Kishon Vijay Abraham I As the patch will probably need an Ack to get through the drm-tree. Heiko > --- > Changes in v2: > - update patch following Enric suggest > Changes in v3: > - delete need_software_training variable > - add default phy config value, if dts do not define phy config value, use these value > Changes in v4: > - rename variable config to tcphy_default_config > Changes in v5: > - None > > drivers/phy/rockchip/phy-rockchip-typec.c | 306 ++++++++++++++++++++---------- > include/soc/rockchip/rockchip_phy_typec.h | 63 ++++++ > 2 files changed, 271 insertions(+), 98 deletions(-) > create mode 100644 include/soc/rockchip/rockchip_phy_typec.h > > diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockchip/phy-rockchip-typec.c > index 76a4b58..5d8692d 100644 > --- a/drivers/phy/rockchip/phy-rockchip-typec.c > +++ b/drivers/phy/rockchip/phy-rockchip-typec.c > @@ -63,6 +63,7 @@ > > #include > #include > +#include > > #define CMN_SSM_BANDGAP (0x21 << 2) > #define CMN_SSM_BIAS (0x22 << 2) > @@ -323,21 +324,29 @@ > * clock 0: PLL 0 div 1 > * clock 1: PLL 1 div 2 > */ > -#define CLK_PLL_CONFIG 0X30 > +#define CLK_PLL1_DIV1 0x20 > +#define CLK_PLL1_DIV2 0x30 > #define CLK_PLL_MASK 0x33 > > #define CMN_READY BIT(0) > > +#define DP_PLL_CLOCK_ENABLE_ACK BIT(3) > #define DP_PLL_CLOCK_ENABLE BIT(2) > +#define DP_PLL_ENABLE_ACK BIT(1) > #define DP_PLL_ENABLE BIT(0) > #define DP_PLL_DATA_RATE_RBR ((2 << 12) | (4 << 8)) > #define DP_PLL_DATA_RATE_HBR ((2 << 12) | (4 << 8)) > #define DP_PLL_DATA_RATE_HBR2 ((1 << 12) | (2 << 8)) > +#define DP_PLL_DATA_RATE_MASK 0xff00 > > -#define DP_MODE_A0 BIT(4) > -#define DP_MODE_A2 BIT(6) > -#define DP_MODE_ENTER_A0 0xc101 > -#define DP_MODE_ENTER_A2 0xc104 > +#define DP_MODE_MASK 0xf > +#define DP_MODE_ENTER_A0 BIT(0) > +#define DP_MODE_ENTER_A2 BIT(2) > +#define DP_MODE_ENTER_A3 BIT(3) > +#define DP_MODE_A0_ACK BIT(4) > +#define DP_MODE_A2_ACK BIT(6) > +#define DP_MODE_A3_ACK BIT(7) > +#define DP_LINK_RESET_DEASSERTED BIT(8) > > #define PHY_MODE_SET_TIMEOUT 100000 > > @@ -349,51 +358,7 @@ > #define MODE_DFP_USB BIT(1) > #define MODE_DFP_DP BIT(2) > > -struct usb3phy_reg { > - u32 offset; > - u32 enable_bit; > - u32 write_enable; > -}; > - > -/** > - * struct rockchip_usb3phy_port_cfg: usb3-phy port configuration. > - * @reg: the base address for usb3-phy config. > - * @typec_conn_dir: the register of type-c connector direction. > - * @usb3tousb2_en: the register of type-c force usb2 to usb2 enable. > - * @external_psm: the register of type-c phy external psm clock. > - * @pipe_status: the register of type-c phy pipe status. > - * @usb3_host_disable: the register of type-c usb3 host disable. > - * @usb3_host_port: the register of type-c usb3 host port. > - * @uphy_dp_sel: the register of type-c phy DP select control. > - */ > -struct rockchip_usb3phy_port_cfg { > - unsigned int reg; > - struct usb3phy_reg typec_conn_dir; > - struct usb3phy_reg usb3tousb2_en; > - struct usb3phy_reg external_psm; > - struct usb3phy_reg pipe_status; > - struct usb3phy_reg usb3_host_disable; > - struct usb3phy_reg usb3_host_port; > - struct usb3phy_reg uphy_dp_sel; > -}; > - > -struct rockchip_typec_phy { > - struct device *dev; > - void __iomem *base; > - struct extcon_dev *extcon; > - struct regmap *grf_regs; > - struct clk *clk_core; > - struct clk *clk_ref; > - struct reset_control *uphy_rst; > - struct reset_control *pipe_rst; > - struct reset_control *tcphy_rst; > - const struct rockchip_usb3phy_port_cfg *port_cfgs; > - /* mutex to protect access to individual PHYs */ > - struct mutex lock; > - > - bool flip; > - u8 mode; > -}; > +#define DP_DEFAULT_RATE 162000 > > struct phy_reg { > u16 value; > @@ -417,15 +382,15 @@ struct phy_reg usb3_pll_cfg[] = { > { 0x8, CMN_DIAG_PLL0_LF_PROG }, > }; > > -struct phy_reg dp_pll_cfg[] = { > +struct phy_reg dp_pll_rbr_cfg[] = { > { 0xf0, CMN_PLL1_VCOCAL_INIT }, > { 0x18, CMN_PLL1_VCOCAL_ITER }, > { 0x30b9, CMN_PLL1_VCOCAL_START }, > - { 0x21c, CMN_PLL1_INTDIV }, > + { 0x87, CMN_PLL1_INTDIV }, > { 0, CMN_PLL1_FRACDIV }, > - { 0x5, CMN_PLL1_HIGH_THR }, > - { 0x35, CMN_PLL1_SS_CTRL1 }, > - { 0x7f1e, CMN_PLL1_SS_CTRL2 }, > + { 0x22, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > { 0x20, CMN_PLL1_DSM_DIAG }, > { 0, CMN_PLLSM1_USER_DEF_CTRL }, > { 0, CMN_DIAG_PLL1_OVRD }, > @@ -436,9 +401,52 @@ struct phy_reg dp_pll_cfg[] = { > { 0x8, CMN_DIAG_PLL1_LF_PROG }, > { 0x100, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > { 0x7, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > - { 0x4, CMN_DIAG_PLL1_INCLK_CTRL }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > +}; > + > +struct phy_reg dp_pll_hbr_cfg[] = { > + { 0xf0, CMN_PLL1_VCOCAL_INIT }, > + { 0x18, CMN_PLL1_VCOCAL_ITER }, > + { 0x30b4, CMN_PLL1_VCOCAL_START }, > + { 0xe1, CMN_PLL1_INTDIV }, > + { 0, CMN_PLL1_FRACDIV }, > + { 0x5, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > + { 0x20, CMN_PLL1_DSM_DIAG }, > + { 0x1000, CMN_PLLSM1_USER_DEF_CTRL }, > + { 0, CMN_DIAG_PLL1_OVRD }, > + { 0, CMN_DIAG_PLL1_FBH_OVRD }, > + { 0, CMN_DIAG_PLL1_FBL_OVRD }, > + { 0x7, CMN_DIAG_PLL1_V2I_TUNE }, > + { 0x45, CMN_DIAG_PLL1_CP_TUNE }, > + { 0x8, CMN_DIAG_PLL1_LF_PROG }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > }; > > +struct phy_reg dp_pll_hbr2_cfg[] = { > + { 0xf0, CMN_PLL1_VCOCAL_INIT }, > + { 0x18, CMN_PLL1_VCOCAL_ITER }, > + { 0x30b4, CMN_PLL1_VCOCAL_START }, > + { 0xe1, CMN_PLL1_INTDIV }, > + { 0, CMN_PLL1_FRACDIV }, > + { 0x5, CMN_PLL1_HIGH_THR }, > + { 0x8000, CMN_PLL1_SS_CTRL1 }, > + { 0, CMN_PLL1_SS_CTRL2 }, > + { 0x20, CMN_PLL1_DSM_DIAG }, > + { 0x1000, CMN_PLLSM1_USER_DEF_CTRL }, > + { 0, CMN_DIAG_PLL1_OVRD }, > + { 0, CMN_DIAG_PLL1_FBH_OVRD }, > + { 0, CMN_DIAG_PLL1_FBL_OVRD }, > + { 0x7, CMN_DIAG_PLL1_V2I_TUNE }, > + { 0x45, CMN_DIAG_PLL1_CP_TUNE }, > + { 0x8, CMN_DIAG_PLL1_LF_PROG }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE1 }, > + { 0x1, CMN_DIAG_PLL1_PTATIS_TUNE2 }, > + { 0x1, CMN_DIAG_PLL1_INCLK_CTRL }, > +}; > static const struct rockchip_usb3phy_port_cfg rk3399_usb3phy_port_cfgs[] = { > { > .reg = 0xff7c0000, > @@ -463,6 +471,24 @@ static const struct rockchip_usb3phy_port_cfg rk3399_usb3phy_port_cfgs[] = { > { /* sentinel */ } > }; > > +/* default phy config */ > +static const struct phy_config tcphy_default_config[3][4] = { > + {{ .swing = 0x2a, .pe = 0x00 }, > + { .swing = 0x1f, .pe = 0x15 }, > + { .swing = 0x14, .pe = 0x22 }, > + { .swing = 0x02, .pe = 0x2b } }, > + > + {{ .swing = 0x21, .pe = 0x00 }, > + { .swing = 0x12, .pe = 0x15 }, > + { .swing = 0x02, .pe = 0x22 }, > + { .swing = 0, .pe = 0 } }, > + > + {{ .swing = 0x15, .pe = 0x00 }, > + { .swing = 0x00, .pe = 0x15 }, > + { .swing = 0, .pe = 0 }, > + { .swing = 0, .pe = 0 } }, > +}; > + > static void tcphy_cfg_24m(struct rockchip_typec_phy *tcphy) > { > u32 i, rdata; > @@ -484,7 +510,7 @@ static void tcphy_cfg_24m(struct rockchip_typec_phy *tcphy) > > rdata = readl(tcphy->base + CMN_DIAG_HSCLK_SEL); > rdata &= ~CLK_PLL_MASK; > - rdata |= CLK_PLL_CONFIG; > + rdata |= CLK_PLL1_DIV2; > writel(rdata, tcphy->base + CMN_DIAG_HSCLK_SEL); > } > > @@ -498,17 +524,44 @@ static void tcphy_cfg_usb3_pll(struct rockchip_typec_phy *tcphy) > tcphy->base + usb3_pll_cfg[i].addr); > } > > -static void tcphy_cfg_dp_pll(struct rockchip_typec_phy *tcphy) > +static void tcphy_cfg_dp_pll(struct rockchip_typec_phy *tcphy, int link_rate) > { > - u32 i; > + struct phy_reg *phy_cfg; > + u32 clk_ctrl; > + u32 i, cfg_size, hsclk_sel; > + > + hsclk_sel = readl(tcphy->base + CMN_DIAG_HSCLK_SEL); > + hsclk_sel &= ~CLK_PLL_MASK; > + > + switch (link_rate) { > + case 162000: > + clk_ctrl = DP_PLL_DATA_RATE_RBR; > + hsclk_sel |= CLK_PLL1_DIV2; > + phy_cfg = dp_pll_rbr_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_rbr_cfg); > + break; > + case 270000: > + clk_ctrl = DP_PLL_DATA_RATE_HBR; > + hsclk_sel |= CLK_PLL1_DIV2; > + phy_cfg = dp_pll_hbr_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_hbr_cfg); > + break; > + case 540000: > + clk_ctrl = DP_PLL_DATA_RATE_HBR2; > + hsclk_sel |= CLK_PLL1_DIV1; > + phy_cfg = dp_pll_hbr2_cfg; > + cfg_size = ARRAY_SIZE(dp_pll_hbr2_cfg); > + break; > + } > + > + clk_ctrl |= DP_PLL_CLOCK_ENABLE | DP_PLL_ENABLE; > + writel(clk_ctrl, tcphy->base + DP_CLK_CTL); > > - /* set the default mode to RBR */ > - writel(DP_PLL_CLOCK_ENABLE | DP_PLL_ENABLE | DP_PLL_DATA_RATE_RBR, > - tcphy->base + DP_CLK_CTL); > + writel(hsclk_sel, tcphy->base + CMN_DIAG_HSCLK_SEL); > > /* load the configuration of PLL1 */ > - for (i = 0; i < ARRAY_SIZE(dp_pll_cfg); i++) > - writel(dp_pll_cfg[i].value, tcphy->base + dp_pll_cfg[i].addr); > + for (i = 0; i < cfg_size; i++) > + writel(phy_cfg[i].value, tcphy->base + phy_cfg[i].addr); > } > > static void tcphy_tx_usb3_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > @@ -535,9 +588,10 @@ static void tcphy_rx_usb3_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > writel(0xfb, tcphy->base + XCVR_DIAG_BIDI_CTRL(lane)); > } > > -static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > +static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, int link_rate, > + u8 swing, u8 pre_emp, u32 lane) > { > - u16 rdata; > + u16 val; > > writel(0xbefc, tcphy->base + XCVR_PSM_RCTRL(lane)); > writel(0x6799, tcphy->base + TX_PSC_A0(lane)); > @@ -545,25 +599,31 @@ static void tcphy_dp_cfg_lane(struct rockchip_typec_phy *tcphy, u32 lane) > writel(0x98, tcphy->base + TX_PSC_A2(lane)); > writel(0x98, tcphy->base + TX_PSC_A3(lane)); > > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_000(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_001(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_010(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_011(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_100(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_101(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_110(lane)); > - writel(0, tcphy->base + TX_TXCC_MGNFS_MULT_111(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_10(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_01(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_00(lane)); > - writel(0, tcphy->base + TX_TXCC_CPOST_MULT_11(lane)); > - > - writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > - writel(0x400, tcphy->base + TX_DIAG_TX_DRV(lane)); > - > - rdata = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > - rdata = (rdata & 0x8fff) | 0x6000; > - writel(rdata, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > + writel(tcphy->config[swing][pre_emp].swing, > + tcphy->base + TX_TXCC_MGNFS_MULT_000(lane)); > + writel(tcphy->config[swing][pre_emp].pe, > + tcphy->base + TX_TXCC_CPOST_MULT_00(lane)); > + > + if (swing == 2 && pre_emp == 0 && link_rate != 540000) { > + writel(0x700, tcphy->base + TX_DIAG_TX_DRV(lane)); > + writel(0x13c, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > + } else { > + writel(0x128, tcphy->base + TX_TXCC_CAL_SCLR_MULT(lane)); > + writel(0x0400, tcphy->base + TX_DIAG_TX_DRV(lane)); > + } > + > + val = readl(tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > + val = val & 0x8fff; > + switch (link_rate) { > + case 162000: > + case 270000: > + val |= (6 << 12); > + break; > + case 540000: > + val |= (4 << 12); > + break; > + } > + writel(val, tcphy->base + XCVR_DIAG_PLLDRC_CTRL(lane)); > } > > static inline int property_enable(struct rockchip_typec_phy *tcphy, > @@ -754,30 +814,33 @@ static int tcphy_phy_init(struct rockchip_typec_phy *tcphy, u8 mode) > tcphy_cfg_24m(tcphy); > > if (mode == MODE_DFP_DP) { > - tcphy_cfg_dp_pll(tcphy); > + tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE); > for (i = 0; i < 4; i++) > - tcphy_dp_cfg_lane(tcphy, i); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, i); > > writel(PIN_ASSIGN_C_E, tcphy->base + PMA_LANE_CFG); > } else { > tcphy_cfg_usb3_pll(tcphy); > - tcphy_cfg_dp_pll(tcphy); > + tcphy_cfg_dp_pll(tcphy, DP_DEFAULT_RATE); > if (tcphy->flip) { > tcphy_tx_usb3_cfg_lane(tcphy, 3); > tcphy_rx_usb3_cfg_lane(tcphy, 2); > - tcphy_dp_cfg_lane(tcphy, 0); > - tcphy_dp_cfg_lane(tcphy, 1); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 0); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 1); > } else { > tcphy_tx_usb3_cfg_lane(tcphy, 0); > tcphy_rx_usb3_cfg_lane(tcphy, 1); > - tcphy_dp_cfg_lane(tcphy, 2); > - tcphy_dp_cfg_lane(tcphy, 3); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 2); > + tcphy_dp_cfg_lane(tcphy, DP_DEFAULT_RATE, 0, 0, 3); > } > > writel(PIN_ASSIGN_D_F, tcphy->base + PMA_LANE_CFG); > } > > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2 | DP_LINK_RESET_DEASSERTED; > + writel(val, tcphy->base + DP_MODE_CTL); > > reset_control_deassert(tcphy->uphy_rst); > > @@ -990,7 +1053,7 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > property_enable(tcphy, &cfg->uphy_dp_sel, 1); > > ret = readx_poll_timeout(readl, tcphy->base + DP_MODE_CTL, > - val, val & DP_MODE_A2, 1000, > + val, val & DP_MODE_A2_ACK, 1000, > PHY_MODE_SET_TIMEOUT); > if (ret < 0) { > dev_err(tcphy->dev, "failed to wait TCPHY enter A2\n"); > @@ -999,13 +1062,19 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > > tcphy_dp_aux_calibration(tcphy); > > - writel(DP_MODE_ENTER_A0, tcphy->base + DP_MODE_CTL); > + /* enter A0 mode */ > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A0; > + writel(val, tcphy->base + DP_MODE_CTL); > > ret = readx_poll_timeout(readl, tcphy->base + DP_MODE_CTL, > - val, val & DP_MODE_A0, 1000, > + val, val & DP_MODE_A0_ACK, 1000, > PHY_MODE_SET_TIMEOUT); > if (ret < 0) { > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2; > + writel(val, tcphy->base + DP_MODE_CTL); > dev_err(tcphy->dev, "failed to wait TCPHY enter A0\n"); > goto power_on_finish; > } > @@ -1023,6 +1092,7 @@ static int rockchip_dp_phy_power_on(struct phy *phy) > static int rockchip_dp_phy_power_off(struct phy *phy) > { > struct rockchip_typec_phy *tcphy = phy_get_drvdata(phy); > + u32 val; > > mutex_lock(&tcphy->lock); > > @@ -1031,7 +1101,10 @@ static int rockchip_dp_phy_power_off(struct phy *phy) > > tcphy->mode &= ~MODE_DFP_DP; > > - writel(DP_MODE_ENTER_A2, tcphy->base + DP_MODE_CTL); > + val = readl(tcphy->base + DP_MODE_CTL); > + val &= ~DP_MODE_MASK; > + val |= DP_MODE_ENTER_A2; > + writel(val, tcphy->base + DP_MODE_CTL); > > if (tcphy->mode == MODE_DISCONNECT) > tcphy_phy_deinit(tcphy); > @@ -1047,9 +1120,35 @@ static const struct phy_ops rockchip_dp_phy_ops = { > .owner = THIS_MODULE, > }; > > +static int typec_dp_phy_config(struct phy *phy, int link_rate, > + int lanes, u8 swing, u8 pre_emp) > +{ > + struct rockchip_typec_phy *tcphy = phy_get_drvdata(phy); > + u8 i; > + > + tcphy_cfg_dp_pll(tcphy, link_rate); > + > + if (tcphy->mode == MODE_DFP_DP) { > + for (i = 0; i < 4; i++) > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, i); > + } else { > + if (tcphy->flip) { > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 0); > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 1); > + } else { > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 2); > + tcphy_dp_cfg_lane(tcphy, link_rate, swing, pre_emp, 3); > + } > + } > + > + return 0; > +} > + > static int tcphy_parse_dt(struct rockchip_typec_phy *tcphy, > struct device *dev) > { > + int ret; > + > tcphy->grf_regs = syscon_regmap_lookup_by_phandle(dev->of_node, > "rockchip,grf"); > if (IS_ERR(tcphy->grf_regs)) { > @@ -1087,6 +1186,16 @@ static int tcphy_parse_dt(struct rockchip_typec_phy *tcphy, > return PTR_ERR(tcphy->tcphy_rst); > } > > + /* > + * check if phy_config pass from dts, if no, > + * use default phy config value. > + */ > + ret = of_property_read_u32_array(dev->of_node, "rockchip,phy_config", > + (u32 *)tcphy->config, sizeof(tcphy->config) / sizeof(u32)); > + if (ret) > + memcpy(tcphy->config, tcphy_default_config, > + sizeof(tcphy->config)); > + > return 0; > } > > @@ -1171,6 +1280,7 @@ static int rockchip_typec_phy_probe(struct platform_device *pdev) > } > } > > + tcphy->typec_phy_config = typec_dp_phy_config; > pm_runtime_enable(dev); > > for_each_available_child_of_node(np, child_np) { > diff --git a/include/soc/rockchip/rockchip_phy_typec.h b/include/soc/rockchip/rockchip_phy_typec.h > new file mode 100644 > index 0000000..be6af0e > --- /dev/null > +++ b/include/soc/rockchip/rockchip_phy_typec.h > @@ -0,0 +1,63 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd > + * Author: Lin Huang > + */ > + > +#ifndef __SOC_ROCKCHIP_PHY_TYPEC_H > +#define __SOC_ROCKCHIP_PHY_TYPEC_H > + > +struct usb3phy_reg { > + u32 offset; > + u32 enable_bit; > + u32 write_enable; > +}; > + > +/** > + * struct rockchip_usb3phy_port_cfg: usb3-phy port configuration. > + * @reg: the base address for usb3-phy config. > + * @typec_conn_dir: the register of type-c connector direction. > + * @usb3tousb2_en: the register of type-c force usb2 to usb2 enable. > + * @external_psm: the register of type-c phy external psm clock. > + * @pipe_status: the register of type-c phy pipe status. > + * @usb3_host_disable: the register of type-c usb3 host disable. > + * @usb3_host_port: the register of type-c usb3 host port. > + * @uphy_dp_sel: the register of type-c phy DP select control. > + */ > +struct rockchip_usb3phy_port_cfg { > + unsigned int reg; > + struct usb3phy_reg typec_conn_dir; > + struct usb3phy_reg usb3tousb2_en; > + struct usb3phy_reg external_psm; > + struct usb3phy_reg pipe_status; > + struct usb3phy_reg usb3_host_disable; > + struct usb3phy_reg usb3_host_port; > + struct usb3phy_reg uphy_dp_sel; > +}; > + > +struct phy_config { > + int swing; > + int pe; > +}; > + > +struct rockchip_typec_phy { > + struct device *dev; > + void __iomem *base; > + struct extcon_dev *extcon; > + struct regmap *grf_regs; > + struct clk *clk_core; > + struct clk *clk_ref; > + struct reset_control *uphy_rst; > + struct reset_control *pipe_rst; > + struct reset_control *tcphy_rst; > + const struct rockchip_usb3phy_port_cfg *port_cfgs; > + /* mutex to protect access to individual PHYs */ > + struct mutex lock; > + struct phy_config config[3][4]; > + bool flip; > + u8 mode; > + int (*typec_phy_config)(struct phy *phy, int link_rate, > + int lanes, u8 swing, u8 pre_emp); > +}; > + > +#endif >