From patchwork Mon Feb 24 10:12:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Longbin Li X-Patchwork-Id: 13987760 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2F9B24A051; Mon, 24 Feb 2025 10:12:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391979; cv=none; b=bZCEasexzuDBqRRpb0RvILnhFq2wrKFifI7qU4uhXLpJoCOtYgN80MLDAu6L2wuotZpahI5nHqoerg/g/uhu8n106vfPfY+vQQW+LoNd10Hg+UBEMteqR5/xbkAwUvomK+FKpT/+cS3fRx6X9Y9DtD6KrtJVARVYc2hYTyBuYrQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391979; c=relaxed/simple; bh=KGeJRad60cuqCHJZvLMv/sE5CXRM5iHWHfq4M41kVqk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JEJDeSzaVuyOLWEkEAXHpvPLOfxDQhdpqvTg04e33e2jQutHs7hZXG1Fqze/CaqndHtLL5LRB1SG+WJrOHQuuOabgY0UYeibScqeyj0rtY51pcqRvqiMEOdCy9VfKJsllG6ZMRfh0cCG5weg74KKX3+D2SGef5QGjNibgLPJ7sg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=WK7go54Y; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WK7go54Y" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-22100006bc8so70378575ad.0; Mon, 24 Feb 2025 02:12:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740391977; x=1740996777; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tfgdDU3dHCgHvLuyG46NLXGA1z+1QvVU4idXkiLTeYg=; b=WK7go54YfCelQ25HzFm9igXOxaU0w1y9EhaVvGH6SGSTRrONpKPdqj+gJdSN4ao5/O zRV8vnSH/YIs2NpOEiLVEWEestqwQL6NcHJI6TvMIOP/f9KDU5b+feA4PrDwQX4RdsQ/ aQ+QGnKGwJXsVQcaKVMkGacHEW4T6VEezCtHvMDLOVmgGxyr1+9Xu8HRgNwX33a0YBCz O1Ky0Y040aR6MRK7F5mGarqHGBa2BT/lFUUeeewWVIiiMhAoLLVH7vUAyY0p/Boepg9A wREc0S0shKGqMGUEWN2UPveoUIHU4wbqCQSD5Hb5Uq4mml2hgrLRyHFWd4k5XUeTGMGh nh+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740391977; x=1740996777; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tfgdDU3dHCgHvLuyG46NLXGA1z+1QvVU4idXkiLTeYg=; b=pEbaEihcmRkgIbPVf5lscCvR1c6zj44TW0mI2DeqI5rnrEj9jaSshCzPvMxdUcrjaz 0ycANCMkO/fw1cCRKcY5TXllbVnx+YHkW/Hjs3+D1v6JO8zr5XHsyOyhIesgoNhe3n45 TdbUYcabZVshOeHRYHDmUu+NTjxRHvZCu0HabihGQU+c1W745pum+pwtg3yL28h8oJdd jZAeWrxJtmUhlT/Fk2JBzj0GBXyBl264U7hz11x8M8A+hc727CTXTSnsMqXI2BuboeDy UjdNhCDh6CoXIc0h7m/l46tI+X8Urtcf5IPxxz1YlD1CtR96bGQgYMPd0scfEa3ScEQf CP5w== X-Forwarded-Encrypted: i=1; AJvYcCVEqa64AVIozFIUehyz+T5zHD9Xjgn4xjN7DKxU0xInjauIzztC2qvdJJ/1xinelCNXislBXD3EqEqf@vger.kernel.org, AJvYcCVZC1JncpY8cHtL3V9xvRo1fuzY1f34cTcfY4z0om9/m7ZMTy+54kgxnxNSa+ZAU0gFbgJDoM9ZwR9F@vger.kernel.org, AJvYcCW2IRZ0QqBN1a982Dh/TUr/p7L15ZbUuWYsj/CKO27xpI710tiqUsJ0Y5lntMCLCR1Fnd3mo8PMcCoQdXl/@vger.kernel.org X-Gm-Message-State: AOJu0Yxn25SPWWsZE4fUN5kQq6P9541gHHDh0e9gk2C7DffYOMN4SQ/C OWoMdnO+3nJEFxkx19CsImQ8FYVxg84oX07BHOlhiKlFB09eGXk4 X-Gm-Gg: ASbGncvVCiVU7mCErLpnw7hEpJrjcgh7dS/8XQMU4T5MxEllF0SIk8U1BwB+UtruG/T u2kBpOzaWWjablm5UpLKjIvZz8YcXSphonCtfN+rBc8GjSu5EVEptOIafaUGzo+YpMgq83oQLy9 ksP3rdV1xW/tbf6vnlweBJgajtu1Badd9oM3udEfWduZ02KtINU7XW/WC0CmmNOJO2LWdRCHaTi lZDvdtaUmTrUTRvzfX1HNxTv/OZ71/WelB/kxewDaCNkunwg5NtDF7nMnJ/7yv7PWNfIVmn7452 6dqkZpbkkV5TLtL5kjfo X-Google-Smtp-Source: AGHT+IF04L64yddkAFq03o8LvF25Xq5MWdPj2nGFRbtcPd0hUWOcQ6Di7Lct9JFSZGV4Unfn5iL97Q== X-Received: by 2002:a17:902:fc4e:b0:21f:7964:e989 with SMTP id d9443c01a7336-2219fffb650mr207806035ad.52.1740391977163; Mon, 24 Feb 2025 02:12:57 -0800 (PST) Received: from cu.. ([2001:19f0:ac00:4eb8:5400:5ff:fe30:7df3]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d7a464f1sm173274365ad.206.2025.02.24.02.12.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 02:12:56 -0800 (PST) From: Longbin Li To: Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Paul Walmsley , Palmer Dabbelt , Albert Ou Cc: Longbin Li , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: [PATCH 1/3] dt-bindings: spi: add Sophgo SPI NOR controller driver Date: Mon, 24 Feb 2025 18:12:00 +0800 Message-ID: <20250224101213.26003-2-looong.bin@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250224101213.26003-1-looong.bin@gmail.com> References: <20250224101213.26003-1-looong.bin@gmail.com> Precedence: bulk X-Mailing-List: linux-spi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add SPI NOR driver for Sophgo, including read, write operations. Signed-off-by: Longbin Li --- .../bindings/spi/spi-sophgo-nor.yaml | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Documentation/devicetree/bindings/spi/spi-sophgo-nor.yaml -- 2.48.1 diff --git a/Documentation/devicetree/bindings/spi/spi-sophgo-nor.yaml b/Documentation/devicetree/bindings/spi/spi-sophgo-nor.yaml new file mode 100644 index 000000000000..0b54946c649f --- /dev/null +++ b/Documentation/devicetree/bindings/spi/spi-sophgo-nor.yaml @@ -0,0 +1,52 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/spi/spi-sophgo-nor.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Sophgo SPI NOR controller + +maintainers: + - Longbin Li + +allOf: + - $ref: spi-controller.yaml# + +properties: + compatible: + const: sophgo,sg2044-spifmc-nor + + reg: + maxItems: 1 + + clocks: + maxItems: 1 + + interrupts: + maxItems: 1 + + resets: + maxItems: 1 + +required: + - compatible + - reg + - clocks + - interrupts + - resets + +unevaluatedProperties: false + +examples: + - | + #include + + spi@1000000 { + compatible = "sophgo,sg2044-spifmc-nor"; + reg = <0x1000000 0x4000000>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&clk 0>; + interrupts = <37 IRQ_TYPE_LEVEL_HIGH>; + resets = <&rst 0>; + }; From patchwork Mon Feb 24 10:12:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Longbin Li X-Patchwork-Id: 13987761 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D47A024A072; Mon, 24 Feb 2025 10:13:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391986; cv=none; b=gsQelgQ39ImpzE5Jo9ZYC9OZMBtRbd3rorD9kiwoEouwtpB8F/mUlFd9Ap2tMn699W1jDTO4xFxdVyggYrY/e0KtjKUEZfcT2SB40cjNWNLWYp26NOfKNpMqqBFE/YjkH5IFNq4luD/lIuraORzuqLIiVfIxzqAE68em8LwXWBI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391986; c=relaxed/simple; bh=vVaDx7z0ZmcYSdZVCynLyZ2AO6c6Mkg760djoI4oB3I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uPLEKnLcmMPQ4qrP78Lnaa+646bEMbG1e50YnK+dhaVi/df5RIW2moq1yWNKosBHIYKxw1V76WLhEe++GYEGq/7nD/Xnb9IrxB0d0DChDv3r4zxcKOGBqv+z3RuFxT1hFOk6PKWf2/4bGAd+ep591vxPJCKMsXmfyJZ65mpR+Tw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Bp+LYXKc; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Bp+LYXKc" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-22185cddbffso84165105ad.1; Mon, 24 Feb 2025 02:13:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740391984; x=1740996784; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i9K1JqtTmWf8xTIkMB47iCGqHODGTaRdIkV2ZLfyu+I=; b=Bp+LYXKcVsnUih9g3cbR1pwxaXCh2Bf6HzmqhOEMgna7k6QAnnpnOaptg6hyck6cZY /NG6JYLaDKndKFQ4tSZ2Tn7hF+HbSqvH7/Na+7cmsaiB/sImScoYP6PokOKHsN7Ziggw eYmho38/MGArWru7FPLWSdeSVF0cug6WtdqmTrHksM73B2qcxjNs5QACGshrmWbO1whG /TQMEva3mgES5fvDnpnEu4/rTZ7kYBwpGJfCFar0yZZ2r6zUsF5t+RUTaZqw4UX38gNi yqx3vLFCytKaBIScgB7lL3kxoPLTULlGzirEEM5MG/Wf7RrWUuvuY3nO6mwDfsIJDnno R9yA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740391984; x=1740996784; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=i9K1JqtTmWf8xTIkMB47iCGqHODGTaRdIkV2ZLfyu+I=; b=I5l6vFKGMJSr0uTUq5Qd0z0xp2JQ+ZIzPhgXkJ43UvLsenE1UylOGUa0tByAcu7jH2 EhVNneiaDdgsn+QcRm3NG6Qmt1HnpZ2njH0ZX+M0CTmUiG2vJxv8j1JOcXBtTfG6K/SS aLjhuJ+Lp+bufEtNNhBzSSUpx+0bD86ZteNeU9vcuMcBeShbdYJVQP17Ls6DCqB92pAz Poyhn9BD30Pkqpnfn+y5Yhe7dkK84zVrlx5cpkjFC4DgpZgZaaLy3FjPK5exGU33FqsO Ihx0kKlCvgEEjU44BQNhRe7WPcQWUiOG1dXiGemgMdqsvFr8nCypNedqp70phRHMEX/o rDgw== X-Forwarded-Encrypted: i=1; AJvYcCUSMCNYbD9sPjRKd2fnqI1SSOJ/iYbQcbGhTBLPKVmQGhHyMEY2ghBnzrn+DKI5nLuzOyM+LZ5DXwO6@vger.kernel.org, AJvYcCWxStczW7vlYzz1KkUbAXNSxyEB0+/4ZS5uwmOzDESreIagq/wCqWPGZYzjJkJhDJ4mlpjmJsZ16+/fajSW@vger.kernel.org, AJvYcCX5wk8PkNDNu9QbA0CHPeNGrTD7WH9oodQL9CMbXcxTSErpWe3+Nqvwji43jia5B5jL3NLhmJ9cyFcC@vger.kernel.org X-Gm-Message-State: AOJu0Yzw7p46PgbGoVPSlbS4NnmINdsZ22801sV+Fk7n9EEk13MtxAEb Hc2J3wbALbVifL8x9DiwyUJ0nk3qkRy5s4PJ6Cy5trgSAK3UeTck X-Gm-Gg: ASbGncs+Nn1IwDloa6p/TO2k55uuh4q+EZX1vyHi4bVqjh0vpexRMPCCO/5i4p0ILYP B4bQ2/b/qmDbs/4wxoMfQjD0o8WMM8CjMvguQEzMqmj5edhOP8B31u3CExwnttKfRq8NnxCxa+5 TlEBqcT9f3KIF/tPvI+CBcw5RJa/pKAexOBkR8W5UDRcCD5ddM73rVDQ3qDt9vpmnrrFM/SqprU Gth0Y6Y9R8QazZW0XVCNXaLVgdZ1emeuBd/SkOvpuKo4mpCNATrp0l/uuB1Z95Aftwg+Fksb3Ps 9b8S626bkYs0+w6mutwl X-Google-Smtp-Source: AGHT+IHb1ImqlO2BqodvFSOU+dtSSudUpLUD3cK/AcFo/b9Ciwsf44zUCCMrsJc76r+i7ooTlRFeKQ== X-Received: by 2002:a17:903:2446:b0:215:58be:334e with SMTP id d9443c01a7336-2219ff89cafmr193548465ad.10.1740391983805; Mon, 24 Feb 2025 02:13:03 -0800 (PST) Received: from cu.. ([2001:19f0:ac00:4eb8:5400:5ff:fe30:7df3]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d7a464f1sm173274365ad.206.2025.02.24.02.12.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 02:13:03 -0800 (PST) From: Longbin Li To: Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Paul Walmsley , Palmer Dabbelt , Albert Ou Cc: Longbin Li , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: [PATCH 2/3] spi: sophgo: add Sophgo SPI NOR controller driver Date: Mon, 24 Feb 2025 18:12:01 +0800 Message-ID: <20250224101213.26003-3-looong.bin@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250224101213.26003-1-looong.bin@gmail.com> References: <20250224101213.26003-1-looong.bin@gmail.com> Precedence: bulk X-Mailing-List: linux-spi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add support for Sophgo SPI NOR controller in Sophgo SoC. Signed-off-by: Longbin Li --- drivers/spi/Kconfig | 9 + drivers/spi/Makefile | 1 + drivers/spi/spi-sophgo-nor.c | 501 +++++++++++++++++++++++++++++++++++ 3 files changed, 511 insertions(+) create mode 100644 drivers/spi/spi-sophgo-nor.c -- 2.48.1 diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index ea8a31032927..6b6d7b348485 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -1021,6 +1021,15 @@ config SPI_SN_F_OSPI for connecting an SPI Flash memory over up to 8-bit wide bus. It supports indirect access mode only. +config SPI_SOPHGO_NOR + tristate "Sophgo SPI NOR Controller" + depends on ARCH_SOPHGO || COMPILE_TEST + help + This enables support for the Sophgo SPI NOR controller, + which supports Dual/Qual read and write operations while + also supporting 3Byte address devices and 4Byte address + devices. + config SPI_SPRD tristate "Spreadtrum SPI controller" depends on ARCH_SPRD || COMPILE_TEST diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 9db7554c1864..9ded1de4b2fd 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -134,6 +134,7 @@ obj-$(CONFIG_SPI_SH_SCI) += spi-sh-sci.o obj-$(CONFIG_SPI_SIFIVE) += spi-sifive.o obj-$(CONFIG_SPI_SLAVE_MT27XX) += spi-slave-mt27xx.o obj-$(CONFIG_SPI_SN_F_OSPI) += spi-sn-f-ospi.o +obj-$(CONFIG_SPI_SOPHGO_NOR) += spi-sophgo-nor.o obj-$(CONFIG_SPI_SPRD) += spi-sprd.o obj-$(CONFIG_SPI_SPRD_ADI) += spi-sprd-adi.o obj-$(CONFIG_SPI_STM32) += spi-stm32.o diff --git a/drivers/spi/spi-sophgo-nor.c b/drivers/spi/spi-sophgo-nor.c new file mode 100644 index 000000000000..1139deeac327 --- /dev/null +++ b/drivers/spi/spi-sophgo-nor.c @@ -0,0 +1,501 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Sophgo SPI NOR controller driver + * + * Copyright (c) 2025 Longbin Li + */ + +#include +#include +#include +#include +#include +#include +#include + +/* Hardware register definitions */ +#define SPIFMC_CTRL 0x00 +#define SPIFMC_CTRL_CPHA BIT(12) +#define SPIFMC_CTRL_CPOL BIT(13) +#define SPIFMC_CTRL_HOLD_OL BIT(14) +#define SPIFMC_CTRL_WP_OL BIT(15) +#define SPIFMC_CTRL_LSBF BIT(20) +#define SPIFMC_CTRL_SRST BIT(21) +#define SPIFMC_CTRL_SCK_DIV_SHIFT 0 +#define SPIFMC_CTRL_FRAME_LEN_SHIFT 16 +#define SPIFMC_CTRL_SCK_DIV_MASK 0x7FF + +#define SPIFMC_CE_CTRL 0x04 +#define SPIFMC_CE_CTRL_CEMANUAL BIT(0) +#define SPIFMC_CE_CTRL_CEMANUAL_EN BIT(1) + +#define SPIFMC_DLY_CTRL 0x08 +#define SPIFMC_CTRL_FM_INTVL_MASK 0x000f +#define SPIFMC_CTRL_FM_INTVL BIT(0) +#define SPIFMC_CTRL_CET_MASK 0x0f00 +#define SPIFMC_CTRL_CET BIT(8) + +#define SPIFMC_DMMR 0x0c + +#define SPIFMC_TRAN_CSR 0x10 +#define SPIFMC_TRAN_CSR_TRAN_MODE_MASK GENMASK(1, 0) +#define SPIFMC_TRAN_CSR_TRAN_MODE_RX BIT(0) +#define SPIFMC_TRAN_CSR_TRAN_MODE_TX BIT(1) +#define SPIFMC_TRAN_CSR_FAST_MODE BIT(3) +#define SPIFMC_TRAN_CSR_BUS_WIDTH_1_BIT (0x00 << 4) +#define SPIFMC_TRAN_CSR_BUS_WIDTH_2_BIT (0x01 << 4) +#define SPIFMC_TRAN_CSR_BUS_WIDTH_4_BIT (0x02 << 4) +#define SPIFMC_TRAN_CSR_DMA_EN BIT(6) +#define SPIFMC_TRAN_CSR_MISO_LEVEL BIT(7) +#define SPIFMC_TRAN_CSR_ADDR_BYTES_MASK GENMASK(10, 8) +#define SPIFMC_TRAN_CSR_ADDR_BYTES_SHIFT 8 +#define SPIFMC_TRAN_CSR_WITH_CMD BIT(11) +#define SPIFMC_TRAN_CSR_FIFO_TRG_LVL_MASK GENMASK(13, 12) +#define SPIFMC_TRAN_CSR_FIFO_TRG_LVL_1_BYTE (0x00 << 12) +#define SPIFMC_TRAN_CSR_FIFO_TRG_LVL_2_BYTE (0x01 << 12) +#define SPIFMC_TRAN_CSR_FIFO_TRG_LVL_4_BYTE (0x02 << 12) +#define SPIFMC_TRAN_CSR_FIFO_TRG_LVL_8_BYTE (0x03 << 12) +#define SPIFMC_TRAN_CSR_GO_BUSY BIT(15) +#define SPIFMC_TRAN_CSR_ADDR4B_SHIFT 20 +#define SPIFMC_TRAN_CSR_CMD4B_SHIFT 21 + +#define SPIFMC_TRAN_NUM 0x14 +#define SPIFMC_FIFO_PORT 0x18 +#define SPIFMC_FIFO_PT 0x20 + +#define SPIFMC_INT_STS 0x28 +#define SPIFMC_INT_TRAN_DONE BIT(0) +#define SPIFMC_INT_RD_FIFO BIT(2) +#define SPIFMC_INT_WR_FIFO BIT(3) +#define SPIFMC_INT_RX_FRAME BIT(4) +#define SPIFMC_INT_TX_FRAME BIT(5) + +#define SPIFMC_INT_EN 0x2c +#define SPIFMC_INT_TRAN_DONE_EN BIT(0) +#define SPIFMC_INT_RD_FIFO_EN BIT(2) +#define SPIFMC_INT_WR_FIFO_EN BIT(3) +#define SPIFMC_INT_RX_FRAME_EN BIT(4) +#define SPIFMC_INT_TX_FRAME_EN BIT(5) + +#define SPIFMC_OPT 0x030 +#define SPIFMC_OPT_DISABLE_FIFO_FLUSH BIT(1) + +#define SPIFMC_MAX_FIFO_DEPTH 8 + +#define SPIFMC_MAX_READ_SIZE 0x10000 + +struct sophgo_spifmc { + struct spi_controller *ctrl; + void __iomem *io_base; + struct device *dev; + struct mutex lock; + struct clk *clk; +}; + +static int sophgo_spifmc_wait_int(struct sophgo_spifmc *spifmc, u8 int_type) +{ + u32 stat; + + return readl_poll_timeout(spifmc->io_base + SPIFMC_INT_STS, stat, + (stat & int_type), 0, 1000000); +} + +static int sophgo_spifmc_wait_xfer_size(struct sophgo_spifmc *spifmc, + int xfer_size) +{ + u8 stat; + + return readl_poll_timeout(spifmc->io_base + SPIFMC_FIFO_PT, stat, + ((stat & 0xf) == xfer_size), 1, 1000000); +} + +static u32 sophgo_spifmc_init_reg(struct sophgo_spifmc *spifmc) +{ + u32 reg; + + reg = readl(spifmc->io_base + SPIFMC_TRAN_CSR); + reg &= ~(SPIFMC_TRAN_CSR_TRAN_MODE_MASK | + SPIFMC_TRAN_CSR_FAST_MODE | + SPIFMC_TRAN_CSR_BUS_WIDTH_2_BIT | + SPIFMC_TRAN_CSR_BUS_WIDTH_4_BIT | + SPIFMC_TRAN_CSR_DMA_EN | + SPIFMC_TRAN_CSR_ADDR_BYTES_MASK | + SPIFMC_TRAN_CSR_WITH_CMD | + SPIFMC_TRAN_CSR_FIFO_TRG_LVL_MASK); + + writel(reg, spifmc->io_base + SPIFMC_TRAN_CSR); + + return reg; +} + +static ssize_t sophgo_spifmc_read_64k(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op, loff_t from, + size_t len, u_char *buf) +{ + int xfer_size, offset; + u32 reg; + int ret; + int i; + + reg = sophgo_spifmc_init_reg(spifmc); + reg |= (op->addr.nbytes + op->dummy.nbytes) << SPIFMC_TRAN_CSR_ADDR_BYTES_SHIFT; + reg |= SPIFMC_TRAN_CSR_FIFO_TRG_LVL_8_BYTE; + reg |= SPIFMC_TRAN_CSR_WITH_CMD; + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_RX; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + writeb(op->cmd.opcode, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = op->addr.nbytes - 1; i >= 0; i--) + writeb((from >> i * 8) & 0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = 0; i < op->dummy.nbytes; i++) + writeb(0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + writel(len, spifmc->io_base + SPIFMC_TRAN_NUM); + writel(0, spifmc->io_base + SPIFMC_INT_STS); + reg |= SPIFMC_TRAN_CSR_GO_BUSY; + writel(reg, spifmc->io_base + SPIFMC_TRAN_CSR); + + ret = sophgo_spifmc_wait_int(spifmc, SPIFMC_INT_RD_FIFO); + if (ret < 0) + return ret; + + offset = 0; + while (offset < len) { + xfer_size = min_t(size_t, SPIFMC_MAX_FIFO_DEPTH, len - offset); + + ret = sophgo_spifmc_wait_xfer_size(spifmc, xfer_size); + if (ret < 0) + return ret; + + for (i = 0; i < xfer_size; i++) + buf[i + offset] = readb(spifmc->io_base + SPIFMC_FIFO_PORT); + + offset += xfer_size; + } + + ret = sophgo_spifmc_wait_int(spifmc, SPIFMC_INT_TRAN_DONE); + if (ret < 0) + return ret; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + + return len; +} + +static ssize_t sophgo_spifmc_read(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op) +{ + size_t xfer_size; + size_t offset; + loff_t from = op->addr.val; + size_t len = op->data.nbytes; + int ret; + u8 *din = op->data.buf.in; + + offset = 0; + while (offset < len) { + xfer_size = min_t(size_t, SPIFMC_MAX_READ_SIZE, len - offset); + + ret = sophgo_spifmc_read_64k(spifmc, op, from, xfer_size, din); + if (ret < 0) + return ret; + + offset += xfer_size; + din += xfer_size; + from += xfer_size; + } + + return 0; +} + +static ssize_t sophgo_spifmc_write(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op) +{ + size_t xfer_size; + const u8 *dout = op->data.buf.out; + int i, offset; + size_t ret; + u32 reg; + + reg = sophgo_spifmc_init_reg(spifmc); + reg |= (op->addr.nbytes + op->dummy.nbytes) << SPIFMC_TRAN_CSR_ADDR_BYTES_SHIFT; + reg |= SPIFMC_TRAN_CSR_FIFO_TRG_LVL_8_BYTE; + reg |= SPIFMC_TRAN_CSR_WITH_CMD; + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_TX; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + writeb(op->cmd.opcode, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = op->addr.nbytes - 1; i >= 0; i--) + writeb((op->addr.val >> i * 8) & 0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = 0; i < op->dummy.nbytes; i++) + writeb(0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + writel(0, spifmc->io_base + SPIFMC_INT_STS); + writel(op->data.nbytes, spifmc->io_base + SPIFMC_TRAN_NUM); + reg |= SPIFMC_TRAN_CSR_GO_BUSY; + writel(reg, spifmc->io_base + SPIFMC_TRAN_CSR); + + ret = sophgo_spifmc_wait_xfer_size(spifmc, 0); + if (ret < 0) + return ret; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + + offset = 0; + while (offset < op->data.nbytes) { + xfer_size = min_t(size_t, SPIFMC_MAX_FIFO_DEPTH, op->data.nbytes - offset); + + ret = sophgo_spifmc_wait_xfer_size(spifmc, 0); + if (ret < 0) + return ret; + + for (i = 0; i < xfer_size; i++) + writeb(dout[i + offset], spifmc->io_base + SPIFMC_FIFO_PORT); + + offset += xfer_size; + } + + ret = sophgo_spifmc_wait_int(spifmc, SPIFMC_INT_TRAN_DONE); + if (ret < 0) + return ret; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + + return 0; +} + +static ssize_t sophgo_spifmc_tran_cmd(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op) +{ + int i, ret; + u32 reg; + + reg = sophgo_spifmc_init_reg(spifmc); + reg |= (op->addr.nbytes + op->dummy.nbytes) << SPIFMC_TRAN_CSR_ADDR_BYTES_SHIFT; + reg |= SPIFMC_TRAN_CSR_FIFO_TRG_LVL_1_BYTE; + reg |= SPIFMC_TRAN_CSR_WITH_CMD; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + writeb(op->cmd.opcode, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = op->addr.nbytes - 1; i >= 0; i--) + writeb((op->addr.val >> i * 8) & 0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = 0; i < op->dummy.nbytes; i++) + writeb(0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + + writel(0, spifmc->io_base + SPIFMC_INT_STS); + reg |= SPIFMC_TRAN_CSR_GO_BUSY; + writel(reg, spifmc->io_base + SPIFMC_TRAN_CSR); + + ret = sophgo_spifmc_wait_int(spifmc, SPIFMC_INT_TRAN_DONE); + if (ret < 0) + return ret; + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + + return 0; +} + +static void sophgo_spifmc_trans(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op) +{ + if (op->data.dir == SPI_MEM_DATA_IN) + sophgo_spifmc_read(spifmc, op); + else if (op->data.dir == SPI_MEM_DATA_OUT) + sophgo_spifmc_write(spifmc, op); + else + sophgo_spifmc_tran_cmd(spifmc, op); +} + +static ssize_t sophgo_spifmc_trans_reg(struct sophgo_spifmc *spifmc, + const struct spi_mem_op *op) +{ + const u8 *dout = NULL; + u8 *din = NULL; + size_t len = op->data.nbytes; + u32 reg; + int ret; + int i; + + if (op->data.dir == SPI_MEM_DATA_IN) + din = op->data.buf.in; + else + dout = op->data.buf.out; + + reg = sophgo_spifmc_init_reg(spifmc); + reg |= SPIFMC_TRAN_CSR_FIFO_TRG_LVL_1_BYTE; + reg |= SPIFMC_TRAN_CSR_WITH_CMD; + + if (din) { + reg |= SPIFMC_TRAN_CSR_BUS_WIDTH_1_BIT; + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_RX; + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_TX; + + writel(SPIFMC_OPT_DISABLE_FIFO_FLUSH, spifmc->io_base + SPIFMC_OPT); + } else { + /* + * If write values to the Status Register, + * configure TRAN_CSR register as the same as + * sophgo_spifmc_read_reg. + */ + if (op->cmd.opcode == 0x01) { + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_RX; + reg |= SPIFMC_TRAN_CSR_TRAN_MODE_TX; + writel(len, spifmc->io_base + SPIFMC_TRAN_NUM); + } + } + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + writeb(op->cmd.opcode, spifmc->io_base + SPIFMC_FIFO_PORT); + + for (i = 0; i < len; i++) { + if (din) + writeb(0xff, spifmc->io_base + SPIFMC_FIFO_PORT); + else + writeb(dout[i], spifmc->io_base + SPIFMC_FIFO_PORT); + } + + writel(0, spifmc->io_base + SPIFMC_INT_STS); + writel(len, spifmc->io_base + SPIFMC_TRAN_NUM); + reg |= SPIFMC_TRAN_CSR_GO_BUSY; + writel(reg, spifmc->io_base + SPIFMC_TRAN_CSR); + + ret = sophgo_spifmc_wait_int(spifmc, SPIFMC_INT_TRAN_DONE); + if (ret < 0) + return ret; + + if (din) { + while (len--) + *din++ = readb(spifmc->io_base + SPIFMC_FIFO_PORT); + } + + writel(0, spifmc->io_base + SPIFMC_FIFO_PT); + + return 0; +} + +static int sophgo_spifmc_exec_op(struct spi_mem *mem, + const struct spi_mem_op *op) +{ + struct sophgo_spifmc *spifmc; + + spifmc = spi_controller_get_devdata(mem->spi->controller); + + mutex_lock(&spifmc->lock); + + if (op->addr.nbytes == 0) + sophgo_spifmc_trans_reg(spifmc, op); + else + sophgo_spifmc_trans(spifmc, op); + + mutex_unlock(&spifmc->lock); + + return 0; +} + +static const struct spi_controller_mem_ops sophgo_spifmc_mem_ops = { + .exec_op = sophgo_spifmc_exec_op, +}; + +static void sophgo_spifmc_init(struct sophgo_spifmc *spifmc) +{ + u32 tran_csr; + u32 reg; + + writel(0, spifmc->io_base + SPIFMC_DMMR); + + reg = readl(spifmc->io_base + SPIFMC_CTRL); + reg |= SPIFMC_CTRL_SRST; + reg &= ~((1 << 11) - 1); + reg |= 1; + writel(reg, spifmc->io_base + SPIFMC_CTRL); + + writel(0, spifmc->io_base + SPIFMC_CE_CTRL); + + tran_csr = readl(spifmc->io_base + SPIFMC_TRAN_CSR); + tran_csr |= (0 << SPIFMC_TRAN_CSR_ADDR_BYTES_SHIFT); + tran_csr |= SPIFMC_TRAN_CSR_FIFO_TRG_LVL_4_BYTE; + tran_csr |= SPIFMC_TRAN_CSR_WITH_CMD; + writel(tran_csr, spifmc->io_base + SPIFMC_TRAN_CSR); +} + +static int sophgo_spifmc_probe(struct platform_device *pdev) +{ + struct spi_controller *ctrl; + struct sophgo_spifmc *spifmc; + void __iomem *base; + int ret; + + ctrl = devm_spi_alloc_host(&pdev->dev, sizeof(*spifmc)); + if (!ctrl) + return -ENOMEM; + + spifmc = spi_controller_get_devdata(ctrl); + dev_set_drvdata(&pdev->dev, ctrl); + + spifmc->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(spifmc->clk)) { + dev_err(&pdev->dev, "AHB clock not found.\n"); + return PTR_ERR(spifmc->clk); + } + + ret = clk_prepare_enable(spifmc->clk); + if (ret) { + dev_err(&pdev->dev, "Unable to enable AHB clock.\n"); + return ret; + } + + spifmc->dev = &pdev->dev; + spifmc->ctrl = ctrl; + + spifmc->io_base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + ctrl->num_chipselect = 1; + ctrl->dev.of_node = pdev->dev.of_node; + ctrl->bits_per_word_mask = SPI_BPW_MASK(8); + ctrl->auto_runtime_pm = false; + ctrl->mem_ops = &sophgo_spifmc_mem_ops; + ctrl->mode_bits = SPI_RX_DUAL | SPI_TX_DUAL | SPI_RX_QUAD | SPI_TX_QUAD; + + mutex_init(&spifmc->lock); + + sophgo_spifmc_init(spifmc); + sophgo_spifmc_init_reg(spifmc); + + return devm_spi_register_controller(&pdev->dev, ctrl); +} + +static void sophgo_spifmc_remove(struct platform_device *pdev) +{ + struct sophgo_spifmc *spifmc = platform_get_drvdata(pdev); + + mutex_destroy(&spifmc->lock); +} + +static const struct of_device_id sophgo_spifmc_match[] = { + { .compatible = "sophgo,sg2044-spifmc-nor" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, sophgo_spifmc_match); + +static struct platform_driver sophgo_nor_driver = { + .driver = { + .name = "sophgo,spifmc-nor", + .of_match_table = sophgo_spifmc_match, + }, + .probe = sophgo_spifmc_probe, + .remove = sophgo_spifmc_remove, +}; + +module_platform_driver(sophgo_nor_driver); + +MODULE_DESCRIPTION("Sophgo SPI NOR controller driver"); +MODULE_AUTHOR("Longbin Li "); +MODULE_LICENSE("GPL"); From patchwork Mon Feb 24 10:12:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Longbin Li X-Patchwork-Id: 13987762 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D65EE24BC0A; Mon, 24 Feb 2025 10:13:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391992; cv=none; b=uY7oopoNL6/cAS2ZpquEeM+E2DzwNASk4zOk35EnkIN29ysGFmYyy7lpeGPubsC60ToEYyaeef1iwiWnkAVXk9YD2LJlmeZ7R6EjeREqCZLKrHdf2IyCvCyT/rfTJ/8cwto5fU1xcVtFGe8Vrcs6iIAmpAvmo37kI3VV0/Ydsv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740391992; c=relaxed/simple; bh=DI/yU4Ha2m1hI+3q6R4XXFjNeHmAswCQiwUL6XQGzvw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C6tJlMVf4oCABlT8aJvmvRzwI5kN5Uxot4A+r80KSG14WjXWvloD9XZE0MoycajPSJCoUaqD536z2uKeKJUboOeU2y444M+aZwIy4O7LYZ0jm8eHAt8XcN2xyFa7FG0o/uHYSNBpL2hMWGZDgcl/OuKqGDA3kyvSvOazD63KMHI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ANhZ/cMv; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ANhZ/cMv" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-220c92c857aso70403905ad.0; Mon, 24 Feb 2025 02:13:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740391990; x=1740996790; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zHH1Bo2ngh238ZBojTHJqWRsImuzKw7MT/RetGGhdDs=; b=ANhZ/cMvZ1icLHUAXCg5sBBZhh1Pz6FcKQtbDxhm5w8tyIftjY82UPQU3XSUUw8onI bfsYCtubJPzXG3N7fNRqW9uWQg13wV3NWI6sFIr5fYti8FRhnMrC7ZyRMgFwIOMY3VNy S7rLWQ8oNabPSLpHSzKzlnl8jX1cBxkjP5l/WEI1UbKY2J7uAUqkbupvwxddl+JwdY5U IwtOG5UhVh6kqkX9nqXbzM0fyyy7aZ1N42L67GYNMUdR1t8I7nuXi+RCgFWeqGoV3GLL WJ763RFfIAsNq8xeD1JBMK9AMzf+Xj7p90/nX5OBY34BXoaF1eMZiwKMFeGpPbMYdLOC zJ5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740391990; x=1740996790; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zHH1Bo2ngh238ZBojTHJqWRsImuzKw7MT/RetGGhdDs=; b=VGy45ci9GYa9yf9s9bWDfUXtYfLyk1gUAO+FwrzdvFWcn3AwTfTFnqMUS2C6vi+9DH vbzAnby9ob4ZbiOtlz3xZQwN65IAXsdSGFKr/EhH+jjYcdxZF+KX4ISU3J95fSWiYB02 Y4vVQnpSc1uSuFIOP068weE+HWUKUbc+V4Ns8t0/k+EqG6G1Krd0Y8cwkLXeFe9Bo2lH iehF5UQvrH0FJ2kKZp6ohb74rIYQYlf79rJWi4c2M0ZZxYTb+JWauO2noV1J/srRK5QS i7/q0ee0ZGGGzMXsEAtkVgu2jx6tG337Gpsklif1ZGkmtbCZZ8I9L58/pMQe//MVKm0R qgDA== X-Forwarded-Encrypted: i=1; AJvYcCWX97s2tya25EUAVGiGoONgungrEn/gho4stETH+kxCVRoyGM1BU7TfQwkVMrkYlAbBDHFuBu7zo5ha@vger.kernel.org, AJvYcCWw8eB/BhU8g+JiXhAcx12P2tB9+zpmpMmiDFTYHjreDwGe19jOLCCr9QeQRSmJW7PwjtnxV8YcqE0u@vger.kernel.org, AJvYcCXAr1HB9Zt9gcU0CYU2qw9mMSyatt9CBU8OctZWZikaTKkCsy6V7+j1x+6xSAW3N+CPn9TSO/FIKbqPHJlC@vger.kernel.org X-Gm-Message-State: AOJu0YzDQ3bRYpiciAFAAN5HwC4Rwy0bAHUlA48td4ERV8kWZ1QUSBna GVRxa79Bgbo0Gj/SUX+Jgiq30QlQM2WXMvfkCoYb4qF0sg28zPwp X-Gm-Gg: ASbGncvyzBbLByd8Z1TjPnisJq0E57L0AaStLlC3nvdCZGa2C8fqZJOPefGqcRkY/UG nvYLVOBikb+NFuDx41j4v2zmQC+9fKtkoRyzc5hq9dEeTl5k3A1e96HAkXy2oXljezE5Dbcs+t2 MJQw6CgKGouCDQntpSTRqF5GyJi1FvNn0uZkttay2UB38aDCMIwbS/1Zs9lNZ3G5y90N1xuQREJ Zj/1aVs7DSGwssjr2yVLcaqlruSUDyCpb2JFrWTsMaXceWiCjsodwwGFqupKaX5wz8SnWmBVsPE ofgHciH99zgv/hCV+aeL X-Google-Smtp-Source: AGHT+IGtCyZFRUi+gbIX4aSNZJGXzCxJh7yxdOzB199I7UFF6fkdtprcsgYmp8oGaKiLKViiu8/0JA== X-Received: by 2002:a17:902:f547:b0:215:6c5f:d142 with SMTP id d9443c01a7336-2219fff87c0mr224305655ad.20.1740391990140; Mon, 24 Feb 2025 02:13:10 -0800 (PST) Received: from cu.. ([2001:19f0:ac00:4eb8:5400:5ff:fe30:7df3]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-220d7a464f1sm173274365ad.206.2025.02.24.02.13.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 02:13:09 -0800 (PST) From: Longbin Li To: Mark Brown , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen Wang , Inochi Amaoto , Paul Walmsley , Palmer Dabbelt , Albert Ou Cc: Longbin Li , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, sophgo@lists.linux.dev, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org Subject: [PATCH 3/3] riscv: dts: sophgo: add Sophgo SPI NOR controller driver Date: Mon, 24 Feb 2025 18:12:02 +0800 Message-ID: <20250224101213.26003-4-looong.bin@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250224101213.26003-1-looong.bin@gmail.com> References: <20250224101213.26003-1-looong.bin@gmail.com> Precedence: bulk X-Mailing-List: linux-spi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add SPI NOR device node for Sophgo. Signed-off-by: Longbin Li --- .../boot/dts/sophgo/sg2044-sophgo-sd3-10.dts | 18 ++++++++++++++ arch/riscv/boot/dts/sophgo/sg2044.dtsi | 24 +++++++++++++++++++ 2 files changed, 42 insertions(+) -- 2.48.1 diff --git a/arch/riscv/boot/dts/sophgo/sg2044-sophgo-sd3-10.dts b/arch/riscv/boot/dts/sophgo/sg2044-sophgo-sd3-10.dts index c50e61a50013..9c634920f37e 100644 --- a/arch/riscv/boot/dts/sophgo/sg2044-sophgo-sd3-10.dts +++ b/arch/riscv/boot/dts/sophgo/sg2044-sophgo-sd3-10.dts @@ -80,6 +80,24 @@ &sd { status = "okay"; }; +&spifmc0 { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + }; +}; + +&spifmc1 { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + }; +}; + &uart1 { status = "okay"; }; diff --git a/arch/riscv/boot/dts/sophgo/sg2044.dtsi b/arch/riscv/boot/dts/sophgo/sg2044.dtsi index 6eaf92dd0a90..e45f7218de04 100644 --- a/arch/riscv/boot/dts/sophgo/sg2044.dtsi +++ b/arch/riscv/boot/dts/sophgo/sg2044.dtsi @@ -33,6 +33,30 @@ soc { dma-noncoherent; ranges; + spifmc0: spi@7001000000 { + compatible = "sophgo,sg2044-spifmc-nor"; + reg = <0x70 0x01000000 0x0 0x4000000>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&clk CLK_GATE_AHB_SPIFMC>; + interrupt-parent = <&intc>; + interrupts = <37 IRQ_TYPE_LEVEL_HIGH>; + resets = <&rst RST_SPIFMC0>; + status = "disabled"; + }; + + spifmc1: spi@7005000000 { + compatible = "sophgo,sg2044-spifmc-nor"; + reg = <0x70 0x05000000 0x0 0x4000000>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&clk CLK_GATE_AHB_SPIFMC>; + interrupt-parent = <&intc>; + interrupts = <38 IRQ_TYPE_LEVEL_HIGH>; + resets = <&rst RST_SPIFMC1>; + status = "disabled"; + }; + dmac0: dma-controller@7020000000 { compatible = "snps,axi-dma-1.01a"; reg = <0x70 0x20000000 0x0 0x10000>;