From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AB1E6CD6E6A for ; Wed, 3 Jun 2026 05:48:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+u8F0ueV/OHH8oYs3KpOXaPYQbEYQFc6eD4eIt1SD/s=; b=y1Pp7PRQtm+wry Ah/RJT3Ln12w0n6U+Rbwq6eWJwwWJD5u1tIU2WO2vIO+aCqccNXU/22Z1rNxzXMb+HqkvRja1k6IH 8a0kQTbKG39a9iJPk+5cbaCNWwktoD+euSpqbSCwOfHe6kiQuQVyRSK/2FtnB03wWZrK/7WGxCj8Y osKsV5rkX/xFLTwlqYaAtxE8/qO01DjAz2A0RumiuoWFtu7+iO0H4LrsGICC5cLYv4cKA3T+oPTkj pab9oFqKASMuTJVnHrdSakCuo/eWAawPNVbL0Xzp8Pfg1vtbLGPA3YIRjBSvgQnOoqZqmaY6BREpr HZDDmW8cO2bRJtLzq7Cg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wUeSo-0000000EJCl-1tT9; Wed, 03 Jun 2026 05:48:26 +0000 Received: from outbound4.mail.transip.nl ([2a01:7c8:7c9:ca11:136:144:136:2]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wUeSk-0000000EJB8-1kBX for linux-phy@lists.infradead.org; Wed, 03 Jun 2026 05:48:25 +0000 Received: from submission13.mail.transip.nl (unknown [10.103.8.164]) by outbound4.mail.transip.nl (Postfix) with ESMTP id 4gVcDq3bmWz1F91M; Wed, 3 Jun 2026 07:48:11 +0200 (CEST) Received: from herrie-desktop.. (180-93-184-31.ftth.glasoperator.nl [31.184.93.180]) by submission13.mail.transip.nl (Postfix) with ESMTPA id 4gVcDp6Lwlz3fCxJ9; Wed, 3 Jun 2026 07:48:10 +0200 (CEST) From: Herman van Hazendonk To: linux-phy@lists.infradead.org Cc: devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Herman van Hazendonk Subject: [PATCH 2/2] phy: qcom: usb-hs: honour qcom,vendor-init-seq raw ULPI writes Date: Wed, 3 Jun 2026 07:48:09 +0200 Message-ID: <20260603054809.565723-3-github.com@herrie.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260603054809.565723-1-github.com@herrie.org> References: <20260603054809.565723-1-github.com@herrie.org> MIME-Version: 1.0 X-Scanned-By: ClueGetter at submission13.mail.transip.nl DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=transip-a; d=herrie.org; t=1780465691; h=from:subject:to:cc: references:in-reply-to:date:mime-version:content-type; bh=TeiTuwVhVKftRrV6+G+q9/smgsdKSE0BphnxQrsrj1M=; b=C7VYHWeP3I+csH5AK6hVkaktFn76kPUyW+7dFUuQ7nZM7PZB+J8zq5MIXyOy3z2ErADvxZ pW2E7ToUZE4v2Y16GTzumsFy0v/U45Y8IQ51rkja+WBA8J9B6FuBd9AMocuSroO42cY4hj XQ6UxpLcJbAzum0plW0hr2qas1dXkWCgPNwWILs2cz0uivlemnIQXwGQJr9/T2jzgoyD2b yDwgGAZySuU4Q3i/hVgSyBqj8uU/L77e3vymozznJG1Wc/E9kwEe3jWaSwMDSCnWKo5n+8 0fIISwmEKJDRaD6XPMFyfmViKWpA1xuoDpNTS0fwYI+AQJDgwdPAqePMTdEUHA== X-Report-Abuse-To: abuse@transip.nl X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260602_224822_748631_1728C90F X-CRM114-Status: GOOD ( 21.49 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org QWRkIHN1cHBvcnQgZm9yIHRoZSBvcHRpb25hbCBxY29tLHZlbmRvci1pbml0LXNlcSBEVCBwcm9w ZXJ0eTogYQpsaXN0IG9mIHU4IChhZGRyLCB2YWwpIHBhaXJzIHdyaXR0ZW4gdmVyYmF0aW0gdG8g cmF3IFVMUEkgcmVnaXN0ZXIKYWRkcmVzc2VzLCByYXRoZXIgdGhhbiB0byBVTFBJX0VYVF9WRU5E T1JfU1BFQ0lGSUMgKyBhZGRyIGxpa2UgdGhlCmV4aXN0aW5nIHFjb20saW5pdC1zZXEgc2VxdWVu Y2UgcmVhY2hlcy4gVGhpcyBsZXRzIGJvYXJkcyByZWFjaCB0aGUKc3RhbmRhcmQgdmVuZG9yIHJl Z2lzdGVyIHJhbmdlIDB4MzAtMHgzRiB3aGVyZSBNU004eDYwLWVyYSBoYXJkd2FyZQprZWVwcyBw cmUtZW1waGFzaXMgbGV2ZWwgLyBIUyBkcml2ZXIgc2xvcGUgLyBDRFIgYXV0by1yZXNldCwgZXRj LgoKVGhlIG5ldyBzZXF1ZW5jZSBpcyBhcHBsaWVkIEFGVEVSIHJlc2V0X2NvbnRyb2xfcmVzZXQo KSBpbgpxY29tX3VzYl9oc19waHlfcG93ZXJfb24oKSBzbyB0aGUgdmFsdWVzIHN1cnZpdmUgdGhl IHJlZ2lzdGVyCnJlc3RvcmUgdGhlIHJlc2V0IHBlcmZvcm1zLiBUaGUgcHJlLWV4aXN0aW5nIHFj b20saW5pdC1zZXEgaXMgbGVmdAphcHBsaWVkIEJFRk9SRSB0aGUgcmVzZXQgdG8gcHJlc2VydmUg Y3VycmVudCBiZWhhdmlvdXIgZm9yIHRoZQpBUFE4MDY0L01TTTg5MTYgYm9hcmRzIHRoYXQgYWxy ZWFkeSBkZXBlbmQgb24gaXQ7IGFuIGVhcmxpZXIgcmV2aWV3IGZsYWdnZWQKdGhpcyBvcmRlcmlu ZyBhcyBhIGxpa2VseSBwcmUtZXhpc3RpbmcgYnVnLCBidXQgYmxpbmRseSByZW9yZGVyaW5nCmVz dGFibGlzaGVkIGJlaGF2aW91ciBmb3IgdGhvc2UgYm9hcmRzIGlzIG91dCBvZiBzY29wZSBmb3Ig dGhpcwpwYXRjaCBhbmQgd291bGQgcmlzayByZWdyZXNzaW5nIHRoZW0uCgpXaGlsZSBhdCBpdCwg aGFyZGVuIHRoZSBwYXJzZSBsb2dpYyBzaGFyZWQgYmV0d2VlbiBxY29tLGluaXQtc2VxCmFuZCBx Y29tLHZlbmRvci1pbml0LXNlcToKCiAgLSBSZWplY3QgYW4gb2RkIGJ5dGUgY291bnQgdXAtZnJv bnQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcKICAgIHRoZSB0cmFpbGluZyBieXRlIGFu ZCBwcm9kdWNpbmcgYSBoYWxmLXBhaXIgdGhlIHJlc3Qgb2YgdGhlCiAgICBkcml2ZXIgY2Fubm90 IGRlc2NyaWJlLgogIC0gUmVqZWN0IG1vcmUgdGhhbiAzMiBieXRlcyAodGhlIGJpbmRpbmcncyBt YXhJdGVtcykgcmF0aGVyIHRoYW4KICAgIG1ha2luZyBhbiB1bmJvdW5kZWQgZGV2bV9rbWFsbG9j X2FycmF5KCkgYWxsb2NhdGlvbiBkcml2ZW4gYnkKICAgIGFuIHVudHJ1c3RlZC1zaGFwZWQgRFQg cHJvcGVydHkuCgpGYWN0b3IgdGhlIGR1cGxpY2F0ZWQgcGFyc2UtYW5kLWFsbG9jYXRlIHNlcXVl bmNlIGludG8KcWNvbV91c2JfaHNfcGh5X3BhcnNlX2luaXRfc2VxKCkgc28gYm90aCBwcm9wZXJ0 aWVzIGdldCB0aGUgc2FtZQp2YWxpZGF0aW9uLiBUaGUgdmFsaWRhdGlvbiBhbHNvIGZpeGVzIHRo ZSBwcmUtZXhpc3Rpbmcgc2FtZSBidWdzIGluCnRoZSBxY29tLGluaXQtc2VxIHBhcnNlIHBhdGgg dW5pZm9ybWx5IHdpdGggdGhlIG5ldyBwcm9wZXJ0eS4KClNpZ25lZC1vZmYtYnk6IEhlcm1hbiB2 YW4gSGF6ZW5kb25rIDxnaXRodWIuY29tQGhlcnJpZS5vcmc+Ci0tLQogZHJpdmVycy9waHkvcXVh bGNvbW0vcGh5LXFjb20tdXNiLWhzLmMgfCAxMDkgKysrKysrKysrKysrKysrKysrKystLS0tLQog MSBmaWxlIGNoYW5nZWQsIDkwIGluc2VydGlvbnMoKyksIDE5IGRlbGV0aW9ucygtKQoKZGlmZiAt LWdpdCBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXVzYi1ocy5jIGIvZHJpdmVycy9w aHkvcXVhbGNvbW0vcGh5LXFjb20tdXNiLWhzLmMKaW5kZXggOThhMTg5ODdmMWJlLi44OWZiZThm OGQwMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXVzYi1ocy5j CisrKyBiL2RyaXZlcnMvcGh5L3F1YWxjb21tL3BoeS1xY29tLXVzYi1ocy5jCkBAIC0zNSw2ICsz NSwxMyBAQCBzdHJ1Y3QgcWNvbV91c2JfaHNfcGh5IHsKIAlzdHJ1Y3QgcmVndWxhdG9yICp2M3Az OwogCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKIAlzdHJ1Y3QgdWxwaV9zZXEgKmluaXRf c2VxOworCS8qCisJICogT3B0aW9uYWwgc2VxdWVuY2Ugb2Ygd3JpdGVzIHRhcmdldGluZyByYXcg VUxQSSBhZGRyZXNzZXMgKG5vCisJICogVUxQSV9FWFRfVkVORE9SX1NQRUNJRklDIGJhc2UgYWRk ZWQpLiBQb3B1bGF0ZWQgZnJvbSB0aGUKKwkgKiAicWNvbSx2ZW5kb3ItaW5pdC1zZXEiIERUIHBy b3BlcnR5LiBBcHBsaWVkIGFmdGVyIFBIWSByZXNldAorCSAqIHNvIHRoZSB2YWx1ZXMgc3Vydml2 ZSB0aGUgcmVzZXQgdGhhdCBmb2xsb3dzIGluaXRfc2VxIHdyaXRlcy4KKwkgKi8KKwlzdHJ1Y3Qg dWxwaV9zZXEgKnZlbmRvcl9pbml0X3NlcTsKIAlzdHJ1Y3QgZXh0Y29uX2RldiAqdmJ1c19lZGV2 OwogCXN0cnVjdCBub3RpZmllcl9ibG9jayB2YnVzX25vdGlmeTsKIH07CkBAIC0xNTQsNiArMTYx LDE5IEBAIHN0YXRpYyBpbnQgcWNvbV91c2JfaHNfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBo eSkKIAkJCWdvdG8gZXJyX3VscGk7CiAJfQogCisJLyoKKwkgKiBBcHBseSBib2FyZC1zcGVjaWZp YyByYXctYWRkcmVzcyBVTFBJIHdyaXRlcyBhZnRlciB0aGUgUEhZIHJlc2V0CisJICogc28gdGhl eSBzdXJ2aXZlIHJlZ2lzdGVyIHJlc3RvcmUuIFVzZWQgdG8gcmVhY2ggdGhlIHN0YW5kYXJkCisJ ICogdmVuZG9yIHJhbmdlIDB4MzAtMHgzRiB3aGljaCBxY29tLGluaXQtc2VxIChhYm92ZSkgY2Fu bm90IOKAlAorCSAqIHByZS1lbXBoYXNpcyBsZXZlbCAvIEhTIGRyaXZlciBzbG9wZSAvIENEUiBh dXRvLXJlc2V0IGV0Yy4gbGl2ZQorCSAqIHRoZXJlIG9uIE1TTTg2NjAtY2xhc3MgaGFyZHdhcmUu CisJICovCisJZm9yIChzZXEgPSB1cGh5LT52ZW5kb3JfaW5pdF9zZXE7IHNlcS0+YWRkcjsgc2Vx KyspIHsKKwkJcmV0ID0gdWxwaV93cml0ZSh1bHBpLCBzZXEtPmFkZHIsIHNlcS0+dmFsKTsKKwkJ aWYgKHJldCkKKwkJCWdvdG8gZXJyX3VscGk7CisJfQorCiAJaWYgKHVwaHktPnZidXNfZWRldikg ewogCQlzdGF0ZSA9IGV4dGNvbl9nZXRfc3RhdGUodXBoeS0+dmJ1c19lZGV2LCBFWFRDT05fVVNC KTsKIAkJLyogc2V0dXAgaW5pdGlhbCBzdGF0ZSAqLwpAQCAtMTk5LDYgKzIxOSw1OSBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcWNvbV91c2JfaHNfcGh5X29wcyA9IHsKIAkub3duZXIg PSBUSElTX01PRFVMRSwKIH07CiAKKy8qCisgKiBUaGUgYmluZGluZyBjYXBzIGJvdGggcWNvbSxp bml0LXNlcSBhbmQgcWNvbSx2ZW5kb3ItaW5pdC1zZXEgYXQKKyAqIG1heEl0ZW1zOiAzMiAoYWRk ciwgdmFsKSBwYWlycywgaS5lLiA2NCBieXRlcyB0b3RhbC4gRW5mb3JjZSB0aGF0CisgKiBsaW1p dCBoZXJlIHNvIGEgbWFsZm9ybWVkIERUIGNhbm5vdCBkcml2ZSBhbiB1bmJvdW5kZWQKKyAqIGRl dm1fa21hbGxvY19hcnJheSgpIGFuZCBzbyB0aGUgbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxl IGF0CisgKiBwcm9iZSB0aW1lIGluc3RlYWQgb2Ygc2lsZW50bHkgdHJ1bmNhdGVkLgorICovCisj ZGVmaW5lIFFDT01fVVNCX0hTX1BIWV9JTklUX1NFUV9NQVhfUEFJUlMJMzIKKyNkZWZpbmUgUUNP TV9VU0JfSFNfUEhZX0lOSVRfU0VRX01BWF9CWVRFUwlcCisJKFFDT01fVVNCX0hTX1BIWV9JTklU X1NFUV9NQVhfUEFJUlMgKiAyKQorCitzdGF0aWMgaW50IHFjb21fdXNiX2hzX3BoeV9wYXJzZV9p bml0X3NlcShzdHJ1Y3QgdWxwaSAqdWxwaSwKKwkJCQkJICBjb25zdCBjaGFyICpwcm9wbmFtZSwK KwkJCQkJICBzdHJ1Y3QgdWxwaV9zZXEgKipvdXQpCit7CisJc3RydWN0IHVscGlfc2VxICpzZXE7 CisJaW50IHNpemU7CisKKwlzaXplID0gb2ZfcHJvcGVydHlfY291bnRfdThfZWxlbXModWxwaS0+ ZGV2Lm9mX25vZGUsIHByb3BuYW1lKTsKKwlpZiAoc2l6ZSA8IDApCisJCXNpemUgPSAwOworCWlm IChzaXplID4gUUNPTV9VU0JfSFNfUEhZX0lOSVRfU0VRX01BWF9CWVRFUykgeworCQlkZXZfZXJy KCZ1bHBpLT5kZXYsCisJCQkiJXM6ICVkIGJ5dGVzIGV4Y2VlZHMgJWQtYnl0ZSBtYXhpbXVtXG4i LAorCQkJcHJvcG5hbWUsIHNpemUsIFFDT01fVVNCX0hTX1BIWV9JTklUX1NFUV9NQVhfQllURVMp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHNpemUgJSAyKSB7CisJCWRldl9lcnIoJnVs cGktPmRldiwKKwkJCSIlczogJWQgYnl0ZXMgaXMgbm90IGEgd2hvbGUgbnVtYmVyIG9mIChhZGRy LCB2YWwpIHBhaXJzXG4iLAorCQkJcHJvcG5hbWUsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisKKwlzZXEgPSBkZXZtX2ttYWxsb2NfYXJyYXkoJnVscGktPmRldiwgKHNpemUgLyAyKSAr IDEsIHNpemVvZigqc2VxKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXEpCisJCXJldHVy biAtRU5PTUVNOworCisJaWYgKHNpemUpIHsKKwkJaW50IHJldCA9IG9mX3Byb3BlcnR5X3JlYWRf dThfYXJyYXkodWxwaS0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgcHJvcG5hbWUsICh1OCAqKXNl cSwgc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwkvKiBOVUwtdGVybWlu YXRlIHNvIHRoZSBwb3dlcl9vbiBsb29wJ3Mgc2VxLT5hZGRyLWFzLXNlbnRpbmVsIHdvcmtzLiAq LworCXNlcVtzaXplIC8gMl0uYWRkciA9IDA7CisJc2VxW3NpemUgLyAyXS52YWwgPSAwOworCisJ Km91dCA9IHNlcTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBxY29tX3VzYl9oc19waHlf cHJvYmUoc3RydWN0IHVscGkgKnVscGkpCiB7CiAJc3RydWN0IHFjb21fdXNiX2hzX3BoeSAqdXBo eTsKQEAgLTIwNiw3ICsyNzksNiBAQCBzdGF0aWMgaW50IHFjb21fdXNiX2hzX3BoeV9wcm9iZShz dHJ1Y3QgdWxwaSAqdWxwaSkKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IHJlZ3VsYXRvciAq cmVnOwogCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKLQlpbnQgc2l6ZTsKIAlpbnQgcmV0 OwogCiAJdXBoeSA9IGRldm1fa3phbGxvYygmdWxwaS0+ZGV2LCBzaXplb2YoKnVwaHkpLCBHRlBf S0VSTkVMKTsKQEAgLTIxNSwxOSArMjg3LDIwIEBAIHN0YXRpYyBpbnQgcWNvbV91c2JfaHNfcGh5 X3Byb2JlKHN0cnVjdCB1bHBpICp1bHBpKQogCXVscGlfc2V0X2RydmRhdGEodWxwaSwgdXBoeSk7 CiAJdXBoeS0+dWxwaSA9IHVscGk7CiAKLQlzaXplID0gb2ZfcHJvcGVydHlfY291bnRfdThfZWxl bXModWxwaS0+ZGV2Lm9mX25vZGUsICJxY29tLGluaXQtc2VxIik7Ci0JaWYgKHNpemUgPCAwKQot CQlzaXplID0gMDsKLQl1cGh5LT5pbml0X3NlcSA9IGRldm1fa21hbGxvY19hcnJheSgmdWxwaS0+ ZGV2LCAoc2l6ZSAvIDIpICsgMSwKLQkJCQkJICAgc2l6ZW9mKCp1cGh5LT5pbml0X3NlcSksIEdG UF9LRVJORUwpOwotCWlmICghdXBoeS0+aW5pdF9zZXEpCi0JCXJldHVybiAtRU5PTUVNOwotCXJl dCA9IG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkodWxwaS0+ZGV2Lm9mX25vZGUsICJxY29tLGlu aXQtc2VxIiwKLQkJCQkJKHU4ICopdXBoeS0+aW5pdF9zZXEsIHNpemUpOwotCWlmIChyZXQgJiYg c2l6ZSkKKwlyZXQgPSBxY29tX3VzYl9oc19waHlfcGFyc2VfaW5pdF9zZXEodWxwaSwgInFjb20s aW5pdC1zZXEiLAorCQkJCQkgICAgICZ1cGh5LT5pbml0X3NlcSk7CisJaWYgKHJldCkKKwkJcmV0 dXJuIHJldDsKKwkvKgorCSAqIE9wdGlvbmFsIHJhdy1hZGRyZXNzIHZlbmRvciBpbml0IHNlcXVl bmNlIOKAlCBzYW1lIGVuY29kaW5nIGFzCisJICogcWNvbSxpbml0LXNlcSAodTggYWRkci92YWwg cGFpcnMpIGJ1dCBlYWNoIHBhaXIgaXMgd3JpdHRlbiB0bworCSAqIHRoZSByYXcgVUxQSSBhZGRy ZXNzIHJhdGhlciB0aGFuIHRvIFVMUElfRVhUX1ZFTkRPUl9TUEVDSUZJQyArCisJICogYWRkci4g TGV0cyBib2FyZHMgcmVhY2ggdGhlIHN0YW5kYXJkIHZlbmRvciByYW5nZSAweDMwLTB4M0YuCisJ ICovCisJcmV0ID0gcWNvbV91c2JfaHNfcGh5X3BhcnNlX2luaXRfc2VxKHVscGksICJxY29tLHZl bmRvci1pbml0LXNlcSIsCisJCQkJCSAgICAgJnVwaHktPnZlbmRvcl9pbml0X3NlcSk7CisJaWYg KHJldCkKIAkJcmV0dXJuIHJldDsKLQkvKiBOVUwgdGVybWluYXRlICovCi0JdXBoeS0+aW5pdF9z ZXFbc2l6ZSAvIDJdLmFkZHIgPSB1cGh5LT5pbml0X3NlcVtzaXplIC8gMl0udmFsID0gMDsKIAog CXVwaHktPnJlZl9jbGsgPSBjbGsgPSBkZXZtX2Nsa19nZXQoJnVscGktPmRldiwgInJlZiIpOwog CWlmIChJU19FUlIoY2xrKSkKQEAgLTI0NSwxMiArMzE4LDEwIEBAIHN0YXRpYyBpbnQgcWNvbV91 c2JfaHNfcGh5X3Byb2JlKHN0cnVjdCB1bHBpICp1bHBpKQogCWlmIChJU19FUlIocmVnKSkKIAkJ cmV0dXJuIFBUUl9FUlIocmVnKTsKIAotCXVwaHktPnJlc2V0ID0gcmVzZXQgPSBkZXZtX3Jlc2V0 X2NvbnRyb2xfZ2V0KCZ1bHBpLT5kZXYsICJwb3IiKTsKLQlpZiAoSVNfRVJSKHJlc2V0KSkgewot CQlpZiAoUFRSX0VSUihyZXNldCkgPT0gLUVQUk9CRV9ERUZFUikKLQkJCXJldHVybiBQVFJfRVJS KHJlc2V0KTsKLQkJdXBoeS0+cmVzZXQgPSBOVUxMOwotCX0KKwl1cGh5LT5yZXNldCA9IHJlc2V0 ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbF9leGNsdXNpdmUoJnVscGktPmRldiwg InBvciIpOworCWlmIChJU19FUlIocmVzZXQpKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZSgmdWxw aS0+ZGV2LCBQVFJfRVJSKHJlc2V0KSwKKwkJCQkgICAgICJmYWlsZWQgdG8gZ2V0IHJlc2V0IGNv bnRyb2xcbiIpOwogCiAJdXBoeS0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKCZ1bHBpLT5kZXYsIHVs cGktPmRldi5vZl9ub2RlLAogCQkJCSAgICAmcWNvbV91c2JfaHNfcGh5X29wcyk7Ci0tIAoyLjQz LjAKCgotLSAKbGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwczovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1w aHkK From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from outbound4.mail.transip.nl (outbound4.mail.transip.nl [136.144.136.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CF5F739061C; Wed, 3 Jun 2026 05:48:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=136.144.136.2 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780465704; cv=none; b=R+1K8Pizl+6ednhx5lVzqetlkAC3ZMbftb/ODoTuzScFKvR7+MgShrSnsoz5deDPS3axJsh1CRpjMtanJ0qiEO9SMRMmjBPw77gF4s7sUS7HR4m+BSSHaPyFePA7iv/YH1Ew6OOImh/uMv7qKkdeafIv4MvorALbgrMAvb8PBZM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780465704; c=relaxed/simple; bh=ykalU1Cs2DBKaoqPX4Nq3Q2kxCDwHauZFAJf1UvW6zw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Sshe2LipxbyO1YQMVCXb69Ts9LDFAxh/MCZ0wM94Ex9AdIKpUTzTIu7dAN3hPn49JT0Z/PYxgSDkKnCJc4o+C+IrMursb0D89JDwZmFZ8aNqutdfVxOAJajrx8o2bSdHelL6DtA8Hq8KaX4VVQQsikt7vH3DODmD6DsLqAnzKdg= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=herrie.org; spf=pass smtp.mailfrom=herrie.org; dkim=pass (2048-bit key) header.d=herrie.org header.i=@herrie.org header.b=C7VYHWeP; arc=none smtp.client-ip=136.144.136.2 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=herrie.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=herrie.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=herrie.org header.i=@herrie.org header.b="C7VYHWeP" Received: from submission13.mail.transip.nl (unknown [10.103.8.164]) by outbound4.mail.transip.nl (Postfix) with ESMTP id 4gVcDq3bmWz1F91M; Wed, 3 Jun 2026 07:48:11 +0200 (CEST) Received: from herrie-desktop.. (180-93-184-31.ftth.glasoperator.nl [31.184.93.180]) by submission13.mail.transip.nl (Postfix) with ESMTPA id 4gVcDp6Lwlz3fCxJ9; Wed, 3 Jun 2026 07:48:10 +0200 (CEST) From: Herman van Hazendonk To: linux-phy@lists.infradead.org Cc: devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, Vinod Koul , Neil Armstrong , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Herman van Hazendonk Subject: [PATCH 2/2] phy: qcom: usb-hs: honour qcom,vendor-init-seq raw ULPI writes Date: Wed, 3 Jun 2026 07:48:09 +0200 Message-ID: <20260603054809.565723-3-github.com@herrie.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260603054809.565723-1-github.com@herrie.org> References: <20260603054809.565723-1-github.com@herrie.org> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: ClueGetter at submission13.mail.transip.nl DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=transip-a; d=herrie.org; t=1780465691; h=from:subject:to:cc: references:in-reply-to:date:mime-version:content-type; bh=TeiTuwVhVKftRrV6+G+q9/smgsdKSE0BphnxQrsrj1M=; b=C7VYHWeP3I+csH5AK6hVkaktFn76kPUyW+7dFUuQ7nZM7PZB+J8zq5MIXyOy3z2ErADvxZ pW2E7ToUZE4v2Y16GTzumsFy0v/U45Y8IQ51rkja+WBA8J9B6FuBd9AMocuSroO42cY4hj XQ6UxpLcJbAzum0plW0hr2qas1dXkWCgPNwWILs2cz0uivlemnIQXwGQJr9/T2jzgoyD2b yDwgGAZySuU4Q3i/hVgSyBqj8uU/L77e3vymozznJG1Wc/E9kwEe3jWaSwMDSCnWKo5n+8 0fIISwmEKJDRaD6XPMFyfmViKWpA1xuoDpNTS0fwYI+AQJDgwdPAqePMTdEUHA== X-Report-Abuse-To: abuse@transip.nl Add support for the optional qcom,vendor-init-seq DT property: a list of u8 (addr, val) pairs written verbatim to raw ULPI register addresses, rather than to ULPI_EXT_VENDOR_SPECIFIC + addr like the existing qcom,init-seq sequence reaches. This lets boards reach the standard vendor register range 0x30-0x3F where MSM8x60-era hardware keeps pre-emphasis level / HS driver slope / CDR auto-reset, etc. The new sequence is applied AFTER reset_control_reset() in qcom_usb_hs_phy_power_on() so the values survive the register restore the reset performs. The pre-existing qcom,init-seq is left applied BEFORE the reset to preserve current behaviour for the APQ8064/MSM8916 boards that already depend on it; an earlier review flagged this ordering as a likely pre-existing bug, but blindly reordering established behaviour for those boards is out of scope for this patch and would risk regressing them. While at it, harden the parse logic shared between qcom,init-seq and qcom,vendor-init-seq: - Reject an odd byte count up-front rather than silently dropping the trailing byte and producing a half-pair the rest of the driver cannot describe. - Reject more than 32 bytes (the binding's maxItems) rather than making an unbounded devm_kmalloc_array() allocation driven by an untrusted-shaped DT property. Factor the duplicated parse-and-allocate sequence into qcom_usb_hs_phy_parse_init_seq() so both properties get the same validation. The validation also fixes the pre-existing same bugs in the qcom,init-seq parse path uniformly with the new property. Signed-off-by: Herman van Hazendonk --- drivers/phy/qualcomm/phy-qcom-usb-hs.c | 109 ++++++++++++++++++++----- 1 file changed, 90 insertions(+), 19 deletions(-) diff --git a/drivers/phy/qualcomm/phy-qcom-usb-hs.c b/drivers/phy/qualcomm/phy-qcom-usb-hs.c index 98a18987f1be..89fbe8f8d001 100644 --- a/drivers/phy/qualcomm/phy-qcom-usb-hs.c +++ b/drivers/phy/qualcomm/phy-qcom-usb-hs.c @@ -35,6 +35,13 @@ struct qcom_usb_hs_phy { struct regulator *v3p3; struct reset_control *reset; struct ulpi_seq *init_seq; + /* + * Optional sequence of writes targeting raw ULPI addresses (no + * ULPI_EXT_VENDOR_SPECIFIC base added). Populated from the + * "qcom,vendor-init-seq" DT property. Applied after PHY reset + * so the values survive the reset that follows init_seq writes. + */ + struct ulpi_seq *vendor_init_seq; struct extcon_dev *vbus_edev; struct notifier_block vbus_notify; }; @@ -154,6 +161,19 @@ static int qcom_usb_hs_phy_power_on(struct phy *phy) goto err_ulpi; } + /* + * Apply board-specific raw-address ULPI writes after the PHY reset + * so they survive register restore. Used to reach the standard + * vendor range 0x30-0x3F which qcom,init-seq (above) cannot — + * pre-emphasis level / HS driver slope / CDR auto-reset etc. live + * there on MSM8660-class hardware. + */ + for (seq = uphy->vendor_init_seq; seq->addr; seq++) { + ret = ulpi_write(ulpi, seq->addr, seq->val); + if (ret) + goto err_ulpi; + } + if (uphy->vbus_edev) { state = extcon_get_state(uphy->vbus_edev, EXTCON_USB); /* setup initial state */ @@ -199,6 +219,59 @@ static const struct phy_ops qcom_usb_hs_phy_ops = { .owner = THIS_MODULE, }; +/* + * The binding caps both qcom,init-seq and qcom,vendor-init-seq at + * maxItems: 32 (addr, val) pairs, i.e. 64 bytes total. Enforce that + * limit here so a malformed DT cannot drive an unbounded + * devm_kmalloc_array() and so the misconfiguration is visible at + * probe time instead of silently truncated. + */ +#define QCOM_USB_HS_PHY_INIT_SEQ_MAX_PAIRS 32 +#define QCOM_USB_HS_PHY_INIT_SEQ_MAX_BYTES \ + (QCOM_USB_HS_PHY_INIT_SEQ_MAX_PAIRS * 2) + +static int qcom_usb_hs_phy_parse_init_seq(struct ulpi *ulpi, + const char *propname, + struct ulpi_seq **out) +{ + struct ulpi_seq *seq; + int size; + + size = of_property_count_u8_elems(ulpi->dev.of_node, propname); + if (size < 0) + size = 0; + if (size > QCOM_USB_HS_PHY_INIT_SEQ_MAX_BYTES) { + dev_err(&ulpi->dev, + "%s: %d bytes exceeds %d-byte maximum\n", + propname, size, QCOM_USB_HS_PHY_INIT_SEQ_MAX_BYTES); + return -EINVAL; + } + if (size % 2) { + dev_err(&ulpi->dev, + "%s: %d bytes is not a whole number of (addr, val) pairs\n", + propname, size); + return -EINVAL; + } + + seq = devm_kmalloc_array(&ulpi->dev, (size / 2) + 1, sizeof(*seq), + GFP_KERNEL); + if (!seq) + return -ENOMEM; + + if (size) { + int ret = of_property_read_u8_array(ulpi->dev.of_node, + propname, (u8 *)seq, size); + if (ret) + return ret; + } + /* NUL-terminate so the power_on loop's seq->addr-as-sentinel works. */ + seq[size / 2].addr = 0; + seq[size / 2].val = 0; + + *out = seq; + return 0; +} + static int qcom_usb_hs_phy_probe(struct ulpi *ulpi) { struct qcom_usb_hs_phy *uphy; @@ -206,7 +279,6 @@ static int qcom_usb_hs_phy_probe(struct ulpi *ulpi) struct clk *clk; struct regulator *reg; struct reset_control *reset; - int size; int ret; uphy = devm_kzalloc(&ulpi->dev, sizeof(*uphy), GFP_KERNEL); @@ -215,19 +287,20 @@ static int qcom_usb_hs_phy_probe(struct ulpi *ulpi) ulpi_set_drvdata(ulpi, uphy); uphy->ulpi = ulpi; - size = of_property_count_u8_elems(ulpi->dev.of_node, "qcom,init-seq"); - if (size < 0) - size = 0; - uphy->init_seq = devm_kmalloc_array(&ulpi->dev, (size / 2) + 1, - sizeof(*uphy->init_seq), GFP_KERNEL); - if (!uphy->init_seq) - return -ENOMEM; - ret = of_property_read_u8_array(ulpi->dev.of_node, "qcom,init-seq", - (u8 *)uphy->init_seq, size); - if (ret && size) + ret = qcom_usb_hs_phy_parse_init_seq(ulpi, "qcom,init-seq", + &uphy->init_seq); + if (ret) + return ret; + /* + * Optional raw-address vendor init sequence — same encoding as + * qcom,init-seq (u8 addr/val pairs) but each pair is written to + * the raw ULPI address rather than to ULPI_EXT_VENDOR_SPECIFIC + + * addr. Lets boards reach the standard vendor range 0x30-0x3F. + */ + ret = qcom_usb_hs_phy_parse_init_seq(ulpi, "qcom,vendor-init-seq", + &uphy->vendor_init_seq); + if (ret) return ret; - /* NUL terminate */ - uphy->init_seq[size / 2].addr = uphy->init_seq[size / 2].val = 0; uphy->ref_clk = clk = devm_clk_get(&ulpi->dev, "ref"); if (IS_ERR(clk)) @@ -245,12 +318,10 @@ static int qcom_usb_hs_phy_probe(struct ulpi *ulpi) if (IS_ERR(reg)) return PTR_ERR(reg); - uphy->reset = reset = devm_reset_control_get(&ulpi->dev, "por"); - if (IS_ERR(reset)) { - if (PTR_ERR(reset) == -EPROBE_DEFER) - return PTR_ERR(reset); - uphy->reset = NULL; - } + uphy->reset = reset = devm_reset_control_get_optional_exclusive(&ulpi->dev, "por"); + if (IS_ERR(reset)) + return dev_err_probe(&ulpi->dev, PTR_ERR(reset), + "failed to get reset control\n"); uphy->phy = devm_phy_create(&ulpi->dev, ulpi->dev.of_node, &qcom_usb_hs_phy_ops); -- 2.43.0