From patchwork Wed Aug 28 17:12:15 2019 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: 1154663 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; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XYGLBioQ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46JXQF6tbhz9sDB for ; Thu, 29 Aug 2019 03:13:41 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id A34C0C21E13; Wed, 28 Aug 2019 17:12:39 +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, 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 B63F1C21E13; Wed, 28 Aug 2019 17:12:28 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 45B32C21C27; Wed, 28 Aug 2019 17:12:27 +0000 (UTC) Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by lists.denx.de (Postfix) with ESMTPS id E2D7BC21C27 for ; Wed, 28 Aug 2019 17:12:26 +0000 (UTC) Received: by mail-wm1-f65.google.com with SMTP id t17so867256wmi.2 for ; Wed, 28 Aug 2019 10:12:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=5fPcWXnmkgb5Y+Aq8dXSaR97O6LeFnz9iCN97LkwE+g=; b=XYGLBioQL2z+MCwU1TkFd5p9e/JHVTr7QnDQNTPeR834Bh3ezC1/UXrbny029o0n9C QJjDucxbHmxfoOhPdRHdUtuojwp5GIgBrNGAfOpf3PqUp5mmyQc93Qp5+myy2/8LqTfH hQZfVgXo0nxVZKkjlt5bYgZz8rnU1X5HrCRvZUCeNTqvFnY49zb9YlLTK1LSC8hLRT4T mQpwpRvPUsqC3gPtQAvOJsDo1f0WsOeTl2CYLMF6IqHHF40NwPZTTNt9FfEMhFc6mCll 9gHJOBRmZ5b+ie6yq/ySQlT8gvoHWtDjMwAHhPIonH/vAPEaJ54dztA4qPIcXQNWghd3 nTWA== 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=5fPcWXnmkgb5Y+Aq8dXSaR97O6LeFnz9iCN97LkwE+g=; b=SHJwGU9X6JxMQDbnJGmrIfDcYK7W7HW1V2J0sWUMXawopNXB5TsqaLiWyTsKr36snK 7gPLb50/YwnsRA4ETTjui6U18P6X3vsJN+YdmAa/rtNkp91E2h15m4MabEtRK+twsYxL CWgDijzdtJvCjQ5eP7HeQ/5tEp8ebXfKkt69sy+n94qc1XxHFirpHyEt5RYwaBWFhf7+ GQCufoCP6FuDu9UKxFIzTfajNG8v1Eryth8ohI2+3xa33tGMxKTVyAXfh740H3M/2rle iUri+ItIHprBuOwusz/UD7IY4W6LMHQFcw953p2SoiD9UQnIrvfG9s8RQKhgfrH94Zfl MeAA== X-Gm-Message-State: APjAAAXh0LbUBtTLN5ugq8FbMXE+jO0jRfsojKDeo48f3BBID+odrGSJ O3PtSpLdDjR9ZvaSbu9d1+5544Ah X-Google-Smtp-Source: APXvYqzkLxc+65H7/gNKVk8weVCekR6tzGCesnaEQ6cEPsERK2L5MnGFt7wsjTBqkkofbZeH5FisnQ== X-Received: by 2002:a1c:7d08:: with SMTP id y8mr6526360wmc.50.1567012346308; Wed, 28 Aug 2019 10:12:26 -0700 (PDT) Received: from skynet.lan (68.red-83-44-14.dynamicip.rima-tde.net. [83.44.14.68]) by smtp.gmail.com with ESMTPSA id y14sm2814946wrd.84.2019.08.28.10.12.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Aug 2019 10:12:25 -0700 (PDT) From: =?utf-8?q?=C3=81lvaro_Fern=C3=A1ndez_Rojas?= To: u-boot@lists.denx.de, philippe.reynes@softathome.com, trini@konsulko.com, daniel.schwierzeck@gmail.com Date: Wed, 28 Aug 2019 19:12:15 +0200 Message-Id: <20190828171220.26175-2-noltari@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190828171220.26175-1-noltari@gmail.com> References: <20190828114418.16452-1-noltari@gmail.com> <20190828171220.26175-1-noltari@gmail.com> MIME-Version: 1.0 Subject: [U-Boot] [PATCH V3 1/6] nand: brcm: add BCM6368 support 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" This adds support for BCM6368, BCM6328, BCM6362 and BCM63268 SoCs. Signed-off-by: Álvaro Fernández Rojas Reviewed-by: Daniel Schwierzeck --- v3: Introduce changes suggested by Daniel Schwierzeck: - Introduce soc_to_priv helper definition. - Switch to dev_remap_addr_name. v2: no changes drivers/mtd/nand/raw/Kconfig | 6 + drivers/mtd/nand/raw/brcmnand/Makefile | 1 + drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c | 117 +++++++++++++++++++ 3 files changed, 124 insertions(+) create mode 100644 drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig index a129f44869..2000826c79 100644 --- a/drivers/mtd/nand/raw/Kconfig +++ b/drivers/mtd/nand/raw/Kconfig @@ -72,6 +72,12 @@ config NAND_BRCMNAND Enable the driver for NAND flash on platforms using a Broadcom NAND controller. +config NAND_BRCMNAND_6368 + bool "Support Broadcom NAND controller on bcm6368" + depends on NAND_BRCMNAND && ARCH_BMIPS + help + Enable support for broadcom nand driver on bcm6368. + config NAND_BRCMNAND_6838 bool "Support Broadcom NAND controller on bcm6838" depends on NAND_BRCMNAND && ARCH_BMIPS && SOC_BMIPS_BCM6838 diff --git a/drivers/mtd/nand/raw/brcmnand/Makefile b/drivers/mtd/nand/raw/brcmnand/Makefile index a2363cc80e..7e70b859dc 100644 --- a/drivers/mtd/nand/raw/brcmnand/Makefile +++ b/drivers/mtd/nand/raw/brcmnand/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0+ +obj-$(CONFIG_NAND_BRCMNAND_6368) += bcm6368_nand.o obj-$(CONFIG_NAND_BRCMNAND_63158) += bcm63158_nand.o obj-$(CONFIG_NAND_BRCMNAND_6838) += bcm6838_nand.o obj-$(CONFIG_NAND_BRCMNAND_6858) += bcm6858_nand.o diff --git a/drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c b/drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c new file mode 100644 index 0000000000..e2f5452c27 --- /dev/null +++ b/drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "brcmnand.h" + +struct bcm6368_nand_soc { + struct brcmnand_soc soc; + void __iomem *base; +}; + +#define soc_to_priv(_soc) container_of(_soc, struct bcm6368_nand_soc, soc) + +#define BCM6368_NAND_INT 0x00 +#define BCM6368_NAND_STATUS_SHIFT 0 +#define BCM6368_NAND_STATUS_MASK (0xfff << BCM6368_NAND_STATUS_SHIFT) +#define BCM6368_NAND_ENABLE_SHIFT 16 +#define BCM6368_NAND_ENABLE_MASK (0xffff << BCM6368_NAND_ENABLE_SHIFT) + +enum { + BCM6368_NP_READ = BIT(0), + BCM6368_BLOCK_ERASE = BIT(1), + BCM6368_COPY_BACK = BIT(2), + BCM6368_PAGE_PGM = BIT(3), + BCM6368_CTRL_READY = BIT(4), + BCM6368_DEV_RBPIN = BIT(5), + BCM6368_ECC_ERR_UNC = BIT(6), + BCM6368_ECC_ERR_CORR = BIT(7), +}; + +static bool bcm6368_nand_intc_ack(struct brcmnand_soc *soc) +{ + struct bcm6368_nand_soc *priv = soc_to_priv(soc); + void __iomem *mmio = priv->base + BCM6368_NAND_INT; + u32 val = brcmnand_readl(mmio); + + if (val & (BCM6368_CTRL_READY << BCM6368_NAND_STATUS_SHIFT)) { + /* Ack interrupt */ + val &= ~BCM6368_NAND_STATUS_MASK; + val |= BCM6368_CTRL_READY << BCM6368_NAND_STATUS_SHIFT; + brcmnand_writel(val, mmio); + return true; + } + + return false; +} + +static void bcm6368_nand_intc_set(struct brcmnand_soc *soc, bool en) +{ + struct bcm6368_nand_soc *priv = soc_to_priv(soc); + void __iomem *mmio = priv->base + BCM6368_NAND_INT; + u32 val = brcmnand_readl(mmio); + + /* Don't ack any interrupts */ + val &= ~BCM6368_NAND_STATUS_MASK; + + if (en) + val |= BCM6368_CTRL_READY << BCM6368_NAND_ENABLE_SHIFT; + else + val &= ~(BCM6368_CTRL_READY << BCM6368_NAND_ENABLE_SHIFT); + + brcmnand_writel(val, mmio); +} + +static int bcm6368_nand_probe(struct udevice *dev) +{ + struct bcm6368_nand_soc *priv = dev_get_priv(dev); + struct brcmnand_soc *soc = &priv->soc; + + priv->base = dev_remap_addr_name(dev, "nand-int-base"); + if (!priv->base) + return -EINVAL; + + soc->ctlrdy_ack = bcm6368_nand_intc_ack; + soc->ctlrdy_set_enabled = bcm6368_nand_intc_set; + + /* Disable and ack all interrupts */ + brcmnand_writel(0, priv->base + BCM6368_NAND_INT); + brcmnand_writel(BCM6368_NAND_STATUS_MASK, + priv->base + BCM6368_NAND_INT); + + return brcmnand_probe(dev, soc); +} + +static const struct udevice_id bcm6368_nand_dt_ids[] = { + { + .compatible = "brcm,nand-bcm6368", + }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(bcm6368_nand) = { + .name = "bcm6368-nand", + .id = UCLASS_MTD, + .of_match = bcm6368_nand_dt_ids, + .probe = bcm6368_nand_probe, + .priv_auto_alloc_size = sizeof(struct bcm6368_nand_soc), +}; + +void board_nand_init(void) +{ + struct udevice *dev; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_MTD, + DM_GET_DRIVER(bcm6368_nand), &dev); + if (ret && ret != -ENODEV) + pr_err("Failed to initialize %s. (error %d)\n", dev->name, + ret); +}