From patchwork Tue Aug 13 19:19:53 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: 1146617 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="Y4zHe8Yt"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 467MyD0JKwz9sML for ; Wed, 14 Aug 2019 05:21:07 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id BCEE4C21FB7; Tue, 13 Aug 2019 19:20:15 +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 F05BCC2200C; Tue, 13 Aug 2019 19:20:06 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 95363C21FC2; Tue, 13 Aug 2019 19:20:04 +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 34AD9C21FA1 for ; Tue, 13 Aug 2019 19:20:04 +0000 (UTC) Received: by mail-wm1-f65.google.com with SMTP id 207so2518558wma.1 for ; Tue, 13 Aug 2019 12:20:04 -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=lApF+x0ySsqol5g8bRHnOwTD5/Sig3TU7JExiJ+3zOg=; b=Y4zHe8YtnOLa06+l0yPKyQQu87B1eV0Q7Cr87Zljqiic/ca5Wx2YlGdh36UGNo7PKg bAGvFAVjlutP31NWnHw6SWZLZRiXkUy3/s5wvZRmuApP6WH93a8pC5H2Hx70JFR4jmtr 15g+bhTdxNm8Tr3MTP6gDNGaqlcyZVyNtaJquGEh8Ds2OKeaBqnSegHAxEo8+Ibk+6RI TWHiprGpKwr/32jQYA/Ha1DODh44hiVAi6Qvi93er3B2BWsT4Xv9sDIIKjKvq0uHgt8Z oFWb8j0CqjasHYtHr1u+NEnkWPTS2bfWLetTDLbpVmFg2UfWMg/ZBDTw6VPsx9IgbFss Pjog== 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=lApF+x0ySsqol5g8bRHnOwTD5/Sig3TU7JExiJ+3zOg=; b=JQ42THBFr5xEk3lC10OSzb4N91ZYUwLmO/W6cHIiKunbyDlwZ5vV2St1PViBFjh4WD BVCebSC3xQKZHNisPVqGdaM8CjAoTmUN4wqCwIuZEGEWD9TvGuitTo3+mbIkgo0ypmOh Cdq3FU72HmFPyqhCHRZGSFGFQxgNSqdN0aKXl/I/KFIa3D5m8/+pgbSVSJ7SDIFlVn5D OinH7VMTbgelXFI0pH7iag5nfImZ8OxGGH+lR6aCGvnXwhYuktQuWKRJTITDaD9A2Akk v9QBUJk3ezGB2q7syDmc9w9X6mOrdRU4RIfLB/lzODFZkOMTq0CnEZGrXZE6fYz1WwQ8 orTg== X-Gm-Message-State: APjAAAVH05O1xm6L+s0x025SDcND3oROnOgoEw4d+ocZv81nafaw3JQZ eivz4R/Fhu57uutqfiTMOp44Zrug X-Google-Smtp-Source: APXvYqz0RObI7PyI9gcxHI+KL1PIKg5jFcZPapkqUBOSVrleN3zB9t87r2ucWHK33ZF8aRahAIOFrA== X-Received: by 2002:a05:600c:2245:: with SMTP id a5mr4647580wmm.121.1565724003520; Tue, 13 Aug 2019 12:20:03 -0700 (PDT) Received: from skynet.lan (235.red-83-44-9.dynamicip.rima-tde.net. [83.44.9.235]) by smtp.gmail.com with ESMTPSA id l8sm217883922wrg.40.2019.08.13.12.20.02 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 13 Aug 2019 12:20:02 -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: Tue, 13 Aug 2019 21:19:53 +0200 Message-Id: <20190813191958.14360-2-noltari@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190813191958.14360-1-noltari@gmail.com> References: <20190813191958.14360-1-noltari@gmail.com> MIME-Version: 1.0 Subject: [U-Boot] [PATCH 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 --- drivers/mtd/nand/raw/Kconfig | 6 + drivers/mtd/nand/raw/brcmnand/Makefile | 1 + drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c | 122 +++++++++++++++++++ 3 files changed, 129 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 f86035bcce..d2bfad28d5 100644 --- a/drivers/mtd/nand/raw/Kconfig +++ b/drivers/mtd/nand/raw/Kconfig @@ -67,6 +67,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..1768d3945f --- /dev/null +++ b/drivers/mtd/nand/raw/brcmnand/bcm6368_nand.c @@ -0,0 +1,122 @@ +// 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 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 = + container_of(soc, struct bcm6368_nand_soc, 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 = + container_of(soc, struct bcm6368_nand_soc, 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 udevice *pdev = dev; + struct bcm6368_nand_soc *priv = dev_get_priv(dev); + struct brcmnand_soc *soc; + struct resource res; + + soc = &priv->soc; + + dev_read_resource_byname(pdev, "nand-int-base", &res); + priv->base = ioremap(res.start, resource_size(&res)); + if (IS_ERR(priv->base)) + return PTR_ERR(priv->base); + + 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(pdev, 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); +}