From patchwork Sun Feb 4 20:11:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= X-Patchwork-Id: 869087 X-Patchwork-Delegate: daniel.schwierzeck@googlemail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="J4dI03jd"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zZMQx4Dwqz9sBZ for ; Mon, 5 Feb 2018 07:15:21 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 32796C21E50; Sun, 4 Feb 2018 20:14:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 02C40C21E73; Sun, 4 Feb 2018 20:13:02 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 61344C21E52; Sun, 4 Feb 2018 20:11:24 +0000 (UTC) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by lists.denx.de (Postfix) with ESMTPS id 0462BC21EA7 for ; Sun, 4 Feb 2018 20:11:21 +0000 (UTC) Received: by mail-wr0-f193.google.com with SMTP id t94so16054055wrc.5 for ; Sun, 04 Feb 2018 12:11:21 -0800 (PST) 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=iVwLs3mEVLEpcB+VBkGDbi4WKbkzwgw3S4uOGhOQQPI=; b=J4dI03jd8YdQ5q+1kkgxJV5w2twHrmf84Jh3ULokP/dlq1NsIz5YJbRQM+XU6nMPZy edhLTA3vCi7QUPjGHG6TQLIM0geUdcLXhzb45gRiKhEBxVuFnvXrH3viw6ZlQOFMKmyV kngdVeF4gR2EUZTW+OV4SIkZWk2r2NtQJmAtNcqLiYpCK2OOvVdwh8rVD00tVuiJQYXS VYDdGXCEM0iLj/UyaaoBVHikJLO5JE7IlIDze1LFdufdCOHso06qxpYsZAZMDnWgVMHQ Ig2C1PhxSZuHSUyaSIsjgtJZnVSMWbbS/9tIMKFT3+Ng2DOxvM4kvcy8nLVxnVpG3GC8 V1ow== 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=iVwLs3mEVLEpcB+VBkGDbi4WKbkzwgw3S4uOGhOQQPI=; b=WRtisxe0gyD+y9Nl8TOA78Dbvuqdmt+xb0sX6kBC7zPypFcYr7GcOIErgYGhQldf3s 88p4R0nqxHWN1STHYDHtDyiB7nxOQ4xiocBrfTawRQaenDqpNXhJE1I5YOvm5I/nAVec 85Z4IpWn6JLUxvWDesI1erLPcgDovWCWFk42vJR6T3rk2wS8vaWzaoKhzOETXPh49X24 qYqZzFWGss9uE7tVhn4+QQsWBwgifjVEkBtbwL8D+w94cagmcsNFsc7HqtyQupu2pMKd Lp8lwdP9qehb8JUMBpXt3utTIVhA/1ppv7SX6iqk1QWmoyUi1JsQc1HrxIf+Uw3wz09r LX3Q== X-Gm-Message-State: AKwxytd8IRqGI3LczZJ5VAAUGAVJf3wuw7spOaR9Ne8LBJvH1+s04UyW 7Aff3ewQqEsOrgh/UO1KmM5/5JUd X-Google-Smtp-Source: AH8x227yGUb3Ry37cnUDtsYr/rRmfU7ZW4v79oH1sXCRy46Ty32TidBiiGF0DhBgwon+5OkvEvD5nA== X-Received: by 10.223.171.168 with SMTP id s37mr4618710wrc.154.1517775080458; Sun, 04 Feb 2018 12:11:20 -0800 (PST) Received: from skynet.lan (175.red-2-137-31.dynamicip.rima-tde.net. [2.137.31.175]) by smtp.gmail.com with ESMTPSA id p4sm7283529wrb.59.2018.02.04.12.11.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 04 Feb 2018 12:11:19 -0800 (PST) From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= To: u-boot@lists.denx.de, marex@denx.de, daniel.schwierzeck@gmail.com, sjg@chromium.org Date: Sun, 4 Feb 2018 21:11:15 +0100 Message-Id: <20180204201117.1695-2-noltari@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180204201117.1695-1-noltari@gmail.com> References: <20180204101955.27900-1-noltari@gmail.com> <20180204201117.1695-1-noltari@gmail.com> MIME-Version: 1.0 Subject: [U-Boot] [PATCH v2 1/3] phy: add support for bcm6318 usbh phy X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Signed-off-by: Álvaro Fernández Rojas Reviewed-by: Daniel Schwierzeck --- v2: no changes drivers/phy/Kconfig | 7 ++ drivers/phy/Makefile | 1 + drivers/phy/bcm6318-usbh-phy.c | 144 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 drivers/phy/bcm6318-usbh-phy.c diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index d3fa9ded2a..4e9d09910c 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -59,6 +59,13 @@ config SPL_NOP_PHY This is useful when a driver uses the PHY framework but no real PHY hardware exists. +config BCM6318_USBH_PHY + bool "BCM6318 USBH PHY support" + depends on PHY && ARCH_BMIPS + select POWER_DOMAIN + help + Support for the Broadcom MIPS BCM6318 USBH PHY. + config BCM6348_USBH_PHY bool "BCM6348 USBH PHY support" depends on PHY && ARCH_BMIPS diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index d8239854a3..68087ae3b1 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_$(SPL_)PHY) += phy-uclass.o obj-$(CONFIG_$(SPL_)NOP_PHY) += nop-phy.o +obj-$(CONFIG_BCM6318_USBH_PHY) += bcm6318-usbh-phy.o obj-$(CONFIG_BCM6348_USBH_PHY) += bcm6348-usbh-phy.o obj-$(CONFIG_BCM6358_USBH_PHY) += bcm6358-usbh-phy.o obj-$(CONFIG_BCM6368_USBH_PHY) += bcm6368-usbh-phy.o diff --git a/drivers/phy/bcm6318-usbh-phy.c b/drivers/phy/bcm6318-usbh-phy.c new file mode 100644 index 0000000000..9f22269ced --- /dev/null +++ b/drivers/phy/bcm6318-usbh-phy.c @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2018 Álvaro Fernández Rojas + * + * Derived from linux/arch/mips/bcm63xx/usb-common.c: + * Copyright 2008 Maxime Bizon + * Copyright 2013 Florian Fainelli + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* USBH Setup register */ +#define USBH_SETUP_REG 0x00 +#define USBH_SETUP_IOC BIT(4) + +/* USBH PLL Control register */ +#define USBH_PLL_REG 0x04 +#define USBH_PLL_SUSP_EN BIT(27) +#define USBH_PLL_IDDQ_PWRDN BIT(31) + +/* USBH Swap Control register */ +#define USBH_SWAP_REG 0x0c +#define USBH_SWAP_OHCI_DATA BIT(0) +#define USBH_SWAP_OHCI_ENDIAN BIT(1) +#define USBH_SWAP_EHCI_DATA BIT(3) +#define USBH_SWAP_EHCI_ENDIAN BIT(4) + +/* USBH Sim Control register */ +#define USBH_SIM_REG 0x20 +#define USBH_SIM_LADDR BIT(5) + +struct bcm6318_usbh_priv { + void __iomem *regs; +}; + +static int bcm6318_usbh_init(struct phy *phy) +{ + struct bcm6318_usbh_priv *priv = dev_get_priv(phy->dev); + + /* enable pll control susp */ + setbits_be32(priv->regs + USBH_PLL_REG, USBH_PLL_SUSP_EN); + + /* configure to work in native cpu endian */ + clrsetbits_be32(priv->regs + USBH_SWAP_REG, + USBH_SWAP_EHCI_ENDIAN | USBH_SWAP_OHCI_ENDIAN, + USBH_SWAP_EHCI_DATA | USBH_SWAP_OHCI_DATA); + + /* setup config */ + setbits_be32(priv->regs + USBH_SETUP_REG, USBH_SETUP_IOC); + + /* disable pll control pwrdn */ + clrbits_be32(priv->regs + USBH_PLL_REG, USBH_PLL_IDDQ_PWRDN); + + /* sim control config */ + setbits_be32(priv->regs + USBH_SIM_REG, USBH_SIM_LADDR); + + return 0; +} + +static struct phy_ops bcm6318_usbh_ops = { + .init = bcm6318_usbh_init, +}; + +static const struct udevice_id bcm6318_usbh_ids[] = { + { .compatible = "brcm,bcm6318-usbh" }, + { /* sentinel */ } +}; + +static int bcm6318_usbh_probe(struct udevice *dev) +{ + struct bcm6318_usbh_priv *priv = dev_get_priv(dev); + struct power_domain pwr_dom; + struct reset_ctl rst_ctl; + struct clk clk; + fdt_addr_t addr; + fdt_size_t size; + int ret; + + addr = devfdt_get_addr_size_index(dev, 0, &size); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->regs = ioremap(addr, size); + + /* enable usbh clock */ + ret = clk_get_by_name(dev, "usbh", &clk); + if (ret < 0) + return ret; + + ret = clk_enable(&clk); + if (ret < 0) + return ret; + + ret = clk_free(&clk); + if (ret < 0) + return ret; + + /* enable power domain */ + ret = power_domain_get(dev, &pwr_dom); + if (ret < 0) + return ret; + + ret = power_domain_on(&pwr_dom); + if (ret < 0) + return ret; + + ret = power_domain_free(&pwr_dom); + if (ret < 0) + return ret; + + /* perform reset */ + ret = reset_get_by_index(dev, 0, &rst_ctl); + if (ret < 0) + return ret; + + ret = reset_deassert(&rst_ctl); + if (ret < 0) + return ret; + + ret = reset_free(&rst_ctl); + if (ret < 0) + return ret; + + mdelay(100); + + return 0; +} + +U_BOOT_DRIVER(bcm6318_usbh) = { + .name = "bcm6318-usbh", + .id = UCLASS_PHY, + .of_match = bcm6318_usbh_ids, + .ops = &bcm6318_usbh_ops, + .priv_auto_alloc_size = sizeof(struct bcm6318_usbh_priv), + .probe = bcm6318_usbh_probe, +};