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 X-Spam-Level: X-Spam-Status: No, score=-9.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E46FC433E0 for ; Fri, 19 Jun 2020 08:52:10 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 502F4214DB for ; Fri, 19 Jun 2020 08:52:10 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fL3rzxLt"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k+qK3HWW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 502F4214DB Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/ehg7mE9NFoxcrS6sN+f/E4JW7EFNgXq2OfGvQxLnRI=; b=fL3rzxLt2F3EAE MS3c2q+puJ5MrJCP4rfAG4AJwanbucFRTYfA4mDTCBE2sq7dXn3FCmZTYIGNkeLdeqSTRb9VMZZVa hVavG5Q2ycA9On60Ygl9Bo3ZuS0ynHd6nheZsR2NQQZF86pf22re0/aLpwpiz9f/g5HZS2Sxl/aR+ DsJw3Ncp0t9iY18jBlqAyVw5IKidrv1aUxVQyu2IAX9MyW4SdJb8ZZye80845VJ6r3bcVkyTMyyC/ vT4L+Yw5JCG4xW4zRsHv3UbHWzXv2ydVBqvi4e9m62O/kVG7wq92Qt0Z+Ed5HtH23rpK+wAJzeTdQ JUQCibcKJknp9U7K9fUQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jmCkh-000230-Kg; Fri, 19 Jun 2020 08:51:59 +0000 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jmCkF-0001cx-R1 for linux-arm-kernel@lists.infradead.org; Fri, 19 Jun 2020 08:51:34 +0000 Received: by mail-wr1-x444.google.com with SMTP id b6so8859400wrs.11 for ; Fri, 19 Jun 2020 01:51:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=P1CwvE4enSTftijkIOzqvAKKEVg0SX8E878tjEKBLwM=; b=k+qK3HWWtEWh0FsMnry24JIYxR/nZ34VJ84LGtbxNbu1rDQf/coRVx7MjfEb2obrmq 2ZG0iuletqOvgy64UZG0udr3aGY6teXVKoqmddNh87YMqk0323/M143sdk2kNjPPApO3 JyHwuTEn2JH3ZfaUbybXlitZfoQnvL4BQf/IlwG6VrgRTa238h7n4aHhtoEB5cQ6aG8f k5CL3TL+f64M2+GTR6HuqWRM8aZjDag37++g6HSeiXveOFcNiA+4M9gyfK1rIv3aolht g7F9dxvewTscNl2T1bp6DVLRPUqHqu5kJaEb5bcDLtyhV44JRqws+dyA57dGcBWLJhlw DEcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=P1CwvE4enSTftijkIOzqvAKKEVg0SX8E878tjEKBLwM=; b=UPbbGViFa0Zg2NP2VSJWaDk9AJ84AgLMELuWwlfmVs2zBCsoqot2aafZygR+dXG32j U5iMxXU8sKHtg1GUAjeidYuP4xNIWNMyEjAJKUFGOsJNa7yUD/Blh1t15g6LRBVUV1VV 4lAk7Zd9vLAmttuTqsCankY/jrQktH78M6GWS3uSwKndKPws7+p7e02PUYIlTvvP1sp1 AEQkvpgdsxMjIkoliQYtZLLFK2PejVrMMiBvRdXHiewVHDWBt21QIL91splBIvXRHUs8 Qj8d3n/ZIoVY0M/JgIrg4901kCF0gQuzfvQLtdLBQpZXKJLbmuYCg8HIcMLROGOm73N3 +LBw== X-Gm-Message-State: AOAM531WS/G+2Baw+KUglKX+Gn9n2HO9lA5PZ9VjqyNx8Df2G3Vd/+h5 Il3mztYygIMo+9aaCG+HsLU= X-Google-Smtp-Source: ABdhPJy94NZu2aNtyMbEpUPoMYnURLaurhVwupkb2mLB/SWbhWWtVDtHBymnlgXDccHPW2MvB4o8kw== X-Received: by 2002:a5d:4e88:: with SMTP id e8mr3052170wru.188.1592556690127; Fri, 19 Jun 2020 01:51:30 -0700 (PDT) Received: from skynet.lan (90.red-88-20-62.staticip.rima-tde.net. [88.20.62.90]) by smtp.gmail.com with ESMTPSA id l1sm6674331wrb.31.2020.06.19.01.51.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jun 2020 01:51:29 -0700 (PDT) From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= To: simon@fire.lp0.eu, jonas.gorski@gmail.com, kishon@ti.com, vkoul@kernel.org, robh+dt@kernel.org, f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com, p.zabel@pengutronix.de, krzk@kernel.org, gregkh@linuxfoundation.org, alcooperx@gmail.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v4 2/2] phy: bcm63xx-usbh: Add BCM63xx USBH driver Date: Fri, 19 Jun 2020 10:51:24 +0200 Message-Id: <20200619085124.4029400-3-noltari@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619085124.4029400-1-noltari@gmail.com> References: <20200619085124.4029400-1-noltari@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200619_015131_877249_03A5360F X-CRM114-Status: GOOD ( 19.05 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org QWRkIEJDTTYzeHggVVNCSCBQSFkgZHJpdmVyIGZvciBCTUlQUy4KClNpZ25lZC1vZmYtYnk6IMOB bHZhcm8gRmVybsOhbmRleiBSb2phcyA8bm9sdGFyaUBnbWFpbC5jb20+Ci0tLQogdjQ6IHNldmVy YWwgaW1wcm92ZW1lbnRzOgogIC0gVXNlIGRldm1fcGxhdGZvcm1faW9yZW1hcF9yZXNvdXJjZS4K ICAtIENvZGUgY2xlYW51cHMuCiAgLSBJbXByb3ZlIGRldmljZSBtb2RlIGNvbmZpZzoKICAgIC0g TW92ZSBVU0JIX1NXQVBfQ09OVFJPTCBkZXZpY2UgbW9kZSB2YWx1ZSB0byB2YXJpYW50IHZhcmlh YmxlLgogICAgLSBTZXQgVVNCSF9VVE1JX0NPTlRST0wxIHJlZ2lzdGVyIHZhbHVlICh2YXJpYW50 IHZhcmlhYmxlKS4KIHYzOiBpbnRyb2R1Y2UgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgRmxvcmlhbjoK ICAtIEFkZCBzdXBwb3J0IGZvciBkZXZpY2UgbW9kZS4KIHYyOiBpbnRyb2R1Y2UgY2hhbmdlcyBz dWdnZXN0ZWQgYnkgRmxvcmlhbjoKICAtIERyb3AgT0YgZGVwZW5kZW5jeSAodXNlIGRldmljZV9n ZXRfbWF0Y2hfZGF0YSkuCiAgLSBEcm9wIF9faW5pdGNvbnN0IGZyb20gdmFyaWFudCB0YWJsZXMu CiAgLSBVc2UgZGV2bV9jbGtfZ2V0X29wdGlvbmFsLgoKIGRyaXZlcnMvcGh5L2Jyb2FkY29tL0tj b25maWcgICAgICAgICAgICB8ICAgOSArCiBkcml2ZXJzL3BoeS9icm9hZGNvbS9NYWtlZmlsZSAg ICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9waHkvYnJvYWRjb20vcGh5LWJjbTYzeHgtdXNiaC5j IHwgNDU3ICsrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA0NjcgaW5z ZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2Jyb2FkY29tL3BoeS1i Y202M3h4LXVzYmguYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2Jyb2FkY29tL0tjb25maWcg Yi9kcml2ZXJzL3BoeS9icm9hZGNvbS9LY29uZmlnCmluZGV4IGIyOWYxMWMxOTE1NS4uYTc4ODlk ZjhjNTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9icm9hZGNvbS9LY29uZmlnCisrKyBiL2Ry aXZlcnMvcGh5L2Jyb2FkY29tL0tjb25maWcKQEAgLTIsNiArMiwxNSBAQAogIwogIyBQaHkgZHJp dmVycyBmb3IgQnJvYWRjb20gcGxhdGZvcm1zCiAjCitjb25maWcgUEhZX0JDTTYzWFhfVVNCSAor CXRyaXN0YXRlICJCQ002M3h4IFVTQkggUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIEJNSVBTX0dF TkVSSUMgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJZGVmYXVsdCBCTUlQ U19HRU5FUklDCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgQkNNNjN4eCBV U0JIIFBIWSBkcml2ZXIuCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgUEhZX0NZR05V U19QQ0lFCiAJdHJpc3RhdGUgIkJyb2FkY29tIEN5Z251cyBQQ0llIFBIWSBkcml2ZXIiCiAJZGVw ZW5kcyBvbiBPRiAmJiAoQVJDSF9CQ01fQ1lHTlVTIHx8IENPTVBJTEVfVEVTVCkKZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGh5L2Jyb2FkY29tL01ha2VmaWxlIGIvZHJpdmVycy9waHkvYnJvYWRjb20v TWFrZWZpbGUKaW5kZXggYzc4ZGU1NDYxMzVjLi43MDI0MTI3Zjg2YWQgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvcGh5L2Jyb2FkY29tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGh5L2Jyb2FkY29tL01h a2VmaWxlCkBAIC0xLDQgKzEsNSBAQAogIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MAorb2JqLSQoQ09ORklHX1BIWV9CQ002M1hYX1VTQkgpCQkrPSBwaHktYmNtNjN4eC11c2JoLm8K IG9iai0kKENPTkZJR19QSFlfQ1lHTlVTX1BDSUUpCQkrPSBwaHktYmNtLWN5Z251cy1wY2llLm8K IG9iai0kKENPTkZJR19CQ01fS09OQV9VU0IyX1BIWSkJCSs9IHBoeS1iY20ta29uYS11c2IyLm8K IG9iai0kKENPTkZJR19QSFlfQkNNX05TX1VTQjIpCQkrPSBwaHktYmNtLW5zLXVzYjIubwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9waHkvYnJvYWRjb20vcGh5LWJjbTYzeHgtdXNiaC5jIGIvZHJpdmVy cy9waHkvYnJvYWRjb20vcGh5LWJjbTYzeHgtdXNiaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uNzlmOTEzZDg2ZGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9waHkvYnJvYWRjb20vcGh5LWJjbTYzeHgtdXNiaC5jCkBAIC0wLDAgKzEsNDU3IEBACisvLyBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlcgorLyoKKyAqIEJDTTYzMjgg VVNCSCBQSFkgQ29udHJvbGxlciBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgw4Fs dmFybyBGZXJuw6FuZGV6IFJvamFzIDxub2x0YXJpQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAo QykgMjAxNSBTaW1vbiBBcmxvdHQgPHNpbW9uQGZpcmUubHAwLmV1PgorICoKKyAqIERlcml2ZWQg ZnJvbSBiY205NjN4eF80LjEyTC4wNkJfY29uc3VtZXIva2VybmVsL2xpbnV4L2FyY2gvbWlwcy9i Y205NjN4eC9zZXR1cC5jOgorICogQ29weXJpZ2h0IChDKSAyMDAyIEJyb2FkY29tIENvcnBvcmF0 aW9uCisgKgorICogRGVyaXZlZCBmcm9tIE9wZW5XcnQgcGF0Y2hlczoKKyAqIENvcHlyaWdodCAo QykgMjAxMyBKb25hcyBHb3Jza2kgPGpvbmFzLmdvcnNraUBnbWFpbC5jb20+CisgKiBDb3B5cmln aHQgKEMpIDIwMTMgRmxvcmlhbiBGYWluZWxsaSA8Zi5mYWluZWxsaUBnbWFpbC5jb20+CisgKiBD b3B5cmlnaHQgKEMpIDIwMDggTWF4aW1lIEJpem9uIDxtYml6b25AZnJlZWJveC5mcj4KKyAqLwor CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKworLyog VVNCSCBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMgKi8KK2VudW0gdXNiaF9yZWdzIHsKKwlVU0JI X0JSVF9DT05UUk9MMSA9IDAsCisJVVNCSF9CUlRfQ09OVFJPTDIsCisJVVNCSF9CUlRfU1RBVFVT MSwKKwlVU0JIX0JSVF9TVEFUVVMyLAorCVVTQkhfVVRNSV9DT05UUk9MMSwKKyNkZWZpbmUgICBV U0JIX1VDMV9ERVZfTU9ERV9TRUwJCUJJVCgwKQorCVVTQkhfVEVTVF9QT1JUX0NPTlRST0wsCisJ VVNCSF9QTExfQ09OVFJPTDEsCisjZGVmaW5lICAgVVNCSF9QTExDX1JFRkNMS1NFTF9TSElGVAkw CisjZGVmaW5lICAgVVNCSF9QTExDX1JFRkNMS1NFTF9NQVNLCSgweDMgPDwgVVNCSF9QTExDX1JF RkNMS1NFTF9TSElGVCkKKyNkZWZpbmUgICBVU0JIX1BMTENfQ0xLU0VMX1NISUZUCTIKKyNkZWZp bmUgICBVU0JIX1BMTENfQ0xLU0VMX01BU0sJCSgweDMgPDwgVVNCSF9QTExDX0NMS1NFTF9NQVNL KQorI2RlZmluZSAgIFVTQkhfUExMQ19YVEFMX1BXUkRXTkIJQklUKDQpCisjZGVmaW5lICAgVVNC SF9QTExDX1BMTF9QV1JEV05CCQlCSVQoNSkKKyNkZWZpbmUgICBVU0JIX1BMTENfUExMX0NBTEVO CQlCSVQoNikKKyNkZWZpbmUgICBVU0JIX1BMTENfUEhZUExMX0JZUAkJQklUKDcpCisjZGVmaW5l ICAgVVNCSF9QTExDX1BMTF9SRVNFVAkJQklUKDgpCisjZGVmaW5lICAgVVNCSF9QTExDX1BMTF9J RERRX1BXUkROCUJJVCg5KQorI2RlZmluZSAgIFVTQkhfUExMQ19QTExfUFdSRE5fREVMQVkJQklU KDEwKQorI2RlZmluZSAgIFVTQkhfNjMxOF9QTExDX1BMTF9TVVNQRU5EX0VOCUJJVCgyNykKKyNk ZWZpbmUgICBVU0JIXzYzMThfUExMQ19QSFlQTExfQllQCUJJVCgyOSkKKyNkZWZpbmUgICBVU0JI XzYzMThfUExMQ19QTExfUkVTRVQJQklUKDMwKQorI2RlZmluZSAgIFVTQkhfNjMxOF9QTExDX1BM TF9JRERRX1BXUkROCUJJVCgzMSkKKwlVU0JIX1NXQVBfQ09OVFJPTCwKKyNkZWZpbmUgICBVU0JI X1NDX09IQ0lfREFUQV9TV0FQCUJJVCgwKQorI2RlZmluZSAgIFVTQkhfU0NfT0hDSV9FTkRJQU5f U1dBUAlCSVQoMSkKKyNkZWZpbmUgICBVU0JIX1NDX09IQ0lfTE9HSUNBTF9BRERSX0VOCUJJVCgy KQorI2RlZmluZSAgIFVTQkhfU0NfRUhDSV9EQVRBX1NXQVAJQklUKDMpCisjZGVmaW5lICAgVVNC SF9TQ19FSENJX0VORElBTl9TV0FQCUJJVCg0KQorI2RlZmluZSAgIFVTQkhfU0NfRUhDSV9MT0dJ Q0FMX0FERFJfRU4JQklUKDUpCisjZGVmaW5lICAgVVNCSF9TQ19VU0JfREVWSUNFX1NFTAlCSVQo NikKKwlVU0JIX0dFTkVSSUNfQ09OVFJPTCwKKyNkZWZpbmUgICBVU0JIX0dDX1BMTF9TVVNQRU5E X0VOCUJJVCgxKQorCVVTQkhfRlJBTUVfQURKVVNUX1ZBTFVFLAorCVVTQkhfU0VUVVAsCisjZGVm aW5lICAgVVNCSF9TX0lPQwkJCUJJVCg0KQorI2RlZmluZSAgIFVTQkhfU19JUFAJCQlCSVQoNSkK KwlVU0JIX01ESU8sCisJVVNCSF9NRElPMzIsCisJVVNCSF9VU0JfU0lNX0NPTlRST0wsCisjZGVm aW5lICAgVVNCSF9VU0NfTEFERFJfU0VMCQlCSVQoNSkKKworCV9fVVNCSF9FTlVNX1NJWkUKK307 CisKK3N0cnVjdCBiY202M3h4X3VzYmhfcGh5X3ZhcmlhbnQgeworCS8qIFJlZ2lzdGVycyAqLwor CWxvbmcgcmVnc1tfX1VTQkhfRU5VTV9TSVpFXTsKKworCS8qIFBMTEMgYml0cyB0byBzZXQvY2xl YXIgZm9yIHBvd2VyIG9uICovCisJdTMyIHBvd2VyX3BsbGNfY2xyOworCXUzMiBwb3dlcl9wbGxj X3NldDsKKworCS8qIFNldHVwIGJpdHMgdG8gc2V0L2NsZWFyIGZvciBwb3dlciBvbiAqLworCXUz MiBzZXR1cF9jbHI7CisJdTMyIHNldHVwX3NldDsKKworCS8qIFN3YXAgQ29udHJvbCBiaXRzIHRv IHNldCAqLworCXUzMiBzd2FwY3RsX2Rldl9zZXQ7CisKKwkvKiBUZXN0IFBvcnQgQ29udHJvbCB2 YWx1ZSB0byBzZXQgaWYgbm9uLXplcm8gKi8KKwl1MzIgdHBjX3ZhbDsKKworCS8qIFVTQiBTaW0g Q29udHJvbCBiaXRzIHRvIHNldCAqLworCXUzMiB1c2Nfc2V0OworCisJLyogVVRNSSBDb250cm9s IDEgYml0cyB0byBzZXQgKi8KKwl1MzIgdXRtaWN0bDFfZGV2X3NldDsKK307CisKK3N0cnVjdCBi Y202M3h4X3VzYmhfcGh5IHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGNsayAqdXNi aF9jbGs7CisJc3RydWN0IGNsayAqdXNiX3JlZl9jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wg KnJlc2V0OworCWNvbnN0IHN0cnVjdCBiY202M3h4X3VzYmhfcGh5X3ZhcmlhbnQgKnZhcmlhbnQ7 CisJYm9vbCBkZXZpY2VfbW9kZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtNjN4eF91 c2JoX3BoeV92YXJpYW50IHVzYmhfYmNtNjMxOCA9IHsKKwkucmVncyA9IHsKKwkJW1VTQkhfQlJU X0NPTlRST0wxXSA9IC0xLAorCQlbVVNCSF9CUlRfQ09OVFJPTDJdID0gLTEsCisJCVtVU0JIX0JS VF9TVEFUVVMxXSA9IC0xLAorCQlbVVNCSF9CUlRfU1RBVFVTMl0gPSAtMSwKKwkJW1VTQkhfVVRN SV9DT05UUk9MMV0gPSAweDJjLAorCQlbVVNCSF9URVNUX1BPUlRfQ09OVFJPTF0gPSAweDFjLAor CQlbVVNCSF9QTExfQ09OVFJPTDFdID0gMHgwNCwKKwkJW1VTQkhfU1dBUF9DT05UUk9MXSA9IDB4 MGMsCisJCVtVU0JIX0dFTkVSSUNfQ09OVFJPTF0gPSAtMSwKKwkJW1VTQkhfRlJBTUVfQURKVVNU X1ZBTFVFXSA9IDB4MDgsCisJCVtVU0JIX1NFVFVQXSA9IDB4MDAsCisJCVtVU0JIX01ESU9dID0g MHgxNCwKKwkJW1VTQkhfTURJTzMyXSA9IDB4MTgsCisJCVtVU0JIX1VTQl9TSU1fQ09OVFJPTF0g PSAweDIwLAorCX0sCisJLnBvd2VyX3BsbGNfY2xyID0gVVNCSF82MzE4X1BMTENfUExMX0lERFFf UFdSRE4sCisJLnBvd2VyX3BsbGNfc2V0ID0gVVNCSF82MzE4X1BMTENfUExMX1NVU1BFTkRfRU4s CisJLnNldHVwX3NldCA9IFVTQkhfU19JT0MsCisJLnN3YXBjdGxfZGV2X3NldCA9IFVTQkhfU0Nf VVNCX0RFVklDRV9TRUwsCisJLnVzY19zZXQgPSBVU0JIX1VTQ19MQUREUl9TRUwsCisJLnV0bWlj dGwxX2Rldl9zZXQgPSBVU0JIX1VDMV9ERVZfTU9ERV9TRUwsCit9OworCitzdGF0aWMgY29uc3Qg c3RydWN0IGJjbTYzeHhfdXNiaF9waHlfdmFyaWFudCB1c2JoX2JjbTYzMjggPSB7CisJLnJlZ3Mg PSB7CisJCVtVU0JIX0JSVF9DT05UUk9MMV0gPSAweDAwLAorCQlbVVNCSF9CUlRfQ09OVFJPTDJd ID0gMHgwNCwKKwkJW1VTQkhfQlJUX1NUQVRVUzFdID0gMHgwOCwKKwkJW1VTQkhfQlJUX1NUQVRV UzJdID0gMHgwYywKKwkJW1VTQkhfVVRNSV9DT05UUk9MMV0gPSAweDEwLAorCQlbVVNCSF9URVNU X1BPUlRfQ09OVFJPTF0gPSAweDE0LAorCQlbVVNCSF9QTExfQ09OVFJPTDFdID0gMHgxOCwKKwkJ W1VTQkhfU1dBUF9DT05UUk9MXSA9IDB4MWMsCisJCVtVU0JIX0dFTkVSSUNfQ09OVFJPTF0gPSAw eDIwLAorCQlbVVNCSF9GUkFNRV9BREpVU1RfVkFMVUVdID0gMHgyNCwKKwkJW1VTQkhfU0VUVVBd ID0gMHgyOCwKKwkJW1VTQkhfTURJT10gPSAweDJjLAorCQlbVVNCSF9NRElPMzJdID0gMHgzMCwK KwkJW1VTQkhfVVNCX1NJTV9DT05UUk9MXSA9IDB4MzQsCisJfSwKKwkuc2V0dXBfc2V0ID0gVVNC SF9TX0lPQywKKwkuc3dhcGN0bF9kZXZfc2V0ID0gVVNCSF9TQ19VU0JfREVWSUNFX1NFTCwKKwku dXRtaWN0bDFfZGV2X3NldCA9IFVTQkhfVUMxX0RFVl9NT0RFX1NFTCwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgYmNtNjN4eF91c2JoX3BoeV92YXJpYW50IHVzYmhfYmNtNjM1OCA9IHsKKwku cmVncyA9IHsKKwkJW1VTQkhfQlJUX0NPTlRST0wxXSA9IC0xLAorCQlbVVNCSF9CUlRfQ09OVFJP TDJdID0gLTEsCisJCVtVU0JIX0JSVF9TVEFUVVMxXSA9IC0xLAorCQlbVVNCSF9CUlRfU1RBVFVT Ml0gPSAtMSwKKwkJW1VTQkhfVVRNSV9DT05UUk9MMV0gPSAtMSwKKwkJW1VTQkhfVEVTVF9QT1JU X0NPTlRST0xdID0gMHgyNCwKKwkJW1VTQkhfUExMX0NPTlRST0wxXSA9IC0xLAorCQlbVVNCSF9T V0FQX0NPTlRST0xdID0gMHgwMCwKKwkJW1VTQkhfR0VORVJJQ19DT05UUk9MXSA9IC0xLAorCQlb VVNCSF9GUkFNRV9BREpVU1RfVkFMVUVdID0gLTEsCisJCVtVU0JIX1NFVFVQXSA9IC0xLAorCQlb VVNCSF9NRElPXSA9IC0xLAorCQlbVVNCSF9NRElPMzJdID0gLTEsCisJCVtVU0JIX1VTQl9TSU1f Q09OVFJPTF0gPSAtMSwKKwl9LAorCS8qCisJICogVGhlIG1hZ2ljIHZhbHVlIGNvbWVzIGZvciB0 aGUgb3JpZ2luYWwgdmVuZG9yIEJTUAorCSAqIGFuZCBpcyBuZWVkZWQgZm9yIFVTQiB0byB3b3Jr LiBEYXRhc2hlZXQgZG9lcyBub3QKKwkgKiBoZWxwLCBzbyB0aGUgbWFnaWMgdmFsdWUgaXMgdXNl ZCBhcy1pcy4KKwkgKi8KKwkudHBjX3ZhbCA9IDB4MWMwMDIwLAorfTsKKworc3RhdGljIGNvbnN0 IHN0cnVjdCBiY202M3h4X3VzYmhfcGh5X3ZhcmlhbnQgdXNiaF9iY202MzY4ID0geworCS5yZWdz ID0geworCQlbVVNCSF9CUlRfQ09OVFJPTDFdID0gMHgwMCwKKwkJW1VTQkhfQlJUX0NPTlRST0wy XSA9IDB4MDQsCisJCVtVU0JIX0JSVF9TVEFUVVMxXSA9IDB4MDgsCisJCVtVU0JIX0JSVF9TVEFU VVMyXSA9IDB4MGMsCisJCVtVU0JIX1VUTUlfQ09OVFJPTDFdID0gMHgxMCwKKwkJW1VTQkhfVEVT VF9QT1JUX0NPTlRST0xdID0gMHgxNCwKKwkJW1VTQkhfUExMX0NPTlRST0wxXSA9IDB4MTgsCisJ CVtVU0JIX1NXQVBfQ09OVFJPTF0gPSAweDFjLAorCQlbVVNCSF9HRU5FUklDX0NPTlRST0xdID0g LTEsCisJCVtVU0JIX0ZSQU1FX0FESlVTVF9WQUxVRV0gPSAweDI0LAorCQlbVVNCSF9TRVRVUF0g PSAweDI4LAorCQlbVVNCSF9NRElPXSA9IDB4MmMsCisJCVtVU0JIX01ESU8zMl0gPSAweDMwLAor CQlbVVNCSF9VU0JfU0lNX0NPTlRST0xdID0gMHgzNCwKKwl9LAorCS5wb3dlcl9wbGxjX2NsciA9 IFVTQkhfUExMQ19QTExfSUREUV9QV1JETiB8IFVTQkhfUExMQ19QTExfUFdSRE5fREVMQVksCisJ LnNldHVwX3NldCA9IFVTQkhfU19JT0MsCisJLnN3YXBjdGxfZGV2X3NldCA9IFVTQkhfU0NfVVNC X0RFVklDRV9TRUwsCisJLnV0bWljdGwxX2Rldl9zZXQgPSBVU0JIX1VDMV9ERVZfTU9ERV9TRUws Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJjbTYzeHhfdXNiaF9waHlfdmFyaWFudCB1c2Jo X2JjbTYzMjY4ID0geworCS5yZWdzID0geworCQlbVVNCSF9CUlRfQ09OVFJPTDFdID0gMHgwMCwK KwkJW1VTQkhfQlJUX0NPTlRST0wyXSA9IDB4MDQsCisJCVtVU0JIX0JSVF9TVEFUVVMxXSA9IDB4 MDgsCisJCVtVU0JIX0JSVF9TVEFUVVMyXSA9IDB4MGMsCisJCVtVU0JIX1VUTUlfQ09OVFJPTDFd ID0gMHgxMCwKKwkJW1VTQkhfVEVTVF9QT1JUX0NPTlRST0xdID0gMHgxNCwKKwkJW1VTQkhfUExM X0NPTlRST0wxXSA9IDB4MTgsCisJCVtVU0JIX1NXQVBfQ09OVFJPTF0gPSAweDFjLAorCQlbVVNC SF9HRU5FUklDX0NPTlRST0xdID0gMHgyMCwKKwkJW1VTQkhfRlJBTUVfQURKVVNUX1ZBTFVFXSA9 IDB4MjQsCisJCVtVU0JIX1NFVFVQXSA9IDB4MjgsCisJCVtVU0JIX01ESU9dID0gMHgyYywKKwkJ W1VTQkhfTURJTzMyXSA9IDB4MzAsCisJCVtVU0JIX1VTQl9TSU1fQ09OVFJPTF0gPSAweDM0LAor CX0sCisJLnBvd2VyX3BsbGNfY2xyID0gVVNCSF9QTExDX1BMTF9JRERRX1BXUkROIHwgVVNCSF9Q TExDX1BMTF9QV1JETl9ERUxBWSwKKwkuc2V0dXBfY2xyID0gVVNCSF9TX0lQUCwKKwkuc2V0dXBf c2V0ID0gVVNCSF9TX0lPQywKKwkuc3dhcGN0bF9kZXZfc2V0ID0gVVNCSF9TQ19VU0JfREVWSUNF X1NFTCwKKwkudXRtaWN0bDFfZGV2X3NldCA9IFVTQkhfVUMxX0RFVl9NT0RFX1NFTCwKK307CisK K3N0YXRpYyBpbmxpbmUgYm9vbCB1c2JoX2hhc19yZWcoc3RydWN0IGJjbTYzeHhfdXNiaF9waHkg KnVzYmgsIGludCByZWcpCit7CisJcmV0dXJuICh1c2JoLT52YXJpYW50LT5yZWdzW3JlZ10gPj0g MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHVzYmhfcmVhZGwoc3RydWN0IGJjbTYzeHhfdXNi aF9waHkgKnVzYmgsIGludCByZWcpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKHVzYmgtPmJhc2Ug KyB1c2JoLT52YXJpYW50LT5yZWdzW3JlZ10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXNi aF93cml0ZWwoc3RydWN0IGJjbTYzeHhfdXNiaF9waHkgKnVzYmgsIGludCByZWcsCisJCQkgICAg ICAgdTMyIHZhbHVlKQoreworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgdXNiaC0+YmFzZSArIHVzYmgt PnZhcmlhbnQtPnJlZ3NbcmVnXSk7Cit9CisKK3N0YXRpYyBpbnQgYmNtNjN4eF91c2JoX3BoeV9p bml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgYmNtNjN4eF91c2JoX3BoeSAqdXNiaCA9 IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9l bmFibGUodXNiaC0+dXNiaF9jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYs ICJ1bmFibGUgdG8gZW5hYmxlIHVzYmggY2xvY2s6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0 OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh1c2JoLT51c2JfcmVmX2Nsayk7CisJ aWYgKHJldCkgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInVuYWJsZSB0byBlbmFibGUgdXNiX3Jl ZiBjbG9jazogJWRcbiIsIHJldCk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh1c2JoLT51c2Jo X2Nsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVzZXRfY29udHJvbF9yZXNldCh1 c2JoLT5yZXNldCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInVuYWJsZSB0 byByZXNldCBkZXZpY2U6ICVkXG4iLCByZXQpOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUodXNi aC0+dXNiX3JlZl9jbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUodXNiaC0+dXNiaF9jbGsp OworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIENvbmZpZ3VyZSB0byB3b3JrIGluIG5hdGl2ZSBD UFUgZW5kaWFuICovCisJaWYgKHVzYmhfaGFzX3JlZyh1c2JoLCBVU0JIX1NXQVBfQ09OVFJPTCkp IHsKKwkJdTMyIHZhbCA9IHVzYmhfcmVhZGwodXNiaCwgVVNCSF9TV0FQX0NPTlRST0wpOworCisJ CXZhbCB8PSBVU0JIX1NDX0VIQ0lfREFUQV9TV0FQOworCQl2YWwgJj0gflVTQkhfU0NfRUhDSV9F TkRJQU5fU1dBUDsKKworCQl2YWwgfD0gVVNCSF9TQ19PSENJX0RBVEFfU1dBUDsKKwkJdmFsICY9 IH5VU0JIX1NDX09IQ0lfRU5ESUFOX1NXQVA7CisKKwkJaWYgKHVzYmgtPmRldmljZV9tb2RlICYm IHVzYmgtPnZhcmlhbnQtPnN3YXBjdGxfZGV2X3NldCkKKwkJCXZhbCB8PSB1c2JoLT52YXJpYW50 LT5zd2FwY3RsX2Rldl9zZXQ7CisKKwkJdXNiaF93cml0ZWwodXNiaCwgVVNCSF9TV0FQX0NPTlRS T0wsIHZhbCk7CisJfQorCisJaWYgKHVzYmhfaGFzX3JlZyh1c2JoLCBVU0JIX1NFVFVQKSkgewor CQl1MzIgdmFsID0gdXNiaF9yZWFkbCh1c2JoLCBVU0JIX1NFVFVQKTsKKworCQl2YWwgfD0gdXNi aC0+dmFyaWFudC0+c2V0dXBfc2V0OworCQl2YWwgJj0gfnVzYmgtPnZhcmlhbnQtPnNldHVwX2Ns cjsKKworCQl1c2JoX3dyaXRlbCh1c2JoLCBVU0JIX1NFVFVQLCB2YWwpOworCX0KKworCWlmICh1 c2JoX2hhc19yZWcodXNiaCwgVVNCSF9VU0JfU0lNX0NPTlRST0wpKSB7CisJCXUzMiB2YWwgPSB1 c2JoX3JlYWRsKHVzYmgsIFVTQkhfVVNCX1NJTV9DT05UUk9MKTsKKworCQl2YWwgfD0gdXNiaC0+ dmFyaWFudC0+dXNjX3NldDsKKworCQl1c2JoX3dyaXRlbCh1c2JoLCBVU0JIX1VTQl9TSU1fQ09O VFJPTCwgdmFsKTsKKwl9CisKKwlpZiAodXNiaC0+dmFyaWFudC0+dHBjX3ZhbCAmJgorCSAgICB1 c2JoX2hhc19yZWcodXNiaCwgVVNCSF9URVNUX1BPUlRfQ09OVFJPTCkpCisJCXVzYmhfd3JpdGVs KHVzYmgsIFVTQkhfVEVTVF9QT1JUX0NPTlRST0wsCisJCQkgICAgdXNiaC0+dmFyaWFudC0+dHBj X3ZhbCk7CisKKwlpZiAodXNiaC0+ZGV2aWNlX21vZGUgJiYKKwkgICAgdXNiaF9oYXNfcmVnKHVz YmgsIFVTQkhfVVRNSV9DT05UUk9MMSkgJiYKKwkgICAgdXNiaC0+dmFyaWFudC0+dXRtaWN0bDFf ZGV2X3NldCkgeworCQl1MzIgdmFsID0gdXNiaF9yZWFkbCh1c2JoLCBVU0JIX1VUTUlfQ09OVFJP TDEpOworCisJCXZhbCB8PSB1c2JoLT52YXJpYW50LT51dG1pY3RsMV9kZXZfc2V0OworCisJCXVz Ymhfd3JpdGVsKHVzYmgsIFVTQkhfVVRNSV9DT05UUk9MMSwgdmFsKTsKKwl9CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBiY202M3h4X3VzYmhfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkg KnBoeSkKK3sKKwlzdHJ1Y3QgYmNtNjN4eF91c2JoX3BoeSAqdXNiaCA9IHBoeV9nZXRfZHJ2ZGF0 YShwaHkpOworCisJaWYgKHVzYmhfaGFzX3JlZyh1c2JoLCBVU0JIX1BMTF9DT05UUk9MMSkpIHsK KwkJdTMyIHZhbCA9IHVzYmhfcmVhZGwodXNiaCwgVVNCSF9QTExfQ09OVFJPTDEpOworCisJCXZh bCB8PSB1c2JoLT52YXJpYW50LT5wb3dlcl9wbGxjX3NldDsKKwkJdmFsICY9IH51c2JoLT52YXJp YW50LT5wb3dlcl9wbGxjX2NscjsKKworCQl1c2JoX3dyaXRlbCh1c2JoLCBVU0JIX1BMTF9DT05U Uk9MMSwgdmFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY202M3h4X3Vz YmhfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IGJjbTYzeHhfdXNi aF9waHkgKnVzYmggPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCWlmICh1c2JoX2hhc19yZWco dXNiaCwgVVNCSF9QTExfQ09OVFJPTDEpKSB7CisJCXUzMiB2YWwgPSB1c2JoX3JlYWRsKHVzYmgs IFVTQkhfUExMX0NPTlRST0wxKTsKKworCQl2YWwgJj0gfnVzYmgtPnZhcmlhbnQtPnBvd2VyX3Bs bGNfc2V0OworCQl2YWwgfD0gdXNiaC0+dmFyaWFudC0+cG93ZXJfcGxsY19jbHI7CisKKwkJdXNi aF93cml0ZWwodXNiaCwgVVNCSF9QTExfQ09OVFJPTDEsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgYmNtNjN4eF91c2JoX3BoeV9leGl0KHN0cnVjdCBwaHkgKnBoeSkK K3sKKwlzdHJ1Y3QgYmNtNjN4eF91c2JoX3BoeSAqdXNiaCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkp OworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVzYmgtPnVzYmhfY2xrKTsKKwljbGtfZGlzYWJs ZV91bnByZXBhcmUodXNiaC0+dXNiX3JlZl9jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcGh5X29wcyBiY202M3h4X3VzYmhfcGh5X29wcyA9IHsKKwkuZXhpdCA9 IGJjbTYzeHhfdXNiaF9waHlfZXhpdCwKKwkuaW5pdCA9IGJjbTYzeHhfdXNiaF9waHlfaW5pdCwK KwkucG93ZXJfb2ZmID0gYmNtNjN4eF91c2JoX3BoeV9wb3dlcl9vZmYsCisJLnBvd2VyX29uID0g YmNtNjN4eF91c2JoX3BoeV9wb3dlcl9vbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisK K3N0YXRpYyBzdHJ1Y3QgcGh5ICpiY202M3h4X3VzYmhfcGh5X3hsYXRlKHN0cnVjdCBkZXZpY2Ug KmRldiwKKwkJCQkJICBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzKQoreworCXN0cnVjdCBi Y202M3h4X3VzYmhfcGh5ICp1c2JoID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwl1c2JoLT5k ZXZpY2VfbW9kZSA9ICEhYXJncy0+YXJnc1swXTsKKworCXJldHVybiBvZl9waHlfc2ltcGxlX3hs YXRlKGRldiwgYXJncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJjbTYzeHhfdXNiaF9waHlf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBiY202M3h4X3VzYmhfcGh5CSp1c2JoOworCWNvbnN0 IHN0cnVjdCBiY202M3h4X3VzYmhfcGh5X3ZhcmlhbnQgKnZhcmlhbnQ7CisJc3RydWN0IHBoeSAq cGh5OworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKworCXVzYmggPSBkZXZt X2t6YWxsb2MoZGV2LCBzaXplb2YoKnVzYmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYmgpCisJ CXJldHVybiAtRU5PTUVNOworCisJdmFyaWFudCA9IGRldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYp OworCWlmICghdmFyaWFudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNiaC0+dmFyaWFudCA9IHZh cmlhbnQ7CisKKwl1c2JoLT5iYXNlID0gZGV2bV9wbGF0Zm9ybV9pb3JlbWFwX3Jlc291cmNlKHBk ZXYsIDApOworCWlmIChJU19FUlIodXNiaC0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHVzYmgt PmJhc2UpOworCisJdXNiaC0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgTlVM TCk7CisJaWYgKElTX0VSUih1c2JoLT5yZXNldCkpIHsKKwkJaWYgKFBUUl9FUlIodXNiaC0+cmVz ZXQpICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVz ZXRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih1c2JoLT5yZXNldCk7CisJfQorCisJdXNiaC0+dXNi aF9jbGsgPSBkZXZtX2Nsa19nZXRfb3B0aW9uYWwoZGV2LCAidXNiaCIpOworCWlmIChJU19FUlIo dXNiaC0+dXNiaF9jbGspKQorCQlyZXR1cm4gUFRSX0VSUih1c2JoLT51c2JoX2Nsayk7CisKKwl1 c2JoLT51c2JfcmVmX2NsayA9IGRldm1fY2xrX2dldF9vcHRpb25hbChkZXYsICJ1c2JfcmVmIik7 CisJaWYgKElTX0VSUih1c2JoLT51c2JfcmVmX2NsaykpCisJCXJldHVybiBQVFJfRVJSKHVzYmgt PnVzYl9yZWZfY2xrKTsKKworCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIE5VTEwsICZiY202 M3h4X3VzYmhfcGh5X29wcyk7CisJaWYgKElTX0VSUihwaHkpKSB7CisJCWRldl9lcnIoZGV2LCAi ZmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwaHkpOworCX0KKwor CXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHVzYmgpOworCXBoeV9zZXRfZHJ2ZGF0YShwaHks IHVzYmgpOworCisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIo ZGV2LAorCQkJCQkJICAgICBiY202M3h4X3VzYmhfcGh5X3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBo eV9wcm92aWRlcikpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgUEhZIHBy b3ZpZGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKKwl9CisKKwlkZXZf aW5mbyhkZXYsICJSZWdpc3RlcmVkIEJDTTYzeHggVVNCIFBIWSBkcml2ZXJcbiIpOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTYzeHhfdXNi aF9waHlfaWRzW10gX19pbml0Y29uc3QgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYz MTgtdXNiaC1waHkiLCAuZGF0YSA9ICZ1c2JoX2JjbTYzMTggfSwKKwl7IC5jb21wYXRpYmxlID0g ImJyY20sYmNtNjMyOC11c2JoLXBoeSIsIC5kYXRhID0gJnVzYmhfYmNtNjMyOCB9LAorCXsgLmNv bXBhdGlibGUgPSAiYnJjbSxiY202MzU4LXVzYmgtcGh5IiwgLmRhdGEgPSAmdXNiaF9iY202MzU4 IH0sCisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNjItdXNiaC1waHkiLCAuZGF0YSA9ICZ1 c2JoX2JjbTYzNjggfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNjM2OC11c2JoLXBoeSIs IC5kYXRhID0gJnVzYmhfYmNtNjM2OCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY202MzI2 OC11c2JoLXBoeSIsIC5kYXRhID0gJnVzYmhfYmNtNjMyNjggfSwKKwl7IC8qIHNlbnRpbmVsICov IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY202M3h4X3VzYmhfcGh5X2lkcyk7CisK K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbTYzeHhfdXNiaF9waHlfZHJpdmVyIF9f cmVmZGF0YSA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZSA9ICJiY202M3h4LXVzYmgtcGh5IiwK KwkJLm9mX21hdGNoX3RhYmxlID0gYmNtNjN4eF91c2JoX3BoeV9pZHMsCisJfSwKKwkucHJvYmUJ PSBiY202M3h4X3VzYmhfcGh5X3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmNt NjN4eF91c2JoX3BoeV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkJDTTYzeHggVVNC SCBQSFkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCLDgWx2YXJvIEZlcm7DoW5kZXogUm9qYXMg PG5vbHRhcmlAZ21haWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiU2ltb24gQXJsb3R0IDxzaW1v bkBmaXJlLmxwMC5ldT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLS0gCjIuMjcuMAoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK 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 X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 984BEC433E2 for ; Fri, 19 Jun 2020 08:51:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 62A2D214DB for ; Fri, 19 Jun 2020 08:51:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k+qK3HWW" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731474AbgFSIvg (ORCPT ); Fri, 19 Jun 2020 04:51:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729299AbgFSIvc (ORCPT ); Fri, 19 Jun 2020 04:51:32 -0400 Received: from mail-wr1-x444.google.com (mail-wr1-x444.google.com [IPv6:2a00:1450:4864:20::444]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88625C06174E; Fri, 19 Jun 2020 01:51:31 -0700 (PDT) Received: by mail-wr1-x444.google.com with SMTP id t18so8881072wru.6; Fri, 19 Jun 2020 01:51:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=P1CwvE4enSTftijkIOzqvAKKEVg0SX8E878tjEKBLwM=; b=k+qK3HWWtEWh0FsMnry24JIYxR/nZ34VJ84LGtbxNbu1rDQf/coRVx7MjfEb2obrmq 2ZG0iuletqOvgy64UZG0udr3aGY6teXVKoqmddNh87YMqk0323/M143sdk2kNjPPApO3 JyHwuTEn2JH3ZfaUbybXlitZfoQnvL4BQf/IlwG6VrgRTa238h7n4aHhtoEB5cQ6aG8f k5CL3TL+f64M2+GTR6HuqWRM8aZjDag37++g6HSeiXveOFcNiA+4M9gyfK1rIv3aolht g7F9dxvewTscNl2T1bp6DVLRPUqHqu5kJaEb5bcDLtyhV44JRqws+dyA57dGcBWLJhlw DEcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=P1CwvE4enSTftijkIOzqvAKKEVg0SX8E878tjEKBLwM=; b=avkx+Ud5+F5Ig6SEyK01nxfi4kV7uoPXp+x8rvGdpwiNTJsoHRq0DxMVB0x5SMPDzc +NgMouEDvwNRgEWyjCtCb8jkHQMG/So1iZzA9gRF7Vjx+QRNUKo++yph54zGDKglvyXH pDcolebisOG+Uhm9ZD0JHrXwUxfh0EaYvHL1ntACWqQRN56h9ElHWnymrOImxS/42uJJ DqD3I6EbpaEq+PT2LPjJTIlD93+ih1gMIDpx4aM8OAuEfqbBuM+UbKDStEaQJ+kYNeAJ SK/Gf7YwsNAzbo5nZ9fYwS4sJqislgNGvJpQHF5BAelm85B0q8cCIVCtlvbwRHwvEB6K 8ZLQ== X-Gm-Message-State: AOAM530aAuwqml8uw/JtJPUJAueLnUEdyLso/x1yztesl0eTmEiy7eQC 7jBE8vC6HIEQeQnkeZ8sBuM= X-Google-Smtp-Source: ABdhPJy94NZu2aNtyMbEpUPoMYnURLaurhVwupkb2mLB/SWbhWWtVDtHBymnlgXDccHPW2MvB4o8kw== X-Received: by 2002:a5d:4e88:: with SMTP id e8mr3052170wru.188.1592556690127; Fri, 19 Jun 2020 01:51:30 -0700 (PDT) Received: from skynet.lan (90.red-88-20-62.staticip.rima-tde.net. [88.20.62.90]) by smtp.gmail.com with ESMTPSA id l1sm6674331wrb.31.2020.06.19.01.51.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jun 2020 01:51:29 -0700 (PDT) From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= To: simon@fire.lp0.eu, jonas.gorski@gmail.com, kishon@ti.com, vkoul@kernel.org, robh+dt@kernel.org, f.fainelli@gmail.com, bcm-kernel-feedback-list@broadcom.com, p.zabel@pengutronix.de, krzk@kernel.org, gregkh@linuxfoundation.org, alcooperx@gmail.com, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Subject: [PATCH v4 2/2] phy: bcm63xx-usbh: Add BCM63xx USBH driver Date: Fri, 19 Jun 2020 10:51:24 +0200 Message-Id: <20200619085124.4029400-3-noltari@gmail.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619085124.4029400-1-noltari@gmail.com> References: <20200619085124.4029400-1-noltari@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add BCM63xx USBH PHY driver for BMIPS. Signed-off-by: Álvaro Fernández Rojas --- v4: several improvements: - Use devm_platform_ioremap_resource. - Code cleanups. - Improve device mode config: - Move USBH_SWAP_CONTROL device mode value to variant variable. - Set USBH_UTMI_CONTROL1 register value (variant variable). v3: introduce changes suggested by Florian: - Add support for device mode. v2: introduce changes suggested by Florian: - Drop OF dependency (use device_get_match_data). - Drop __initconst from variant tables. - Use devm_clk_get_optional. drivers/phy/broadcom/Kconfig | 9 + drivers/phy/broadcom/Makefile | 1 + drivers/phy/broadcom/phy-bcm63xx-usbh.c | 457 ++++++++++++++++++++++++ 3 files changed, 467 insertions(+) create mode 100644 drivers/phy/broadcom/phy-bcm63xx-usbh.c diff --git a/drivers/phy/broadcom/Kconfig b/drivers/phy/broadcom/Kconfig index b29f11c19155..a7889df8c541 100644 --- a/drivers/phy/broadcom/Kconfig +++ b/drivers/phy/broadcom/Kconfig @@ -2,6 +2,15 @@ # # Phy drivers for Broadcom platforms # +config PHY_BCM63XX_USBH + tristate "BCM63xx USBH PHY driver" + depends on BMIPS_GENERIC || COMPILE_TEST + select GENERIC_PHY + default BMIPS_GENERIC + help + Enable this to support the BCM63xx USBH PHY driver. + If unsure, say N. + config PHY_CYGNUS_PCIE tristate "Broadcom Cygnus PCIe PHY driver" depends on OF && (ARCH_BCM_CYGNUS || COMPILE_TEST) diff --git a/drivers/phy/broadcom/Makefile b/drivers/phy/broadcom/Makefile index c78de546135c..7024127f86ad 100644 --- a/drivers/phy/broadcom/Makefile +++ b/drivers/phy/broadcom/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_PHY_BCM63XX_USBH) += phy-bcm63xx-usbh.o obj-$(CONFIG_PHY_CYGNUS_PCIE) += phy-bcm-cygnus-pcie.o obj-$(CONFIG_BCM_KONA_USB2_PHY) += phy-bcm-kona-usb2.o obj-$(CONFIG_PHY_BCM_NS_USB2) += phy-bcm-ns-usb2.o diff --git a/drivers/phy/broadcom/phy-bcm63xx-usbh.c b/drivers/phy/broadcom/phy-bcm63xx-usbh.c new file mode 100644 index 000000000000..79f913d86def --- /dev/null +++ b/drivers/phy/broadcom/phy-bcm63xx-usbh.c @@ -0,0 +1,457 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * BCM6328 USBH PHY Controller Driver + * + * Copyright (C) 2020 Álvaro Fernández Rojas + * Copyright (C) 2015 Simon Arlott + * + * Derived from bcm963xx_4.12L.06B_consumer/kernel/linux/arch/mips/bcm963xx/setup.c: + * Copyright (C) 2002 Broadcom Corporation + * + * Derived from OpenWrt patches: + * Copyright (C) 2013 Jonas Gorski + * Copyright (C) 2013 Florian Fainelli + * Copyright (C) 2008 Maxime Bizon + */ + +#include +#include +#include +#include +#include +#include + +/* USBH control register offsets */ +enum usbh_regs { + USBH_BRT_CONTROL1 = 0, + USBH_BRT_CONTROL2, + USBH_BRT_STATUS1, + USBH_BRT_STATUS2, + USBH_UTMI_CONTROL1, +#define USBH_UC1_DEV_MODE_SEL BIT(0) + USBH_TEST_PORT_CONTROL, + USBH_PLL_CONTROL1, +#define USBH_PLLC_REFCLKSEL_SHIFT 0 +#define USBH_PLLC_REFCLKSEL_MASK (0x3 << USBH_PLLC_REFCLKSEL_SHIFT) +#define USBH_PLLC_CLKSEL_SHIFT 2 +#define USBH_PLLC_CLKSEL_MASK (0x3 << USBH_PLLC_CLKSEL_MASK) +#define USBH_PLLC_XTAL_PWRDWNB BIT(4) +#define USBH_PLLC_PLL_PWRDWNB BIT(5) +#define USBH_PLLC_PLL_CALEN BIT(6) +#define USBH_PLLC_PHYPLL_BYP BIT(7) +#define USBH_PLLC_PLL_RESET BIT(8) +#define USBH_PLLC_PLL_IDDQ_PWRDN BIT(9) +#define USBH_PLLC_PLL_PWRDN_DELAY BIT(10) +#define USBH_6318_PLLC_PLL_SUSPEND_EN BIT(27) +#define USBH_6318_PLLC_PHYPLL_BYP BIT(29) +#define USBH_6318_PLLC_PLL_RESET BIT(30) +#define USBH_6318_PLLC_PLL_IDDQ_PWRDN BIT(31) + USBH_SWAP_CONTROL, +#define USBH_SC_OHCI_DATA_SWAP BIT(0) +#define USBH_SC_OHCI_ENDIAN_SWAP BIT(1) +#define USBH_SC_OHCI_LOGICAL_ADDR_EN BIT(2) +#define USBH_SC_EHCI_DATA_SWAP BIT(3) +#define USBH_SC_EHCI_ENDIAN_SWAP BIT(4) +#define USBH_SC_EHCI_LOGICAL_ADDR_EN BIT(5) +#define USBH_SC_USB_DEVICE_SEL BIT(6) + USBH_GENERIC_CONTROL, +#define USBH_GC_PLL_SUSPEND_EN BIT(1) + USBH_FRAME_ADJUST_VALUE, + USBH_SETUP, +#define USBH_S_IOC BIT(4) +#define USBH_S_IPP BIT(5) + USBH_MDIO, + USBH_MDIO32, + USBH_USB_SIM_CONTROL, +#define USBH_USC_LADDR_SEL BIT(5) + + __USBH_ENUM_SIZE +}; + +struct bcm63xx_usbh_phy_variant { + /* Registers */ + long regs[__USBH_ENUM_SIZE]; + + /* PLLC bits to set/clear for power on */ + u32 power_pllc_clr; + u32 power_pllc_set; + + /* Setup bits to set/clear for power on */ + u32 setup_clr; + u32 setup_set; + + /* Swap Control bits to set */ + u32 swapctl_dev_set; + + /* Test Port Control value to set if non-zero */ + u32 tpc_val; + + /* USB Sim Control bits to set */ + u32 usc_set; + + /* UTMI Control 1 bits to set */ + u32 utmictl1_dev_set; +}; + +struct bcm63xx_usbh_phy { + void __iomem *base; + struct clk *usbh_clk; + struct clk *usb_ref_clk; + struct reset_control *reset; + const struct bcm63xx_usbh_phy_variant *variant; + bool device_mode; +}; + +static const struct bcm63xx_usbh_phy_variant usbh_bcm6318 = { + .regs = { + [USBH_BRT_CONTROL1] = -1, + [USBH_BRT_CONTROL2] = -1, + [USBH_BRT_STATUS1] = -1, + [USBH_BRT_STATUS2] = -1, + [USBH_UTMI_CONTROL1] = 0x2c, + [USBH_TEST_PORT_CONTROL] = 0x1c, + [USBH_PLL_CONTROL1] = 0x04, + [USBH_SWAP_CONTROL] = 0x0c, + [USBH_GENERIC_CONTROL] = -1, + [USBH_FRAME_ADJUST_VALUE] = 0x08, + [USBH_SETUP] = 0x00, + [USBH_MDIO] = 0x14, + [USBH_MDIO32] = 0x18, + [USBH_USB_SIM_CONTROL] = 0x20, + }, + .power_pllc_clr = USBH_6318_PLLC_PLL_IDDQ_PWRDN, + .power_pllc_set = USBH_6318_PLLC_PLL_SUSPEND_EN, + .setup_set = USBH_S_IOC, + .swapctl_dev_set = USBH_SC_USB_DEVICE_SEL, + .usc_set = USBH_USC_LADDR_SEL, + .utmictl1_dev_set = USBH_UC1_DEV_MODE_SEL, +}; + +static const struct bcm63xx_usbh_phy_variant usbh_bcm6328 = { + .regs = { + [USBH_BRT_CONTROL1] = 0x00, + [USBH_BRT_CONTROL2] = 0x04, + [USBH_BRT_STATUS1] = 0x08, + [USBH_BRT_STATUS2] = 0x0c, + [USBH_UTMI_CONTROL1] = 0x10, + [USBH_TEST_PORT_CONTROL] = 0x14, + [USBH_PLL_CONTROL1] = 0x18, + [USBH_SWAP_CONTROL] = 0x1c, + [USBH_GENERIC_CONTROL] = 0x20, + [USBH_FRAME_ADJUST_VALUE] = 0x24, + [USBH_SETUP] = 0x28, + [USBH_MDIO] = 0x2c, + [USBH_MDIO32] = 0x30, + [USBH_USB_SIM_CONTROL] = 0x34, + }, + .setup_set = USBH_S_IOC, + .swapctl_dev_set = USBH_SC_USB_DEVICE_SEL, + .utmictl1_dev_set = USBH_UC1_DEV_MODE_SEL, +}; + +static const struct bcm63xx_usbh_phy_variant usbh_bcm6358 = { + .regs = { + [USBH_BRT_CONTROL1] = -1, + [USBH_BRT_CONTROL2] = -1, + [USBH_BRT_STATUS1] = -1, + [USBH_BRT_STATUS2] = -1, + [USBH_UTMI_CONTROL1] = -1, + [USBH_TEST_PORT_CONTROL] = 0x24, + [USBH_PLL_CONTROL1] = -1, + [USBH_SWAP_CONTROL] = 0x00, + [USBH_GENERIC_CONTROL] = -1, + [USBH_FRAME_ADJUST_VALUE] = -1, + [USBH_SETUP] = -1, + [USBH_MDIO] = -1, + [USBH_MDIO32] = -1, + [USBH_USB_SIM_CONTROL] = -1, + }, + /* + * The magic value comes for the original vendor BSP + * and is needed for USB to work. Datasheet does not + * help, so the magic value is used as-is. + */ + .tpc_val = 0x1c0020, +}; + +static const struct bcm63xx_usbh_phy_variant usbh_bcm6368 = { + .regs = { + [USBH_BRT_CONTROL1] = 0x00, + [USBH_BRT_CONTROL2] = 0x04, + [USBH_BRT_STATUS1] = 0x08, + [USBH_BRT_STATUS2] = 0x0c, + [USBH_UTMI_CONTROL1] = 0x10, + [USBH_TEST_PORT_CONTROL] = 0x14, + [USBH_PLL_CONTROL1] = 0x18, + [USBH_SWAP_CONTROL] = 0x1c, + [USBH_GENERIC_CONTROL] = -1, + [USBH_FRAME_ADJUST_VALUE] = 0x24, + [USBH_SETUP] = 0x28, + [USBH_MDIO] = 0x2c, + [USBH_MDIO32] = 0x30, + [USBH_USB_SIM_CONTROL] = 0x34, + }, + .power_pllc_clr = USBH_PLLC_PLL_IDDQ_PWRDN | USBH_PLLC_PLL_PWRDN_DELAY, + .setup_set = USBH_S_IOC, + .swapctl_dev_set = USBH_SC_USB_DEVICE_SEL, + .utmictl1_dev_set = USBH_UC1_DEV_MODE_SEL, +}; + +static const struct bcm63xx_usbh_phy_variant usbh_bcm63268 = { + .regs = { + [USBH_BRT_CONTROL1] = 0x00, + [USBH_BRT_CONTROL2] = 0x04, + [USBH_BRT_STATUS1] = 0x08, + [USBH_BRT_STATUS2] = 0x0c, + [USBH_UTMI_CONTROL1] = 0x10, + [USBH_TEST_PORT_CONTROL] = 0x14, + [USBH_PLL_CONTROL1] = 0x18, + [USBH_SWAP_CONTROL] = 0x1c, + [USBH_GENERIC_CONTROL] = 0x20, + [USBH_FRAME_ADJUST_VALUE] = 0x24, + [USBH_SETUP] = 0x28, + [USBH_MDIO] = 0x2c, + [USBH_MDIO32] = 0x30, + [USBH_USB_SIM_CONTROL] = 0x34, + }, + .power_pllc_clr = USBH_PLLC_PLL_IDDQ_PWRDN | USBH_PLLC_PLL_PWRDN_DELAY, + .setup_clr = USBH_S_IPP, + .setup_set = USBH_S_IOC, + .swapctl_dev_set = USBH_SC_USB_DEVICE_SEL, + .utmictl1_dev_set = USBH_UC1_DEV_MODE_SEL, +}; + +static inline bool usbh_has_reg(struct bcm63xx_usbh_phy *usbh, int reg) +{ + return (usbh->variant->regs[reg] >= 0); +} + +static inline u32 usbh_readl(struct bcm63xx_usbh_phy *usbh, int reg) +{ + return __raw_readl(usbh->base + usbh->variant->regs[reg]); +} + +static inline void usbh_writel(struct bcm63xx_usbh_phy *usbh, int reg, + u32 value) +{ + __raw_writel(value, usbh->base + usbh->variant->regs[reg]); +} + +static int bcm63xx_usbh_phy_init(struct phy *phy) +{ + struct bcm63xx_usbh_phy *usbh = phy_get_drvdata(phy); + int ret; + + ret = clk_prepare_enable(usbh->usbh_clk); + if (ret) { + dev_err(&phy->dev, "unable to enable usbh clock: %d\n", ret); + return ret; + } + + ret = clk_prepare_enable(usbh->usb_ref_clk); + if (ret) { + dev_err(&phy->dev, "unable to enable usb_ref clock: %d\n", ret); + clk_disable_unprepare(usbh->usbh_clk); + return ret; + } + + ret = reset_control_reset(usbh->reset); + if (ret) { + dev_err(&phy->dev, "unable to reset device: %d\n", ret); + clk_disable_unprepare(usbh->usb_ref_clk); + clk_disable_unprepare(usbh->usbh_clk); + return ret; + } + + /* Configure to work in native CPU endian */ + if (usbh_has_reg(usbh, USBH_SWAP_CONTROL)) { + u32 val = usbh_readl(usbh, USBH_SWAP_CONTROL); + + val |= USBH_SC_EHCI_DATA_SWAP; + val &= ~USBH_SC_EHCI_ENDIAN_SWAP; + + val |= USBH_SC_OHCI_DATA_SWAP; + val &= ~USBH_SC_OHCI_ENDIAN_SWAP; + + if (usbh->device_mode && usbh->variant->swapctl_dev_set) + val |= usbh->variant->swapctl_dev_set; + + usbh_writel(usbh, USBH_SWAP_CONTROL, val); + } + + if (usbh_has_reg(usbh, USBH_SETUP)) { + u32 val = usbh_readl(usbh, USBH_SETUP); + + val |= usbh->variant->setup_set; + val &= ~usbh->variant->setup_clr; + + usbh_writel(usbh, USBH_SETUP, val); + } + + if (usbh_has_reg(usbh, USBH_USB_SIM_CONTROL)) { + u32 val = usbh_readl(usbh, USBH_USB_SIM_CONTROL); + + val |= usbh->variant->usc_set; + + usbh_writel(usbh, USBH_USB_SIM_CONTROL, val); + } + + if (usbh->variant->tpc_val && + usbh_has_reg(usbh, USBH_TEST_PORT_CONTROL)) + usbh_writel(usbh, USBH_TEST_PORT_CONTROL, + usbh->variant->tpc_val); + + if (usbh->device_mode && + usbh_has_reg(usbh, USBH_UTMI_CONTROL1) && + usbh->variant->utmictl1_dev_set) { + u32 val = usbh_readl(usbh, USBH_UTMI_CONTROL1); + + val |= usbh->variant->utmictl1_dev_set; + + usbh_writel(usbh, USBH_UTMI_CONTROL1, val); + } + + return 0; +} + +static int bcm63xx_usbh_phy_power_on(struct phy *phy) +{ + struct bcm63xx_usbh_phy *usbh = phy_get_drvdata(phy); + + if (usbh_has_reg(usbh, USBH_PLL_CONTROL1)) { + u32 val = usbh_readl(usbh, USBH_PLL_CONTROL1); + + val |= usbh->variant->power_pllc_set; + val &= ~usbh->variant->power_pllc_clr; + + usbh_writel(usbh, USBH_PLL_CONTROL1, val); + } + + return 0; +} + +static int bcm63xx_usbh_phy_power_off(struct phy *phy) +{ + struct bcm63xx_usbh_phy *usbh = phy_get_drvdata(phy); + + if (usbh_has_reg(usbh, USBH_PLL_CONTROL1)) { + u32 val = usbh_readl(usbh, USBH_PLL_CONTROL1); + + val &= ~usbh->variant->power_pllc_set; + val |= usbh->variant->power_pllc_clr; + + usbh_writel(usbh, USBH_PLL_CONTROL1, val); + } + + return 0; +} + +static int bcm63xx_usbh_phy_exit(struct phy *phy) +{ + struct bcm63xx_usbh_phy *usbh = phy_get_drvdata(phy); + + clk_disable_unprepare(usbh->usbh_clk); + clk_disable_unprepare(usbh->usb_ref_clk); + + return 0; +} + +static const struct phy_ops bcm63xx_usbh_phy_ops = { + .exit = bcm63xx_usbh_phy_exit, + .init = bcm63xx_usbh_phy_init, + .power_off = bcm63xx_usbh_phy_power_off, + .power_on = bcm63xx_usbh_phy_power_on, + .owner = THIS_MODULE, +}; + +static struct phy *bcm63xx_usbh_phy_xlate(struct device *dev, + struct of_phandle_args *args) +{ + struct bcm63xx_usbh_phy *usbh = dev_get_drvdata(dev); + + usbh->device_mode = !!args->args[0]; + + return of_phy_simple_xlate(dev, args); +} + +static int __init bcm63xx_usbh_phy_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct bcm63xx_usbh_phy *usbh; + const struct bcm63xx_usbh_phy_variant *variant; + struct phy *phy; + struct phy_provider *phy_provider; + + usbh = devm_kzalloc(dev, sizeof(*usbh), GFP_KERNEL); + if (!usbh) + return -ENOMEM; + + variant = device_get_match_data(dev); + if (!variant) + return -EINVAL; + usbh->variant = variant; + + usbh->base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(usbh->base)) + return PTR_ERR(usbh->base); + + usbh->reset = devm_reset_control_get(dev, NULL); + if (IS_ERR(usbh->reset)) { + if (PTR_ERR(usbh->reset) != -EPROBE_DEFER) + dev_err(dev, "failed to get reset\n"); + return PTR_ERR(usbh->reset); + } + + usbh->usbh_clk = devm_clk_get_optional(dev, "usbh"); + if (IS_ERR(usbh->usbh_clk)) + return PTR_ERR(usbh->usbh_clk); + + usbh->usb_ref_clk = devm_clk_get_optional(dev, "usb_ref"); + if (IS_ERR(usbh->usb_ref_clk)) + return PTR_ERR(usbh->usb_ref_clk); + + phy = devm_phy_create(dev, NULL, &bcm63xx_usbh_phy_ops); + if (IS_ERR(phy)) { + dev_err(dev, "failed to create PHY\n"); + return PTR_ERR(phy); + } + + platform_set_drvdata(pdev, usbh); + phy_set_drvdata(phy, usbh); + + phy_provider = devm_of_phy_provider_register(dev, + bcm63xx_usbh_phy_xlate); + if (IS_ERR(phy_provider)) { + dev_err(dev, "failed to register PHY provider\n"); + return PTR_ERR(phy_provider); + } + + dev_info(dev, "Registered BCM63xx USB PHY driver\n"); + + return 0; +} + +static const struct of_device_id bcm63xx_usbh_phy_ids[] __initconst = { + { .compatible = "brcm,bcm6318-usbh-phy", .data = &usbh_bcm6318 }, + { .compatible = "brcm,bcm6328-usbh-phy", .data = &usbh_bcm6328 }, + { .compatible = "brcm,bcm6358-usbh-phy", .data = &usbh_bcm6358 }, + { .compatible = "brcm,bcm6362-usbh-phy", .data = &usbh_bcm6368 }, + { .compatible = "brcm,bcm6368-usbh-phy", .data = &usbh_bcm6368 }, + { .compatible = "brcm,bcm63268-usbh-phy", .data = &usbh_bcm63268 }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, bcm63xx_usbh_phy_ids); + +static struct platform_driver bcm63xx_usbh_phy_driver __refdata = { + .driver = { + .name = "bcm63xx-usbh-phy", + .of_match_table = bcm63xx_usbh_phy_ids, + }, + .probe = bcm63xx_usbh_phy_probe, +}; +module_platform_driver(bcm63xx_usbh_phy_driver); + +MODULE_DESCRIPTION("BCM63xx USBH PHY driver"); +MODULE_AUTHOR("Álvaro Fernández Rojas "); +MODULE_AUTHOR("Simon Arlott "); +MODULE_LICENSE("GPL"); -- 2.27.0