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,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 054B1C43381 for ; Mon, 4 Mar 2019 10:39:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BB7DA20663 for ; Mon, 4 Mar 2019 10:39:22 +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="ZRWhal5U" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726506AbfCDKjV (ORCPT ); Mon, 4 Mar 2019 05:39:21 -0500 Received: from mail-wm1-f65.google.com ([209.85.128.65]:51403 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726387AbfCDKi5 (ORCPT ); Mon, 4 Mar 2019 05:38:57 -0500 Received: by mail-wm1-f65.google.com with SMTP id n19so4072703wmi.1 for ; Mon, 04 Mar 2019 02:38:55 -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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=ZRWhal5UAPAGwSkEL4nmJcK/qy/nH+ppl2DwjZCviYVTyL9P6LJMOFWLVDDVJ4vooe iyOfixarHY7hMPqtrmNv+YOOgj8GBSwx4PDRlN9XOVAuGv4354TMBMlgCH9TY+wDRfiM vKTPSnbJClDfIgSvj2WoycdDjWYj4lceZJGp4VS8OM7PFavoxyptVwi/kUIXjDmHrAJr rdPuBq8L9+YSS1cqSmwttVJvzzkLLdd5M6qeRLMkwaQsy7qmTi86SzynXDjs3so0Gk+h 8RqFpD+CSWeEypeKm0nkDOB/I06bMr60DF+nOqN/4Xe+EcnPhU2utQO5J365Ff7W87eZ 1Ttw== 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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=niVuLLCJkKNpb5rvVYSKpUvkR8VL2VPJ/qdiwHDFz2oJFcNJz5BBcXEVDKa+wBZnWy YxFmzb0sz8V2Q6//Vyb+PY1XPRXNliUulHXnj/LC+OgXSGOafaBDqtpyg7/c+ro54ogz /iAecXtMwwiOSrIjBNo/bvR1JlZlnvviRMkrJvSxe6PHMryJ4+QBIoEWicFy7HphGXVo nF9v8xTzfvrWXFnwGB26G9q/Mi6GBMJ/JhQ4EaQ5GIouuL0fGxZU8+Fokc/7chkKqH9x RyZnUizDRhPdEE5ZiufWAQYPCSsPpVyBiNRnLx6K/ksHkjmxjKkxet/HzslYhrIe75rB Rs8w== X-Gm-Message-State: AHQUAuZzpVyK9JD20wc/6zM9vSSbBMLaBmTEHJGxD37gg+z5UMW3Y1Z3 26QgUUnmNFK1zvqjkokWqyGm+g== X-Google-Smtp-Source: AHgI3IZAp6oS3PKDahHjHYYIr51x+a6YNfE/B/IUusZbGB8tr+dcZVlzTC+vMAXufYznDLAlzdWniA== X-Received: by 2002:a1c:7903:: with SMTP id l3mr11433660wme.22.1551695934796; Mon, 04 Mar 2019 02:38:54 -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 g24sm5505676wmh.45.2019.03.04.02.38.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Mar 2019 02:38:54 -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 v2 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Mon, 4 Mar 2019 11:38:43 +0100 Message-Id: <20190304103846.2060-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190304103846.2060-1-narmstrong@baylibre.com> References: <20190304103846.2060-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 | 11 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 190 ++++++++++++++++++++++ 3 files changed, 202 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..560ff0f1ed4c 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,14 @@ 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 driver" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + 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..4712a9464ac9 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,190 @@ +// 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 + +#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: [v2,5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver From: Neil Armstrong Message-Id: <20190304103846.2060-6-narmstrong@baylibre.com> Date: Mon, 4 Mar 2019 11:38:43 +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 CiBkcml2ZXJzL3BoeS9hbWxvZ2ljL0tjb25maWcgICAgICAgICAgICAgICB8ICAxMSArKwogZHJp dmVycy9waHkvYW1sb2dpYy9NYWtlZmlsZSAgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9w aHkvYW1sb2dpYy9waHktbWVzb24tZzEyYS11c2IyLmMgfCAxOTAgKysrKysrKysrKysrKysrKysr KysrKwogMyBmaWxlcyBjaGFuZ2VkLCAyMDIgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcGh5L2FtbG9naWMvcGh5LW1lc29uLWcxMmEtdXNiMi5jCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9waHkvYW1sb2dpYy9LY29uZmlnIGIvZHJpdmVycy9waHkvYW1sb2dpYy9LY29u ZmlnCmluZGV4IDIzZmUxY2RhMmY3MC4uNTYwZmYwZjFlZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJz L3BoeS9hbWxvZ2ljL0tjb25maWcKKysrIGIvZHJpdmVycy9waHkvYW1sb2dpYy9LY29uZmlnCkBA IC0zNiwzICszNiwxNCBAQCBjb25maWcgUEhZX01FU09OX0dYTF9VU0IzCiAJICBFbmFibGUgdGhp cyB0byBzdXBwb3J0IHRoZSBNZXNvbiBVU0IzIFBIWSBhbmQgT1RHIGRldGVjdGlvbgogCSAgSVAg YmxvY2sgZm91bmQgaW4gTWVzb24gR1hMIGFuZCBHWE0gU29Dcy4KIAkgIElmIHVuc3VyZSwgc2F5 IE4uCisKK2NvbmZpZyBQSFlfTUVTT05fRzEyQV9VU0IyCisJdHJpc3RhdGUgIk1lc29uIEcxMkEg VVNCMiBQSFkgZHJpdmVyIgorCWRlZmF1bHQgQVJDSF9NRVNPTgorCWRlcGVuZHMgb24gT0YgJiYg KEFSQ0hfTUVTT04gfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVj dCBSRUdNQVBfTU1JTworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIE1lc29u IFVTQjIgUEhZcyBmb3VuZCBpbiBNZXNvbgorCSAgRzEyQSBTb0NzLgorCSAgSWYgdW5zdXJlLCBz YXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2FtbG9naWMvTWFrZWZpbGUgYi9kcml2ZXJz L3BoeS9hbWxvZ2ljL01ha2VmaWxlCmluZGV4IDRmZDg4NDhjMTk0ZC4uN2Q0ZDEwZjVhNmIzIDEw MDY0NAotLS0gYS9kcml2ZXJzL3BoeS9hbWxvZ2ljL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGh5 L2FtbG9naWMvTWFrZWZpbGUKQEAgLTEsMyArMSw0IEBACiBvYmotJChDT05GSUdfUEhZX01FU09O OEJfVVNCMikJCSs9IHBoeS1tZXNvbjhiLXVzYjIubwogb2JqLSQoQ09ORklHX1BIWV9NRVNPTl9H WExfVVNCMikJKz0gcGh5LW1lc29uLWd4bC11c2IyLm8KK29iai0kKENPTkZJR19QSFlfTUVTT05f RzEyQV9VU0IyKQkrPSBwaHktbWVzb24tZzEyYS11c2IyLm8KIG9iai0kKENPTkZJR19QSFlfTUVT T05fR1hMX1VTQjMpCSs9IHBoeS1tZXNvbi1neGwtdXNiMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJz L3BoeS9hbWxvZ2ljL3BoeS1tZXNvbi1nMTJhLXVzYjIuYyBiL2RyaXZlcnMvcGh5L2FtbG9naWMv cGh5LW1lc29uLWcxMmEtdXNiMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uNDcxMmE5NDY0YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvYW1sb2dp Yy9waHktbWVzb24tZzEyYS11c2IyLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogTWVzb24gRzEyQSBVU0IyIFBIWSBkcml2ZXIK KyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgTWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJs dW1lbnN0aW5nbEBnb29nbGVtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbWxvZ2lj LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqIENvcHlyaWdodCAoQykgMjAxOSBCYXlMaWJy ZSwgU0FTCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNv bT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXku aD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2lu Y2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorI2lu Y2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2Uu aD4KKworI2RlZmluZSBQSFlfQ1RSTF9SMAkJCQkJCTB4MAorI2RlZmluZSBQSFlfQ1RSTF9SMQkJ CQkJCTB4NAorI2RlZmluZSBQSFlfQ1RSTF9SMgkJCQkJCTB4OAorI2RlZmluZSBQSFlfQ1RSTF9S MwkJCQkJCTB4YworI2RlZmluZSBQSFlfQ1RSTF9SNAkJCQkJCTB4MTAKKyNkZWZpbmUgUEhZX0NU UkxfUjUJCQkJCQkweDE0CisjZGVmaW5lIFBIWV9DVFJMX1I2CQkJCQkJMHgxOAorI2RlZmluZSBQ SFlfQ1RSTF9SNwkJCQkJCTB4MWMKKyNkZWZpbmUgUEhZX0NUUkxfUjgJCQkJCQkweDIwCisjZGVm aW5lIFBIWV9DVFJMX1I5CQkJCQkJMHgyNAorI2RlZmluZSBQSFlfQ1RSTF9SMTAJCQkJCQkweDI4 CisjZGVmaW5lIFBIWV9DVFJMX1IxMQkJCQkJCTB4MmMKKyNkZWZpbmUgUEhZX0NUUkxfUjEyCQkJ CQkJMHgzMAorI2RlZmluZSBQSFlfQ1RSTF9SMTMJCQkJCQkweDM0CisjZGVmaW5lIFBIWV9DVFJM X1IxNAkJCQkJCTB4MzgKKyNkZWZpbmUgUEhZX0NUUkxfUjE1CQkJCQkJMHgzYworI2RlZmluZSBQ SFlfQ1RSTF9SMTYJCQkJCQkweDQwCisjZGVmaW5lIFBIWV9DVFJMX1IxNwkJCQkJCTB4NDQKKyNk ZWZpbmUgUEhZX0NUUkxfUjE4CQkJCQkJMHg0OAorI2RlZmluZSBQSFlfQ1RSTF9SMTkJCQkJCQkw eDRjCisjZGVmaW5lIFBIWV9DVFJMX1IyMAkJCQkJCTB4NTAKKyNkZWZpbmUgUEhZX0NUUkxfUjIx CQkJCQkJMHg1NAorI2RlZmluZSBQSFlfQ1RSTF9SMjIJCQkJCQkweDU4CisjZGVmaW5lIFBIWV9D VFJMX1IyMwkJCQkJCTB4NWMKKworI2RlZmluZSBSRVNFVF9DT01QTEVURV9USU1FCQkJCQkxMDAw CisjZGVmaW5lIFBMTF9SRVNFVF9DT01QTEVURV9USU1FCQkJCQkxMDAKKworc3RydWN0IHBoeV9t ZXNvbl9nMTJhX3VzYjJfcHJpdiB7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgcmVn bWFwCQkqcmVnbWFwOworCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wJ KnJlc2V0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHBoeV9tZXNv bl9nMTJhX3VzYjJfcmVnbWFwX2NvbmYgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMg PSAzMiwKKwkucmVnX3N0cmlkZSA9IDQsCisJLm1heF9yZWdpc3RlciA9IFBIWV9DVFJMX1IyMywK K307CisKK3N0YXRpYyBpbnQgcGh5X21lc29uX2cxMmFfdXNiMl9pbml0KHN0cnVjdCBwaHkgKnBo eSkKK3sKKwlzdHJ1Y3QgcGh5X21lc29uX2cxMmFfdXNiMl9wcml2ICpwcml2ID0gcGh5X2dldF9k cnZkYXRhKHBoeSk7CisJaW50IHJldDsKKworCXJldCA9IHJlc2V0X2NvbnRyb2xfcmVzZXQocHJp di0+cmVzZXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1ZGVsYXkoUkVTRVRfQ09N UExFVEVfVElNRSk7CisKKwkvKiB1c2IyX290Z19hY2FfZW4gPT0gMCAqLworCXJlZ21hcF91cGRh dGVfYml0cyhwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IyMSwgQklUKDIpLCAwKTsKKworCS8qIFBM TCBTZXR1cCA6IDI0TUh6ICogMjAgLyAxID0gNDgwTUh6ICovCisJcmVnbWFwX3dyaXRlKHByaXYt PnJlZ21hcCwgUEhZX0NUUkxfUjE2LCAweDM5NDAwNDE0KTsKKwlyZWdtYXBfd3JpdGUocHJpdi0+ cmVnbWFwLCBQSFlfQ1RSTF9SMTcsIDB4OTI3ZTAwMDApOworCXJlZ21hcF93cml0ZShwcml2LT5y ZWdtYXAsIFBIWV9DVFJMX1IxOCwgMHhhYzVmNDllNSk7CisKKwl1ZGVsYXkoUExMX1JFU0VUX0NP TVBMRVRFX1RJTUUpOworCisJLyogVW5SZXNldCBQTEwgKi8KKwlyZWdtYXBfd3JpdGUocHJpdi0+ cmVnbWFwLCBQSFlfQ1RSTF9SMTYsIDB4MTk0MDA0MTQpOworCisJLyogUEhZIFR1bmluZyAqLwor CXJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IyMCwgMHhmZTE4KTsKKwlyZWdt YXBfd3JpdGUocHJpdi0+cmVnbWFwLCBQSFlfQ1RSTF9SNCwgMHg4MDAwZmZmKTsKKworCS8qIFR1 bmluZyBEaXNjb25uZWN0IFRocmVzaG9sZCAqLworCXJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAs IFBIWV9DVFJMX1IzLCAweDM0KTsKKworCS8qIEFuYWxvZyBTZXR0aW5ncyAqLworCXJlZ21hcF93 cml0ZShwcml2LT5yZWdtYXAsIFBIWV9DVFJMX1IxNCwgMCk7CisJcmVnbWFwX3dyaXRlKHByaXYt PnJlZ21hcCwgUEhZX0NUUkxfUjEzLCAweDc4MDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHBoeV9tZXNvbl9nMTJhX3VzYjJfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3Ry dWN0IHBoeV9tZXNvbl9nMTJhX3VzYjJfcHJpdiAqcHJpdiA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkp OworCisJcmV0dXJuIHJlc2V0X2NvbnRyb2xfcmVzZXQocHJpdi0+cmVzZXQpOworfQorCisvKiBz ZXRfbW9kZSBpcyBub3QgbmVlZGVkLCBtb2RlIHNldHRpbmcgaXMgaGFuZGxlZCB2aWEgdGhlIFVU TUkgYnVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcGh5X21lc29uX2cxMmFfdXNi Ml9vcHMgPSB7CisJLmluaXQJCT0gcGh5X21lc29uX2cxMmFfdXNiMl9pbml0LAorCS5leGl0CQk9 IHBoeV9tZXNvbl9nMTJhX3VzYjJfZXhpdCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9Owor CitzdGF0aWMgaW50IHBoeV9tZXNvbl9nMTJhX3VzYjJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVj dCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlz dHJ1Y3QgcGh5X21lc29uX2cxMmFfdXNiMl9wcml2ICpwcml2OworCXN0cnVjdCBwaHkgKnBoeTsK Kwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldDsKKworCXByaXYgPSBkZXZtX2t6YWxsb2Mo ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAt RU5PTUVNOworCisJcHJpdi0+ZGV2ID0gZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYs IHByaXYpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0Vf TUVNLCAwKTsKKwliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAo SVNfRVJSKGJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKworCXByaXYtPnJlZ21hcCA9 IGRldm1fcmVnbWFwX2luaXRfbW1pbyhkZXYsIGJhc2UsCisJCQkJCSAgICAgJnBoeV9tZXNvbl9n MTJhX3VzYjJfcmVnbWFwX2NvbmYpOworCWlmIChJU19FUlIocHJpdi0+cmVnbWFwKSkKKwkJcmV0 dXJuIFBUUl9FUlIocHJpdi0+cmVnbWFwKTsKKworCXByaXYtPmNsayA9IGRldm1fY2xrX2dldChk ZXYsICJ4dGFsIik7CisJaWYgKElTX0VSUihwcml2LT5jbGspKQorCQlyZXR1cm4gUFRSX0VSUihw cml2LT5jbGspOworCisJcHJpdi0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwg InBoeSIpOworCWlmIChJU19FUlIocHJpdi0+cmVzZXQpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2 LT5yZXNldCk7CisKKwlyZXQgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHByaXYtPnJlc2V0KTsK KwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwg TlVMTCwgJnBoeV9tZXNvbl9nMTJhX3VzYjJfb3BzKTsKKwlpZiAoSVNfRVJSKHBoeSkpIHsKKwkJ cmV0ID0gUFRSX0VSUihwaHkpOworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZf ZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKworCQlyZXR1cm4gcmV0OworCX0K KworCXBoeV9zZXRfYnVzX3dpZHRoKHBoeSwgOCk7CisJcGh5X3NldF9kcnZkYXRhKHBoeSwgcHJp dik7CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYs IG9mX3BoeV9zaW1wbGVfeGxhdGUpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJv dmlkZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwaHlfbWVzb25f ZzEyYV91c2IyX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLGcxMmEt dXNiMi1waHkiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwaHlfbWVz b25fZzEyYV91c2IyX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIg cGh5X21lc29uX2cxMmFfdXNiMl9kcml2ZXIgPSB7CisJLnByb2JlCT0gcGh5X21lc29uX2cxMmFf dXNiMl9wcm9iZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQkJPSAicGh5LW1lc29uLWcxMmEtdXNi MiIsCisJCS5vZl9tYXRjaF90YWJsZQk9IHBoeV9tZXNvbl9nMTJhX3VzYjJfb2ZfbWF0Y2gsCisJ fSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBoeV9tZXNvbl9nMTJhX3VzYjJfZHJpdmVy KTsKKworTU9EVUxFX0FVVEhPUigiTWFydGluIEJsdW1lbnN0aW5nbCA8bWFydGluLmJsdW1lbnN0 aW5nbEBnb29nbGVtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk5laWwgQXJtc3Ryb25nIDxu YXJtc3Ryb25nQGJheWxpYnJlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWVzb24gRzEy QSBVU0IyIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK 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,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 1F798C43381 for ; Mon, 4 Mar 2019 10:40:14 +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 E286B20663 for ; Mon, 4 Mar 2019 10:40:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="RYp+BgMs"; 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="ZRWhal5U" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E286B20663 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=dGSNSo3o5wCEbiVAfRMCiTgRCm0i+73BLQoD8MQwjGk=; b=RYp+BgMsv4747P NwEjAA6+gjQ0GZBMw1fMTj2DnaMVkUdTyK8+KPg5jzT5TRBgRvCY3NBsRFqTFnTk7fZGK53exkG2p zaqybUS1rrAdT8TeYX4kWPcS3a6KSC405zOa8cEnBURcPUZjO0LzG6E1O9u2OZchwtAHQII0TbInV EjhkU4WlUmglfXn8B2s3wqGoRHv+T2Un4/e2j5zmkKWBizRs0d2gZbqWEk2uybACfVqdXEj+2x/Bg DqFPBkuMgvNgcJh4SgSe2NaqHxz4qYnD8O+rPu1k/rxlIG5WzuUmV4D+aUx7/Ji6ZBDIO6ioPebv3 2OFqQTVUhfDKbjNpeL0w==; 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 1h0l0y-0003ms-I8; Mon, 04 Mar 2019 10:40:08 +0000 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0kzo-0001wf-8n for linux-arm-kernel@lists.infradead.org; Mon, 04 Mar 2019 10:39:04 +0000 Received: by mail-wm1-x341.google.com with SMTP id f3so1653246wmj.4 for ; Mon, 04 Mar 2019 02:38:56 -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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=ZRWhal5UAPAGwSkEL4nmJcK/qy/nH+ppl2DwjZCviYVTyL9P6LJMOFWLVDDVJ4vooe iyOfixarHY7hMPqtrmNv+YOOgj8GBSwx4PDRlN9XOVAuGv4354TMBMlgCH9TY+wDRfiM vKTPSnbJClDfIgSvj2WoycdDjWYj4lceZJGp4VS8OM7PFavoxyptVwi/kUIXjDmHrAJr rdPuBq8L9+YSS1cqSmwttVJvzzkLLdd5M6qeRLMkwaQsy7qmTi86SzynXDjs3so0Gk+h 8RqFpD+CSWeEypeKm0nkDOB/I06bMr60DF+nOqN/4Xe+EcnPhU2utQO5J365Ff7W87eZ 1Ttw== 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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=RM+ESvCg8EnJM0i3Im95fZquQ7PF6kUIK1ZgSF1YIgjYbiKQUtf59pzLSwfmkMBg5e Q3XzHjHrv2R6ZBPEHzly+oXuPjWy/2sCGhyIAJfaVSHVcMvivydYo9yOcbTLBJ/xUdGu lq4Rma3oq8pY2rwx4gvjNDGeqyqbNSZRq6RkweVZVAi7zBX0GaUzPXq0/Gs/fIs1mhGA 5+mghF/BERKcQ40DcF19g9lYlkfQl+sN5lBDIiDBnRX5DHx7Rw6jw1BUUOtjNDkFRT4H KoDDZoQx0WURduNfEVYJAQML6g7VGGHKQtjf52PrHtc+/GpgpSSHNXSGYWnbOzm6hhbP 0+qw== X-Gm-Message-State: AHQUAuZCcSBwtdlUsoUBxr/Ra0wBEOIS2EfXfdZV0yg2kLHk3gqD22Va 73aqMbTXZW4FtmfH8Xb7eY3trw== X-Google-Smtp-Source: AHgI3IZAp6oS3PKDahHjHYYIr51x+a6YNfE/B/IUusZbGB8tr+dcZVlzTC+vMAXufYznDLAlzdWniA== X-Received: by 2002:a1c:7903:: with SMTP id l3mr11433660wme.22.1551695934796; Mon, 04 Mar 2019 02:38:54 -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 g24sm5505676wmh.45.2019.03.04.02.38.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Mar 2019 02:38:54 -0800 (PST) From: Neil Armstrong To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Subject: [PATCH v2 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Mon, 4 Mar 2019 11:38:43 +0100 Message-Id: <20190304103846.2060-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190304103846.2060-1-narmstrong@baylibre.com> References: <20190304103846.2060-1-narmstrong@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190304_023856_615601_4428336B X-CRM114-Status: GOOD ( 19.05 ) 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 | 11 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 190 ++++++++++++++++++++++ 3 files changed, 202 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..560ff0f1ed4c 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,14 @@ 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 driver" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + 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..4712a9464ac9 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,190 @@ +// 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 + +#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 4D01FC43381 for ; Mon, 4 Mar 2019 10:40:25 +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 16C9920663 for ; Mon, 4 Mar 2019 10:40:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="d409wqur"; 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="ZRWhal5U" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 16C9920663 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=o9OiaRPe5+cEQ30U/+M1KiDrP1FEqQQpaNh2rCR7MPo=; b=d409wqurSXDGGC eOMN7TvEOO5Ai/JHqp/9rX8+gfGW/FrRRk71sz4YbXJ70btpgHes5OSNESGZf1oLf8W9iTUK85ooi lS3BVhdtiHgjbWZH56/qi9w+NDsarhrJVM9/44VZva6Ha9nIRMisLgRaMlqAbY8ku3/eLrAq3xFli 2tvJxQy0a9x0Flou9nJHrwIPuVbcf2/OeF2Wz2/QyMbp+9Ah+tH3KVFvBHmjUfxLy8UbnMErr8f5T 39/aCKZLoYKgp8JZIaDLT9Jt0URhKRtev5WAsgbz2q864A9WyVQJTlS68IKDhbLhnidjQ+iC3Pm4Z hiJYGmgVMA5eywoq3CLw==; 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 1h0l1A-0004rj-JF; Mon, 04 Mar 2019 10:40:20 +0000 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0kzo-0001wg-92 for linux-amlogic@lists.infradead.org; Mon, 04 Mar 2019 10:39:04 +0000 Received: by mail-wm1-x341.google.com with SMTP id g20so4136608wmh.5 for ; Mon, 04 Mar 2019 02:38:56 -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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=ZRWhal5UAPAGwSkEL4nmJcK/qy/nH+ppl2DwjZCviYVTyL9P6LJMOFWLVDDVJ4vooe iyOfixarHY7hMPqtrmNv+YOOgj8GBSwx4PDRlN9XOVAuGv4354TMBMlgCH9TY+wDRfiM vKTPSnbJClDfIgSvj2WoycdDjWYj4lceZJGp4VS8OM7PFavoxyptVwi/kUIXjDmHrAJr rdPuBq8L9+YSS1cqSmwttVJvzzkLLdd5M6qeRLMkwaQsy7qmTi86SzynXDjs3so0Gk+h 8RqFpD+CSWeEypeKm0nkDOB/I06bMr60DF+nOqN/4Xe+EcnPhU2utQO5J365Ff7W87eZ 1Ttw== 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=KE/Ag92eZkmaEXb+bw28OqTZIKfiGkWvL6G21tsdm6c=; b=iFG8/qbcfnpKfgddi6VXER0VsJUgbYFpnGDxTeFEzzspSSpZbiDwflHIdRJJGAXC/Z 9l4V5mU10r8+38CsG59w+DDDSa2V1Ydp1MZsTL2vBG3x/AP0PTMcrOU2L4eVjEDkunTN R/N/npq8z8hl5VtEl5RTC/fRfrEs5kwQ8ca6eyG1bEXLJzN7DyEkkqiZ5zi7ne+qHjEc bZ8RgiWtcb3jK2amvM8871wKOK5XR1a8kK7/hnsbfxeEe1P9y57OH8yyegV9iy/sGnX9 H1+Kwb8h4ISkDOjyZJSq1TzngbenAd1SmO65S1hdlI4LuezopU+SDBO2U9wRluF54kDp +QLQ== X-Gm-Message-State: AHQUAuY1A3LK0h+0bONLIh4P9lI2jdEDLG9WY5L3KtBDpRdNY4m/lY+l 0WH7nP4/rCNHW/uvVZ842c+MeA== X-Google-Smtp-Source: AHgI3IZAp6oS3PKDahHjHYYIr51x+a6YNfE/B/IUusZbGB8tr+dcZVlzTC+vMAXufYznDLAlzdWniA== X-Received: by 2002:a1c:7903:: with SMTP id l3mr11433660wme.22.1551695934796; Mon, 04 Mar 2019 02:38:54 -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 g24sm5505676wmh.45.2019.03.04.02.38.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Mar 2019 02:38:54 -0800 (PST) From: Neil Armstrong To: gregkh@linuxfoundation.org, hminas@synopsys.com, balbi@kernel.org, kishon@ti.com Subject: [PATCH v2 5/8] phy: amlogic: add Amlogic G12A USB2 PHY Driver Date: Mon, 4 Mar 2019 11:38:43 +0100 Message-Id: <20190304103846.2060-6-narmstrong@baylibre.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190304103846.2060-1-narmstrong@baylibre.com> References: <20190304103846.2060-1-narmstrong@baylibre.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190304_023856_695079_897E3C32 X-CRM114-Status: GOOD ( 17.59 ) 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 | 11 ++ drivers/phy/amlogic/Makefile | 1 + drivers/phy/amlogic/phy-meson-g12a-usb2.c | 190 ++++++++++++++++++++++ 3 files changed, 202 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..560ff0f1ed4c 100644 --- a/drivers/phy/amlogic/Kconfig +++ b/drivers/phy/amlogic/Kconfig @@ -36,3 +36,14 @@ 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 driver" + default ARCH_MESON + depends on OF && (ARCH_MESON || COMPILE_TEST) + 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..4712a9464ac9 --- /dev/null +++ b/drivers/phy/amlogic/phy-meson-g12a-usb2.c @@ -0,0 +1,190 @@ +// 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 + +#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