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.0 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,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 62767C282C4 for ; Tue, 12 Feb 2019 15:14:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B9582075C for ; Tue, 12 Feb 2019 15:14:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="wrtE0/w9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730554AbfBLPOh (ORCPT ); Tue, 12 Feb 2019 10:14:37 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:52101 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730318AbfBLPO1 (ORCPT ); Tue, 12 Feb 2019 10:14:27 -0500 Received: by mail-wm1-f65.google.com with SMTP id b11so3371492wmj.1 for ; Tue, 12 Feb 2019 07:14:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=wrtE0/w9XBQq4RrLyXplyeDh0NH+b53jIT/DiR68Ud7xnMkw+Bwmf+YOPQ18UtRPEK 0UzHo8IpPf6V8Yi5Xpb6QRP8/vHnPw3uLcwCZNF+oqYoIr8RBviuLYPm7mjrSiscbgKA VprbXUIT8cyeskJzrppyZom5h+OJtrpBmva7+Fj+AOzMSjhbLJ5rJo6ipnJ485w31SMo xsE35hIQSBxLmHN59pHXoNus0ze8aRC2QGPjQ0rgDYEViYznAyM9NHe9eX983GfyxPRz /Znx6N8+/dp1dTvQc69+kzcrCBsvlsLG3KYbOvJZhlj76TT/HQwL0eJTP0pCqeTCRbFZ jx3g== 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=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=p5+5ZpeTwAXmhvuP/gGG4LKU8k+jJpHcMqH0a+JT5leKaSbkW+1hkqpj/vwqfIacVQ xlQ9AhDgP0Cp8xgB4WVCbWpD6QBDKus0CVDwAHB0n3IicJHe5E/ZI2WxUPENmxVDr4w5 tZgudRYznRO/k9+W6nfpO2sBerGO+Cl0F2QCYM8ocgfnY4IO1QlYDlrbuqzdx+ABlXzD PbDselV24cxMXcj4JreHCcnU9qR5jDCtjLRfw5WGG/JrWK9F32YKXUhERezbz11sWQO8 p90H+PA3bhYQHuRHI8ILH+ekmzBxu80aCzW0UgBiJMaeuFvbk9gH8eN8TAtVuFsjPSyE mcBw== X-Gm-Message-State: AHQUAuaBSRVcGC3otPFWUFT+DiN7zSLIGSx/ZpXABLXLK5LFuYP5S8u5 oKm+jHEl4qNi0QQCsOCPHgrnQw== X-Google-Smtp-Source: AHgI3IZu6tf0SY0WQKvUQxs4uBL0ZqVZP9aea+gL8H0GFy33ML8K9VB/fc83GwnpKgwjr8jHBQAkpA== X-Received: by 2002:a1c:ac42:: with SMTP id v63mr3213364wme.119.1549984464882; Tue, 12 Feb 2019 07:14:24 -0800 (PST) Received: from bender.baylibre.local (lmontsouris-657-1-212-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.gmail.com with ESMTPSA id c1sm1589515wmb.14.2019.02.12.07.14.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Feb 2019 07:14:23 -0800 (PST) From: Neil Armstrong To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Cc: Neil Armstrong , linux-amlogic@lists.infradead.org, linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Tue, 12 Feb 2019 16:14:10 +0100 Message-Id: <20190212151413.24632-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190212151413.24632-1-narmstrong@baylibre.com> References: <20190212151413.24632-1-narmstrong@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds support for the USB2 PHY found in the Amlogic G12A SoC Family. It supports Host and/or Peripheral mode, depending on it's position. The first PHY is only used as Host, but the second supports Dual modes defined by the USB Control Glue HW in front of the USB Controllers. Signed-off-by: Neil Armstrong --- drivers/phy/amlogic/Kconfig | 12 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 191 ++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 drivers/phy/amlogic/phy-meson-g12a-usb2.c diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig index 23fe1cda2f70..78d6e194dce9 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,15 @@ config PHY_MESON_GXL_USB3 Enable this to support the Meson USB3 PHY and OTG detection IP block found in Meson GXL and GXM SoCs. If unsure, say N. + +config PHY_MESON_G12A_USB2 + tristate "Meson G12A USB2 PHY drivers" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + depends on USB_SUPPORT + select GENERIC_PHY + select REGMAP_MMIO + help + Enable this to support the Meson USB2 PHYs found in Meson + G12A SoCs. + If unsure, say N. diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile index 4fd8848c194d..7d4d10f5a6b3 100644 --- a/drivers/phy/amlogic/Makefile +++ b/drivers/phy/amlogic/Makefile @@ -1,3 +1,4 @@ obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB2) += phy-meson-gxl-usb2.o +obj-$(CONFIG_PHY_MESON_G12A_USB2) += phy-meson-g12a-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB3) += phy-meson-gxl-usb3.o diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb2.c b/drivers/phy/amlogic/phy-meson-g12a-usb2.c new file mode 100644 index 000000000000..3b6271a8be02 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Meson G12A USB2 PHY driver + * + * Copyright (C) 2017 Martin Blumenstingl + * Copyright (C) 2017 Amlogic, Inc. All rights reserved + * Copyright (C) 2019 BayLibre, SAS + * Author: Neil Armstrong + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PHY_CTRL_R0 0x0 +#define PHY_CTRL_R1 0x4 +#define PHY_CTRL_R2 0x8 +#define PHY_CTRL_R3 0xc +#define PHY_CTRL_R4 0x10 +#define PHY_CTRL_R5 0x14 +#define PHY_CTRL_R6 0x18 +#define PHY_CTRL_R7 0x1c +#define PHY_CTRL_R8 0x20 +#define PHY_CTRL_R9 0x24 +#define PHY_CTRL_R10 0x28 +#define PHY_CTRL_R11 0x2c +#define PHY_CTRL_R12 0x30 +#define PHY_CTRL_R13 0x34 +#define PHY_CTRL_R14 0x38 +#define PHY_CTRL_R15 0x3c +#define PHY_CTRL_R16 0x40 +#define PHY_CTRL_R17 0x44 +#define PHY_CTRL_R18 0x48 +#define PHY_CTRL_R19 0x4c +#define PHY_CTRL_R20 0x50 +#define PHY_CTRL_R21 0x54 +#define PHY_CTRL_R22 0x58 +#define PHY_CTRL_R23 0x5c + +#define RESET_COMPLETE_TIME 1000 +#define PLL_RESET_COMPLETE_TIME 100 + +struct phy_meson_g12a_usb2_priv { + struct device *dev; + struct regmap *regmap; + struct clk *clk; + struct reset_control *reset; +}; + +static const struct regmap_config phy_meson_g12a_usb2_regmap_conf = { + .reg_bits = 8, + .val_bits = 32, + .reg_stride = 4, + .max_register = PHY_CTRL_R23, +}; + +static int phy_meson_g12a_usb2_init(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + int ret; + + ret = reset_control_reset(priv->reset); + if (ret) + return ret; + + udelay(RESET_COMPLETE_TIME); + + /* usb2_otg_aca_en == 0 */ + regmap_update_bits(priv->regmap, PHY_CTRL_R21, BIT(2), 0); + + /* PLL Setup : 24MHz * 20 / 1 = 480MHz */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x39400414); + regmap_write(priv->regmap, PHY_CTRL_R17, 0x927e0000); + regmap_write(priv->regmap, PHY_CTRL_R18, 0xac5f49e5); + + udelay(PLL_RESET_COMPLETE_TIME); + + /* UnReset PLL */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x19400414); + + /* PHY Tuning */ + regmap_write(priv->regmap, PHY_CTRL_R20, 0xfe18); + regmap_write(priv->regmap, PHY_CTRL_R4, 0x8000fff); + + /* Tuning Disconnect Threshold */ + regmap_write(priv->regmap, PHY_CTRL_R3, 0x34); + + /* Analog Settings */ + regmap_write(priv->regmap, PHY_CTRL_R14, 0); + regmap_write(priv->regmap, PHY_CTRL_R13, 0x78000); + + return 0; +} + +static int phy_meson_g12a_usb2_exit(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + + return reset_control_reset(priv->reset); +} + +/* set_mode is not needed, mode setting is handled via the UTMI bus */ +static const struct phy_ops phy_meson_g12a_usb2_ops = { + .init = phy_meson_g12a_usb2_init, + .exit = phy_meson_g12a_usb2_exit, + .owner = THIS_MODULE, +}; + +static int phy_meson_g12a_usb2_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct phy_provider *phy_provider; + struct resource *res; + struct phy_meson_g12a_usb2_priv *priv; + struct phy *phy; + void __iomem *base; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + platform_set_drvdata(pdev, priv); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + base = devm_ioremap_resource(dev, res); + if (IS_ERR(base)) + return PTR_ERR(base); + + priv->regmap = devm_regmap_init_mmio(dev, base, + &phy_meson_g12a_usb2_regmap_conf); + if (IS_ERR(priv->regmap)) + return PTR_ERR(priv->regmap); + + priv->clk = devm_clk_get(dev, "xtal"); + if (IS_ERR(priv->clk)) + return PTR_ERR(priv->clk); + + priv->reset = devm_reset_control_get(dev, "phy"); + if (IS_ERR(priv->reset)) + return PTR_ERR(priv->reset); + + ret = reset_control_deassert(priv->reset); + if (ret) + return ret; + + phy = devm_phy_create(dev, NULL, &phy_meson_g12a_usb2_ops); + if (IS_ERR(phy)) { + ret = PTR_ERR(phy); + if (ret != -EPROBE_DEFER) + dev_err(dev, "failed to create PHY\n"); + + return ret; + } + + phy_set_bus_width(phy, 8); + phy_set_drvdata(phy, priv); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static const struct of_device_id phy_meson_g12a_usb2_of_match[] = { + { .compatible = "amlogic,g12a-usb2-phy", }, + { }, +}; +MODULE_DEVICE_TABLE(of, phy_meson_g12a_usb2_of_match); + +static struct platform_driver phy_meson_g12a_usb2_driver = { + .probe = phy_meson_g12a_usb2_probe, + .driver = { + .name = "phy-meson-g12a-usb2", + .of_match_table = phy_meson_g12a_usb2_of_match, + }, +}; +module_platform_driver(phy_meson_g12a_usb2_driver); + +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_AUTHOR("Neil Armstrong "); +MODULE_DESCRIPTION("Meson G12A USB2 PHY driver"); +MODULE_LICENSE("GPL v2"); -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver From: Neil Armstrong Message-Id: <20190212151413.24632-6-narmstrong@baylibre.com> Date: Tue, 12 Feb 2019 16:14:10 +0100 To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Cc: Neil Armstrong , linux-amlogic@lists.infradead.org, linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org List-ID: VGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBVU0IyIFBIWSBmb3VuZCBpbiB0aGUgQW1sb2dpYyBH MTJBIFNvQyBGYW1pbHkuCgpJdCBzdXBwb3J0cyBIb3N0IGFuZC9vciBQZXJpcGhlcmFsIG1vZGUs IGRlcGVuZGluZyBvbiBpdCdzIHBvc2l0aW9uLgpUaGUgZmlyc3QgUEhZIGlzIG9ubHkgdXNlZCBh cyBIb3N0LCBidXQgdGhlIHNlY29uZCBzdXBwb3J0cyBEdWFsIG1vZGVzCmRlZmluZWQgYnkgdGhl IFVTQiBDb250cm9sIEdsdWUgSFcgaW4gZnJvbnQgb2YgdGhlIFVTQiBDb250cm9sbGVycy4KClNp Z25lZC1vZmYtYnk6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KLS0t CiBkcml2ZXJzL3BoeS9hbWxvZ2ljL0tjb25maWcgICAgICAgICAgICAgICB8ICAxMiArKwogZHJp dmVycy9waHkvYW1sb2dpYy9NYWtlZmlsZSAgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9w aHkvYW1sb2dpYy9waHktbWVzb24tZzEyYS11c2IyLmMgfCAxOTEgKysrKysrKysrKysrKysrKysr KysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyMDQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L2FtbG9naWMvcGh5LW1lc29uLWcxMmEtdXNiMi5jCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9waHkvYW1sb2dpYy9LY29uZmlnIGIvZHJpdmVycy9waHkvYW1sb2dpYy9LY29u ZmlnCmluZGV4IDIzZmUxY2RhMmY3MC4uNzhkNmUxOTRkY2U5IDEwMDY0NAotLS0gYS9kcml2ZXJz L3BoeS9hbWxvZ2ljL0tjb25maWcKKysrIGIvZHJpdmVycy9waHkvYW1sb2dpYy9LY29uZmlnCkBA IC0zNiwzICszNiwxNSBAQCBjb25maWcgUEhZX01FU09OX0dYTF9VU0IzCiAJICBFbmFibGUgdGhp cyB0byBzdXBwb3J0IHRoZSBNZXNvbiBVU0IzIFBIWSBhbmQgT1RHIGRldGVjdGlvbgogCSAgSVAg YmxvY2sgZm91bmQgaW4gTWVzb24gR1hMIGFuZCBHWE0gU29Dcy4KIAkgIElmIHVuc3VyZSwgc2F5 IE4uCisKK2NvbmZpZyBQSFlfTUVTT05fRzEyQV9VU0IyCisJdHJpc3RhdGUgIk1lc29uIEcxMkEg VVNCMiBQSFkgZHJpdmVycyIKKwlkZWZhdWx0IEFSQ0hfTUVTT04KKwlkZXBlbmRzIG9uIE9GICYm IChBUkNIX01FU09OIHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFVTQl9TVVBQT1JUCisJ c2VsZWN0IEdFTkVSSUNfUEhZCisJc2VsZWN0IFJFR01BUF9NTUlPCisJaGVscAorCSAgRW5hYmxl IHRoaXMgdG8gc3VwcG9ydCB0aGUgTWVzb24gVVNCMiBQSFlzIGZvdW5kIGluIE1lc29uCisJICBH MTJBIFNvQ3MuCisJICBJZiB1bnN1cmUsIHNheSBOLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkv YW1sb2dpYy9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L2FtbG9naWMvTWFrZWZpbGUKaW5kZXggNGZk ODg0OGMxOTRkLi43ZDRkMTBmNWE2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L2FtbG9naWMv TWFrZWZpbGUKKysrIGIvZHJpdmVycy9waHkvYW1sb2dpYy9NYWtlZmlsZQpAQCAtMSwzICsxLDQg QEAKIG9iai0kKENPTkZJR19QSFlfTUVTT044Ql9VU0IyKQkJKz0gcGh5LW1lc29uOGItdXNiMi5v CiBvYmotJChDT05GSUdfUEhZX01FU09OX0dYTF9VU0IyKQkrPSBwaHktbWVzb24tZ3hsLXVzYjIu bworb2JqLSQoQ09ORklHX1BIWV9NRVNPTl9HMTJBX1VTQjIpCSs9IHBoeS1tZXNvbi1nMTJhLXVz YjIubwogb2JqLSQoQ09ORklHX1BIWV9NRVNPTl9HWExfVVNCMykJKz0gcGh5LW1lc29uLWd4bC11 c2IzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2FtbG9naWMvcGh5LW1lc29uLWcxMmEtdXNi Mi5jIGIvZHJpdmVycy9waHkvYW1sb2dpYy9waHktbWVzb24tZzEyYS11c2IyLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4zYjYyNzFhOGJlMDIKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL3BoeS9hbWxvZ2ljL3BoeS1tZXNvbi1nMTJhLXVzYjIuYwpAQCAtMCww ICsxLDE5MSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBN ZXNvbiBHMTJBIFVTQjIgUEhZIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBNYXJ0 aW4gQmx1bWVuc3RpbmdsIDxtYXJ0aW4uYmx1bWVuc3RpbmdsQGdvb2dsZW1haWwuY29tPgorICog Q29weXJpZ2h0IChDKSAyMDE3IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZAorICog Q29weXJpZ2h0IChDKSAyMDE5IEJheUxpYnJlLCBTQVMKKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJv bmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsu aD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5j bHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2lu Y2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1 ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K KworI2RlZmluZSBQSFlfQ1RSTF9SMAkJCQkJCTB4MAorI2RlZmluZSBQSFlfQ1RSTF9SMQkJCQkJ CTB4NAorI2RlZmluZSBQSFlfQ1RSTF9SMgkJCQkJCTB4OAorI2RlZmluZSBQSFlfQ1RSTF9SMwkJ CQkJCTB4YworI2RlZmluZSBQSFlfQ1RSTF9SNAkJCQkJCTB4MTAKKyNkZWZpbmUgUEhZX0NUUkxf UjUJCQkJCQkweDE0CisjZGVmaW5lIFBIWV9DVFJMX1I2CQkJCQkJMHgxOAorI2RlZmluZSBQSFlf Q1RSTF9SNwkJCQkJCTB4MWMKKyNkZWZpbmUgUEhZX0NUUkxfUjgJCQkJCQkweDIwCisjZGVmaW5l IFBIWV9DVFJMX1I5CQkJCQkJMHgyNAorI2RlZmluZSBQSFlfQ1RSTF9SMTAJCQkJCQkweDI4Cisj ZGVmaW5lIFBIWV9DVFJMX1IxMQkJCQkJCTB4MmMKKyNkZWZpbmUgUEhZX0NUUkxfUjEyCQkJCQkJ MHgzMAorI2RlZmluZSBQSFlfQ1RSTF9SMTMJCQkJCQkweDM0CisjZGVmaW5lIFBIWV9DVFJMX1Ix NAkJCQkJCTB4MzgKKyNkZWZpbmUgUEhZX0NUUkxfUjE1CQkJCQkJMHgzYworI2RlZmluZSBQSFlf Q1RSTF9SMTYJCQkJCQkweDQwCisjZGVmaW5lIFBIWV9DVFJMX1IxNwkJCQkJCTB4NDQKKyNkZWZp bmUgUEhZX0NUUkxfUjE4CQkJCQkJMHg0OAorI2RlZmluZSBQSFlfQ1RSTF9SMTkJCQkJCQkweDRj CisjZGVmaW5lIFBIWV9DVFJMX1IyMAkJCQkJCTB4NTAKKyNkZWZpbmUgUEhZX0NUUkxfUjIxCQkJ CQkJMHg1NAorI2RlZmluZSBQSFlfQ1RSTF9SMjIJCQkJCQkweDU4CisjZGVmaW5lIFBIWV9DVFJM X1IyMwkJCQkJCTB4NWMKKworI2RlZmluZSBSRVNFVF9DT01QTEVURV9USU1FCQkJCQkxMDAwCisj ZGVmaW5lIFBMTF9SRVNFVF9DT01QTEVURV9USU1FCQkJCQkxMDAKKworc3RydWN0IHBoeV9tZXNv bl9nMTJhX3VzYjJfcHJpdiB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgcmVnbWFw CQkqcmVnbWFwOworCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wJKnJl c2V0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHBoeV9tZXNvbl9n MTJhX3VzYjJfcmVnbWFwX2NvbmYgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSAz MiwKKwkucmVnX3N0cmlkZSA9IDQsCisJLm1heF9yZWdpc3RlciA9IFBIWV9DVFJMX1IyMywKK307 CisKK3N0YXRpYyBpbnQgcGh5X21lc29uX2cxMmFfdXNiMl9pbml0KHN0cnVjdCBwaHkgKnBoeSkK K3sKKwlzdHJ1Y3QgcGh5X21lc29uX2cxMmFfdXNiMl9wcml2ICpwcml2ID0gcGh5X2dldF9kcnZk YXRhKHBoeSk7CisJaW50IHJldDsKKworCXJldCA9IHJlc2V0X2NvbnRyb2xfcmVzZXQocHJpdi0+ cmVzZXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1ZGVsYXkoUkVTRVRfQ09NUExF VEVfVElNRSk7CisKKwkvKiB1c2IyX290Z19hY2FfZW4gPT0gMCAqLworCXJlZ21hcF91cGRhdGVf Yml0cyhwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IyMSwgQklUKDIpLCAwKTsKKworCS8qIFBMTCBT ZXR1cCA6IDI0TUh6ICogMjAgLyAxID0gNDgwTUh6ICovCisJcmVnbWFwX3dyaXRlKHByaXYtPnJl Z21hcCwgUEhZX0NUUkxfUjE2LCAweDM5NDAwNDE0KTsKKwlyZWdtYXBfd3JpdGUocHJpdi0+cmVn bWFwLCBQSFlfQ1RSTF9SMTcsIDB4OTI3ZTAwMDApOworCXJlZ21hcF93cml0ZShwcml2LT5yZWdt YXAsIFBIWV9DVFJMX1IxOCwgMHhhYzVmNDllNSk7CisKKwl1ZGVsYXkoUExMX1JFU0VUX0NPTVBM RVRFX1RJTUUpOworCisJLyogVW5SZXNldCBQTEwgKi8KKwlyZWdtYXBfd3JpdGUocHJpdi0+cmVn bWFwLCBQSFlfQ1RSTF9SMTYsIDB4MTk0MDA0MTQpOworCisJLyogUEhZIFR1bmluZyAqLworCXJl Z21hcF93cml0ZShwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IyMCwgMHhmZTE4KTsKKwlyZWdtYXBf d3JpdGUocHJpdi0+cmVnbWFwLCBQSFlfQ1RSTF9SNCwgMHg4MDAwZmZmKTsKKworCS8qIFR1bmlu ZyBEaXNjb25uZWN0IFRocmVzaG9sZCAqLworCXJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIFBI WV9DVFJMX1IzLCAweDM0KTsKKworCS8qIEFuYWxvZyBTZXR0aW5ncyAqLworCXJlZ21hcF93cml0 ZShwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IxNCwgMCk7CisJcmVnbWFwX3dyaXRlKHByaXYtPnJl Z21hcCwgUEhZX0NUUkxfUjEzLCAweDc4MDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IHBoeV9tZXNvbl9nMTJhX3VzYjJfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0 IHBoeV9tZXNvbl9nMTJhX3VzYjJfcHJpdiAqcHJpdiA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwor CisJcmV0dXJuIHJlc2V0X2NvbnRyb2xfcmVzZXQocHJpdi0+cmVzZXQpOworfQorCisvKiBzZXRf bW9kZSBpcyBub3QgbmVlZGVkLCBtb2RlIHNldHRpbmcgaXMgaGFuZGxlZCB2aWEgdGhlIFVUTUkg YnVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcGh5X21lc29uX2cxMmFfdXNiMl9v cHMgPSB7CisJLmluaXQJCT0gcGh5X21lc29uX2cxMmFfdXNiMl9pbml0LAorCS5leGl0CQk9IHBo eV9tZXNvbl9nMTJhX3VzYjJfZXhpdCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitz dGF0aWMgaW50IHBoeV9tZXNvbl9nMTJhX3VzYjJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBw aHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1 Y3QgcGh5X21lc29uX2cxMmFfdXNiMl9wcml2ICpwcml2OworCXN0cnVjdCBwaHkgKnBoeTsKKwl2 b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2 LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5P TUVNOworCisJcHJpdi0+ZGV2ID0gZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBy aXYpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVN LCAwKTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNf RVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKworCXByaXYtPnJlZ21hcCA9IGRl dm1fcmVnbWFwX2luaXRfbW1pbyhkZXYsIGJhc2UsCisJCQkJCSAgICAgJnBoeV9tZXNvbl9nMTJh X3VzYjJfcmVnbWFwX2NvbmYpOworCWlmIChJU19FUlIocHJpdi0+cmVnbWFwKSkKKwkJcmV0dXJu IFBUUl9FUlIocHJpdi0+cmVnbWFwKTsKKworCXByaXYtPmNsayA9IGRldm1fY2xrX2dldChkZXYs ICJ4dGFsIik7CisJaWYgKElTX0VSUihwcml2LT5jbGspKQorCQlyZXR1cm4gUFRSX0VSUihwcml2 LT5jbGspOworCisJcHJpdi0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgInBo eSIpOworCWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5y ZXNldCk7CisKKwlyZXQgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHByaXYtPnJlc2V0KTsKKwlp ZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgTlVM TCwgJnBoeV9tZXNvbl9nMTJhX3VzYjJfb3BzKTsKKwlpZiAoSVNfRVJSKHBoeSkpIHsKKwkJcmV0 ID0gUFRSX0VSUihwaHkpOworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJy KGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKworCQlyZXR1cm4gcmV0OworCX0KKwor CXBoeV9zZXRfYnVzX3dpZHRoKHBoeSwgOCk7CisJcGh5X3NldF9kcnZkYXRhKHBoeSwgcHJpdik7 CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9m X3BoeV9zaW1wbGVfeGxhdGUpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlk ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwaHlfbWVzb25fZzEy YV91c2IyX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLGcxMmEtdXNi Mi1waHkiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwaHlfbWVzb25f ZzEyYV91c2IyX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGh5 X21lc29uX2cxMmFfdXNiMl9kcml2ZXIgPSB7CisJLnByb2JlCT0gcGh5X21lc29uX2cxMmFfdXNi Ml9wcm9iZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSAicGh5LW1lc29uLWcxMmEtdXNiMiIs CisJCS5vZl9tYXRjaF90YWJsZQk9IHBoeV9tZXNvbl9nMTJhX3VzYjJfb2ZfbWF0Y2gsCisJfSwK K307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBoeV9tZXNvbl9nMTJhX3VzYjJfZHJpdmVyKTsK KworTU9EVUxFX0FVVEhPUigiTWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0aW5n bEBnb29nbGVtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk5laWwgQXJtc3Ryb25nIDxuYXJt c3Ryb25nQGJheWxpYnJlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWVzb24gRzEyQSBV U0IyIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK 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.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 AA510C282CA for ; Tue, 12 Feb 2019 15:15:44 +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 755592075C for ; Tue, 12 Feb 2019 15:15:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="mRU8y0to"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="wrtE0/w9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 755592075C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.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=TLnNb+RjOUj2Iz/bvQwJf5QcjXnHSm42qGW1gkpzbDw=; b=mRU8y0toVEGOeg jdFSckDb2e9+ckjJ4a5WnpPrASQfIO1SpOO3rxarlczGCHdPSMcmqt4nmoAJ7drTWsNDwZ5iAr5Ub 9BBWS8DuCp1cahpXiRMjbUvgILjmFOWDGQPXrFkmpZJkIlu5PtxnAI/bvjk7uGyz+d+uDdFpgmJIM bQL2rVBjaa4ITN+mism4wCfn+OlarWxkI+8wNUG0HiG8mKimDpREUklxGJSiMmO9EcjJ8MGpTafuu 4Z+7iJrXLt/6EmpfOOKmo5rHVUeiSXvuTZ2MZ38KHeYYVG7PSY1D7tJ2UQa+Xx1YaVC0GcxGA26oC w2S9nI+z/VrYClp5BryA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gtZma-0000Kr-QR; Tue, 12 Feb 2019 15:15:37 +0000 Received: from mail-wm1-x342.google.com ([2a00:1450:4864:20::342]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gtZlS-0006Wr-Hc for linux-arm-kernel@lists.infradead.org; Tue, 12 Feb 2019 15:14:38 +0000 Received: by mail-wm1-x342.google.com with SMTP id d15so3363100wmb.3 for ; Tue, 12 Feb 2019 07:14:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=wrtE0/w9XBQq4RrLyXplyeDh0NH+b53jIT/DiR68Ud7xnMkw+Bwmf+YOPQ18UtRPEK 0UzHo8IpPf6V8Yi5Xpb6QRP8/vHnPw3uLcwCZNF+oqYoIr8RBviuLYPm7mjrSiscbgKA VprbXUIT8cyeskJzrppyZom5h+OJtrpBmva7+Fj+AOzMSjhbLJ5rJo6ipnJ485w31SMo xsE35hIQSBxLmHN59pHXoNus0ze8aRC2QGPjQ0rgDYEViYznAyM9NHe9eX983GfyxPRz /Znx6N8+/dp1dTvQc69+kzcrCBsvlsLG3KYbOvJZhlj76TT/HQwL0eJTP0pCqeTCRbFZ jx3g== 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=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=ZzDbakillWL4jHn4dm6uxmf/UoN/uNe87ihNqfhsqr0cp5TAaTFoLU63wB3s/qsRh1 zXSTI4aDeOkKNWIw/D+NNpjneE29iJwiusxNSUQTVfEn5czLNDwYYTQ/PG7YOaZut5X4 xjRM05jrbS2NKih3lkYzsKfo2irj1pcYJJDrzDv5M9WgRHSMiGUmpNST0fZ7XKtPkaVq PpvAtWUPAgKldQtFDcK5UbERU66jWGmT7GANu1lDMxvdRMh4Dx+FguHWQ3jXc87k4oTM E4grB3xLJlIqa1QHLnCbmdK604vBJE+emN/4u4lQcayJW7ep9K4BreR7PBRMiisXFetN bCsw== X-Gm-Message-State: AHQUAubiJFvkdN89ER2I6xecMdgQUMAJtQGQ5mBJEgGP5GQf4ypuSZjM llnZmC8TmR5ioPNwczMGoikcBw== X-Google-Smtp-Source: AHgI3IZu6tf0SY0WQKvUQxs4uBL0ZqVZP9aea+gL8H0GFy33ML8K9VB/fc83GwnpKgwjr8jHBQAkpA== X-Received: by 2002:a1c:ac42:: with SMTP id v63mr3213364wme.119.1549984464882; Tue, 12 Feb 2019 07:14:24 -0800 (PST) Received: from bender.baylibre.local (lmontsouris-657-1-212-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.gmail.com with ESMTPSA id c1sm1589515wmb.14.2019.02.12.07.14.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Feb 2019 07:14:23 -0800 (PST) From: Neil Armstrong To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Subject: [PATCH 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Tue, 12 Feb 2019 16:14:10 +0100 Message-Id: <20190212151413.24632-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190212151413.24632-1-narmstrong@baylibre.com> References: <20190212151413.24632-1-narmstrong@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190212_071427_190463_A42EE832 X-CRM114-Status: GOOD ( 18.89 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-amlogic@lists.infradead.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Neil Armstrong Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org This adds support for the USB2 PHY found in the Amlogic G12A SoC Family. It supports Host and/or Peripheral mode, depending on it's position. The first PHY is only used as Host, but the second supports Dual modes defined by the USB Control Glue HW in front of the USB Controllers. Signed-off-by: Neil Armstrong --- drivers/phy/amlogic/Kconfig | 12 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 191 ++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 drivers/phy/amlogic/phy-meson-g12a-usb2.c diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig index 23fe1cda2f70..78d6e194dce9 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,15 @@ config PHY_MESON_GXL_USB3 Enable this to support the Meson USB3 PHY and OTG detection IP block found in Meson GXL and GXM SoCs. If unsure, say N. + +config PHY_MESON_G12A_USB2 + tristate "Meson G12A USB2 PHY drivers" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + depends on USB_SUPPORT + select GENERIC_PHY + select REGMAP_MMIO + help + Enable this to support the Meson USB2 PHYs found in Meson + G12A SoCs. + If unsure, say N. diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile index 4fd8848c194d..7d4d10f5a6b3 100644 --- a/drivers/phy/amlogic/Makefile +++ b/drivers/phy/amlogic/Makefile @@ -1,3 +1,4 @@ obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB2) += phy-meson-gxl-usb2.o +obj-$(CONFIG_PHY_MESON_G12A_USB2) += phy-meson-g12a-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB3) += phy-meson-gxl-usb3.o diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb2.c b/drivers/phy/amlogic/phy-meson-g12a-usb2.c new file mode 100644 index 000000000000..3b6271a8be02 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Meson G12A USB2 PHY driver + * + * Copyright (C) 2017 Martin Blumenstingl + * Copyright (C) 2017 Amlogic, Inc. All rights reserved + * Copyright (C) 2019 BayLibre, SAS + * Author: Neil Armstrong + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PHY_CTRL_R0 0x0 +#define PHY_CTRL_R1 0x4 +#define PHY_CTRL_R2 0x8 +#define PHY_CTRL_R3 0xc +#define PHY_CTRL_R4 0x10 +#define PHY_CTRL_R5 0x14 +#define PHY_CTRL_R6 0x18 +#define PHY_CTRL_R7 0x1c +#define PHY_CTRL_R8 0x20 +#define PHY_CTRL_R9 0x24 +#define PHY_CTRL_R10 0x28 +#define PHY_CTRL_R11 0x2c +#define PHY_CTRL_R12 0x30 +#define PHY_CTRL_R13 0x34 +#define PHY_CTRL_R14 0x38 +#define PHY_CTRL_R15 0x3c +#define PHY_CTRL_R16 0x40 +#define PHY_CTRL_R17 0x44 +#define PHY_CTRL_R18 0x48 +#define PHY_CTRL_R19 0x4c +#define PHY_CTRL_R20 0x50 +#define PHY_CTRL_R21 0x54 +#define PHY_CTRL_R22 0x58 +#define PHY_CTRL_R23 0x5c + +#define RESET_COMPLETE_TIME 1000 +#define PLL_RESET_COMPLETE_TIME 100 + +struct phy_meson_g12a_usb2_priv { + struct device *dev; + struct regmap *regmap; + struct clk *clk; + struct reset_control *reset; +}; + +static const struct regmap_config phy_meson_g12a_usb2_regmap_conf = { + .reg_bits = 8, + .val_bits = 32, + .reg_stride = 4, + .max_register = PHY_CTRL_R23, +}; + +static int phy_meson_g12a_usb2_init(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + int ret; + + ret = reset_control_reset(priv->reset); + if (ret) + return ret; + + udelay(RESET_COMPLETE_TIME); + + /* usb2_otg_aca_en == 0 */ + regmap_update_bits(priv->regmap, PHY_CTRL_R21, BIT(2), 0); + + /* PLL Setup : 24MHz * 20 / 1 = 480MHz */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x39400414); + regmap_write(priv->regmap, PHY_CTRL_R17, 0x927e0000); + regmap_write(priv->regmap, PHY_CTRL_R18, 0xac5f49e5); + + udelay(PLL_RESET_COMPLETE_TIME); + + /* UnReset PLL */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x19400414); + + /* PHY Tuning */ + regmap_write(priv->regmap, PHY_CTRL_R20, 0xfe18); + regmap_write(priv->regmap, PHY_CTRL_R4, 0x8000fff); + + /* Tuning Disconnect Threshold */ + regmap_write(priv->regmap, PHY_CTRL_R3, 0x34); + + /* Analog Settings */ + regmap_write(priv->regmap, PHY_CTRL_R14, 0); + regmap_write(priv->regmap, PHY_CTRL_R13, 0x78000); + + return 0; +} + +static int phy_meson_g12a_usb2_exit(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + + return reset_control_reset(priv->reset); +} + +/* set_mode is not needed, mode setting is handled via the UTMI bus */ +static const struct phy_ops phy_meson_g12a_usb2_ops = { + .init = phy_meson_g12a_usb2_init, + .exit = phy_meson_g12a_usb2_exit, + .owner = THIS_MODULE, +}; + +static int phy_meson_g12a_usb2_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct phy_provider *phy_provider; + struct resource *res; + struct phy_meson_g12a_usb2_priv *priv; + struct phy *phy; + void __iomem *base; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + platform_set_drvdata(pdev, priv); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + base = devm_ioremap_resource(dev, res); + if (IS_ERR(base)) + return PTR_ERR(base); + + priv->regmap = devm_regmap_init_mmio(dev, base, + &phy_meson_g12a_usb2_regmap_conf); + if (IS_ERR(priv->regmap)) + return PTR_ERR(priv->regmap); + + priv->clk = devm_clk_get(dev, "xtal"); + if (IS_ERR(priv->clk)) + return PTR_ERR(priv->clk); + + priv->reset = devm_reset_control_get(dev, "phy"); + if (IS_ERR(priv->reset)) + return PTR_ERR(priv->reset); + + ret = reset_control_deassert(priv->reset); + if (ret) + return ret; + + phy = devm_phy_create(dev, NULL, &phy_meson_g12a_usb2_ops); + if (IS_ERR(phy)) { + ret = PTR_ERR(phy); + if (ret != -EPROBE_DEFER) + dev_err(dev, "failed to create PHY\n"); + + return ret; + } + + phy_set_bus_width(phy, 8); + phy_set_drvdata(phy, priv); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static const struct of_device_id phy_meson_g12a_usb2_of_match[] = { + { .compatible = "amlogic,g12a-usb2-phy", }, + { }, +}; +MODULE_DEVICE_TABLE(of, phy_meson_g12a_usb2_of_match); + +static struct platform_driver phy_meson_g12a_usb2_driver = { + .probe = phy_meson_g12a_usb2_probe, + .driver = { + .name = "phy-meson-g12a-usb2", + .of_match_table = phy_meson_g12a_usb2_of_match, + }, +}; +module_platform_driver(phy_meson_g12a_usb2_driver); + +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_AUTHOR("Neil Armstrong "); +MODULE_DESCRIPTION("Meson G12A USB2 PHY driver"); +MODULE_LICENSE("GPL v2"); -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 2BB2CC282CA for ; Tue, 12 Feb 2019 15:15:42 +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 EC6022075C for ; Tue, 12 Feb 2019 15:15:41 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="PGgXivf4"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="wrtE0/w9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EC6022075C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-amlogic-bounces+linux-amlogic=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=ai537dM51lS6yjru17jblkGgDCTV4eX/mW85HJe0pGM=; b=PGgXivf46HbRCR C1hQnO+LOfDjgBH9t5TC9ZobHQraeFMBjjG9cB7rRlsOTGRXLKmWfPcuyfKtVbmwX33yQGX+wpGEb TmD8EUWxDqLUYiChrVj/6dqpuoi52lmdYrt20Cq8a6kf5uAcodn83SiTaofDcmwprwSC8jIGEB4DF 6LYQoLENVx1CFrWu818X/hw33l/6UTTPjtN43tfdCFXbI8k5LFqDA0AZhcyhZ7lvQ0GBBKyp73W97 /gicq93jPa1VaVfVi7poDzfybJSEQTo6fnXggpyuuUC2lpnV4QQtxF1Mo49R3DY8QJgrRSqHeqmW7 i1WxmAXe9wipBiyeEL4Q==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gtZmX-0000Ja-3F; Tue, 12 Feb 2019 15:15:33 +0000 Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gtZlT-0006Ws-G8 for linux-amlogic@lists.infradead.org; Tue, 12 Feb 2019 15:14:37 +0000 Received: by mail-wm1-x344.google.com with SMTP id x7so3349118wmj.0 for ; Tue, 12 Feb 2019 07:14:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=wrtE0/w9XBQq4RrLyXplyeDh0NH+b53jIT/DiR68Ud7xnMkw+Bwmf+YOPQ18UtRPEK 0UzHo8IpPf6V8Yi5Xpb6QRP8/vHnPw3uLcwCZNF+oqYoIr8RBviuLYPm7mjrSiscbgKA VprbXUIT8cyeskJzrppyZom5h+OJtrpBmva7+Fj+AOzMSjhbLJ5rJo6ipnJ485w31SMo xsE35hIQSBxLmHN59pHXoNus0ze8aRC2QGPjQ0rgDYEViYznAyM9NHe9eX983GfyxPRz /Znx6N8+/dp1dTvQc69+kzcrCBsvlsLG3KYbOvJZhlj76TT/HQwL0eJTP0pCqeTCRbFZ jx3g== 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=gX/dyjDLSpZsBP8Ako1lDKHH5OMyxQQgkLBf9iyVjDY=; b=po/XYd0lRH3F2CWrFXtU+7hO5fgtvqX7eyfJENr25vWmLQLDS8pEeZJulOypRrE08c fBNdANBRaZsRP3Ewn3QlxcwOlqhRjAXriSBzlQ9aOLECSPFX5j0HQNZ35AW6qGl7j8Ev HJnJnjkQ+hhBzDZHQ0jNuq4k8TIKNXtadRsW5BH+7qs+4HClXj0jcU1wQM+3itZNws+2 fKpZPFgdPT57hfBiRdKBjLZeYAKvsYiZIMzYc57SQOSxquJYRU8gPI1xtH/4X+qh5kFq jW9bOnXeXyhrBthCtPaxUBaCeCNnGWEK1avwvr8d8RQKqRdXFw1LVelGH6jQ9orvj96Y 2yEA== X-Gm-Message-State: AHQUAuac1qItteINIESH8iqRtTbH+zmxV5gXBxP/kRCvcTGwn/u6rYqd LpibHsnZswDHuVZJ9LdfgHnKsA== X-Google-Smtp-Source: AHgI3IZu6tf0SY0WQKvUQxs4uBL0ZqVZP9aea+gL8H0GFy33ML8K9VB/fc83GwnpKgwjr8jHBQAkpA== X-Received: by 2002:a1c:ac42:: with SMTP id v63mr3213364wme.119.1549984464882; Tue, 12 Feb 2019 07:14:24 -0800 (PST) Received: from bender.baylibre.local (lmontsouris-657-1-212-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) by smtp.gmail.com with ESMTPSA id c1sm1589515wmb.14.2019.02.12.07.14.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Feb 2019 07:14:23 -0800 (PST) From: Neil Armstrong To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Subject: [PATCH 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Tue, 12 Feb 2019 16:14:10 +0100 Message-Id: <20190212151413.24632-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190212151413.24632-1-narmstrong@baylibre.com> References: <20190212151413.24632-1-narmstrong@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190212_071428_175750_BFEDB1C5 X-CRM114-Status: GOOD ( 17.32 ) X-BeenThere: linux-amlogic@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-amlogic@lists.infradead.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Neil Armstrong Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-amlogic" Errors-To: linux-amlogic-bounces+linux-amlogic=archiver.kernel.org@lists.infradead.org This adds support for the USB2 PHY found in the Amlogic G12A SoC Family. It supports Host and/or Peripheral mode, depending on it's position. The first PHY is only used as Host, but the second supports Dual modes defined by the USB Control Glue HW in front of the USB Controllers. Signed-off-by: Neil Armstrong --- drivers/phy/amlogic/Kconfig | 12 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 191 ++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 drivers/phy/amlogic/phy-meson-g12a-usb2.c diff --git a/drivers/phy/amlogic/Kconfig b/drivers/phy/amlogic/Kconfig index 23fe1cda2f70..78d6e194dce9 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,15 @@ config PHY_MESON_GXL_USB3 Enable this to support the Meson USB3 PHY and OTG detection IP block found in Meson GXL and GXM SoCs. If unsure, say N. + +config PHY_MESON_G12A_USB2 + tristate "Meson G12A USB2 PHY drivers" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + depends on USB_SUPPORT + select GENERIC_PHY + select REGMAP_MMIO + help + Enable this to support the Meson USB2 PHYs found in Meson + G12A SoCs. + If unsure, say N. diff --git a/drivers/phy/amlogic/Makefile b/drivers/phy/amlogic/Makefile index 4fd8848c194d..7d4d10f5a6b3 100644 --- a/drivers/phy/amlogic/Makefile +++ b/drivers/phy/amlogic/Makefile @@ -1,3 +1,4 @@ obj-$(CONFIG_PHY_MESON8B_USB2) += phy-meson8b-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB2) += phy-meson-gxl-usb2.o +obj-$(CONFIG_PHY_MESON_G12A_USB2) += phy-meson-g12a-usb2.o obj-$(CONFIG_PHY_MESON_GXL_USB3) += phy-meson-gxl-usb3.o diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb2.c b/drivers/phy/amlogic/phy-meson-g12a-usb2.c new file mode 100644 index 000000000000..3b6271a8be02 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Meson G12A USB2 PHY driver + * + * Copyright (C) 2017 Martin Blumenstingl + * Copyright (C) 2017 Amlogic, Inc. All rights reserved + * Copyright (C) 2019 BayLibre, SAS + * Author: Neil Armstrong + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PHY_CTRL_R0 0x0 +#define PHY_CTRL_R1 0x4 +#define PHY_CTRL_R2 0x8 +#define PHY_CTRL_R3 0xc +#define PHY_CTRL_R4 0x10 +#define PHY_CTRL_R5 0x14 +#define PHY_CTRL_R6 0x18 +#define PHY_CTRL_R7 0x1c +#define PHY_CTRL_R8 0x20 +#define PHY_CTRL_R9 0x24 +#define PHY_CTRL_R10 0x28 +#define PHY_CTRL_R11 0x2c +#define PHY_CTRL_R12 0x30 +#define PHY_CTRL_R13 0x34 +#define PHY_CTRL_R14 0x38 +#define PHY_CTRL_R15 0x3c +#define PHY_CTRL_R16 0x40 +#define PHY_CTRL_R17 0x44 +#define PHY_CTRL_R18 0x48 +#define PHY_CTRL_R19 0x4c +#define PHY_CTRL_R20 0x50 +#define PHY_CTRL_R21 0x54 +#define PHY_CTRL_R22 0x58 +#define PHY_CTRL_R23 0x5c + +#define RESET_COMPLETE_TIME 1000 +#define PLL_RESET_COMPLETE_TIME 100 + +struct phy_meson_g12a_usb2_priv { + struct device *dev; + struct regmap *regmap; + struct clk *clk; + struct reset_control *reset; +}; + +static const struct regmap_config phy_meson_g12a_usb2_regmap_conf = { + .reg_bits = 8, + .val_bits = 32, + .reg_stride = 4, + .max_register = PHY_CTRL_R23, +}; + +static int phy_meson_g12a_usb2_init(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + int ret; + + ret = reset_control_reset(priv->reset); + if (ret) + return ret; + + udelay(RESET_COMPLETE_TIME); + + /* usb2_otg_aca_en == 0 */ + regmap_update_bits(priv->regmap, PHY_CTRL_R21, BIT(2), 0); + + /* PLL Setup : 24MHz * 20 / 1 = 480MHz */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x39400414); + regmap_write(priv->regmap, PHY_CTRL_R17, 0x927e0000); + regmap_write(priv->regmap, PHY_CTRL_R18, 0xac5f49e5); + + udelay(PLL_RESET_COMPLETE_TIME); + + /* UnReset PLL */ + regmap_write(priv->regmap, PHY_CTRL_R16, 0x19400414); + + /* PHY Tuning */ + regmap_write(priv->regmap, PHY_CTRL_R20, 0xfe18); + regmap_write(priv->regmap, PHY_CTRL_R4, 0x8000fff); + + /* Tuning Disconnect Threshold */ + regmap_write(priv->regmap, PHY_CTRL_R3, 0x34); + + /* Analog Settings */ + regmap_write(priv->regmap, PHY_CTRL_R14, 0); + regmap_write(priv->regmap, PHY_CTRL_R13, 0x78000); + + return 0; +} + +static int phy_meson_g12a_usb2_exit(struct phy *phy) +{ + struct phy_meson_g12a_usb2_priv *priv = phy_get_drvdata(phy); + + return reset_control_reset(priv->reset); +} + +/* set_mode is not needed, mode setting is handled via the UTMI bus */ +static const struct phy_ops phy_meson_g12a_usb2_ops = { + .init = phy_meson_g12a_usb2_init, + .exit = phy_meson_g12a_usb2_exit, + .owner = THIS_MODULE, +}; + +static int phy_meson_g12a_usb2_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct phy_provider *phy_provider; + struct resource *res; + struct phy_meson_g12a_usb2_priv *priv; + struct phy *phy; + void __iomem *base; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + platform_set_drvdata(pdev, priv); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + base = devm_ioremap_resource(dev, res); + if (IS_ERR(base)) + return PTR_ERR(base); + + priv->regmap = devm_regmap_init_mmio(dev, base, + &phy_meson_g12a_usb2_regmap_conf); + if (IS_ERR(priv->regmap)) + return PTR_ERR(priv->regmap); + + priv->clk = devm_clk_get(dev, "xtal"); + if (IS_ERR(priv->clk)) + return PTR_ERR(priv->clk); + + priv->reset = devm_reset_control_get(dev, "phy"); + if (IS_ERR(priv->reset)) + return PTR_ERR(priv->reset); + + ret = reset_control_deassert(priv->reset); + if (ret) + return ret; + + phy = devm_phy_create(dev, NULL, &phy_meson_g12a_usb2_ops); + if (IS_ERR(phy)) { + ret = PTR_ERR(phy); + if (ret != -EPROBE_DEFER) + dev_err(dev, "failed to create PHY\n"); + + return ret; + } + + phy_set_bus_width(phy, 8); + phy_set_drvdata(phy, priv); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + + return PTR_ERR_OR_ZERO(phy_provider); +} + +static const struct of_device_id phy_meson_g12a_usb2_of_match[] = { + { .compatible = "amlogic,g12a-usb2-phy", }, + { }, +}; +MODULE_DEVICE_TABLE(of, phy_meson_g12a_usb2_of_match); + +static struct platform_driver phy_meson_g12a_usb2_driver = { + .probe = phy_meson_g12a_usb2_probe, + .driver = { + .name = "phy-meson-g12a-usb2", + .of_match_table = phy_meson_g12a_usb2_of_match, + }, +}; +module_platform_driver(phy_meson_g12a_usb2_driver); + +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_AUTHOR("Neil Armstrong "); +MODULE_DESCRIPTION("Meson G12A USB2 PHY driver"); +MODULE_LICENSE("GPL v2"); -- 2.20.1 _______________________________________________ linux-amlogic mailing list linux-amlogic@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-amlogic