From patchwork Tue Oct 15 20:10:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177369 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="D6hVULrl"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t64t61nvz9sPZ for ; Wed, 16 Oct 2019 07:11:10 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 4EB7EC21C50; Tue, 15 Oct 2019 20:10:55 +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_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 C7DDBC21C29; Tue, 15 Oct 2019 20:10:43 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 0551FC21C29; Tue, 15 Oct 2019 20:10:40 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id B5B31C21BE5 for ; Tue, 15 Oct 2019 20:10:40 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id o18so25308569wrv.13 for ; Tue, 15 Oct 2019 13:10:40 -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=8hr9n2512O9oc3i4dLmqoIkgO3MenCmq1W8DfYfMzNY=; b=D6hVULrl2ALvmUp4sTyuuHk9mPXmKKvHhQ9plidjiTTQaMru+nDDx4f3nC59aRWr48 ctGclr3U62wBL2NTZ8lSy4UK6Fj+vY6MFbexdbEy1jl1QcPGHaBGRmfMTT8YKd6Sr2Ul R3Vx4f1RpJxez2Kzjg6D9mAPHz6P9YGDhZd7u4PW75HSY+8sxkUQNXRzBM+rUBS7P9no fetflVEHQGx6F5fIXIsOgBLqlLyX9DHUTQ2H5MRqPkhcjonuqKsR9X774dQrhUmvKYWf zG6spBXHM4jUgdvbtqYNVQQQnb8fqinn5iiLPXfXFB/UeYdJcd+YFNt41TO9Btcl3SzL CBnQ== 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=8hr9n2512O9oc3i4dLmqoIkgO3MenCmq1W8DfYfMzNY=; b=afWypRuA9o9YcFjXvr/HZBTfXfua5TGUfltWGwhIh6RTN8Sk4KIESdf98Hu3xB3NZz PLjKFtBPgTwk+ugZwvcsFE23yEiAJaHFyBp2lBuTAqlSsW08W3xRZae0Z3WqAhNbwT6N jLYYudKT35vX7sKB/na6RYOGjgyFo9lag3I2kFvYFi9wtLO9sD5jaeZPmxMynkW+EgQQ bS8yGKq3tV5ubeHgSbdUwvXZORxpiCMQHpGT1+8lfMEyLM5V+6nTChocHC10NE7ozXIQ jqDlwUyj0e9Fo7ZKE6mJ6cgzhzHWt9FxotmSUlAsnJd2Fbh5LC+o3AeRxJIAmJ9ScibR 8OsA== X-Gm-Message-State: APjAAAWMxk+tUOmJ5Ra+uL2kyRUDV/zVH+bWo16qpBEJlLXEjaRThX7J 90/Ko0MiIxyjxRLzGBc0Cp8= X-Google-Smtp-Source: APXvYqyBRJp0d2epE/EaiW0vgWXrXPRZj9ceQxgfIezC3vSLjodwlI37p5LTFis3oCSvwCKHGZq1RQ== X-Received: by 2002:adf:fcc5:: with SMTP id f5mr31374503wrs.37.1571170240379; Tue, 15 Oct 2019 13:10:40 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:39 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:14 +0200 Message-Id: <20191015201032.20156-2-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 01/18] ddr: socfpga: gen5: constify altera_gen5_sdram_ops 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" Make the function pointer struct const, as it does not need to be writable. This doesn't really change anything other than moving this variable to a different section. No functional change. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/ddr/altera/sdram_gen5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ddr/altera/sdram_gen5.c b/drivers/ddr/altera/sdram_gen5.c index fcd89b619d..8c8ea19eb9 100644 --- a/drivers/ddr/altera/sdram_gen5.c +++ b/drivers/ddr/altera/sdram_gen5.c @@ -626,7 +626,7 @@ static int altera_gen5_sdram_get_info(struct udevice *dev, return 0; } -static struct ram_ops altera_gen5_sdram_ops = { +static const struct ram_ops altera_gen5_sdram_ops = { .get_info = altera_gen5_sdram_get_info, }; From patchwork Tue Oct 15 20:10:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177371 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="l/U8H2II"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6622vSyz9sNx for ; Wed, 16 Oct 2019 07:12:09 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 43004C21DAF; Tue, 15 Oct 2019 20:11:16 +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_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 EE8BCC21DFA; Tue, 15 Oct 2019 20:10:53 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E54D6C21DA1; Tue, 15 Oct 2019 20:10:45 +0000 (UTC) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by lists.denx.de (Postfix) with ESMTPS id DD044C21D56 for ; Tue, 15 Oct 2019 20:10:41 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id v17so357467wml.4 for ; Tue, 15 Oct 2019 13:10:41 -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=MirsIsda/BBvO+3vF9yMWW4nJ9yDKTMBYhJ9Sw4qcUU=; b=l/U8H2II9zE6p4u1vbzrzxcfnlWyt3bOUWAUN5PTdEiiyVbsVmkG3wcPnkBYA1GxoV Dog+srQhGMzVCeQ8voObK+Vu9HtQZ44k+mxJfDnfiW6oUBGjHzxOqJaZeUo6pRgJVwJw pw7m+QOzKEMKV7TD9Er2P0EoJv0osdO868m8rle+mGZUeERCRJaXs/sjXrKj4fPjYGOi dBCsauq2VyW+PBqUpZFL9ihquNuafYeYlafJdslBoyEAM9q/8j5HHR05q0IalH/qa02/ YAizTdtCYdVs4vs56NDpKOpIZeDyuaRIOWp1uK0G/fD8e7XhXwsTf2laHiYBHC15FVuv h9aQ== 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=MirsIsda/BBvO+3vF9yMWW4nJ9yDKTMBYhJ9Sw4qcUU=; b=HyseBWq2OQ+m5KyIznManlqhmVSuV5NTLEOIIo98fvrouJy+phaoW/SxReXV8Rl1oO 6Lq3lSnAui2gucEfLISahkhuw81idNtGZ8zo/tmrieiibZ/zOZzK3k54aGMCs82WrnIy DPUvftQbGHfw4pVNKVQ8dpmBQ9DsRh/37CUhgJ+7wJ9zAV697J8xTqtNOjN4SAll7WY8 4CkqctcPuhyLaj5iR+fJ0SgZxJ/Gp/WHtZtv46F0Io0YdM5aN7uGUcyFvYp8It4InSM/ 30J8BQp0cR0CQiHycGjUXCP6MwCT27olvjxFZT5d/qK61gqrduKsaRgT+wBB2eXM0+0+ +KMw== X-Gm-Message-State: APjAAAVuHA0COl7dE174+pGxQqhVngj4lvbRwEa9QaDCs5xKDYlcFOgM LFRHF9oKL6Smzjj280WfELI= X-Google-Smtp-Source: APXvYqwwndz/8+RbXIBAMAlbwN2Jr+Y3O8detMqGr/+QHL9AoBuODDzAD0uXe8HNnLsFAGaswFYLLA== X-Received: by 2002:a1c:ed0d:: with SMTP id l13mr265744wmh.54.1571170241537; Tue, 15 Oct 2019 13:10:41 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:40 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:15 +0200 Message-Id: <20191015201032.20156-3-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Tom Rini , Albert Aribaud , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 02/18] dts: arm: socfpga: add label for clkmgr 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" In preparation for moving socfpga gen5 clock handoff data to devicetree, add a label to the base devicetree so that dts files including this base tree can reference clkmgr by label. Signed-off-by: Simon Goldschmidt --- Changes in v2: None arch/arm/dts/socfpga.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/dts/socfpga.dtsi b/arch/arm/dts/socfpga.dtsi index 51a6a51b53..eda558f2fe 100644 --- a/arch/arm/dts/socfpga.dtsi +++ b/arch/arm/dts/socfpga.dtsi @@ -114,7 +114,7 @@ status = "disabled"; }; - clkmgr@ffd04000 { + clkmgr: clkmgr@ffd04000 { compatible = "altr,clk-mgr"; reg = <0xffd04000 0x1000>; From patchwork Tue Oct 15 20:10:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177370 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="ICfJnup9"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t65w4zNtz9sPF for ; Wed, 16 Oct 2019 07:12:04 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 50F8EC21CB6; Tue, 15 Oct 2019 20:11:04 +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_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 57669C21DB5; Tue, 15 Oct 2019 20:10:49 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 13A2FC21DA6; Tue, 15 Oct 2019 20:10:46 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id 2C568C21DA2 for ; Tue, 15 Oct 2019 20:10:43 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id p4so9486839wrm.8 for ; Tue, 15 Oct 2019 13:10:43 -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=rOXn5eT/jYnNhda2rp7LZcJv4KF3CwkzlYrJ1kBAvo8=; b=ICfJnup9MTL4RlMD7eYq7PFe2EuetlMTAeBK2RSK4NJB1dlEsUyUE+5cb1L+LtbFEc MzdOsNtiWtrFr2dFkmgD46bX6H63eaYTBzQ7LvHCr+GksdDiAEmhla/9cqn+mWAguPWw qjug/DAmrloFkx/QKwpUmtPCsTToVX2U5hgs+GPZLIDlg56Iea1+O72ky7Iu0JNBYki/ YkArPjKxl6JKTRt28lNnnpdqtFDYvcW1WYZzhcOsTxDR+p/tGNYMls0DRM/+sc5VTHNP GwB9VycebG3rGWhtvdGDdnuh4YlzWBWQBQNCcUm9a8El9h6OX8QFa++76ukvKDkuKAEo t58g== 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=rOXn5eT/jYnNhda2rp7LZcJv4KF3CwkzlYrJ1kBAvo8=; b=huBXxDMCnwy/mriTeU9BWXPzQJkrVJPLsdrK7uZG2WxDiHIzZX3rBl2P0j5ovtdtjv ohC/biyL1on+x0mC6GcD1mrxt/XhlOVZiK7Ps4bjxlSMxLxjVm6WxUrDgjEunqaOER9p n6YLsy5VQcYYMumMMGfXQKgw5r+ZrdWzQHasuBJAfEdU8+cFSFxYQsoqaPYwExfPmeAg m0P1a1uJhqpXwxB0gOnefhhxyopcTUzbCMa1Ih0iXZjBncBOqdNJV9KRv3VI7qwhUP4x 2KMk/P/iiK9VytLrEj17IKrFLGUI0MWjSZpkso/+8paw9Qaz4svR31Bh1p/hs2Azol7T u4Jg== X-Gm-Message-State: APjAAAX5oXSjz4YU0YedOqJy5llwrI/5bjFZmRa7fM1+KqlFFAUxKozp y3rorRT2hKu0jB+WkVtq044= X-Google-Smtp-Source: APXvYqyTiIS5WGC7TNCIHsRnKWbrYAljsWjZpI9NsD/odXhXiQ7lDax/B9R+/ApBtuzjphYQglUSHg== X-Received: by 2002:adf:ea11:: with SMTP id q17mr13582586wrm.83.1571170242825; Tue, 15 Oct 2019 13:10:42 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:42 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:16 +0200 Message-Id: <20191015201032.20156-4-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Tom Rini , Albert Aribaud , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 03/18] arm: socfpga: gen5: increase SPL_SYS_MALLOC_F_LEN 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" In preparation to adding more DM based drivers, increase the SPL pre-relocation heap just enough to allow those new drivers to run. Signed-off-by: Simon Goldschmidt --- Changes in v2: None arch/arm/mach-socfpga/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-socfpga/Kconfig b/arch/arm/mach-socfpga/Kconfig index 1d914648e3..9efdcd6f10 100644 --- a/arch/arm/mach-socfpga/Kconfig +++ b/arch/arm/mach-socfpga/Kconfig @@ -13,7 +13,7 @@ config SPL_STACK_R_ADDR default 0x00800000 if TARGET_SOCFPGA_GEN5 config SPL_SYS_MALLOC_F_LEN - default 0x800 if TARGET_SOCFPGA_GEN5 + default 0x1100 if TARGET_SOCFPGA_GEN5 config SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION_TYPE default 0xa2 From patchwork Tue Oct 15 20:10:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177378 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="aBnYV4wm"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6DP0VQvz9sPF for ; Wed, 16 Oct 2019 07:17:40 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id B6711C21D72; Tue, 15 Oct 2019 20:12: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_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 29330C21DAF; Tue, 15 Oct 2019 20:11:02 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 2E5A3C21D83; Tue, 15 Oct 2019 20:10:47 +0000 (UTC) Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by lists.denx.de (Postfix) with ESMTPS id 5B1ABC21DD3 for ; Tue, 15 Oct 2019 20:10:44 +0000 (UTC) Received: by mail-wm1-f67.google.com with SMTP id p7so387652wmp.4 for ; Tue, 15 Oct 2019 13:10:44 -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=4oL7AJGA1e6OptUfzWJfjnqNXrJQbUtE3KLwD9AfH4A=; b=aBnYV4wmQJXpGDoDzGS5HtBQJ1DDJpIr86vIQ55vZyDR/aTd3oEYKMjY+FbDxpL7aB cj0BBqeBVbScPg/5gAtG128mtlT746gSP9jgbEFAVcgoCAA25/V4I7gw1FMXbDz9+7o+ om8RUGpWax/2B/bY5GfSiikbI4FTkpRB/w+sFfvZZM2J7OuQ7mfq0D2hVBxnK5VAmLl3 L3zn+MmMXRlq7KUSFAPgmAGouGRi5RRXhnpKS1rIG2xU4+0+vCYjOEZL34fNsTRL34Ev ZA/3TN98Gq/8/pC4JhL9HGq7qB5/3E/ogFn3XT5kcMprI1kZDJHDyhw/w/uL2W0oY4Gs dk1g== 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=4oL7AJGA1e6OptUfzWJfjnqNXrJQbUtE3KLwD9AfH4A=; b=Jdb7XrT1yk4/0fzlJSy58wglcrqyC9sfsFLMEzRQp2Qh+GMUKvOmoIBPpgf0y0DRGY 6b2y3ZutoWXph2o3g1CwycElosw72ooQTN1rs7pP0GPGo2OxdrLUwBH/AzuZiqqe7nkw DtFJXlQDmYcNk15yGtEQ68vKzKL6FcpB1dxHr/rOl38SzMuEuQaNZhzzh58fAmii6IeS OS5gdV/4Wxl3ZN/PJkPs2gpjRNP7teUNwtZulDwDeR2AgU1UFR19qtuHPJm4pW6/wxtT 2B+Y8FNeTExoXB0hLJv1LChK/iFZycbDqc9S5mLs0jWhcrDWSiIJj1wXP5Ankd/4NTXP VEEQ== X-Gm-Message-State: APjAAAU1UtLQZLjiJgP0cUMYSKst6Fw3MoI21jOHS0DRWpVZ7cb+jQ5T qu7WmMdDqkYv8xxE/4IOAhE= X-Google-Smtp-Source: APXvYqxd8iYsZLQlKwlfj/84dRzYJA9yKKPdDRi4u/taGhKYLiwjAdCJqsOsWwohqiP+7fiz0m1iAA== X-Received: by 2002:a05:600c:2549:: with SMTP id e9mr194725wma.64.1571170244034; Tue, 15 Oct 2019 13:10:44 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:43 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:17 +0200 Message-Id: <20191015201032.20156-5-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 04/18] timer: dw-apb: add reset handling 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" To use this timer on socfpga as system tick, it needs to take itself out of reset. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/timer/dw-apb-timer.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/drivers/timer/dw-apb-timer.c b/drivers/timer/dw-apb-timer.c index 86312b8dc7..fad22be8c9 100644 --- a/drivers/timer/dw-apb-timer.c +++ b/drivers/timer/dw-apb-timer.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -18,7 +19,8 @@ #define DW_APB_CTRL 0x8 struct dw_apb_timer_priv { - fdt_addr_t regs; + fdt_addr_t regs; + struct reset_ctl_bulk resets; }; static int dw_apb_timer_get_count(struct udevice *dev, u64 *count) @@ -42,6 +44,12 @@ static int dw_apb_timer_probe(struct udevice *dev) struct clk clk; int ret; + ret = reset_get_bulk(dev, &priv->resets); + if (ret) + dev_warn(dev, "Can't get reset: %d\n", ret); + else + reset_deassert_bulk(&priv->resets); + ret = clk_get_by_index(dev, 0, &clk); if (ret) return ret; @@ -67,6 +75,13 @@ static int dw_apb_timer_ofdata_to_platdata(struct udevice *dev) return 0; } +static int dw_apb_timer_remove(struct udevice *dev) +{ + struct dw_apb_timer_priv *priv = dev_get_priv(dev); + + return reset_release_bulk(&priv->resets); +} + static const struct timer_ops dw_apb_timer_ops = { .get_count = dw_apb_timer_get_count, }; @@ -83,5 +98,6 @@ U_BOOT_DRIVER(dw_apb_timer) = { .probe = dw_apb_timer_probe, .of_match = dw_apb_timer_ids, .ofdata_to_platdata = dw_apb_timer_ofdata_to_platdata, + .remove = dw_apb_timer_remove, .priv_auto_alloc_size = sizeof(struct dw_apb_timer_priv), }; From patchwork Tue Oct 15 20:10:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177381 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="Ezv+zAq7"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6G333NKz9sPZ for ; Wed, 16 Oct 2019 07:19:07 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 1EF62C21C93; Tue, 15 Oct 2019 20:12:21 +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_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 5CCD5C21DE8; Tue, 15 Oct 2019 20:11:06 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5D9ABC21C50; Tue, 15 Oct 2019 20:10:48 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id A68A1C21D74 for ; Tue, 15 Oct 2019 20:10:45 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id z9so25347706wrl.11 for ; Tue, 15 Oct 2019 13:10:45 -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=EGTEANj3OXg08KKRq5P+8CtEBrsZm06eouSce4wEZFk=; b=Ezv+zAq78YTC/lSBWVBZdaj18b98CvBGzmAteX6VSZrkorT9a5P6wfN+iAiX+H/QTA C3H2NxFy6Jl5ur1fOk/6wbT4ZzpgbfdalEFE4eaNvRvlaYNKkb5v3nwqKLYJqlOSIGk1 7Ly9bTUjHNARi9RiPDn0FhOnCBg+SkvqcEDOVa+0PHPC3K6z4NbosDiWYkqMsWhjOj3X QNsiR0M67fUkLd3oLIPyKR6/BbXWj1z7g6PYqu02jetE+ZXpm7UL7LSzhO5NmW/FI4b9 Tdt3FhhLwFJtF/KB2tBFwac2U95PNteme6XH56q8UO8+ePnCuV/JvckgyaOniHlDyRCC dq+Q== 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=EGTEANj3OXg08KKRq5P+8CtEBrsZm06eouSce4wEZFk=; b=YaaGDASIVoc4E7mV/Eagu5to4d0D8y55RsmmbwuGliEc4qgakysmBX2+FsqD1rGEMj 1Y2WUMKYBkaTdhsYB7nnSEJhLMu/7qD8Agi9Zy9Q55xePqp1IjuwS3u51a6S9PhhYfjs 4cU1BM9fsEPv5oVD5cYLAMxfRHFeSuCsDd5sae0zcIADuECK9lgQnjykQ8slGGrDbdMY Z3FxMUXchEJewfcL+WBXmUaI+hBujHaThB9PT6F6eyrXbTLNuiGhVA5DA4Tv1mAKvoN9 3GTCDxI+dVoa9GFZ70At4esZJxhR7wEfSW1qWTNM/LbfY6gHbf8WMMHIWiWFJHxwMbGH 3gSw== X-Gm-Message-State: APjAAAXZodsO7l2kxHsR2H71+7LvCcKgQpj2BIqQV4NFOKIJ4i/fBaGb cQvFncZHhoG7D3FuMB1Axk4tvRCe X-Google-Smtp-Source: APXvYqy7JOnWaVpM9P94AwYcITllpU+Z2RFDVMB/RMdfeG8IPjikLzAo7Ide8SZZXpZwg39lQ8/OWw== X-Received: by 2002:adf:e98d:: with SMTP id h13mr30747201wrm.70.1571170245261; Tue, 15 Oct 2019 13:10:45 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:44 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:18 +0200 Message-Id: <20191015201032.20156-6-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Albert Aribaud , u-boot@lists.denx.de, Joe Hershberger , Tom Rini Subject: [U-Boot] [RFC PATCH v2 05/18] arm: socfpga: gen5: move initial reset handling to reset driver 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 moves disabling all peripherals from ad-hoc code in arch/arm to the socfpga reset driver. To do this, DM initialization and UCLASS_RESET probing has to be done earlier in the SPL. Also, the gen5 devicetrees need an added property that tells the reset driver which bits to set and which need to be left at 0 (L4WD0). Signed-off-by: Simon Goldschmidt --- Changes in v2: - add dts based reset handling (messed up in v1) arch/arm/dts/socfpga-common-u-boot.dtsi | 1 + arch/arm/mach-socfpga/reset_manager_gen5.c | 13 -------- arch/arm/mach-socfpga/spl_gen5.c | 21 ++++++------ drivers/reset/reset-socfpga.c | 37 ++++++++++++++++++++-- 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/arch/arm/dts/socfpga-common-u-boot.dtsi b/arch/arm/dts/socfpga-common-u-boot.dtsi index 322c858c4b..aebe476e3f 100644 --- a/arch/arm/dts/socfpga-common-u-boot.dtsi +++ b/arch/arm/dts/socfpga-common-u-boot.dtsi @@ -12,6 +12,7 @@ &rst { u-boot,dm-pre-reloc; + altr,modrst-reset-val = <1 0xffffffbf 0xffffffff>; }; &sdr { diff --git a/arch/arm/mach-socfpga/reset_manager_gen5.c b/arch/arm/mach-socfpga/reset_manager_gen5.c index 9a32f5abfe..34e59b852b 100644 --- a/arch/arm/mach-socfpga/reset_manager_gen5.c +++ b/arch/arm/mach-socfpga/reset_manager_gen5.c @@ -48,19 +48,6 @@ void socfpga_per_reset(u32 reset, int set) clrbits_le32(reg, 1 << RSTMGR_RESET(reset)); } -/* - * Assert reset on every peripheral but L4WD0. - * Watchdog must be kept intact to prevent glitches - * and/or hangs. - */ -void socfpga_per_reset_all(void) -{ - const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)); - - writel(~l4wd0, &reset_manager_base->per_mod_reset); - writel(0xffffffff, &reset_manager_base->per2_mod_reset); -} - #define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10 #define L3REGS_REMAP_HPS2FPGA_MASK 0x08 #define L3REGS_REMAP_OCRAM_MASK 0x01 diff --git a/arch/arm/mach-socfpga/spl_gen5.c b/arch/arm/mach-socfpga/spl_gen5.c index 87b76b47de..1ae8025746 100644 --- a/arch/arm/mach-socfpga/spl_gen5.c +++ b/arch/arm/mach-socfpga/spl_gen5.c @@ -84,12 +84,19 @@ void board_init_f(ulong dummy) socfpga_sdram_remap_zero(); socfpga_pl310_clear(); + ret = spl_early_init(); + if (ret) { + debug("spl_early_init() failed: %d\n", ret); + hang(); + } + debug("Freezing all I/O banks\n"); /* freeze all IO banks */ sys_mgr_frzctrl_freeze_req(); - /* Put everything into reset but L4WD0. */ - socfpga_per_reset_all(); + ret = uclass_get_device(UCLASS_RESET, 0, &dev); + if (ret) + debug("Reset init failed: %d\n", ret); if (!socfpga_is_booting_from_fpga()) { /* Put FPGA bridges into reset too. */ @@ -130,16 +137,6 @@ void board_init_f(ulong dummy) debug_uart_init(); #endif - ret = spl_early_init(); - if (ret) { - debug("spl_early_init() failed: %d\n", ret); - hang(); - } - - ret = uclass_get_device(UCLASS_RESET, 0, &dev); - if (ret) - debug("Reset init failed: %d\n", ret); - /* enable console uart printing */ preloader_console_init(); diff --git a/drivers/reset/reset-socfpga.c b/drivers/reset/reset-socfpga.c index 93ec9cfdb6..c5fd0679c7 100644 --- a/drivers/reset/reset-socfpga.c +++ b/drivers/reset/reset-socfpga.c @@ -106,6 +106,39 @@ static const struct reset_ops socfpga_reset_ops = { .rst_deassert = socfpga_reset_deassert, }; +/* + * This function ensures that in SPL, all peripherals are reset at startup. + * It does this by reading reset values from the device tree. + */ +static int socfpga_reset_set_inital_reset_values(struct udevice *dev) +{ +#ifdef CONFIG_SPL_BUILD + struct socfpga_reset_data *data = dev_get_priv(dev); + int ret; + u32 modrst_vals[5]; + size_t i, sz, offset; + + ret = dev_read_size(dev, "altr,modrst-reset-val"); + if (ret >= sizeof(u32)) { + sz = min(ret/sizeof(u32), ARRAY_SIZE(modrst_vals)); + ret = dev_read_u32_array(dev, "altr,modrst-reset-val", + modrst_vals, sz); + if (ret) { + dev_warn(dev, "Failed to read modrst reset values\n"); + return ret; + } + /* first item is register offset to start */ + offset = modrst_vals[0] * 4; + for (i = 1; i < sz; i++) { + writel(modrst_vals[i], data->modrst_base + offset); + offset += 4; + } + } +#endif + + return 0; +} + static int socfpga_reset_probe(struct udevice *dev) { struct socfpga_reset_data *data = dev_get_priv(dev); @@ -117,7 +150,7 @@ static int socfpga_reset_probe(struct udevice *dev) modrst_offset = dev_read_u32_default(dev, "altr,modrst-offset", 0x10); data->modrst_base = membase + modrst_offset; - return 0; + return socfpga_reset_set_inital_reset_values(dev); } static int socfpga_reset_remove(struct udevice *dev) @@ -163,5 +196,5 @@ U_BOOT_DRIVER(socfpga_reset) = { .priv_auto_alloc_size = sizeof(struct socfpga_reset_data), .ops = &socfpga_reset_ops, .remove = socfpga_reset_remove, - .flags = DM_FLAG_OS_PREPARE, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_OS_PREPARE, }; From patchwork Tue Oct 15 20:10:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177376 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="OIPZALDv"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6D144ggz9sPF for ; Wed, 16 Oct 2019 07:17:21 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 414CCC21DD4; Tue, 15 Oct 2019 20:12:44 +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_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 51227C21D65; Tue, 15 Oct 2019 20:11:17 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5C32DC21DB6; Tue, 15 Oct 2019 20:10:49 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by lists.denx.de (Postfix) with ESMTPS id AC4C5C21DDC for ; Tue, 15 Oct 2019 20:10:46 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id b9so25389519wrs.0 for ; Tue, 15 Oct 2019 13:10:46 -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=liU45J4NgeAZIzOXDmrtvkhFhSrHX1/YjSg47VlS5NE=; b=OIPZALDv2TKKKpBkUk52Kbh+F+D3FtIkdCGupgguLiC57xi+QJdSCKupXEJVZSWwke 4/8ZHSkpWcmlGFTTuWATRFoJhL+Qsrt7yNUBgQCeRLl/xjp/ASzDK4oaH+FbbbhGryMJ bKypTLKlzoIbAhdVl7Haw5//rGSALDvq9QwxXbRmb6NL61f3QzqeKxA4O95qhNuT19bc LPvL4FFWAceUPbsAgbngq8mdpTO03M3tSlV9ZcOhqqcTalW3KzsWyz8FNYmjqZGCbyqF 9E2T5/rZ/KfVTEKG+OcoF2IH1CEe2HnyTi7rI1HVQWFDS3JAnOnRF3kSMqxZdgZbAhuO kFqg== 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=liU45J4NgeAZIzOXDmrtvkhFhSrHX1/YjSg47VlS5NE=; b=lgNnZ/o+4l0xpQ/Za6O50EFm/B6Bon5gFbPdu6tot7lZuJ8nkdqGAbyF34i8Ie5qQx GIUyH4jfbncljG3bI5Zk7ecfHmXFK9NdzjA5dIBiQTaDV3AV+++GgGRmiVFrVAUY8f5K ZFXMwEE9DCxUPoxpeBv0aj2qJ0wnSHjU05IMJBVKEQ03rA+6qyeCXIUsax8Y4Ne698s/ B6XAk8X29sgTlJCRjrNpU7261D971Zqv+fC2fckCjxjH4V3PqtHlZBGdpITNIo2ahDHw C6H/161eW0rRs/3hNwW64r6XbVE/RE6krfwbQyQfOze94q6C7p0/RIy4r88pdXuCX8Lj y6BQ== X-Gm-Message-State: APjAAAWL5A661uLZBc+DMtXkcte6zSf+1TAY7RrcQU9Awh2wxdWpRfk6 g7IGpzv+kG5zHUQB+H9rAHU= X-Google-Smtp-Source: APXvYqx7DV/bwxO0F8MXjIOdlPbgX5h8sdqXmW5Y0ekNF84P4WeLqvlJZMOwDwnsuRx+8xrXFD3PSg== X-Received: by 2002:a5d:560e:: with SMTP id l14mr18394107wrv.173.1571170246326; Tue, 15 Oct 2019 13:10:46 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:45 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:19 +0200 Message-Id: <20191015201032.20156-7-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Tom Rini , Albert Aribaud , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 06/18] arm: dts: socfpga: add settings for gen5 clk driver 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" For some clocks, the socfpga gen5 clock driver in preparation needs a source register, which is used to select the parent clock. Add these to the socfpga gen5 base device tree. Signed-off-by: Simon Goldschmidt --- Changes in v2: - split this patch from v1 5/6 arch/arm/dts/socfpga.dtsi | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arch/arm/dts/socfpga.dtsi b/arch/arm/dts/socfpga.dtsi index eda558f2fe..8ff3f211cb 100644 --- a/arch/arm/dts/socfpga.dtsi +++ b/arch/arm/dts/socfpga.dtsi @@ -332,6 +332,7 @@ compatible = "altr,socfpga-gate-clk"; clocks = <&mainclk>, <&per_base_clk>; div-reg = <0x64 4 3>; + src-reg = <0x70 0 1>; clk-gate = <0x60 2>; }; @@ -340,6 +341,7 @@ compatible = "altr,socfpga-gate-clk"; clocks = <&mainclk>, <&per_base_clk>; div-reg = <0x64 7 3>; + src-reg = <0x70 1 1>; clk-gate = <0x60 3>; }; @@ -453,6 +455,7 @@ #clock-cells = <0>; compatible = "altr,socfpga-gate-clk"; clocks = <&f2s_periph_ref_clk>, <&main_nand_sdmmc_clk>, <&per_nand_mmc_clk>; + src-reg = <0xac 0 2>; clk-gate = <0xa0 8>; clk-phase = <0 135>; }; @@ -469,6 +472,7 @@ #clock-cells = <0>; compatible = "altr,socfpga-gate-clk"; clocks = <&f2s_periph_ref_clk>, <&main_nand_sdmmc_clk>, <&per_nand_mmc_clk>; + src-reg = <0xac 2 2>; clk-gate = <0xa0 9>; }; @@ -491,6 +495,7 @@ #clock-cells = <0>; compatible = "altr,socfpga-gate-clk"; clocks = <&f2s_periph_ref_clk>, <&main_qspi_clk>, <&per_qspi_clk>; + src-reg = <0xac 4 2>; clk-gate = <0xa0 11>; }; From patchwork Tue Oct 15 20:10:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177382 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="RFA2bC6g"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6GM65Zgz9sPF for ; Wed, 16 Oct 2019 07:19:23 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 5CFB6C21D83; Tue, 15 Oct 2019 20:12:34 +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_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 CFE19C21DD9; Tue, 15 Oct 2019 20:11:14 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id E16B4C21D9A; Tue, 15 Oct 2019 20:10:51 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by lists.denx.de (Postfix) with ESMTPS id 65FB3C21DA6 for ; Tue, 15 Oct 2019 20:10:48 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id o18so25308918wrv.13 for ; Tue, 15 Oct 2019 13:10:48 -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=gZzNwNegEDYNS51LbTdY/Se+PCbbbnMmyvi6XfAfEXw=; b=RFA2bC6gJ8h7A+H5IftP8+o9lnBDLb2bAp9aS1qem1Kl+UR8r6HN63xtB51xjUqC0p k2pPXGkeQYM9O9M+5Z+rWXDiW5zCQPlRpf6VpSyZxqWLQfs17CkI/tHYydEYhhmb1XD5 YbXhtYXkmZ3WjZ5EZAghJWex7BxKMUwmeSZKBF5VwD3WtfkAKTz0u8Tdh/l9I2jO5FrK NMH3v/D6YnatPxnY8Pq9fJlNzUHFFbp6ewLQAIBV/jsl8iOeb8uGOYWAGZzLpVR7NqgJ GAFb3nh3l3UniAdWB7gmfZQePmKgLzow23/Xd59sDuc9O4VMwb2eG9sdr96mT5NpiHr2 Rusw== 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=gZzNwNegEDYNS51LbTdY/Se+PCbbbnMmyvi6XfAfEXw=; b=TY2jGj5HlPVy0Ox5d4BDesPRjqdVW2HFyAeNQmHqkHaV8BP0yBhYF9ohJGZt0hg9c2 WOF2TvgvPvjAmihQcyRTsVjqQ4r3Z4QOCKfLlIyJLlMKdIA3VLyY9w4kBxL5y5eOk0Ea gtbY1bcqz2gCjpLHt2j+7fKBiBw2GvZx6BXHT4WAUJmfqXjOihNvahTJhcCGdPewzFcO b1hm5fxKoBVReF7RWxwLHKSbKPpwhx92uPWjrrBzUUzHTsWYiGAFg6DGYa81TLF4+ks+ R9+3hvw3Z7chxZVJkFv+WcFQA2z5ABQ8R5bJ/5IfOT9yLj5qm9XD2OYE2Wsy/bZpQVz3 IMBA== X-Gm-Message-State: APjAAAXqjldeANKLUvUsEZVSjqiZnmM5XOBAQxlspOwwFbnTWzhV8+xL hgdMmeyuVC4LQUezbcZZjlQ= X-Google-Smtp-Source: APXvYqxBFZlT2w9EA7c3mBwJQ+CEbDUzharEoLotvllJ2F7afRkfVkMDBeYWiVLQYnO9RhsHYD1yiQ== X-Received: by 2002:a5d:40c6:: with SMTP id b6mr17008303wrq.90.1571170248088; Tue, 15 Oct 2019 13:10:48 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:47 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:20 +0200 Message-Id: <20191015201032.20156-8-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Tom Rini , Albert Aribaud , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 07/18] arm: dts: socfpga: make clock nodes available in SPL 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" The socfpga gen5 clock driver will need some of the clock nodes to be preserved in the SPL devicetree. Mark them appropriately. Signed-off-by: Simon Goldschmidt --- Changes in v2: - split this patch from v1 5/6 arch/arm/dts/socfpga-common-u-boot.dtsi | 70 +++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/arch/arm/dts/socfpga-common-u-boot.dtsi b/arch/arm/dts/socfpga-common-u-boot.dtsi index aebe476e3f..7bc3b0021f 100644 --- a/arch/arm/dts/socfpga-common-u-boot.dtsi +++ b/arch/arm/dts/socfpga-common-u-boot.dtsi @@ -7,6 +7,12 @@ /{ soc { u-boot,dm-pre-reloc; + clkmgr@ffd04000 { + u-boot,dm-pre-reloc; + clocks { + u-boot,dm-pre-reloc; + }; + }; }; }; @@ -18,3 +24,67 @@ &sdr { u-boot,dm-pre-reloc; }; + +&osc1 { + u-boot,dm-pre-reloc; +}; + +&osc2 { + u-boot,dm-pre-reloc; +}; + +&f2s_periph_ref_clk { + u-boot,dm-pre-reloc; +}; + +&main_pll { + u-boot,dm-pre-reloc; +}; + +&mainclk { + u-boot,dm-pre-reloc; +}; + +&main_qspi_clk { + u-boot,dm-pre-reloc; +}; + +&main_nand_sdmmc_clk { + u-boot,dm-pre-reloc; +}; + +&periph_pll { + u-boot,dm-pre-reloc; +}; + +&per_qspi_clk { + u-boot,dm-pre-reloc; +}; + +&per_nand_mmc_clk { + u-boot,dm-pre-reloc; +}; + +&per_base_clk { + u-boot,dm-pre-reloc; +}; + +&l4_mp_clk { + u-boot,dm-pre-reloc; +}; + +&l4_sp_clk { + u-boot,dm-pre-reloc; +}; + +&sdmmc_clk { + u-boot,dm-pre-reloc; +}; + +&sdmmc_clk_divided { + u-boot,dm-pre-reloc; +}; + +&qspi_clk { + u-boot,dm-pre-reloc; +}; From patchwork Tue Oct 15 20:10:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177372 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="k2XCLQiG"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6653ntDz9sNx for ; Wed, 16 Oct 2019 07:12:13 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 2497FC21C93; Tue, 15 Oct 2019 20:11:29 +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.8 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H2,T_DKIM_INVALID,UPPERCASE_50_75 autolearn=no autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 7F96FC21DF8; Tue, 15 Oct 2019 20:11:01 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id BCB94C21DCA; Tue, 15 Oct 2019 20:10:53 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id DED13C21DD4 for ; Tue, 15 Oct 2019 20:10:49 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id z9so25347897wrl.11 for ; Tue, 15 Oct 2019 13:10:49 -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=HLjYE757X1aF96URaCgKLTxDdrPEwQ7tse8C3CR8BsE=; b=k2XCLQiGEyvUD3RIVsiUh9m11E/xejWcIDwmoMyPdhXD0au8jg0cwkN3CcHYxX23NE 9/4jtZ654OFtpHA7U0QvK76JyquvgVraM+gFDQFbwhJuTh3x2hMR8YEUuMeC4hK10q22 U9DqFPvnz5h8aeVF2Ut6SBt6Bq+UAl/PloxivuvOm8JADJw+Fee1ygf0PFuEgb1Vv50K 2/8W7fSEXak0LyXHFh/xEL/pDkA2VLGXYqkWLamOysDvF86fZu7u3/6kfx9A7lR66/Lz Fmw2pL6qz/lDBNEuzmxSRoS3oNDEpzJQ/LQcw0wch7zFwjt50+7mUwvr8ArSckOVWsQK Tn+w== 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=HLjYE757X1aF96URaCgKLTxDdrPEwQ7tse8C3CR8BsE=; b=rHJL+MTH6EtvY3X9vy6oOQwh+v9dGFSMDEOAgsyrlkntD9xAcQWOGmgfGGlOrkCs+P rSQPRai5pyevgerAHktkWX5rOsZ9BvdHe40qbwZNv/aENOflXEdR9cGXQb7I+srsBNl1 tvdFuA6J6cB0mGKrTAOMaF38cUi+gAkIJTdJRBEPDVcXi7G6QECAX4L8a7czlnDrGTgF 17bp7EY9SlGeb0Mx0I3gTFzueISIU/NmF89nSmg+LYTcfy61BvaG8mrhhsi+hF8uW2DB vGoDnpR5AvDmnGBJZO8fKlVVWHSJxEPyEaS5J0w5xyspxOi5jTGINJTiysIKGW8pz8Q1 YNCA== X-Gm-Message-State: APjAAAX70QIIgTUsPq8LGJcQTfuPX66/Zp/q/i8rnVyiIcNXyylDTIf6 Jy1PjYjy5Bn4N8onYiACHt0= X-Google-Smtp-Source: APXvYqzp+Nsy6wUwhEsxO6ldIoOB/dvzyuNyungyb0qR0fjQOnBHOF+m1GOR+DBg/YMn42CU+SVVag== X-Received: by 2002:a05:6000:1051:: with SMTP id c17mr6737780wrx.124.1571170249190; Tue, 15 Oct 2019 13:10:49 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:48 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:21 +0200 Message-Id: <20191015201032.20156-9-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de, Albert Aribaud Subject: [U-Boot] [RFC PATCH v2 08/18] socfpga: gen5: add new tool to create handoff dtsi files 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 new tool converts handoff information from quartus to "*_handoff.dtsi" devicetree files. This is in preparation to move from ad-hoc code in arch that parses the 'qts' header files to drivers parsing the same information from devicetree. Converting existing U-Boot 'qts' files is also supported. Signed-off-by: Simon Goldschmidt --- Changes in v2: None arch/arm/mach-socfpga/create_handoff_gen5.c | 660 ++++++++++++++++++++ arch/arm/mach-socfpga/qts-to-handoff.sh | 83 +++ 2 files changed, 743 insertions(+) create mode 100644 arch/arm/mach-socfpga/create_handoff_gen5.c create mode 100755 arch/arm/mach-socfpga/qts-to-handoff.sh diff --git a/arch/arm/mach-socfpga/create_handoff_gen5.c b/arch/arm/mach-socfpga/create_handoff_gen5.c new file mode 100644 index 0000000000..6ec436719d --- /dev/null +++ b/arch/arm/mach-socfpga/create_handoff_gen5.c @@ -0,0 +1,660 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * This is a host-tool that needs to be compiled per board and prints the + * handoff.dtsi to stdout. + */ + +#include +#include + +/* Define kernel types */ +typedef uint8_t u8; +typedef uint32_t u32; + +#ifdef USE_QUARTUS_OUTPUT +#ifdef ARRIA5 +#include "iocsr_config_arria5.c" +#include "pinmux_config_arria5.c" +#else +#include "iocsr_config_cyclone5.c" +#include "pinmux_config_cyclone5.c" +#endif +#include "pll_config.h" +#include "sdram/sdram_config.h" +#include "sequencer_auto.h" +#include "sequencer_defines.h" +#include "sequencer_auto_ac_init.c" +#include "sequencer_auto_inst_init.c" +#define RW_MGR(x) __RW_MGR_##x +#else +#define RW_MGR(x) RW_MGR_##x +#include +#include +#include +#include +#endif + +#include "include/mach/clock_manager_gen5.h" +#include "include/mach/sdram_gen5.h" + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) +#endif + +const char handoff_dtsi_hdr[] = + "// SPDX-License-Identifier: GPL-2.0\n" + "/*\n" + " *\n" + " * This code was generated by a tool based on\n" + " * handoffs from both Qsys and Quartus.\n" + " *\n" + " * Changes to this file may be lost if\n" + " * the code is regenerated.\n" + " *\n" + " */\n"; + +/* Wrap PLL config */ + +#define MAIN_VCO_BASE ( \ + (CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \ + CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \ + (CONFIG_HPS_MAINPLLGRP_VCO_NUMER << \ + CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) \ + ) + +#define PERI_VCO_BASE ( \ + (CONFIG_HPS_PERPLLGRP_VCO_PSRC << \ + CLKMGR_PERPLLGRP_VCO_PSRC_OFFSET) | \ + (CONFIG_HPS_PERPLLGRP_VCO_DENOM << \ + CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) | \ + (CONFIG_HPS_PERPLLGRP_VCO_NUMER << \ + CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) \ + ) + +#define SDR_VCO_BASE ( \ + (CONFIG_HPS_SDRPLLGRP_VCO_SSRC << \ + CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET) | \ + (CONFIG_HPS_SDRPLLGRP_VCO_DENOM << \ + CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) | \ + (CONFIG_HPS_SDRPLLGRP_VCO_NUMER << \ + CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) \ + ) + +static const struct cm_config cm_default = { + /* main group */ + MAIN_VCO_BASE, + (CONFIG_HPS_MAINPLLGRP_MPUCLK_CNT << + CLKMGR_MAINPLLGRP_MPUCLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_MAINCLK_CNT << + CLKMGR_MAINPLLGRP_MAINCLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_DBGATCLK_CNT << + CLKMGR_MAINPLLGRP_DBGATCLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_MAINQSPICLK_CNT << + CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_MAINNANDSDMMCCLK_CNT << + CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_CFGS2FUSER0CLK_CNT << + CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_OFFSET), + (CONFIG_HPS_MAINPLLGRP_MAINDIV_L3MPCLK << + CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_OFFSET) | + (CONFIG_HPS_MAINPLLGRP_MAINDIV_L3SPCLK << + CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_OFFSET) | + (CONFIG_HPS_MAINPLLGRP_MAINDIV_L4MPCLK << + CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_OFFSET) | + (CONFIG_HPS_MAINPLLGRP_MAINDIV_L4SPCLK << + CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET), + (CONFIG_HPS_MAINPLLGRP_DBGDIV_DBGATCLK << + CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_OFFSET) | + (CONFIG_HPS_MAINPLLGRP_DBGDIV_DBGCLK << + CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_OFFSET), + (CONFIG_HPS_MAINPLLGRP_TRACEDIV_TRACECLK << + CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_OFFSET), + (CONFIG_HPS_MAINPLLGRP_L4SRC_L4MP << + CLKMGR_MAINPLLGRP_L4SRC_L4MP_OFFSET) | + (CONFIG_HPS_MAINPLLGRP_L4SRC_L4SP << + CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET), + + /* peripheral group */ + PERI_VCO_BASE, + (CONFIG_HPS_PERPLLGRP_EMAC0CLK_CNT << + CLKMGR_PERPLLGRP_EMAC0CLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_EMAC1CLK_CNT << + CLKMGR_PERPLLGRP_EMAC1CLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_PERQSPICLK_CNT << + CLKMGR_PERPLLGRP_PERQSPICLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_PERNANDSDMMCCLK_CNT << + CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_PERBASECLK_CNT << + CLKMGR_PERPLLGRP_PERBASECLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_S2FUSER1CLK_CNT << + CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_OFFSET), + (CONFIG_HPS_PERPLLGRP_DIV_USBCLK << + CLKMGR_PERPLLGRP_DIV_USBCLK_OFFSET) | + (CONFIG_HPS_PERPLLGRP_DIV_SPIMCLK << + CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET) | + (CONFIG_HPS_PERPLLGRP_DIV_CAN0CLK << + CLKMGR_PERPLLGRP_DIV_CAN0CLK_OFFSET) | + (CONFIG_HPS_PERPLLGRP_DIV_CAN1CLK << + CLKMGR_PERPLLGRP_DIV_CAN1CLK_OFFSET), + (CONFIG_HPS_PERPLLGRP_GPIODIV_GPIODBCLK << + CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_OFFSET), + (CONFIG_HPS_PERPLLGRP_SRC_QSPI << + CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET) | + (CONFIG_HPS_PERPLLGRP_SRC_NAND << + CLKMGR_PERPLLGRP_SRC_NAND_OFFSET) | + (CONFIG_HPS_PERPLLGRP_SRC_SDMMC << + CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET), + + /* sdram pll group */ + SDR_VCO_BASE, + (CONFIG_HPS_SDRPLLGRP_DDRDQSCLK_PHASE << + CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_OFFSET) | + (CONFIG_HPS_SDRPLLGRP_DDRDQSCLK_CNT << + CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET), + (CONFIG_HPS_SDRPLLGRP_DDR2XDQSCLK_PHASE << + CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_OFFSET) | + (CONFIG_HPS_SDRPLLGRP_DDR2XDQSCLK_CNT << + CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_OFFSET), + (CONFIG_HPS_SDRPLLGRP_DDRDQCLK_PHASE << + CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_OFFSET) | + (CONFIG_HPS_SDRPLLGRP_DDRDQCLK_CNT << + CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_OFFSET), + (CONFIG_HPS_SDRPLLGRP_S2FUSER2CLK_PHASE << + CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_OFFSET) | + (CONFIG_HPS_SDRPLLGRP_S2FUSER2CLK_CNT << + CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_OFFSET), + + /* altera group */ + CONFIG_HPS_ALTERAGRP_MPUCLK, +}; + +/* Wrap SDRAM config */ +static const struct socfpga_sdram_config sdram_config = { + .ctrl_cfg = + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE << + SDR_CTRLGRP_CTRLCFG_MEMTYPE_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL << + SDR_CTRLGRP_CTRLCFG_MEMBL_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER << + SDR_CTRLGRP_CTRLCFG_ADDRORDER_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN << + SDR_CTRLGRP_CTRLCFG_ECCEN_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN << + SDR_CTRLGRP_CTRLCFG_ECCCORREN_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN << + SDR_CTRLGRP_CTRLCFG_REORDEREN_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT << + SDR_CTRLGRP_CTRLCFG_STARVELIMIT_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN << + SDR_CTRLGRP_CTRLCFG_DQSTRKEN_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS << + SDR_CTRLGRP_CTRLCFG_NODMPINS_LSB), + .dram_timing1 = + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL << + SDR_CTRLGRP_DRAMTIMING1_TCWL_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL << + SDR_CTRLGRP_DRAMTIMING1_TAL_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL << + SDR_CTRLGRP_DRAMTIMING1_TCL_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD << + SDR_CTRLGRP_DRAMTIMING1_TRRD_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW << + SDR_CTRLGRP_DRAMTIMING1_TFAW_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC << + SDR_CTRLGRP_DRAMTIMING1_TRFC_LSB), + .dram_timing2 = + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI << + SDR_CTRLGRP_DRAMTIMING2_TREFI_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD << + SDR_CTRLGRP_DRAMTIMING2_TRCD_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP << + SDR_CTRLGRP_DRAMTIMING2_TRP_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR << + SDR_CTRLGRP_DRAMTIMING2_TWR_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR << + SDR_CTRLGRP_DRAMTIMING2_TWTR_LSB), + .dram_timing3 = + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP << + SDR_CTRLGRP_DRAMTIMING3_TRTP_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS << + SDR_CTRLGRP_DRAMTIMING3_TRAS_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC << + SDR_CTRLGRP_DRAMTIMING3_TRC_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD << + SDR_CTRLGRP_DRAMTIMING3_TMRD_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD << + SDR_CTRLGRP_DRAMTIMING3_TCCD_LSB), + .dram_timing4 = + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT << + SDR_CTRLGRP_DRAMTIMING4_SELFRFSHEXIT_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT << + SDR_CTRLGRP_DRAMTIMING4_PWRDOWNEXIT_LSB), + .lowpwr_timing = + (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES << + SDR_CTRLGRP_LOWPWRTIMING_AUTOPDCYCLES_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES << + SDR_CTRLGRP_LOWPWRTIMING_CLKDISABLECYCLES_LSB), + .dram_odt = + (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_READ << + SDR_CTRLGRP_DRAMODT_READ_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_WRITE << + SDR_CTRLGRP_DRAMODT_WRITE_LSB), + .extratime1 = + (CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR << + SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC << + SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_BC_LSB) | +(CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP << + SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_DIFF_LSB), + .dram_addrw = + (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS << + SDR_CTRLGRP_DRAMADDRW_COLBITS_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS << + SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS << + SDR_CTRLGRP_DRAMADDRW_BANKBITS_LSB) | + ((CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS - 1) << + SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB), + .dram_if_width = + (CONFIG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH << + SDR_CTRLGRP_DRAMIFWIDTH_IFWIDTH_LSB), + .dram_dev_width = + (CONFIG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH << + SDR_CTRLGRP_DRAMDEVWIDTH_DEVWIDTH_LSB), + .dram_intr = + (CONFIG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN << + SDR_CTRLGRP_DRAMINTR_INTREN_LSB), + .lowpwr_eq = + (CONFIG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK << + SDR_CTRLGRP_LOWPWREQ_SELFRFSHMASK_LSB), + .static_cfg = + (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL << + SDR_CTRLGRP_STATICCFG_MEMBL_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA << + SDR_CTRLGRP_STATICCFG_USEECCASDATA_LSB), + .ctrl_width = + (CONFIG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH << + SDR_CTRLGRP_CTRLWIDTH_CTRLWIDTH_LSB), + .cport_width = + (CONFIG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH << + SDR_CTRLGRP_CPORTWIDTH_CMDPORTWIDTH_LSB), + .cport_wmap = + (CONFIG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP << + SDR_CTRLGRP_CPORTWMAP_CPORTWFIFOMAP_LSB), + .cport_rmap = + (CONFIG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP << + SDR_CTRLGRP_CPORTRMAP_CPORTRFIFOMAP_LSB), + .rfifo_cmap = + (CONFIG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP << + SDR_CTRLGRP_RFIFOCMAP_RFIFOCPORTMAP_LSB), + .wfifo_cmap = + (CONFIG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP << + SDR_CTRLGRP_WFIFOCMAP_WFIFOCPORTMAP_LSB), + .cport_rdwr = + (CONFIG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR << + SDR_CTRLGRP_CPORTRDWR_CPORTRDWR_LSB), + .port_cfg = + (CONFIG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN << + SDR_CTRLGRP_PORTCFG_AUTOPCHEN_LSB), + .fpgaport_rst = CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST, + .fifo_cfg = + (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE << + SDR_CTRLGRP_FIFOCFG_SYNCMODE_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC << + SDR_CTRLGRP_FIFOCFG_INCSYNC_LSB), + .mp_priority = + (CONFIG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY << + SDR_CTRLGRP_MPPRIORITY_USERPRIORITY_LSB), + .mp_weight0 = + (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0 << + SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_0_STATICWEIGHT_31_0_LSB), + .mp_weight1 = + (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32 << + SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_STATICWEIGHT_49_32_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0 << + SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_SUMOFWEIGHTS_13_0_LSB), + .mp_weight2 = + (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14 << + SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_2_SUMOFWEIGHTS_45_14_LSB), + .mp_weight3 = + (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46 << + SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_3_SUMOFWEIGHTS_63_46_LSB), + .mp_pacing0 = + (CONFIG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0 << + SDR_CTRLGRP_MPPACING_MPPACING_0_THRESHOLD1_31_0_LSB), + .mp_pacing1 = + (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32 << + SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD1_59_32_LSB) | + (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0 << + SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD2_3_0_LSB), + .mp_pacing2 = + (CONFIG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4 << + SDR_CTRLGRP_MPPACING_MPPACING_2_THRESHOLD2_35_4_LSB), + .mp_pacing3 = + (CONFIG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36 << + SDR_CTRLGRP_MPPACING_MPPACING_3_THRESHOLD2_59_36_LSB), + .mp_threshold0 = + (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0 << + SDR_CTRLGRP_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0_LSB), + .mp_threshold1 = + (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32 << + SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_LSB), + .mp_threshold2 = + (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64 << + SDR_CTRLGRP_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64_LSB), + .phy_ctrl0 = CONFIG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0, +}; + +static const struct socfpga_sdram_rw_mgr_config rw_mgr_config = { + .activate_0_and_1 = RW_MGR(ACTIVATE_0_AND_1), + .activate_0_and_1_wait1 = RW_MGR(ACTIVATE_0_AND_1_WAIT1), + .activate_0_and_1_wait2 = RW_MGR(ACTIVATE_0_AND_1_WAIT2), + .activate_1 = RW_MGR(ACTIVATE_1), + .clear_dqs_enable = RW_MGR(CLEAR_DQS_ENABLE), + .guaranteed_read = RW_MGR(GUARANTEED_READ), + .guaranteed_read_cont = RW_MGR(GUARANTEED_READ_CONT), + .guaranteed_write = RW_MGR(GUARANTEED_WRITE), + .guaranteed_write_wait0 = RW_MGR(GUARANTEED_WRITE_WAIT0), + .guaranteed_write_wait1 = RW_MGR(GUARANTEED_WRITE_WAIT1), + .guaranteed_write_wait2 = RW_MGR(GUARANTEED_WRITE_WAIT2), + .guaranteed_write_wait3 = RW_MGR(GUARANTEED_WRITE_WAIT3), + .idle = RW_MGR(IDLE), + .idle_loop1 = RW_MGR(IDLE_LOOP1), + .idle_loop2 = RW_MGR(IDLE_LOOP2), + .init_reset_0_cke_0 = RW_MGR(INIT_RESET_0_CKE_0), + .init_reset_1_cke_0 = RW_MGR(INIT_RESET_1_CKE_0), + .lfsr_wr_rd_bank_0 = RW_MGR(LFSR_WR_RD_BANK_0), + .lfsr_wr_rd_bank_0_data = RW_MGR(LFSR_WR_RD_BANK_0_DATA), + .lfsr_wr_rd_bank_0_dqs = RW_MGR(LFSR_WR_RD_BANK_0_DQS), + .lfsr_wr_rd_bank_0_nop = RW_MGR(LFSR_WR_RD_BANK_0_NOP), + .lfsr_wr_rd_bank_0_wait = RW_MGR(LFSR_WR_RD_BANK_0_WAIT), + .lfsr_wr_rd_bank_0_wl_1 = RW_MGR(LFSR_WR_RD_BANK_0_WL_1), + .lfsr_wr_rd_dm_bank_0 = RW_MGR(LFSR_WR_RD_DM_BANK_0), + .lfsr_wr_rd_dm_bank_0_data = RW_MGR(LFSR_WR_RD_DM_BANK_0_DATA), + .lfsr_wr_rd_dm_bank_0_dqs = RW_MGR(LFSR_WR_RD_DM_BANK_0_DQS), + .lfsr_wr_rd_dm_bank_0_nop = RW_MGR(LFSR_WR_RD_DM_BANK_0_NOP), + .lfsr_wr_rd_dm_bank_0_wait = RW_MGR(LFSR_WR_RD_DM_BANK_0_WAIT), + .lfsr_wr_rd_dm_bank_0_wl_1 = RW_MGR(LFSR_WR_RD_DM_BANK_0_WL_1), + .mrs0_dll_reset = RW_MGR(MRS0_DLL_RESET), + .mrs0_dll_reset_mirr = RW_MGR(MRS0_DLL_RESET_MIRR), + .mrs0_user = RW_MGR(MRS0_USER), + .mrs0_user_mirr = RW_MGR(MRS0_USER_MIRR), + .mrs1 = RW_MGR(MRS1), + .mrs1_mirr = RW_MGR(MRS1_MIRR), + .mrs2 = RW_MGR(MRS2), + .mrs2_mirr = RW_MGR(MRS2_MIRR), + .mrs3 = RW_MGR(MRS3), + .mrs3_mirr = RW_MGR(MRS3_MIRR), + .precharge_all = RW_MGR(PRECHARGE_ALL), + .read_b2b = RW_MGR(READ_B2B), + .read_b2b_wait1 = RW_MGR(READ_B2B_WAIT1), + .read_b2b_wait2 = RW_MGR(READ_B2B_WAIT2), + .refresh_all = RW_MGR(REFRESH_ALL), + .rreturn = RW_MGR(RETURN), + .sgle_read = RW_MGR(SGLE_READ), + .zqcl = RW_MGR(ZQCL), + + .true_mem_data_mask_width = RW_MGR_TRUE_MEM_DATA_MASK_WIDTH, + .mem_address_mirroring = RW_MGR_MEM_ADDRESS_MIRRORING, + .mem_data_mask_width = RW_MGR_MEM_DATA_MASK_WIDTH, + .mem_data_width = RW_MGR_MEM_DATA_WIDTH, + .mem_dq_per_read_dqs = RW_MGR_MEM_DQ_PER_READ_DQS, + .mem_dq_per_write_dqs = RW_MGR_MEM_DQ_PER_WRITE_DQS, + .mem_if_read_dqs_width = RW_MGR_MEM_IF_READ_DQS_WIDTH, + .mem_if_write_dqs_width = RW_MGR_MEM_IF_WRITE_DQS_WIDTH, + .mem_number_of_cs_per_dimm = RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM, + .mem_number_of_ranks = RW_MGR_MEM_NUMBER_OF_RANKS, + .mem_virtual_groups_per_read_dqs = + RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS, + .mem_virtual_groups_per_write_dqs = + RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS, +}; + +static const struct socfpga_sdram_io_config io_config = { + .delay_per_dchain_tap = IO_DELAY_PER_DCHAIN_TAP, + .delay_per_dqs_en_dchain_tap = IO_DELAY_PER_DQS_EN_DCHAIN_TAP, + .delay_per_opa_tap_lo = IO_DELAY_PER_OPA_TAP & 0xff, + .delay_per_opa_tap_hi = (IO_DELAY_PER_OPA_TAP << 8) & 0xff, + .dll_chain_length = IO_DLL_CHAIN_LENGTH, + .dqdqs_out_phase_max = IO_DQDQS_OUT_PHASE_MAX, + .dqs_en_delay_max = IO_DQS_EN_DELAY_MAX, + .dqs_en_delay_offset = IO_DQS_EN_DELAY_OFFSET, + .dqs_en_phase_max = IO_DQS_EN_PHASE_MAX, + .dqs_in_delay_max = IO_DQS_IN_DELAY_MAX, + .dqs_in_reserve = IO_DQS_IN_RESERVE, + .dqs_out_reserve = IO_DQS_OUT_RESERVE, + .io_in_delay_max = IO_IO_IN_DELAY_MAX, + .io_out1_delay_max = IO_IO_OUT1_DELAY_MAX, + .io_out2_delay_max = IO_IO_OUT2_DELAY_MAX, + .shift_dqs_en_when_shift_dqs = IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS, +}; + +static const struct socfpga_sdram_misc_config misc_config = { + .afi_rate_ratio = AFI_RATE_RATIO, + .calib_lfifo_offset = CALIB_LFIFO_OFFSET, + .calib_vfifo_offset = CALIB_VFIFO_OFFSET, + .enable_super_quick_calibration = ENABLE_SUPER_QUICK_CALIBRATION, + .max_latency_count_width = MAX_LATENCY_COUNT_WIDTH, + .read_valid_fifo_size = READ_VALID_FIFO_SIZE, + .reg_file_init_seq_signature_ll = REG_FILE_INIT_SEQ_SIGNATURE & 0xff, + .reg_file_init_seq_signature_lh = (REG_FILE_INIT_SEQ_SIGNATURE >> 8) & 0xff, + .reg_file_init_seq_signature_hl = (REG_FILE_INIT_SEQ_SIGNATURE >> 16) & 0xff, + .reg_file_init_seq_signature_hh = (REG_FILE_INIT_SEQ_SIGNATURE >> 24) & 0xff, + .tinit_cntr0_val = TINIT_CNTR0_VAL, + .tinit_cntr1_val = TINIT_CNTR1_VAL, + .tinit_cntr2_val = TINIT_CNTR2_VAL, + .treset_cntr0_val = TRESET_CNTR0_VAL, + .treset_cntr1_val = TRESET_CNTR1_VAL, + .treset_cntr2_val = TRESET_CNTR2_VAL, +}; + +static void print_hdr(void) +{ + printf(handoff_dtsi_hdr); +} + +static void print_clkmgr_base(void) +{ + const char handoff_dtsi_clkmgr_base[] = + "\n" + "&osc1 {\n" + " clock-frequency = <%d>;\n" /* CONFIG_HPS_CLK_OSC1_HZ */ + "};\n" + "\n" + "&osc2 {\n" + " clock-frequency = <%d>;\n" /* CONFIG_HPS_CLK_OSC2_HZ */ + "};\n" + "\n" + "&f2s_periph_ref_clk {\n" + " clock-frequency = <%d>;\n" /* CONFIG_HPS_CLK_F2S_PER_REF_HZ */ + "};\n" + "\n" + "&f2s_sdram_ref_clk {\n" + " clock-frequency = <%d>;\n" /* CONFIG_HPS_CLK_F2S_SDR_REF_HZ */ + "};\n"; + + printf(handoff_dtsi_clkmgr_base, CONFIG_HPS_CLK_OSC1_HZ, + CONFIG_HPS_CLK_OSC2_HZ, CONFIG_HPS_CLK_F2S_PER_REF_HZ, + CONFIG_HPS_CLK_F2S_SDR_REF_HZ); +} + +/* + * dtc stores u32 array big endian but we load them raw and expect them to be in + * little endian format. To prevent this tool to depend on host endianess, do + * the switch manually, not via 'htonl'. + */ +static u32 swap_bytes(u32 val) +{ + return (val << 24) | ((val & 0xFF00ul) << 8) | + ((val & 0xFF0000ul) >> 8) | (val >> 24); +} + +static void print_array_ulong(const unsigned long *arr, size_t arr_size, + size_t el_per_line, const char *indent1, + const char *name, const char *indent_next) +{ + size_t i; + + printf("%s%s = <", indent1, name); + for (i = 0; i < arr_size; i++) { + printf("0x%08x", swap_bytes((u32)arr[i])); + if (i + 1 < arr_size) { + if (i % el_per_line == (el_per_line - 1)) { + printf("\n%s", indent_next); + } else { + printf(" "); + } + } + } + printf(">;\n"); +} + +#ifdef USE_QUARTUS_OUTPUT +static void print_array_sysmgrinit(const unsigned long *arr, size_t arr_size, + const char *indent1, const char *name, + const char *indent_next) +{ + size_t i; + + printf("%s%s = [", indent1, name); + for (i = 0; i < arr_size; i++) { + printf("%02x", (u8)arr[i]); + if (i + 1 < arr_size) { + if (i % 8 == 7) { + printf("\n%s", indent_next); + } else { + printf(" "); + } + } + } + printf("];\n"); +} +#define print_array_alt_u32 print_array_ulong +#else +#define print_array_sysmgrinit(arr, sz, ind1, n, ind2) print_array_u8(arr, sz, 8, ind1, n, ind2) +#define print_array_alt_u32 print_array_u32 +#endif + +static void print_array_u32(const u32 *arr, size_t arr_size, + size_t el_per_line, const char *indent1, + const char *name, const char *indent_next) +{ + size_t i; + + printf("%s%s = <", indent1, name); + for (i = 0; i < arr_size; i++) { + printf("0x%08x", swap_bytes(arr[i])); + if (i + 1 < arr_size) { + if (i % el_per_line == (el_per_line - 1)) { + printf("\n%s", indent_next); + } else { + printf(" "); + } + } + } + printf(">;\n"); +} + +static void print_array_u8(const u8 *arr, size_t arr_size, size_t el_per_line, + const char *indent1, const char *name, + const char *indent_next) +{ + size_t i; + + printf("%s%s = [", indent1, name); + for (i = 0; i < arr_size; i++) { + printf("%02x", arr[i]); + if (i + 1 < arr_size) { + if (i % el_per_line == (el_per_line - 1)) { + printf("\n%s", indent_next); + } else { + printf(" "); + } + } + } + printf("];\n"); +} + + +static void print_clkmgr_cfg(void) +{ + const char handoff_dtsi_clkmgr_cfg_a[] = + "\n" + "&clkmgr {\n"; + const char handoff_dtsi_clkmgr_cfg_b[] = "};\n"; + const char clk_mgr_cfg_indent[] = "\t\t\t "; + + printf(handoff_dtsi_clkmgr_cfg_a); + print_array_u32((const u32 *)&cm_default, sizeof(cm_default)/4, 4, "\t", + "altr,clk-mgr-cfg", clk_mgr_cfg_indent); + printf(handoff_dtsi_clkmgr_cfg_b); +} + +static void print_sysmgr(void) +{ + const char handoff_dtsi_sysmgr_begin[] = + "\n" + "&sysmgr {\n"; + const char handoff_dtsi_sysmgr_end[] = "};\n"; + const char sysmgr_cfg_indent[] = "\t\t\t\t\t"; + size_t i; + + printf(handoff_dtsi_sysmgr_begin); + + /* sys_mgr_init_table is an u8 table */ + print_array_sysmgrinit(sys_mgr_init_table, ARRAY_SIZE(sys_mgr_init_table), + "\t", "altr,pinmux-cfg","\t\t\t "); + /* ioscr scan chain table 0 */ + print_array_ulong(iocsr_scan_chain0_table, + ARRAY_SIZE(iocsr_scan_chain0_table), 4, + "\t", "altr,iocsr-scan-chain0-table", + sysmgr_cfg_indent); + /* ioscr scan chain table 0 */ + print_array_ulong(iocsr_scan_chain1_table, + ARRAY_SIZE(iocsr_scan_chain1_table), 4, + "\t", "altr,iocsr-scan-chain1-table", + sysmgr_cfg_indent); + /* ioscr scan chain table 0 */ + print_array_ulong(iocsr_scan_chain2_table, + ARRAY_SIZE(iocsr_scan_chain2_table), 4, + "\t", "altr,iocsr-scan-chain2-table", + sysmgr_cfg_indent); + /* ioscr scan chain table 0 */ + print_array_ulong(iocsr_scan_chain3_table, + ARRAY_SIZE(iocsr_scan_chain3_table), 4, + "\t", "altr,iocsr-scan-chain3-table", + sysmgr_cfg_indent); + printf(handoff_dtsi_sysmgr_end); +} + +static void print_sdram_cfg(void) +{ + const char handoff_dtsi_sdram_cfg_begin[] = + "\n" + "&sdr {\n"; + const char handoff_dtsi_sdram_cfg_end[] = "};\n"; + + printf(handoff_dtsi_sdram_cfg_begin); + print_array_u32((const u32 *)&sdram_config, sizeof(sdram_config)/4, 4, + "\t", "altr,sdr-cfg", "\t\t\t"); + print_array_u8((const u8 *)&rw_mgr_config, sizeof(rw_mgr_config), 8, + "\t", "altr,sdr-rw-mgr-cfg", "\t\t\t "); + print_array_u8((const u8 *)&io_config, sizeof(io_config), 8, + "\t", "altr,sdr-io-cfg", "\t\t\t "); + print_array_u8((const u8 *)&misc_config, sizeof(misc_config), 8, + "\t", "altr,sdr-misc-cfg", "\t\t\t "); + print_array_alt_u32(ac_rom_init, ARRAY_SIZE(ac_rom_init), 4, + "\t", "altr,sdr-ac-rom-init", "\t\t\t\t"); + print_array_alt_u32(inst_rom_init, ARRAY_SIZE(inst_rom_init), 4, + "\t", "altr,sdr-inst-rom-init", "\t\t\t\t "); + printf(handoff_dtsi_sdram_cfg_end); +} + +int main(void) +{ + print_hdr(); + print_clkmgr_base(); + print_clkmgr_cfg(); + print_sysmgr(); + print_sdram_cfg(); +} diff --git a/arch/arm/mach-socfpga/qts-to-handoff.sh b/arch/arm/mach-socfpga/qts-to-handoff.sh new file mode 100755 index 0000000000..b9032a5411 --- /dev/null +++ b/arch/arm/mach-socfpga/qts-to-handoff.sh @@ -0,0 +1,83 @@ +#!/bin/sh +# This script converts Quartus handoff files (in Quartus or U-Boot format) +# to a handoff.dtsi file. + + +usage() { + MY_BASENAME=`basename $0` + echo "${MY_BASENAME} [soc_type] [input_qts_dir] [input_bsp_dir] [output_file]" + echo " or" + echo "${MY_BASENAME} 'u-boot' [uboot_qts_dir] [output_file]" + echo "" + echo "Process QTS-generated headers into handoff.dtsi:" + echo "" + echo " soc_type - Type of SoC, either 'cyclone5' or 'arria5'." + echo " input_qts_dir - Directory with compiled Quartus project" + echo " and containing the Quartus project file (QPF)." + echo " input_bsp_dir - Directory with generated bsp containing" + echo " the settings.bsp file." + echo " output_file - Full filename to store the handoff dtsi file." + echo " uboot_qts_dir - board/qts directory if input files are in" + echo " 'old-style' U-Boot format." + echo "" +} + +soc="$1" + +HANDOFF_TEMPLATE="`dirname $0`/create_handoff_gen5.c" + +case "$soc" in +"cyclone5"|"arria5") + if [ "$#" -ne 4 ] ; then + usage + exit 1 + fi + in_qts_dir="$2" + in_bsp_dir="$3" + output_file="$4" + out_dir=`dirname ${output_file}` + + if [ ! -d "${in_qts_dir}" -o ! -d "${in_bsp_dir}" -o \ + ! -d "${out_dir}" -o -z "${soc}" ] ; then + usage + exit 3 + fi + + if [ "$soc" = "cyclone5" ] ; then + CMDLINE_DEFINES="-DCYCLONE5" + else + CMDLINE_DEFINES="-DARRIA5" + fi + CMDLINE_DEFINES="${CMDLINE_DEFINES} -DUSE_QUARTUS_OUTPUT -I${in_bsp_dir}/generated/" + for d in ${in_qts_dir}/hps_isw_handoff/*/ ; do + CMDLINE_DEFINES="${CMDLINE_DEFINES} -I$d" + done + ;; +"u-boot") + if [ "$#" -ne 3 ] ; then + usage + exit 1 + fi + in_qts_dir="$2" + output_file="$3" + out_dir=`dirname ${output_file}` + + if [ ! -d "${in_qts_dir}" -o ! -d "${out_dir}" ] ; then + usage + exit 3 + fi + + CMDLINE_DEFINES="-I${in_qts_dir}" + ;; +*) + usage + exit 1 + ;; +esac + +# compile +gcc ${CMDLINE_DEFINES} ${HANDOFF_TEMPLATE} -o ${out_dir}/create_handoff_gen5 +${out_dir}/create_handoff_gen5 > ${output_file} + +# TODO: remove tmp file: +#rm $${out_dir}/create_handoff_gen5 From patchwork Tue Oct 15 20:10:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177384 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="DpN4iBYY"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6Gm15TWz9sPF for ; Wed, 16 Oct 2019 07:19:44 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id CF1BCC21DF8; Tue, 15 Oct 2019 20:13:29 +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_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 7B8BCC21E0F; Tue, 15 Oct 2019 20:11:30 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A80B5C21D9A; Tue, 15 Oct 2019 20:10:53 +0000 (UTC) Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by lists.denx.de (Postfix) with ESMTPS id 9FE6DC21DD7 for ; Tue, 15 Oct 2019 20:10:50 +0000 (UTC) Received: by mail-wm1-f66.google.com with SMTP id a6so382906wma.5 for ; Tue, 15 Oct 2019 13:10:50 -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=93P1yxTIYkjvrgq41BTqvDCQiw6WmRLPWwSy30q7gnA=; b=DpN4iBYYevFSnv3s79DSps+uXcxVCOGKQMtEIYJmwL3M5yPe6M/NvaivS6MHhc4yqz w5QEBZ7k+PwebO8liHBEdQeoYbDFx+x7xDl5IhueXGVHwJHm6cPF7LH9ME4n4NJw7VjY I233Kf2MlqAje/ZzV6Ug7D6ZceL9Qbev4vRZH0pxfyAaYHgfM29+Qigau4AKts+zCyJv TQ2KfRthgTBxdGC60lVOuakuUPWJFwPZf4I6ovQWoUTLBFliRa+SDtG2RJB/CrFSUua9 Os+amu6hgDVim7HwYXCjV6tJ+TaQIKydxbF6C8FQ6kTKcJdD1KDd1lSpLhVgNgvrJyoB NLsA== 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=93P1yxTIYkjvrgq41BTqvDCQiw6WmRLPWwSy30q7gnA=; b=DjcgNgbtdoLK31xzVPYAG5p9RZXau3buICpzmoVLYtxbaP8kIYsff/m96vLtxY32Ez uYHkY35a5m+MheEQcWirw9UnvIc/o452ylV3pQOlSkSdkUZGIbqrJeOk8k0V6FSqEQcI kBAQTOWTGWakJivraqxlodcjoZMwjcC6aztT/Ks9XyO6vG9BEKMK3Jl256JuW03awjFm CVovh7SMuUDIm2JDOcoCnYTMGu3sO+6BlP8xzi5Vi0JZO2yW4nCeL5klYWxfMW9iwVww VNGylZAIE9de1H/MzjwIsqoTNsBaaHOLjDMfmzvbxP6opVuOhgMsY3mPKn1H+lwAJVe7 E6Nw== X-Gm-Message-State: APjAAAUEdzYllxLNt4RPIVjo0CtfSMubsjtZ3wTlgw6CKXLedrJFej9E L81w6SZyfF1LkJ/PrbRk/aw= X-Google-Smtp-Source: APXvYqwhugHP2tY+P9V6YkmSE6L/JGgNooMZuX0yaOL1ES3kvjTQfS244UvYHEEH0N26/GJyP7z9Jw== X-Received: by 2002:a1c:5408:: with SMTP id i8mr159422wmb.149.1571170250209; Tue, 15 Oct 2019 13:10:50 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:49 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:22 +0200 Message-Id: <20191015201032.20156-10-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de, Albert Aribaud Subject: [U-Boot] [RFC PATCH v2 09/18] sdram: socfpga: gen5: make config structs dts compatible 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" In preparation of moving SDRAM config from 'qts' files to devicetree, make the config structs compatible to devicetree by keeping all struct members of the same type (u8 or u32). That way, these structs can be stored to devicetree as simple array. Signed-off-by: Simon Goldschmidt --- Changes in v2: None .../mach-socfpga/include/mach/sdram_gen5.h | 8 +++- arch/arm/mach-socfpga/wrap_sdram_config.c | 8 +++- drivers/ddr/altera/sequencer.c | 39 +++++++++++-------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/arch/arm/mach-socfpga/include/mach/sdram_gen5.h b/arch/arm/mach-socfpga/include/mach/sdram_gen5.h index c41208591a..7353b1c5e6 100644 --- a/arch/arm/mach-socfpga/include/mach/sdram_gen5.h +++ b/arch/arm/mach-socfpga/include/mach/sdram_gen5.h @@ -180,7 +180,8 @@ struct socfpga_sdram_rw_mgr_config { }; struct socfpga_sdram_io_config { - u16 delay_per_opa_tap; + u8 delay_per_opa_tap_lo; + u8 delay_per_opa_tap_hi; u8 delay_per_dchain_tap; u8 delay_per_dqs_en_dchain_tap; u8 dll_chain_length; @@ -198,7 +199,10 @@ struct socfpga_sdram_io_config { }; struct socfpga_sdram_misc_config { - u32 reg_file_init_seq_signature; + u8 reg_file_init_seq_signature_ll; + u8 reg_file_init_seq_signature_lh; + u8 reg_file_init_seq_signature_hl; + u8 reg_file_init_seq_signature_hh; u8 afi_rate_ratio; u8 calib_lfifo_offset; u8 calib_vfifo_offset; diff --git a/arch/arm/mach-socfpga/wrap_sdram_config.c b/arch/arm/mach-socfpga/wrap_sdram_config.c index 2b072cc65e..c43c2423a0 100644 --- a/arch/arm/mach-socfpga/wrap_sdram_config.c +++ b/arch/arm/mach-socfpga/wrap_sdram_config.c @@ -254,7 +254,8 @@ static const struct socfpga_sdram_rw_mgr_config rw_mgr_config = { static const struct socfpga_sdram_io_config io_config = { .delay_per_dchain_tap = IO_DELAY_PER_DCHAIN_TAP, .delay_per_dqs_en_dchain_tap = IO_DELAY_PER_DQS_EN_DCHAIN_TAP, - .delay_per_opa_tap = IO_DELAY_PER_OPA_TAP, + .delay_per_opa_tap_lo = IO_DELAY_PER_OPA_TAP & 0xff, + .delay_per_opa_tap_hi = (IO_DELAY_PER_OPA_TAP << 8) & 0xff, .dll_chain_length = IO_DLL_CHAIN_LENGTH, .dqdqs_out_phase_max = IO_DQDQS_OUT_PHASE_MAX, .dqs_en_delay_max = IO_DQS_EN_DELAY_MAX, @@ -276,7 +277,10 @@ static const struct socfpga_sdram_misc_config misc_config = { .enable_super_quick_calibration = ENABLE_SUPER_QUICK_CALIBRATION, .max_latency_count_width = MAX_LATENCY_COUNT_WIDTH, .read_valid_fifo_size = READ_VALID_FIFO_SIZE, - .reg_file_init_seq_signature = REG_FILE_INIT_SEQ_SIGNATURE, + .reg_file_init_seq_signature_ll = REG_FILE_INIT_SEQ_SIGNATURE & 0xff, + .reg_file_init_seq_signature_lh = (REG_FILE_INIT_SEQ_SIGNATURE >> 8) & 0xff, + .reg_file_init_seq_signature_hl = (REG_FILE_INIT_SEQ_SIGNATURE >> 16) & 0xff, + .reg_file_init_seq_signature_hh = (REG_FILE_INIT_SEQ_SIGNATURE >> 24) & 0xff, .tinit_cntr0_val = TINIT_CNTR0_VAL, .tinit_cntr1_val = TINIT_CNTR1_VAL, .tinit_cntr2_val = TINIT_CNTR2_VAL, diff --git a/drivers/ddr/altera/sequencer.c b/drivers/ddr/altera/sequencer.c index b85b56efe5..6c632227c2 100644 --- a/drivers/ddr/altera/sequencer.c +++ b/drivers/ddr/altera/sequencer.c @@ -30,6 +30,9 @@ static const struct socfpga_data_mgr *data_mgr = static const struct socfpga_sdr_ctrl *sdr_ctrl = (struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS; +#define delay_per_opa_tap(iocfg) ((iocfg)->delay_per_opa_tap_lo | \ + ((iocfg)->delay_per_opa_tap_hi << 8)) + #define DELTA_D 1 /* @@ -1623,7 +1626,7 @@ static int sdr_find_phase(struct socfpga_sdrseq *seq, int working, *p = 0; ret = sdr_find_phase_delay(seq, working, 0, grp, work, - seq->iocfg->delay_per_opa_tap, p); + delay_per_opa_tap(seq->iocfg), p); if (!ret) return 0; @@ -1651,7 +1654,7 @@ static int sdr_find_phase(struct socfpga_sdrseq *seq, int working, static int sdr_working_phase(struct socfpga_sdrseq *seq, const u32 grp, u32 *work_bgn, u32 *d, u32 *p, u32 *i) { - const u32 dtaps_per_ptap = seq->iocfg->delay_per_opa_tap / + const u32 dtaps_per_ptap = delay_per_opa_tap(seq->iocfg) / seq->iocfg->delay_per_dqs_en_dchain_tap; int ret; @@ -1693,7 +1696,7 @@ static void sdr_backup_phase(struct socfpga_sdrseq *seq, const u32 grp, } else { (*p)--; } - tmp_delay = *work_bgn - seq->iocfg->delay_per_opa_tap; + tmp_delay = *work_bgn - delay_per_opa_tap(seq->iocfg); scc_mgr_set_dqs_en_phase_all_ranks(seq, grp, *p); for (d = 0; d <= seq->iocfg->dqs_en_delay_max && tmp_delay < *work_bgn; @@ -1735,7 +1738,7 @@ static int sdr_nonworking_phase(struct socfpga_sdrseq *seq, int ret; (*p)++; - *work_end += seq->iocfg->delay_per_opa_tap; + *work_end += delay_per_opa_tap(seq->iocfg); if (*p > seq->iocfg->dqs_en_phase_max) { /* Fiddle with FIFO. */ *p = 0; @@ -1774,19 +1777,19 @@ static int sdr_find_window_center(struct socfpga_sdrseq *seq, work_bgn, work_end, work_mid); /* Get the middle delay to be less than a VFIFO delay */ tmp_delay = (seq->iocfg->dqs_en_phase_max + 1) - * seq->iocfg->delay_per_opa_tap; + * delay_per_opa_tap(seq->iocfg); debug_cond(DLEVEL >= 2, "vfifo ptap delay %d\n", tmp_delay); work_mid %= tmp_delay; debug_cond(DLEVEL >= 2, "new work_mid %d\n", work_mid); - tmp_delay = rounddown(work_mid, seq->iocfg->delay_per_opa_tap); + tmp_delay = rounddown(work_mid, delay_per_opa_tap(seq->iocfg)); if (tmp_delay > seq->iocfg->dqs_en_phase_max - * seq->iocfg->delay_per_opa_tap) { + * delay_per_opa_tap(seq->iocfg)) { tmp_delay = seq->iocfg->dqs_en_phase_max - * seq->iocfg->delay_per_opa_tap; + * delay_per_opa_tap(seq->iocfg); } - p = tmp_delay / seq->iocfg->delay_per_opa_tap; + p = tmp_delay / delay_per_opa_tap(seq->iocfg); debug_cond(DLEVEL >= 2, "new p %d, tmp_delay=%d\n", p, tmp_delay); @@ -1850,7 +1853,7 @@ rw_mgr_mem_calibrate_vfifo_find_dqs_en_phase(struct socfpga_sdrseq *seq, scc_mgr_set_dqs_en_phase_all_ranks(seq, grp, 0); /* Step 0: Determine number of delay taps for each phase tap. */ - dtaps_per_ptap = seq->iocfg->delay_per_opa_tap / + dtaps_per_ptap = delay_per_opa_tap(seq->iocfg) / seq->iocfg->delay_per_dqs_en_dchain_tap; /* Step 1: First push vfifo until we get a failing read. */ @@ -1894,7 +1897,7 @@ rw_mgr_mem_calibrate_vfifo_find_dqs_en_phase(struct socfpga_sdrseq *seq, p = p - 1; } - work_end -= seq->iocfg->delay_per_opa_tap; + work_end -= delay_per_opa_tap(seq->iocfg); scc_mgr_set_dqs_en_phase_all_ranks(seq, grp, p); d = 0; @@ -2747,7 +2750,7 @@ static int rw_mgr_mem_calibrate_vfifo(struct socfpga_sdrseq *seq, failed_substage = CAL_SUBSTAGE_GUARANTEED_READ; /* USER Determine number of delay taps for each phase tap. */ - dtaps_per_ptap = DIV_ROUND_UP(seq->iocfg->delay_per_opa_tap, + dtaps_per_ptap = DIV_ROUND_UP(delay_per_opa_tap(seq->iocfg), seq->iocfg->delay_per_dqs_en_dchain_tap) - 1; @@ -3677,8 +3680,12 @@ static void hc_initialize_rom_data(void) static void initialize_reg_file(struct socfpga_sdrseq *seq) { /* Initialize the register file with the correct data */ - writel(seq->misccfg->reg_file_init_seq_signature, - &sdr_reg_file->signature); + u32 reg_file_init_seq_signature = + seq->misccfg->reg_file_init_seq_signature_ll | + (seq->misccfg->reg_file_init_seq_signature_lh << 8) | + (seq->misccfg->reg_file_init_seq_signature_hl << 16) | + (seq->misccfg->reg_file_init_seq_signature_hh << 24); + writel(reg_file_init_seq_signature, &sdr_reg_file->signature); writel(0, &sdr_reg_file->debug_data_addr); writel(0, &sdr_reg_file->cur_stage); writel(0, &sdr_reg_file->fom); @@ -3749,7 +3756,7 @@ static void initialize_tracking(struct socfpga_sdrseq *seq) * Compute usable version of value in case we skip full * computation later. */ - writel(DIV_ROUND_UP(seq->iocfg->delay_per_opa_tap, + writel(DIV_ROUND_UP(delay_per_opa_tap(seq->iocfg), seq->iocfg->delay_per_dchain_tap) - 1, &sdr_reg_file->dtaps_per_ptap); @@ -3834,7 +3841,7 @@ int sdram_calibration_full(struct socfpga_sdr *sdr) seq.rwcfg->mem_if_read_dqs_width, seq.rwcfg->mem_if_write_dqs_width, seq.rwcfg->mem_data_width, seq.rwcfg->mem_data_mask_width, - seq.iocfg->delay_per_opa_tap, + delay_per_opa_tap(seq.iocfg), seq.iocfg->delay_per_dchain_tap); debug_cond(DLEVEL >= 1, "dtap_dqsen_delay=%u, dll=%u", seq.iocfg->delay_per_dqs_en_dchain_tap, From patchwork Tue Oct 15 20:10:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177374 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="jA5gAJpq"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6Cp7537z9sPF for ; Wed, 16 Oct 2019 07:17:09 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 3A74DC21D9A; Tue, 15 Oct 2019 20:12:53 +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_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 45924C21DB3; Tue, 15 Oct 2019 20:11:18 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id D9F79C21D65; Tue, 15 Oct 2019 20:10:55 +0000 (UTC) Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by lists.denx.de (Postfix) with ESMTPS id 3FB2DC21D56 for ; Tue, 15 Oct 2019 20:10:52 +0000 (UTC) Received: by mail-wm1-f68.google.com with SMTP id b24so348819wmj.5 for ; Tue, 15 Oct 2019 13:10:52 -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=AmTustKei75xjT1FjAC5qRp0ArYLHoykD13wBF+sPyo=; b=jA5gAJpq3EPIT44/tc6Gm/5Py/4rrpAbshNjPOyKgW5XWd4lH1+wUs0QFxl/xwCiPU ++mErRok+8h2L2VwW7RoY/IULLW/w5whHD1aqczWNJ94SsKMt22WPiC2OjJkKIuH1pW3 QIfBPan0+ZST6/JJQk+3NZ8Y07ZBMO4NyRcN0Dfad0L7Vcv/z2PcXkpr/gcwxfkDBVyz uoqoOQaUN6lwsFq0idrRHGfcaK+kait9RwJhpH7hX8ftzf3Ca7DPNySFvdXVNPrpVoN2 xEzBhk5vPmuBjBiECSdNC6TRF+GH87CTN8Z7+Qe4ZtQzaDotE2P2c2AZXbA3uIcQ6pU5 Y50w== 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=AmTustKei75xjT1FjAC5qRp0ArYLHoykD13wBF+sPyo=; b=hg70HaEtWpLL4u0VcTAAwec0S6zlJ2XHU23eIftGrn81Re1/AWRy1wJCZWwwaTxzKS CxQZrDKHMVo7pdwFAdk8faX7Rji7x2d77vwIzyK/kr8vciH8axXgzJ+VBacW4YFj/nbv LdGY6KSsYm+/hZz/8aVA0D0fkg/F8GJzuSBNFu/qltoQb2mYTZ1NfGKQkivtUapKfzMZ rIXIb4GrR5tEfRCMehttOC7bOB9SP1uq8pId005C3WVjw5GYXnBgPxHs5p6uY66gyy0W VviohDFfFt+wGsDWj0Mg0BrQHKz+tvKO/8eOCwe9hgUoML0YIYz/BiVtWnxl4BWO2YPs xfdA== X-Gm-Message-State: APjAAAXhD4XbN9rHzZgZZVMBGkcxZ2RHiVORnU3XXJswTF8KPOLF4UCw ojg61/1hR7PJGQfOylTmubc= X-Google-Smtp-Source: APXvYqzaJKKBeNc0QKofHzawmWubT+gEvE6RpdTKqkx2CNjXx1qioTLgloNj2Lr3VYY7smZd99ss8w== X-Received: by 2002:a1c:ed0d:: with SMTP id l13mr265133wmh.76.1571170251819; Tue, 15 Oct 2019 13:10:51 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:50 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:23 +0200 Message-Id: <20191015201032.20156-11-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 10/18] ddr: socfpga: gen5: fetch handoff information from 'of_to_platdata' 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" In preparation to move handoff data from 'qts' files to devicetree, fetch SDRAM config in 'of_to_platdata' DM callback. That way, this callback can be changed to fetch the data from devicetree. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/ddr/altera/sdram_gen5.c | 45 +++++++++++++++++++++++++-------- drivers/ddr/altera/sequencer.c | 35 +++++++++++++++---------- drivers/ddr/altera/sequencer.h | 9 ++++++- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/drivers/ddr/altera/sdram_gen5.c b/drivers/ddr/altera/sdram_gen5.c index 8c8ea19eb9..91d9f6c0fc 100644 --- a/drivers/ddr/altera/sdram_gen5.c +++ b/drivers/ddr/altera/sdram_gen5.c @@ -25,6 +25,15 @@ struct altera_gen5_sdram_priv { struct altera_gen5_sdram_platdata { struct socfpga_sdr *sdr; + /* Handoff config follows */ + const struct socfpga_sdram_config *cfg; + const struct socfpga_sdram_rw_mgr_config *rwcfg; + const struct socfpga_sdram_io_config *iocfg; + const struct socfpga_sdram_misc_config *misccf; + const u32 *inst_rom_init; + unsigned int inst_rom_init_len; + const u32 *ac_rom_init; + unsigned int ac_rom_init_len; }; struct sdram_prot_rule { @@ -43,7 +52,9 @@ struct sdram_prot_rule { static struct socfpga_system_manager *sysmgr_regs = (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS; -static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl); +static unsigned long sdram_calculate_size( + struct socfpga_sdr_ctrl *sdr_ctrl, + const struct socfpga_sdram_config *cfg); /** * get_errata_rows() - Up the number of DRAM rows to cover entire address space @@ -446,10 +457,10 @@ static void sdr_load_regs(struct socfpga_sdr_ctrl *sdr_ctrl, * * Initialize the SDRAM MMR. */ -int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, - unsigned int sdr_phy_reg) +static int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, + unsigned int sdr_phy_reg, + const struct socfpga_sdram_config *cfg) { - const struct socfpga_sdram_config *cfg = socfpga_get_sdram_config(); const unsigned int rows = (cfg->dram_addrw & SDR_CTRLGRP_DRAMADDRW_ROWBITS_MASK) >> SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB; @@ -481,7 +492,7 @@ int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, 1 << SDR_CTRLGRP_STATICCFG_APPLYCFG_LSB); sdram_set_protection_config(sdr_ctrl, 0, - sdram_calculate_size(sdr_ctrl) - 1); + sdram_calculate_size(sdr_ctrl, cfg) - 1); sdram_dump_protection_config(sdr_ctrl); @@ -494,11 +505,12 @@ int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl, * Calculate SDRAM device size based on SDRAM controller parameters. * Size is specified in bytes. */ -static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl) +static unsigned long sdram_calculate_size( + struct socfpga_sdr_ctrl *sdr_ctrl, + const struct socfpga_sdram_config *cfg) { unsigned long temp; unsigned long row, bank, col, cs, width; - const struct socfpga_sdram_config *cfg = socfpga_get_sdram_config(); const unsigned int csbits = ((cfg->dram_addrw & SDR_CTRLGRP_DRAMADDRW_CSBITS_MASK) >> SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB) + 1; @@ -565,6 +577,16 @@ static int altera_gen5_sdram_ofdata_to_platdata(struct udevice *dev) if (!plat->sdr) return -ENODEV; + /* Get handoff config */ + plat->cfg = socfpga_get_sdram_config(); + plat->rwcfg = socfpga_get_sdram_rwmgr_config(); + plat->iocfg = socfpga_get_sdram_io_config(); + plat->misccf = socfpga_get_sdram_misc_config(); + + socfpga_get_seq_inst_init(&plat->inst_rom_init, + &plat->inst_rom_init_len); + socfpga_get_seq_ac_init(&plat->ac_rom_init, &plat->ac_rom_init_len); + return 0; } @@ -584,19 +606,22 @@ static int altera_gen5_sdram_probe(struct udevice *dev) } reset_deassert_bulk(&resets); - if (sdram_mmr_init_full(sdr_ctrl, 0xffffffff) != 0) { + if (sdram_mmr_init_full(sdr_ctrl, 0xffffffff, plat->cfg) != 0) { puts("SDRAM init failed.\n"); goto failed; } debug("SDRAM: Calibrating PHY\n"); /* SDRAM calibration */ - if (sdram_calibration_full(plat->sdr) == 0) { + if (sdram_calibration_full(plat->sdr, plat->rwcfg, plat->iocfg, + plat->misccf, plat->inst_rom_init, + plat->inst_rom_init_len, plat->ac_rom_init, + plat->ac_rom_init_len) == 0) { puts("SDRAM calibration failed.\n"); goto failed; } - sdram_size = sdram_calculate_size(sdr_ctrl); + sdram_size = sdram_calculate_size(sdr_ctrl, plat->cfg); debug("SDRAM: %ld MiB\n", sdram_size >> 20); /* Sanity check ensure correct SDRAM size specified */ diff --git a/drivers/ddr/altera/sequencer.c b/drivers/ddr/altera/sequencer.c index 6c632227c2..1e03cf3cf6 100644 --- a/drivers/ddr/altera/sequencer.c +++ b/drivers/ddr/altera/sequencer.c @@ -3655,21 +3655,20 @@ static void debug_mem_calibrate(struct socfpga_sdrseq *seq, int pass) * * Initialize ROM data. */ -static void hc_initialize_rom_data(void) +static void hc_initialize_rom_data(const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len) { - unsigned int nelem = 0; - const u32 *rom_init; u32 i, addr; - socfpga_get_seq_inst_init(&rom_init, &nelem); addr = SDR_PHYGRP_RWMGRGRP_ADDRESS | RW_MGR_INST_ROM_WRITE_OFFSET; - for (i = 0; i < nelem; i++) - writel(rom_init[i], addr + (i << 2)); + for (i = 0; i < inst_rom_init_len; i++) + writel(inst_rom_init[i], addr + (i << 2)); - socfpga_get_seq_ac_init(&rom_init, &nelem); addr = SDR_PHYGRP_RWMGRGRP_ADDRESS | RW_MGR_AC_ROM_WRITE_OFFSET; - for (i = 0; i < nelem; i++) - writel(rom_init[i], addr + (i << 2)); + for (i = 0; i < ac_rom_init_len; i++) + writel(ac_rom_init[i], addr + (i << 2)); } /** @@ -3788,7 +3787,14 @@ static void initialize_tracking(struct socfpga_sdrseq *seq) &sdr_reg_file->trk_rfsh); } -int sdram_calibration_full(struct socfpga_sdr *sdr) +int sdram_calibration_full(struct socfpga_sdr *sdr, + const struct socfpga_sdram_rw_mgr_config *rwcfg, + const struct socfpga_sdram_io_config *iocfg, + const struct socfpga_sdram_misc_config *misccfg, + const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len) { u32 pass; struct socfpga_sdrseq seq; @@ -3802,9 +3808,9 @@ int sdram_calibration_full(struct socfpga_sdr *sdr) memset(&seq, 0, sizeof(seq)); - seq.rwcfg = socfpga_get_sdram_rwmgr_config(); - seq.iocfg = socfpga_get_sdram_io_config(); - seq.misccfg = socfpga_get_sdram_misc_config(); + seq.rwcfg = rwcfg; + seq.iocfg = iocfg; + seq.misccfg = misccfg; /* Set the calibration enabled by default */ seq.gbl.phy_debug_mode_flags |= PHY_DEBUG_ENABLE_CAL_RPT; @@ -3856,7 +3862,8 @@ int sdram_calibration_full(struct socfpga_sdr *sdr) debug_cond(DLEVEL >= 1, "dqs_in_reserve=%u dqs_out_reserve=%u\n", seq.iocfg->dqs_in_reserve, seq.iocfg->dqs_out_reserve); - hc_initialize_rom_data(); + hc_initialize_rom_data(inst_rom_init, inst_rom_init_len, + ac_rom_init, ac_rom_init_len); /* update info for sims */ reg_file_set_stage(CAL_STAGE_NIL); diff --git a/drivers/ddr/altera/sequencer.h b/drivers/ddr/altera/sequencer.h index 4a03c3fdf9..84057d4b4f 100644 --- a/drivers/ddr/altera/sequencer.h +++ b/drivers/ddr/altera/sequencer.h @@ -278,6 +278,13 @@ struct socfpga_sdrseq { struct param_type param; }; -int sdram_calibration_full(struct socfpga_sdr *sdr); +int sdram_calibration_full(struct socfpga_sdr *sdr, + const struct socfpga_sdram_rw_mgr_config *rwcfg, + const struct socfpga_sdram_io_config *iocfg, + const struct socfpga_sdram_misc_config *misccfg, + const u32 *inst_rom_init, + unsigned int inst_rom_init_len, + const u32 *ac_rom_init, + unsigned int ac_rom_init_len); #endif /* _SEQUENCER_H_ */ From patchwork Tue Oct 15 20:10:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177377 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="Ec8siegO"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6D71Q7Jz9sPF for ; Wed, 16 Oct 2019 07:17:27 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id E612BC21D74; Tue, 15 Oct 2019 20:12:11 +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_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 CD655C21DA6; Tue, 15 Oct 2019 20:11:05 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7BF82C21CB6; Tue, 15 Oct 2019 20:10:55 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id 4596CC21DB3 for ; Tue, 15 Oct 2019 20:10:53 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id j11so25384782wrp.1 for ; Tue, 15 Oct 2019 13:10:53 -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=HGCjZAxmFkQ+MEwWAxqmLWOaIywLWdq/hjX6MQ0XnnQ=; b=Ec8siegOpgVyJK4zTQtBQGMbxvFNoFgWDbdspsGeSp9SGx94j7Xq7HcLiXOuxYwb6A 1s6pEivuCx1sC2/WVXScDGJOLfHgjtxej5ccq9JZoZbnKBzIqepLyxvVukCXHA5fQzFv h9EQt7eo2nsk28v3B6h3yE9xaaHWzemJVny+lEGMSGO2kS9alrfKPGRkwDaZ3dmJynOf DKmzmgAy11Ba6vRAEbFY3daYaAmCogGKRxx33iyVS9wjsMBlG96fT2CYFAPQUmqqoTU1 xnrgZ/s69m/UY3Gxdqz5vDzjQ7x3W5T1q33hmUYv0c2uBCYoKgVYJo6+x7kvhxr3n6wB iUYQ== 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=HGCjZAxmFkQ+MEwWAxqmLWOaIywLWdq/hjX6MQ0XnnQ=; b=V6mj6qlGG+JloSyQTZuuV/ZjD7RgbFCEae6cUJY6clGsAI0T7CHHMlbjkIlgw/Qt18 Wc3WWNqIlxg3bLgJ171lyf0vr45ddfe/QEUG0hSKUGheJn2UMqwo/PRLicLXl98ID00W ppOCuoLtE/a7Dcy8bvf90z0205Ff3rzbZJG9zjID1pbB726PzJTvubwc3bfXVCtfpKxa eTvxNFkPuMo4ljkZ123mJkLqlaa/gZoH/A4MP20eYhe2geFtjp7X1rtpl0a7YFWvk3Jw jHC7ox6+fnIlnyAF6yc3RE5q4mHMV1mFSjIBeu1F8/woAIEXYK8txe3bK3mOAN5GfA3X Z4Iw== X-Gm-Message-State: APjAAAXYqnr/e/rP0UsXVdq8GnEXCM/FN1drDyThPL5edPrdDEoxkcTB rlJ8KLyI75JE1/IrfRXZ/ls= X-Google-Smtp-Source: APXvYqwf+2B2njQpPUrc558XvjM/HDPs8uq985au96agunwYcdcrndrvwq0bo9Mw1R+GaNdD87OTEQ== X-Received: by 2002:a5d:568a:: with SMTP id f10mr9624893wrv.215.1571170252894; Tue, 15 Oct 2019 13:10:52 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:52 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:24 +0200 Message-Id: <20191015201032.20156-12-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 11/18] ddr: socfpga: gen5: read handoff information from devicetree 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" Instead of reading SDRAM handoff data from 'qts' files, read it from devicetree. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/ddr/altera/sdram_gen5.c | 61 ++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/drivers/ddr/altera/sdram_gen5.c b/drivers/ddr/altera/sdram_gen5.c index 91d9f6c0fc..09ee45026c 100644 --- a/drivers/ddr/altera/sdram_gen5.c +++ b/drivers/ddr/altera/sdram_gen5.c @@ -572,20 +572,65 @@ static unsigned long sdram_calculate_size( static int altera_gen5_sdram_ofdata_to_platdata(struct udevice *dev) { struct altera_gen5_sdram_platdata *plat = dev->platdata; + int sz; plat->sdr = (struct socfpga_sdr *)devfdt_get_addr_index(dev, 0); if (!plat->sdr) return -ENODEV; /* Get handoff config */ - plat->cfg = socfpga_get_sdram_config(); - plat->rwcfg = socfpga_get_sdram_rwmgr_config(); - plat->iocfg = socfpga_get_sdram_io_config(); - plat->misccf = socfpga_get_sdram_misc_config(); - - socfpga_get_seq_inst_init(&plat->inst_rom_init, - &plat->inst_rom_init_len); - socfpga_get_seq_ac_init(&plat->ac_rom_init, &plat->ac_rom_init_len); + plat->cfg = (const struct socfpga_sdram_config *) + dev_read_u8_array_ptr(dev, "altr,sdr-cfg", sizeof(*plat->cfg)); + if (!plat->cfg) { + debug("Failed to parse altr,sdr-cfg\n"); + return -EINVAL; + } + plat->rwcfg = (const struct socfpga_sdram_rw_mgr_config *) + dev_read_u8_array_ptr(dev, "altr,sdr-rw-mgr-cfg", + sizeof(*plat->rwcfg)); + if (!plat->rwcfg) { + debug("Failed to parse altr,sdr-rw-mgr-cfg\n"); + return -EINVAL; + } + plat->iocfg = (const struct socfpga_sdram_io_config *) + dev_read_u8_array_ptr(dev, "altr,sdr-io-cfg", + sizeof(*plat->iocfg)); + if (!plat->iocfg) { + debug("Failed to parse altr,sdr-io-cfg\n"); + return -EINVAL; + } + plat->misccf = (const struct socfpga_sdram_misc_config *) + dev_read_u8_array_ptr(dev, "altr,sdr-misc-cfg", + sizeof(*plat->misccf)); + if (!plat->misccf) { + debug("Failed to parse altr,sdr-misc-cfg\n"); + return -EINVAL; + } + + sz = dev_read_size(dev, "altr,sdr-inst-rom-init"); + if (sz <= 0) { + debug("Failed to read altr,sdr-inst-rom-init size\n"); + return sz; + } + plat->inst_rom_init_len = sz / sizeof(u32); + plat->inst_rom_init = (const u32*)dev_read_u8_array_ptr(dev, + "altr,sdr-inst-rom-init", sz); + if (!plat->inst_rom_init) { + debug("Failed to parse altr,sdr-inst-rom-init\n"); + return -EINVAL; + } + sz = dev_read_size(dev, "altr,sdr-ac-rom-init"); + if (sz <= 0) { + debug("Failed to read altr,sdr-ac-rom-init size\n"); + return sz; + } + plat->ac_rom_init_len = sz / sizeof(u32); + plat->ac_rom_init = (const u32*)dev_read_u8_array_ptr(dev, + "altr,sdr-ac-rom-init", sz); + if (!plat->ac_rom_init) { + debug("Failed to parse altr,sdr-ac-rom-init\n"); + return -EINVAL; + } return 0; } From patchwork Tue Oct 15 20:10:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177375 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="Q5avPhjE"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6Cw168lz9sPF for ; Wed, 16 Oct 2019 07:17:16 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id CE0C8C21E0F; Tue, 15 Oct 2019 20:13:10 +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_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 E17F1C21E07; Tue, 15 Oct 2019 20:11:24 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7EB50C21D8E; Tue, 15 Oct 2019 20:10:57 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id D0F9BC21C50 for ; Tue, 15 Oct 2019 20:10:54 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id y18so15912994wrn.5 for ; Tue, 15 Oct 2019 13:10:54 -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=X338B2vmD+wONdVlzvZFb5uaGm3ykKG/3kxiN6b3q5A=; b=Q5avPhjEF5MV092/LtsrGd8O6QPThUzLVRGVRdZWvQG2RxnJIV8IKTs4OR+7catNZE HnX7nyt5XTZtMnp4TWRYRlSPnSVJBk7gDqR/Bvre+dQVonQmHPHn99uOLQiUTtrpklAD 2UQwUY4lXD+1449Eo6NIFUGZs1R598mzR2bZLK+fqnRBlSIOAN9gnvkuKG5BfJmYvSjm m3LhzKhNa+fBCjC3/akQ+ZAAi4oCYGJoL4ATj63ze8WrIeGYTo/14290X6mE/xnjG2ax fOJQzJ6N8tHcMvKoj7/1M8xvQh4dwCtVVoFNkO5prXzTNrNOU5eSJYgg0aprdwjovfmx M+Sg== 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=X338B2vmD+wONdVlzvZFb5uaGm3ykKG/3kxiN6b3q5A=; b=lF61hUovmCyhfPMRcuiBkfsUQ9X3JS6JEMK4YqOPO+24daJQ4aF2SEI+v8PrkE7srz 8quaQo2YySzDrMBWEz9fRkIFrRgKXHgHkwN30NzB2ZLvPxBTZYGOn7WExZyiKDS9kXBn uzerwtIvYYHKHWPwR8a+NT0PSaNy4l2Mdldc9rSCQ+BDkSrt1MbHz1E+fKZEoaDl486b 1kHi+ElB/I9Rd2sPt1+POKcKsWi96vWLr5gKVWiLfUppQwV25tl+TjsNHbQfeIqN20CP 27gZvggtGXq9bBssANGuPZe+FQSBZnOK78zLv2L8LiIHGiFk1+nqAD0yOws6dWFh3tTo TwbA== X-Gm-Message-State: APjAAAVx4VEUVaAD5xe1lJL5Ky4oAqXZW1MBvhV62Wd/fgoAueF2rNUb cOJVMh9h1ZVifHXqHiWAErE= X-Google-Smtp-Source: APXvYqyBLd2qFIdUqnLAWKftjuUGETW202BB+mNu8NYf10bVM/l2lcyxRN2909lvRiIYJff+aBwi6A== X-Received: by 2002:adf:9102:: with SMTP id j2mr30024578wrj.136.1571170254314; Tue, 15 Oct 2019 13:10:54 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:53 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:25 +0200 Message-Id: <20191015201032.20156-13-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: u-boot@lists.denx.de, Krzysztof Kozlowski , Stefan Roese , Marek Vasut , Tom Rini , Ryder Lee , Heinrich Schuchardt , Albert Aribaud Subject: [U-Boot] [RFC PATCH v2 12/18] arm: socfpga: gen5: add readonly clk driver 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 clk-gen5 as a readonly DM_CLK driver that can return clocks for the peripherals. Signed-off-by: Simon Goldschmidt --- Changes in v2: None MAINTAINERS | 1 + drivers/clk/altera/Makefile | 1 + drivers/clk/altera/clk-gen5.c | 338 ++++++++++++++++++++++++++++++++++ 3 files changed, 340 insertions(+) create mode 100644 drivers/clk/altera/clk-gen5.c diff --git a/MAINTAINERS b/MAINTAINERS index 74a1423f50..be8a38ea07 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -114,6 +114,7 @@ M: Simon Goldschmidt S: Maintainted T: git https://gitlab.denx.de/u-boot/custodians/u-boot-socfpga.git F: arch/arm/mach-socfpga/ +F: drivers/clk/altera/clk-gen5.c F: drivers/sysreset/sysreset_socfpga* ARM AMLOGIC SOC SUPPORT diff --git a/drivers/clk/altera/Makefile b/drivers/clk/altera/Makefile index a3ae8b24b0..d0664c6ad5 100644 --- a/drivers/clk/altera/Makefile +++ b/drivers/clk/altera/Makefile @@ -4,3 +4,4 @@ # obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clk-arria10.o +obj-$(CONFIG_TARGET_SOCFPGA_GEN5) += clk-gen5.o diff --git a/drivers/clk/altera/clk-gen5.c b/drivers/clk/altera/clk-gen5.c new file mode 100644 index 0000000000..4c197b81b0 --- /dev/null +++ b/drivers/clk/altera/clk-gen5.c @@ -0,0 +1,338 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018 Marek Vasut + */ + +#include +#include +#include +#include +#include +#include + +#include + +enum socfpga_gen5_clk_type { + SOCFPGA_GEN5_CLK_MAIN_PLL, + SOCFPGA_GEN5_CLK_PER_PLL, + SOCFPGA_GEN5_CLK_PERIP_CLK, + SOCFPGA_GEN5_CLK_GATE_CLK, + SOCFPGA_GEN5_CLK_UNKNOWN_CLK, +}; + +struct socfpga_gen5_clk_platdata { + enum socfpga_gen5_clk_type type; + struct clk_bulk clks; + u32 regs; + /* Fixed divider */ + u16 fix_div; + /* Control register */ + u16 ctl_reg; + /* Divider register */ + u16 div_reg; + u8 div_len; + u8 div_off; + /* Clock gating register */ + u16 gate_reg; + u8 gate_bit; + /* Clock source register */ + u16 src_reg; + u8 src_len; + u8 src_off; +}; + +static int socfpga_gen5_clk_get_upstream(struct clk *clk, struct clk **upclk) +{ + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(clk->dev); + u32 reg, maxval; + + if (plat->clks.count == 0) + return 0; + + if (plat->src_reg && plat->src_len) { + maxval = 1 << plat->src_len; + if (plat->clks.count <= maxval) { + reg = readl(plat->regs + plat->src_reg); + reg >>= plat->src_off; + reg &= (maxval - 1); + *upclk = &plat->clks.clks[reg]; + return 0; + } + } + + if (plat->clks.count == 1) { + *upclk = &plat->clks.clks[0]; + return 0; + } + + if (!plat->ctl_reg) + return -EINVAL; + + reg = readl(plat->regs + plat->ctl_reg); + + /* Assume PLLs are ON for now */ + if (plat->type == SOCFPGA_GEN5_CLK_MAIN_PLL) { + reg = (reg >> 8) & 0x3; + maxval = 2; + } else if (plat->type == SOCFPGA_GEN5_CLK_PER_PLL) { + reg = (reg >> 8) & 0x3; + maxval = 3; + } else { + reg = (reg >> 16) & 0x7; + maxval = 4; + } + + if (reg > maxval) { + dev_err(clk->dev, "Invalid clock source\n"); + return -EINVAL; + } + + *upclk = &plat->clks.clks[reg]; + return 0; +} + +static int socfpga_gen5_clk_endisable(struct clk *clk, bool enable) +{ + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(clk->dev); + struct clk *upclk = NULL; + int ret; + + if (!enable && plat->gate_reg) + clrbits_le32(plat->regs + plat->gate_reg, BIT(plat->gate_bit)); + + ret = socfpga_gen5_clk_get_upstream(clk, &upclk); + if (ret) + return ret; + + if (upclk) { + if (enable) + clk_enable(upclk); + else + clk_disable(upclk); + } + + if (enable && plat->gate_reg) + setbits_le32(plat->regs + plat->gate_reg, BIT(plat->gate_bit)); + + return 0; +} + +static int socfpga_gen5_clk_enable(struct clk *clk) +{ + return socfpga_gen5_clk_endisable(clk, true); +} + +static int socfpga_gen5_clk_disable(struct clk *clk) +{ + return socfpga_gen5_clk_endisable(clk, false); +} + +static ulong socfpga_gen5_clk_get_rate(struct clk *clk) +{ + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(clk->dev); + struct clk *upclk = NULL; + ulong rate, uprate, reg, numer, denom; + int ret; + + ret = socfpga_gen5_clk_get_upstream(clk, &upclk); + if (ret || !upclk) + return 0; + + uprate = clk_get_rate(upclk); + rate = uprate; + + if (plat->type == SOCFPGA_GEN5_CLK_MAIN_PLL) { + reg = readl(plat->regs + plat->ctl_reg); /* VCO */ + numer = (reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >> + CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET; + denom = (reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >> + CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET; + rate /= denom + 1; + rate *= numer + 1; + } else if (plat->type == SOCFPGA_GEN5_CLK_PER_PLL) { + reg = readl(plat->regs + plat->ctl_reg); /* VCO */ + numer = (reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >> + CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET; + denom = (reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >> + CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET; + rate /= denom + 1; + rate *= numer + 1; + } else { + rate /= plat->fix_div; + + if (plat->fix_div == 1 && plat->ctl_reg) { + reg = readl(plat->regs + plat->ctl_reg); + reg &= 0x1ff; + rate /= reg + 1; + } + + if (plat->div_reg) { + reg = readl(plat->regs + plat->div_reg); + reg >>= plat->div_off; + reg &= (1 << plat->div_len) - 1; + if (plat->type == SOCFPGA_GEN5_CLK_PERIP_CLK) + rate /= reg + 1; + if (plat->type == SOCFPGA_GEN5_CLK_GATE_CLK) + rate /= 1 << reg; + } + } + + return rate; +} + +static const struct clk_ops socfpga_gen5_clk_ops = { + .enable = socfpga_gen5_clk_enable, + .disable = socfpga_gen5_clk_disable, + .get_rate = socfpga_gen5_clk_get_rate, +}; + +static int socfpga_gen5_clk_bind(struct udevice *dev) +{ + const void *fdt = gd->fdt_blob; + int offset = dev_of_offset(dev); + bool pre_reloc_only = !(gd->flags & GD_FLG_RELOC); + const char *name; + int ret; + const char *drv_name; + + for (offset = fdt_first_subnode(fdt, offset); + offset > 0; + offset = fdt_next_subnode(fdt, offset)) { + name = fdt_get_name(fdt, offset, NULL); + if (!name) + return -EINVAL; + + if (!strcmp(name, "clocks")) { + offset = fdt_first_subnode(fdt, offset); + name = fdt_get_name(fdt, offset, NULL); + if (!name) + return -EINVAL; + } + + /* Filter out supported sub-clock */ + if (fdt_node_check_compatible(fdt, offset, + "altr,socfpga-pll-clock") && + fdt_node_check_compatible(fdt, offset, + "altr,socfpga-perip-clk") && + fdt_node_check_compatible(fdt, offset, + "altr,socfpga-gate-clk") && + fdt_node_check_compatible(fdt, offset, "fixed-clock")) + continue; + + if (pre_reloc_only && + !dm_ofnode_pre_reloc(offset_to_ofnode(offset))) + continue; + + if (fdt_node_check_compatible(fdt, offset, "fixed-clock")) + drv_name = "clk-gen5"; + else + drv_name = "fixed_rate_clock"; + + ret = device_bind_driver_to_node(dev, drv_name, name, + offset_to_ofnode(offset), + NULL); + if (ret) + return ret; + } + + return 0; +} + +static int socfpga_gen5_clk_probe(struct udevice *dev) +{ + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(dev); + const void *fdt = gd->fdt_blob; + int offset = dev_of_offset(dev); + + clk_get_bulk(dev, &plat->clks); + + if (!fdt_node_check_compatible(fdt, offset, + "altr,socfpga-pll-clock")) { + /* Main PLL has 3 upstream clock */ + if (plat->clks.count == 1) + plat->type = SOCFPGA_GEN5_CLK_MAIN_PLL; + else + plat->type = SOCFPGA_GEN5_CLK_PER_PLL; + } else if (!fdt_node_check_compatible(fdt, offset, + "altr,socfpga-perip-clk")) { + plat->type = SOCFPGA_GEN5_CLK_PERIP_CLK; + } else if (!fdt_node_check_compatible(fdt, offset, + "altr,socfpga-gate-clk")) { + plat->type = SOCFPGA_GEN5_CLK_GATE_CLK; + } else { + plat->type = SOCFPGA_GEN5_CLK_UNKNOWN_CLK; + } + + return 0; +} + +static int socfpga_gen5_ofdata_to_platdata(struct udevice *dev) +{ + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(dev); + struct socfpga_gen5_clk_platdata *pplat; + struct udevice *pdev; + const void *fdt = gd->fdt_blob; + unsigned int divreg[3], gatereg[2], srcreg[3]; + int ret, offset = dev_of_offset(dev); + u32 regs; + + regs = dev_read_u32_default(dev, "reg", 0x0); + + if (!fdt_node_check_compatible(fdt, offset, "altr,clk-mgr")) { + plat->regs = devfdt_get_addr(dev); + } else { + pdev = dev_get_parent(dev); + if (!pdev) + return -ENODEV; + + pplat = dev_get_platdata(pdev); + if (!pplat) + return -EINVAL; + + plat->ctl_reg = regs; + plat->regs = pplat->regs; + } + + plat->type = SOCFPGA_GEN5_CLK_UNKNOWN_CLK; + + plat->fix_div = dev_read_u32_default(dev, "fixed-divider", 1); + + ret = dev_read_u32_array(dev, "src-reg", srcreg, ARRAY_SIZE(srcreg)); + if (!ret) { + plat->src_reg = srcreg[0]; + plat->src_len = srcreg[2]; + plat->src_off = srcreg[1]; + } + + ret = dev_read_u32_array(dev, "div-reg", divreg, ARRAY_SIZE(divreg)); + if (!ret) { + plat->div_reg = divreg[0]; + plat->div_len = divreg[2]; + plat->div_off = divreg[1]; + } + + ret = dev_read_u32_array(dev, "clk-gate", gatereg, ARRAY_SIZE(gatereg)); + if (!ret) { + plat->gate_reg = gatereg[0]; + plat->gate_bit = gatereg[1]; + } + + return 0; +} + +static const struct udevice_id socfpga_gen5_clk_match[] = { + { .compatible = "altr,clk-mgr" }, + {} +}; + +U_BOOT_DRIVER(socfpga_gen5_clk) = { + .name = "clk-gen5", + .id = UCLASS_CLK, + .of_match = socfpga_gen5_clk_match, + .ops = &socfpga_gen5_clk_ops, + .bind = socfpga_gen5_clk_bind, + .probe = socfpga_gen5_clk_probe, + .ofdata_to_platdata = socfpga_gen5_ofdata_to_platdata, + + .platdata_auto_alloc_size = sizeof(struct socfpga_gen5_clk_platdata), +}; From patchwork Tue Oct 15 20:10:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177385 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="uUlc2VJE"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6H41tfnz9sPF for ; Wed, 16 Oct 2019 07:20:00 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 0060EC21E1B; Tue, 15 Oct 2019 20:14:40 +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_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 85A8BC21DC1; Tue, 15 Oct 2019 20:12:50 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 19E0DC21D56; Tue, 15 Oct 2019 20:10:57 +0000 (UTC) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by lists.denx.de (Postfix) with ESMTPS id A44B9C21DA2 for ; Tue, 15 Oct 2019 20:10:55 +0000 (UTC) Received: by mail-wr1-f66.google.com with SMTP id b9so25389928wrs.0 for ; Tue, 15 Oct 2019 13:10:55 -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=PqYQOM3zo/MRKLyR2sQNZcbhafiUF6E3IkIK5EhO980=; b=uUlc2VJEEyxPXinIFzgUjxD8oDd+T+CsvYwXOaV0XY+k5NLgcKPhpk19Y07nfJmPJm mtamEroqde+UwhLcjVJ3LPpMUNaYBafpbv5uLR0uvPcoyOWum2To+Gd9mW+c9OXfruMW gTBWk/XSz82JoTjRuKSAgxxPdTvxsIo+JPVoWbwcdQjcfUCptQ5B6NQIzcBTc13rDLOP hoDjmIJf6Y5XlX8gTZvmOsEbIaRdw4JvdFXgHs4aSGSQetGd9FudOk9ROp74jDIpeQ4/ QnHEBLF0AuWVjjrkk81VGrtPl59qKqs/7j0LricODLqkemxC+kCHTy2uZAxN11Mn9oXN 8L5A== 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=PqYQOM3zo/MRKLyR2sQNZcbhafiUF6E3IkIK5EhO980=; b=Y1ZEndoz4W1lOIB9wl/UBnvuwUZ77E0hdaRGs8/DOqWqP66teZdt+8lCHd3IhII/Y3 3LPha8gyHWmowaTGEtlQkBVjm4yueRWSYxSiZGK3hhYP9Em+pHRnZs+/wgh9nOFcVmY6 fMO/g33WApoXNgi1rpH+82b86rrHkKbC/0n1Qu26j/W7cq4dLxGQKnqiQQrtDVXuZ7I1 wFqgDcC1eONrigpUIMqQhHa0JvhVCxMrHxmsodpW/Q9FsXL5g+JaKYJZneKUNQFba2xm jD5O90w+2FmLbLhJK528WXLzhUYHkA4YCfeQyqAyR3ycgua4POP4ixmZwTtqTQfooslC T03g== X-Gm-Message-State: APjAAAWUW+UR6uSymJG+iVFJZoVbeHMSMKGUn9R0HXF+c5D4nn01+Scs o5WigpEQooAR12TZulY/y4I= X-Google-Smtp-Source: APXvYqy2f9EEtoDb4Q7i4tTO/bz5mLwFTTXMylR8i0qzr2LDpiF2Xse0vYFhN/43ItFhuYhh08azoQ== X-Received: by 2002:adf:8295:: with SMTP id 21mr3164184wrc.14.1571170255352; Tue, 15 Oct 2019 13:10:55 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:54 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:26 +0200 Message-Id: <20191015201032.20156-14-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Tom Rini , Albert Aribaud , u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 13/18] arm: socfpga: gen5: enable DM CLK 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" Enable CLK and SPL_CLK so that the new readonly clock driver is used. Signed-off-by: Simon Goldschmidt --- Changes in v2: None arch/arm/mach-socfpga/Kconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/mach-socfpga/Kconfig b/arch/arm/mach-socfpga/Kconfig index 9efdcd6f10..81052f27d5 100644 --- a/arch/arm/mach-socfpga/Kconfig +++ b/arch/arm/mach-socfpga/Kconfig @@ -53,7 +53,9 @@ config TARGET_SOCFPGA_CYCLONE5 config TARGET_SOCFPGA_GEN5 bool + select CLK select SPL_ALTERA_SDRAM + select SPL_CLK if SPL imply FPGA_SOCFPGA imply SPL_SIZE_LIMIT_SUBTRACT_GD imply SPL_SIZE_LIMIT_SUBTRACT_MALLOC From patchwork Tue Oct 15 20:10:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177373 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="DYP9S0T4"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t69G5bVGz9sPF for ; Wed, 16 Oct 2019 07:14:58 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 5E1E8C21D83; Tue, 15 Oct 2019 20:13:57 +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_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 A9DD4C21C93; Tue, 15 Oct 2019 20:12:25 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id B17E3C21C51; Tue, 15 Oct 2019 20:11:01 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by lists.denx.de (Postfix) with ESMTPS id 35E47C21DA6 for ; Tue, 15 Oct 2019 20:10:59 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id j18so25348116wrq.10 for ; Tue, 15 Oct 2019 13:10:59 -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=wO6ruQl2wpBrFDfLGZ7jMhByJI+2r7A5mjBO7ddSZAA=; b=DYP9S0T4bKFkCAICYSaofWUfKMhbdF4uoG0yaBGLapF8ro5Hfp6fQkuVcJhoD/k5WY NCJotQSa1D4+3DPNxollP5m7ntzze/+RuDQnWQfdUjnJ3kZqcgEfG5s83LhyDTkxQ6PR We/aqRR1r89N5cCxpRau0db6Y1wtkjl4nRXbhhPqaFd5tiyZlSps1dN8fF7R1qTy7iXj ECMRFrP/0fGhvg7Vd+ZnV4R+4axGGMlrLIqIRyHeFQ4t5TPPLsrL+o24yfq5LWcIX6X3 CapU2aUwBTN+d4IPuJubDCBxnQu3ZW2+yMhVBXx8P+RXa7mG+wkdtJeo2zzJdEQ9CmBa ONuA== 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=wO6ruQl2wpBrFDfLGZ7jMhByJI+2r7A5mjBO7ddSZAA=; b=kf80UTdVYvtsRe1Nqfd6PZrbkcEQPeEjvq1mJteY7DTSe9GxgeQRrGdXsIwwjdSwRa i+tvupY/j3STa70L9R0P/455lzfoyBSSac81ABz7NWHTNOQWbEfRiFiCrOKQShUQPwKV S0NNqIWS4sXrv5sUDRG6Cmf2KEaDiNcDD7xBEzIgjnt2ghgP8h8bOTWM7GHc46Xlh1jq mLMr6xbuWL0ckIHWbhecNJ/lku/Qiz7jR+S4BrYclBf81r+sVB6eYziaopeGTdoG/Nlh HFu2RNDg3pL9tR4PE6GpAVXZ6Ok95DpTYeQl1BvTSQjCTWOnhj5UFV1eXgXtukRStBX9 CNEA== X-Gm-Message-State: APjAAAW9lychzH2K0sIA+XxKDvYC4Cc36YWKR8OXmVJPegCn+DikqX1Y MEauuzaoPT4BgVng+b7/vGQ= X-Google-Smtp-Source: APXvYqzMUTKkGLPffYdgpoI1SjYnJoFaSnArrN5Jfskboq5ceXN84IM3Bg5NjTH3av0HUi6XwFqJ3g== X-Received: by 2002:a5d:44c8:: with SMTP id z8mr9727186wrr.66.1571170258047; Tue, 15 Oct 2019 13:10:58 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:55 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:27 +0200 Message-Id: <20191015201032.20156-15-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Albert Aribaud , u-boot@lists.denx.de, Tom Rini Subject: [U-Boot] [RFC PATCH v2 14/18] arm: socfpga: gen5: move clock initialization to CLK driver 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 moves setting initial clock values (as defined by Quartus handoff files) from ad-hoc code in arch to CM_CLK driver. TODO: CONFIG_CLOCKS and cmd 'clocks' must be fixed for dts access. Signed-off-by: Simon Goldschmidt --- Changes in v2: None arch/arm/mach-socfpga/Makefile | 1 - arch/arm/mach-socfpga/clock_manager.c | 31 +- arch/arm/mach-socfpga/clock_manager_gen5.c | 528 ------------------ .../mach-socfpga/include/mach/clock_manager.h | 2 + .../include/mach/clock_manager_gen5.h | 12 - arch/arm/mach-socfpga/spl_gen5.c | 8 +- drivers/clk/altera/clk-gen5.c | 361 ++++++++++++ 7 files changed, 388 insertions(+), 555 deletions(-) delete mode 100644 arch/arm/mach-socfpga/clock_manager_gen5.c diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile index fc1181cb27..4b77990f74 100644 --- a/arch/arm/mach-socfpga/Makefile +++ b/arch/arm/mach-socfpga/Makefile @@ -10,7 +10,6 @@ obj-y += clock_manager.o obj-y += misc.o ifdef CONFIG_TARGET_SOCFPGA_GEN5 -obj-y += clock_manager_gen5.o obj-y += misc_gen5.o obj-y += reset_manager_gen5.o obj-y += scan_manager.o diff --git a/arch/arm/mach-socfpga/clock_manager.c b/arch/arm/mach-socfpga/clock_manager.c index 9f3c643df8..16760c760f 100644 --- a/arch/arm/mach-socfpga/clock_manager.c +++ b/arch/arm/mach-socfpga/clock_manager.c @@ -10,6 +10,8 @@ DECLARE_GLOBAL_DATA_PTR; +#ifndef CONFIG_TARGET_SOCFPGA_GEN5 + static const struct socfpga_clock_manager *clock_manager_base = (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS; @@ -18,11 +20,7 @@ void cm_wait_for_lock(u32 mask) u32 inter_val; u32 retry = 0; do { -#if defined(CONFIG_TARGET_SOCFPGA_GEN5) - inter_val = readl(&clock_manager_base->inter) & mask; -#else inter_val = readl(&clock_manager_base->stat) & mask; -#endif /* Wait for stable lock */ if (inter_val == mask) retry++; @@ -40,14 +38,29 @@ int cm_wait_for_fsm(void) CLKMGR_STAT_BUSY, false, 20000, false); } -int set_cpu_clk_info(void) +#endif + +#ifdef CONFIG_TARGET_SOCFPGA_GEN5 +static unsigned long cm_get_mpu_clk_hz(void) { -#if defined(CONFIG_TARGET_SOCFPGA_GEN5) - /* Calculate the clock frequencies required for drivers */ - cm_get_l4_sp_clk_hz(); - cm_get_mmc_controller_clk_hz(); + return 0; // TODO: use devicetree +} + +static unsigned long cm_get_sdram_clk_hz(void) +{ + return 0; // TODO: use devicetree +} + +#ifndef CONFIG_SPL_BUILD +static void cm_print_clock_quick_summary(void) +{ + // TODO: use devicetree +} +#endif #endif +int set_cpu_clk_info(void) +{ gd->bd->bi_arm_freq = cm_get_mpu_clk_hz() / 1000000; gd->bd->bi_dsp_freq = 0; diff --git a/arch/arm/mach-socfpga/clock_manager_gen5.c b/arch/arm/mach-socfpga/clock_manager_gen5.c deleted file mode 100644 index 3a64600861..0000000000 --- a/arch/arm/mach-socfpga/clock_manager_gen5.c +++ /dev/null @@ -1,528 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (C) 2013-2017 Altera Corporation - */ - -#include -#include -#include -#include -#include - -static const struct socfpga_clock_manager *clock_manager_base = - (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS; - -/* - * function to write the bypass register which requires a poll of the - * busy bit - */ -static void cm_write_bypass(u32 val) -{ - writel(val, &clock_manager_base->bypass); - cm_wait_for_fsm(); -} - -/* function to write the ctrl register which requires a poll of the busy bit */ -static void cm_write_ctrl(u32 val) -{ - writel(val, &clock_manager_base->ctrl); - cm_wait_for_fsm(); -} - -/* function to write a clock register that has phase information */ -static int cm_write_with_phase(u32 value, const void *reg_address, u32 mask) -{ - int ret; - - /* poll until phase is zero */ - ret = wait_for_bit_le32(reg_address, mask, false, 20000, false); - if (ret) - return ret; - - writel(value, reg_address); - - return wait_for_bit_le32(reg_address, mask, false, 20000, false); -} - -/* - * Setup clocks while making no assumptions about previous state of the clocks. - * - * Start by being paranoid and gate all sw managed clocks - * Put all plls in bypass - * Put all plls VCO registers back to reset value (bandgap power down). - * Put peripheral and main pll src to reset value to avoid glitch. - * Delay 5 us. - * Deassert bandgap power down and set numerator and denominator - * Start 7 us timer. - * set internal dividers - * Wait for 7 us timer. - * Enable plls - * Set external dividers while plls are locking - * Wait for pll lock - * Assert/deassert outreset all. - * Take all pll's out of bypass - * Clear safe mode - * set source main and peripheral clocks - * Ungate clocks - */ - -int cm_basic_init(const struct cm_config * const cfg) -{ - unsigned long end; - int ret; - - /* Start by being paranoid and gate all sw managed clocks */ - - /* - * We need to disable nandclk - * and then do another apb access before disabling - * gatting off the rest of the periperal clocks. - */ - writel(~CLKMGR_PERPLLGRP_EN_NANDCLK_MASK & - readl(&clock_manager_base->per_pll.en), - &clock_manager_base->per_pll.en); - - /* DO NOT GATE OFF DEBUG CLOCKS & BRIDGE CLOCKS */ - writel(CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK | - CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK | - CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK | - CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK | - CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK | - CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK, - &clock_manager_base->main_pll.en); - - writel(0, &clock_manager_base->sdr_pll.en); - - /* now we can gate off the rest of the peripheral clocks */ - writel(0, &clock_manager_base->per_pll.en); - - /* Put all plls in bypass */ - cm_write_bypass(CLKMGR_BYPASS_PERPLL | CLKMGR_BYPASS_SDRPLL | - CLKMGR_BYPASS_MAINPLL); - - /* Put all plls VCO registers back to reset value. */ - writel(CLKMGR_MAINPLLGRP_VCO_RESET_VALUE & - ~CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK, - &clock_manager_base->main_pll.vco); - writel(CLKMGR_PERPLLGRP_VCO_RESET_VALUE & - ~CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK, - &clock_manager_base->per_pll.vco); - writel(CLKMGR_SDRPLLGRP_VCO_RESET_VALUE & - ~CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK, - &clock_manager_base->sdr_pll.vco); - - /* - * The clocks to the flash devices and the L4_MAIN clocks can - * glitch when coming out of safe mode if their source values - * are different from their reset value. So the trick it to - * put them back to their reset state, and change input - * after exiting safe mode but before ungating the clocks. - */ - writel(CLKMGR_PERPLLGRP_SRC_RESET_VALUE, - &clock_manager_base->per_pll.src); - writel(CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE, - &clock_manager_base->main_pll.l4src); - - /* read back for the required 5 us delay. */ - readl(&clock_manager_base->main_pll.vco); - readl(&clock_manager_base->per_pll.vco); - readl(&clock_manager_base->sdr_pll.vco); - - - /* - * We made sure bgpwr down was assert for 5 us. Now deassert BG PWR DN - * with numerator and denominator. - */ - writel(cfg->main_vco_base, &clock_manager_base->main_pll.vco); - writel(cfg->peri_vco_base, &clock_manager_base->per_pll.vco); - writel(cfg->sdram_vco_base, &clock_manager_base->sdr_pll.vco); - - /* - * Time starts here. Must wait 7 us from - * BGPWRDN_SET(0) to VCO_ENABLE_SET(1). - */ - end = timer_get_us() + 7; - - /* main mpu */ - writel(cfg->mpuclk, &clock_manager_base->main_pll.mpuclk); - - /* altera group mpuclk */ - writel(cfg->altera_grp_mpuclk, &clock_manager_base->altera.mpuclk); - - /* main main clock */ - writel(cfg->mainclk, &clock_manager_base->main_pll.mainclk); - - /* main for dbg */ - writel(cfg->dbgatclk, &clock_manager_base->main_pll.dbgatclk); - - /* main for cfgs2fuser0clk */ - writel(cfg->cfg2fuser0clk, - &clock_manager_base->main_pll.cfgs2fuser0clk); - - /* Peri emac0 50 MHz default to RMII */ - writel(cfg->emac0clk, &clock_manager_base->per_pll.emac0clk); - - /* Peri emac1 50 MHz default to RMII */ - writel(cfg->emac1clk, &clock_manager_base->per_pll.emac1clk); - - /* Peri QSPI */ - writel(cfg->mainqspiclk, &clock_manager_base->main_pll.mainqspiclk); - - writel(cfg->perqspiclk, &clock_manager_base->per_pll.perqspiclk); - - /* Peri pernandsdmmcclk */ - writel(cfg->mainnandsdmmcclk, - &clock_manager_base->main_pll.mainnandsdmmcclk); - - writel(cfg->pernandsdmmcclk, - &clock_manager_base->per_pll.pernandsdmmcclk); - - /* Peri perbaseclk */ - writel(cfg->perbaseclk, &clock_manager_base->per_pll.perbaseclk); - - /* Peri s2fuser1clk */ - writel(cfg->s2fuser1clk, &clock_manager_base->per_pll.s2fuser1clk); - - /* 7 us must have elapsed before we can enable the VCO */ - while (timer_get_us() < end) - ; - - /* Enable vco */ - /* main pll vco */ - writel(cfg->main_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, - &clock_manager_base->main_pll.vco); - - /* periferal pll */ - writel(cfg->peri_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, - &clock_manager_base->per_pll.vco); - - /* sdram pll vco */ - writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, - &clock_manager_base->sdr_pll.vco); - - /* L3 MP and L3 SP */ - writel(cfg->maindiv, &clock_manager_base->main_pll.maindiv); - - writel(cfg->dbgdiv, &clock_manager_base->main_pll.dbgdiv); - - writel(cfg->tracediv, &clock_manager_base->main_pll.tracediv); - - /* L4 MP, L4 SP, can0, and can1 */ - writel(cfg->perdiv, &clock_manager_base->per_pll.div); - - writel(cfg->gpiodiv, &clock_manager_base->per_pll.gpiodiv); - - cm_wait_for_lock(LOCKED_MASK); - - /* write the sdram clock counters before toggling outreset all */ - writel(cfg->ddrdqsclk & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK, - &clock_manager_base->sdr_pll.ddrdqsclk); - - writel(cfg->ddr2xdqsclk & CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK, - &clock_manager_base->sdr_pll.ddr2xdqsclk); - - writel(cfg->ddrdqclk & CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK, - &clock_manager_base->sdr_pll.ddrdqclk); - - writel(cfg->s2fuser2clk & CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK, - &clock_manager_base->sdr_pll.s2fuser2clk); - - /* - * after locking, but before taking out of bypass - * assert/deassert outresetall - */ - u32 mainvco = readl(&clock_manager_base->main_pll.vco); - - /* assert main outresetall */ - writel(mainvco | CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK, - &clock_manager_base->main_pll.vco); - - u32 periphvco = readl(&clock_manager_base->per_pll.vco); - - /* assert pheriph outresetall */ - writel(periphvco | CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK, - &clock_manager_base->per_pll.vco); - - /* assert sdram outresetall */ - writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN| - CLKMGR_SDRPLLGRP_VCO_OUTRESETALL, - &clock_manager_base->sdr_pll.vco); - - /* deassert main outresetall */ - writel(mainvco & ~CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK, - &clock_manager_base->main_pll.vco); - - /* deassert pheriph outresetall */ - writel(periphvco & ~CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK, - &clock_manager_base->per_pll.vco); - - /* deassert sdram outresetall */ - writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, - &clock_manager_base->sdr_pll.vco); - - /* - * now that we've toggled outreset all, all the clocks - * are aligned nicely; so we can change any phase. - */ - ret = cm_write_with_phase(cfg->ddrdqsclk, - &clock_manager_base->sdr_pll.ddrdqsclk, - CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK); - if (ret) - return ret; - - /* SDRAM DDR2XDQSCLK */ - ret = cm_write_with_phase(cfg->ddr2xdqsclk, - &clock_manager_base->sdr_pll.ddr2xdqsclk, - CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK); - if (ret) - return ret; - - ret = cm_write_with_phase(cfg->ddrdqclk, - &clock_manager_base->sdr_pll.ddrdqclk, - CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK); - if (ret) - return ret; - - ret = cm_write_with_phase(cfg->s2fuser2clk, - &clock_manager_base->sdr_pll.s2fuser2clk, - CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK); - if (ret) - return ret; - - /* Take all three PLLs out of bypass when safe mode is cleared. */ - cm_write_bypass(0); - - /* clear safe mode */ - cm_write_ctrl(readl(&clock_manager_base->ctrl) | CLKMGR_CTRL_SAFEMODE); - - /* - * now that safe mode is clear with clocks gated - * it safe to change the source mux for the flashes the the L4_MAIN - */ - writel(cfg->persrc, &clock_manager_base->per_pll.src); - writel(cfg->l4src, &clock_manager_base->main_pll.l4src); - - /* Now ungate non-hw-managed clocks */ - writel(~0, &clock_manager_base->main_pll.en); - writel(~0, &clock_manager_base->per_pll.en); - writel(~0, &clock_manager_base->sdr_pll.en); - - /* Clear the loss of lock bits (write 1 to clear) */ - writel(CLKMGR_INTER_SDRPLLLOST_MASK | CLKMGR_INTER_PERPLLLOST_MASK | - CLKMGR_INTER_MAINPLLLOST_MASK, - &clock_manager_base->inter); - - return 0; -} - -static unsigned int cm_get_main_vco_clk_hz(void) -{ - u32 reg, clock; - - /* get the main VCO clock */ - reg = readl(&clock_manager_base->main_pll.vco); - clock = cm_get_osc_clk_hz(1); - clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >> - CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1; - clock *= ((reg & CLKMGR_MAINPLLGRP_VCO_NUMER_MASK) >> - CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) + 1; - - return clock; -} - -static unsigned int cm_get_per_vco_clk_hz(void) -{ - u32 reg, clock = 0; - - /* identify PER PLL clock source */ - reg = readl(&clock_manager_base->per_pll.vco); - reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >> - CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET; - if (reg == CLKMGR_VCO_SSRC_EOSC1) - clock = cm_get_osc_clk_hz(1); - else if (reg == CLKMGR_VCO_SSRC_EOSC2) - clock = cm_get_osc_clk_hz(2); - else if (reg == CLKMGR_VCO_SSRC_F2S) - clock = cm_get_f2s_per_ref_clk_hz(); - - /* get the PER VCO clock */ - reg = readl(&clock_manager_base->per_pll.vco); - clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >> - CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1; - clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >> - CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) + 1; - - return clock; -} - -unsigned long cm_get_mpu_clk_hz(void) -{ - u32 reg, clock; - - clock = cm_get_main_vco_clk_hz(); - - /* get the MPU clock */ - reg = readl(&clock_manager_base->altera.mpuclk); - clock /= (reg + 1); - reg = readl(&clock_manager_base->main_pll.mpuclk); - clock /= (reg + 1); - return clock; -} - -unsigned long cm_get_sdram_clk_hz(void) -{ - u32 reg, clock = 0; - - /* identify SDRAM PLL clock source */ - reg = readl(&clock_manager_base->sdr_pll.vco); - reg = (reg & CLKMGR_SDRPLLGRP_VCO_SSRC_MASK) >> - CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET; - if (reg == CLKMGR_VCO_SSRC_EOSC1) - clock = cm_get_osc_clk_hz(1); - else if (reg == CLKMGR_VCO_SSRC_EOSC2) - clock = cm_get_osc_clk_hz(2); - else if (reg == CLKMGR_VCO_SSRC_F2S) - clock = cm_get_f2s_sdr_ref_clk_hz(); - - /* get the SDRAM VCO clock */ - reg = readl(&clock_manager_base->sdr_pll.vco); - clock /= ((reg & CLKMGR_SDRPLLGRP_VCO_DENOM_MASK) >> - CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) + 1; - clock *= ((reg & CLKMGR_SDRPLLGRP_VCO_NUMER_MASK) >> - CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) + 1; - - /* get the SDRAM (DDR_DQS) clock */ - reg = readl(&clock_manager_base->sdr_pll.ddrdqsclk); - reg = (reg & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK) >> - CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET; - clock /= (reg + 1); - - return clock; -} - -unsigned int cm_get_l4_sp_clk_hz(void) -{ - u32 reg, clock = 0; - - /* identify the source of L4 SP clock */ - reg = readl(&clock_manager_base->main_pll.l4src); - reg = (reg & CLKMGR_MAINPLLGRP_L4SRC_L4SP) >> - CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET; - - if (reg == CLKMGR_L4_SP_CLK_SRC_MAINPLL) { - clock = cm_get_main_vco_clk_hz(); - - /* get the clock prior L4 SP divider (main clk) */ - reg = readl(&clock_manager_base->altera.mainclk); - clock /= (reg + 1); - reg = readl(&clock_manager_base->main_pll.mainclk); - clock /= (reg + 1); - } else if (reg == CLKMGR_L4_SP_CLK_SRC_PERPLL) { - clock = cm_get_per_vco_clk_hz(); - - /* get the clock prior L4 SP divider (periph_base_clk) */ - reg = readl(&clock_manager_base->per_pll.perbaseclk); - clock /= (reg + 1); - } - - /* get the L4 SP clock which supplied to UART */ - reg = readl(&clock_manager_base->main_pll.maindiv); - reg = (reg & CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK) >> - CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET; - clock = clock / (1 << reg); - - return clock; -} - -unsigned int cm_get_mmc_controller_clk_hz(void) -{ - u32 reg, clock = 0; - - /* identify the source of MMC clock */ - reg = readl(&clock_manager_base->per_pll.src); - reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >> - CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET; - - if (reg == CLKMGR_SDMMC_CLK_SRC_F2S) { - clock = cm_get_f2s_per_ref_clk_hz(); - } else if (reg == CLKMGR_SDMMC_CLK_SRC_MAIN) { - clock = cm_get_main_vco_clk_hz(); - - /* get the SDMMC clock */ - reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk); - clock /= (reg + 1); - } else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) { - clock = cm_get_per_vco_clk_hz(); - - /* get the SDMMC clock */ - reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk); - clock /= (reg + 1); - } - - /* further divide by 4 as we have fixed divider at wrapper */ - clock /= 4; - return clock; -} - -unsigned int cm_get_qspi_controller_clk_hz(void) -{ - u32 reg, clock = 0; - - /* identify the source of QSPI clock */ - reg = readl(&clock_manager_base->per_pll.src); - reg = (reg & CLKMGR_PERPLLGRP_SRC_QSPI_MASK) >> - CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET; - - if (reg == CLKMGR_QSPI_CLK_SRC_F2S) { - clock = cm_get_f2s_per_ref_clk_hz(); - } else if (reg == CLKMGR_QSPI_CLK_SRC_MAIN) { - clock = cm_get_main_vco_clk_hz(); - - /* get the qspi clock */ - reg = readl(&clock_manager_base->main_pll.mainqspiclk); - clock /= (reg + 1); - } else if (reg == CLKMGR_QSPI_CLK_SRC_PER) { - clock = cm_get_per_vco_clk_hz(); - - /* get the qspi clock */ - reg = readl(&clock_manager_base->per_pll.perqspiclk); - clock /= (reg + 1); - } - - return clock; -} - -unsigned int cm_get_spi_controller_clk_hz(void) -{ - u32 reg, clock = 0; - - clock = cm_get_per_vco_clk_hz(); - - /* get the clock prior L4 SP divider (periph_base_clk) */ - reg = readl(&clock_manager_base->per_pll.perbaseclk); - clock /= (reg + 1); - - return clock; -} - -/* Override weak dw_spi_get_clk implementation in designware_spi.c driver */ -int dw_spi_get_clk(struct udevice *bus, ulong *rate) -{ - *rate = cm_get_spi_controller_clk_hz(); - - return 0; -} - -void cm_print_clock_quick_summary(void) -{ - printf("MPU %10ld kHz\n", cm_get_mpu_clk_hz() / 1000); - printf("DDR %10ld kHz\n", cm_get_sdram_clk_hz() / 1000); - printf("EOSC1 %8d kHz\n", cm_get_osc_clk_hz(1) / 1000); - printf("EOSC2 %8d kHz\n", cm_get_osc_clk_hz(2) / 1000); - printf("F2S_SDR_REF %8d kHz\n", cm_get_f2s_sdr_ref_clk_hz() / 1000); - printf("F2S_PER_REF %8d kHz\n", cm_get_f2s_per_ref_clk_hz() / 1000); - printf("MMC %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000); - printf("QSPI %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000); - printf("UART %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000); - printf("SPI %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000); -} diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager.h b/arch/arm/mach-socfpga/include/mach/clock_manager.h index dd80e3a767..fff606e099 100644 --- a/arch/arm/mach-socfpga/include/mach/clock_manager.h +++ b/arch/arm/mach-socfpga/include/mach/clock_manager.h @@ -6,11 +6,13 @@ #ifndef _CLOCK_MANAGER_H_ #define _CLOCK_MANAGER_H_ +#ifndef CONFIG_TARGET_SOCFPGA_GEN5 #ifndef __ASSEMBLER__ void cm_wait_for_lock(u32 mask); int cm_wait_for_fsm(void); void cm_print_clock_quick_summary(void); #endif +#endif #if defined(CONFIG_TARGET_SOCFPGA_GEN5) #include diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h index 5bedf28cf1..a9efe2a377 100644 --- a/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h +++ b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h @@ -111,19 +111,7 @@ struct socfpga_clock_manager { u32 _pad_0xe8_0x200[70]; }; -/* Clock speed accessors */ -unsigned long cm_get_mpu_clk_hz(void); -unsigned long cm_get_sdram_clk_hz(void); -unsigned int cm_get_l4_sp_clk_hz(void); -unsigned int cm_get_mmc_controller_clk_hz(void); -unsigned int cm_get_qspi_controller_clk_hz(void); -unsigned int cm_get_spi_controller_clk_hz(void); -const unsigned int cm_get_osc_clk_hz(const int osc); -const unsigned int cm_get_f2s_per_ref_clk_hz(void); -const unsigned int cm_get_f2s_sdr_ref_clk_hz(void); - /* Clock configuration accessors */ -int cm_basic_init(const struct cm_config * const cfg); const struct cm_config * const cm_get_default_config(void); #endif /* __ASSEMBLER__ */ diff --git a/arch/arm/mach-socfpga/spl_gen5.c b/arch/arm/mach-socfpga/spl_gen5.c index 1ae8025746..901fd9597e 100644 --- a/arch/arm/mach-socfpga/spl_gen5.c +++ b/arch/arm/mach-socfpga/spl_gen5.c @@ -62,7 +62,6 @@ u32 spl_boot_mode(const u32 boot_device) void board_init_f(ulong dummy) { - const struct cm_config *cm_default_cfg = cm_get_default_config(); unsigned long reg; int ret; struct udevice *dev; @@ -106,10 +105,9 @@ void board_init_f(ulong dummy) socfpga_per_reset(SOCFPGA_RESET(OSC1TIMER0), 0); timer_init(); - debug("Reconfigure Clock Manager\n"); - /* reconfigure the PLLs */ - if (cm_basic_init(cm_default_cfg)) - hang(); + ret = uclass_get_device(UCLASS_CLK, 0, &dev); + if (ret) + debug("Reset init failed: %d\n", ret); /* Enable bootrom to configure IOs. */ sysmgr_config_warmrstcfgio(1); diff --git a/drivers/clk/altera/clk-gen5.c b/drivers/clk/altera/clk-gen5.c index 4c197b81b0..e8f435a798 100644 --- a/drivers/clk/altera/clk-gen5.c +++ b/drivers/clk/altera/clk-gen5.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 Marek Vasut + * Copyright (C) 2019 Simon Goldschmidt */ #include @@ -9,6 +10,7 @@ #include #include #include +#include #include @@ -41,6 +43,353 @@ struct socfpga_gen5_clk_platdata { u8 src_off; }; +#ifdef CONFIG_SPL_BUILD +static void socfpga_gen5_clk_wait_for_lock( + const struct socfpga_clock_manager *clock_mgr, u32 mask) +{ + u32 inter_val; + u32 retry = 0; + do { +#if defined(CONFIG_TARGET_SOCFPGA_GEN5) + inter_val = readl(&clock_mgr->inter) & mask; +#else + inter_val = readl(&clock_mgr->stat) & mask; +#endif + /* Wait for stable lock */ + if (inter_val == mask) + retry++; + else + retry = 0; + if (retry >= 10) + break; + } while (1); +} + +/* function to poll in the fsm busy bit */ +static int socfpga_gen5_clk_wait_for_fsm( + const struct socfpga_clock_manager *clock_mgr) +{ + return wait_for_bit_le32(&clock_mgr->stat, + CLKMGR_STAT_BUSY, false, 20000, false); +} +/* + * function to write the bypass register which requires a poll of the + * busy bit + */ +static void socfpga_gen5_clk_write_bypass( + const struct socfpga_clock_manager *clock_mgr, u32 val) +{ + writel(val, &clock_mgr->bypass); + socfpga_gen5_clk_wait_for_fsm(clock_mgr); +} + +/* function to write the ctrl register which requires a poll of the busy bit */ +static void socfpga_gen5_clk_write_ctrl( + const struct socfpga_clock_manager *clock_mgr, u32 val) +{ + writel(val, &clock_mgr->ctrl); + socfpga_gen5_clk_wait_for_fsm(clock_mgr); +} + +/* function to write a clock register that has phase information */ +static int socfpga_gen5_clk_write_with_phase( + const struct socfpga_clock_manager *clock_mgr, u32 value, + const void *reg_address, u32 mask) +{ + int ret; + + /* poll until phase is zero */ + ret = wait_for_bit_le32(reg_address, mask, false, 20000, false); + if (ret) + return ret; + + writel(value, reg_address); + + return wait_for_bit_le32(reg_address, mask, false, 20000, false); +} + +/* + * Setup clocks while making no assumptions about previous state of the clocks. + * + * Start by being paranoid and gate all sw managed clocks + * Put all plls in bypass + * Put all plls VCO registers back to reset value (bandgap power down). + * Put peripheral and main pll src to reset value to avoid glitch. + * Delay 5 us. + * Deassert bandgap power down and set numerator and denominator + * Start 7 us timer. + * set internal dividers + * Wait for 7 us timer. + * Enable plls + * Set external dividers while plls are locking + * Wait for pll lock + * Assert/deassert outreset all. + * Take all pll's out of bypass + * Clear safe mode + * set source main and peripheral clocks + * Ungate clocks + */ +static int socfpga_gen5_clk_init(struct udevice *dev) +{ + unsigned long end; + int ret; + struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(dev); + const struct socfpga_clock_manager *clock_manager_base = + (const struct socfpga_clock_manager *)plat->regs; + const struct cm_config *cfg = cm_get_default_config(); + + /* Start by being paranoid and gate all sw managed clocks */ + + /* + * We need to disable nandclk + * and then do another apb access before disabling + * gatting off the rest of the periperal clocks. + */ + writel(~CLKMGR_PERPLLGRP_EN_NANDCLK_MASK & + readl(&clock_manager_base->per_pll.en), + &clock_manager_base->per_pll.en); + + /* DO NOT GATE OFF DEBUG CLOCKS & BRIDGE CLOCKS */ + writel(CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK | + CLKMGR_MAINPLLGRP_EN_DBGTRACECLK_MASK | + CLKMGR_MAINPLLGRP_EN_DBGCLK_MASK | + CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK | + CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK | + CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK, + &clock_manager_base->main_pll.en); + + writel(0, &clock_manager_base->sdr_pll.en); + + /* now we can gate off the rest of the peripheral clocks */ + writel(0, &clock_manager_base->per_pll.en); + + /* Put all plls in bypass */ + socfpga_gen5_clk_write_bypass(clock_manager_base, + CLKMGR_BYPASS_PERPLL | + CLKMGR_BYPASS_SDRPLL | + CLKMGR_BYPASS_MAINPLL); + + /* Put all plls VCO registers back to reset value. */ + writel(CLKMGR_MAINPLLGRP_VCO_RESET_VALUE & + ~CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK, + &clock_manager_base->main_pll.vco); + writel(CLKMGR_PERPLLGRP_VCO_RESET_VALUE & + ~CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK, + &clock_manager_base->per_pll.vco); + writel(CLKMGR_SDRPLLGRP_VCO_RESET_VALUE & + ~CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK, + &clock_manager_base->sdr_pll.vco); + + /* + * The clocks to the flash devices and the L4_MAIN clocks can + * glitch when coming out of safe mode if their source values + * are different from their reset value. So the trick it to + * put them back to their reset state, and change input + * after exiting safe mode but before ungating the clocks. + */ + writel(CLKMGR_PERPLLGRP_SRC_RESET_VALUE, + &clock_manager_base->per_pll.src); + writel(CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE, + &clock_manager_base->main_pll.l4src); + + /* read back for the required 5 us delay. */ + readl(&clock_manager_base->main_pll.vco); + readl(&clock_manager_base->per_pll.vco); + readl(&clock_manager_base->sdr_pll.vco); + + + /* + * We made sure bgpwr down was assert for 5 us. Now deassert BG PWR DN + * with numerator and denominator. + */ + writel(cfg->main_vco_base, &clock_manager_base->main_pll.vco); + writel(cfg->peri_vco_base, &clock_manager_base->per_pll.vco); + writel(cfg->sdram_vco_base, &clock_manager_base->sdr_pll.vco); + + /* + * Time starts here. Must wait 7 us from + * BGPWRDN_SET(0) to VCO_ENABLE_SET(1). + */ + end = timer_get_us() + 7; + + /* main mpu */ + writel(cfg->mpuclk, &clock_manager_base->main_pll.mpuclk); + + /* altera group mpuclk */ + writel(cfg->altera_grp_mpuclk, &clock_manager_base->altera.mpuclk); + + /* main main clock */ + writel(cfg->mainclk, &clock_manager_base->main_pll.mainclk); + + /* main for dbg */ + writel(cfg->dbgatclk, &clock_manager_base->main_pll.dbgatclk); + + /* main for cfgs2fuser0clk */ + writel(cfg->cfg2fuser0clk, + &clock_manager_base->main_pll.cfgs2fuser0clk); + + /* Peri emac0 50 MHz default to RMII */ + writel(cfg->emac0clk, &clock_manager_base->per_pll.emac0clk); + + /* Peri emac1 50 MHz default to RMII */ + writel(cfg->emac1clk, &clock_manager_base->per_pll.emac1clk); + + /* Peri QSPI */ + writel(cfg->mainqspiclk, &clock_manager_base->main_pll.mainqspiclk); + + writel(cfg->perqspiclk, &clock_manager_base->per_pll.perqspiclk); + + /* Peri pernandsdmmcclk */ + writel(cfg->mainnandsdmmcclk, + &clock_manager_base->main_pll.mainnandsdmmcclk); + + writel(cfg->pernandsdmmcclk, + &clock_manager_base->per_pll.pernandsdmmcclk); + + /* Peri perbaseclk */ + writel(cfg->perbaseclk, &clock_manager_base->per_pll.perbaseclk); + + /* Peri s2fuser1clk */ + writel(cfg->s2fuser1clk, &clock_manager_base->per_pll.s2fuser1clk); + + /* 7 us must have elapsed before we can enable the VCO */ + while (timer_get_us() < end) + ; + + /* Enable vco */ + /* main pll vco */ + writel(cfg->main_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, + &clock_manager_base->main_pll.vco); + + /* periferal pll */ + writel(cfg->peri_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, + &clock_manager_base->per_pll.vco); + + /* sdram pll vco */ + writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, + &clock_manager_base->sdr_pll.vco); + + /* L3 MP and L3 SP */ + writel(cfg->maindiv, &clock_manager_base->main_pll.maindiv); + + writel(cfg->dbgdiv, &clock_manager_base->main_pll.dbgdiv); + + writel(cfg->tracediv, &clock_manager_base->main_pll.tracediv); + + /* L4 MP, L4 SP, can0, and can1 */ + writel(cfg->perdiv, &clock_manager_base->per_pll.div); + + writel(cfg->gpiodiv, &clock_manager_base->per_pll.gpiodiv); + + socfpga_gen5_clk_wait_for_lock(clock_manager_base, LOCKED_MASK); + + /* write the sdram clock counters before toggling outreset all */ + writel(cfg->ddrdqsclk & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK, + &clock_manager_base->sdr_pll.ddrdqsclk); + + writel(cfg->ddr2xdqsclk & CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK, + &clock_manager_base->sdr_pll.ddr2xdqsclk); + + writel(cfg->ddrdqclk & CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK, + &clock_manager_base->sdr_pll.ddrdqclk); + + writel(cfg->s2fuser2clk & CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK, + &clock_manager_base->sdr_pll.s2fuser2clk); + + /* + * after locking, but before taking out of bypass + * assert/deassert outresetall + */ + u32 mainvco = readl(&clock_manager_base->main_pll.vco); + + /* assert main outresetall */ + writel(mainvco | CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK, + &clock_manager_base->main_pll.vco); + + u32 periphvco = readl(&clock_manager_base->per_pll.vco); + + /* assert pheriph outresetall */ + writel(periphvco | CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK, + &clock_manager_base->per_pll.vco); + + /* assert sdram outresetall */ + writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN| + CLKMGR_SDRPLLGRP_VCO_OUTRESETALL, + &clock_manager_base->sdr_pll.vco); + + /* deassert main outresetall */ + writel(mainvco & ~CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK, + &clock_manager_base->main_pll.vco); + + /* deassert pheriph outresetall */ + writel(periphvco & ~CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK, + &clock_manager_base->per_pll.vco); + + /* deassert sdram outresetall */ + writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN, + &clock_manager_base->sdr_pll.vco); + + /* + * now that we've toggled outreset all, all the clocks + * are aligned nicely; so we can change any phase. + */ + ret = socfpga_gen5_clk_write_with_phase( + clock_manager_base, cfg->ddrdqsclk, + &clock_manager_base->sdr_pll.ddrdqsclk, + CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK); + if (ret) + return ret; + + /* SDRAM DDR2XDQSCLK */ + ret = socfpga_gen5_clk_write_with_phase( + clock_manager_base, cfg->ddr2xdqsclk, + &clock_manager_base->sdr_pll.ddr2xdqsclk, + CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK); + if (ret) + return ret; + + ret = socfpga_gen5_clk_write_with_phase( + clock_manager_base, cfg->ddrdqclk, + &clock_manager_base->sdr_pll.ddrdqclk, + CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK); + if (ret) + return ret; + + ret = socfpga_gen5_clk_write_with_phase( + clock_manager_base, cfg->s2fuser2clk, + &clock_manager_base->sdr_pll.s2fuser2clk, + CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK); + if (ret) + return ret; + + /* Take all three PLLs out of bypass when safe mode is cleared. */ + socfpga_gen5_clk_write_bypass(clock_manager_base, 0); + + /* clear safe mode */ + socfpga_gen5_clk_write_ctrl(clock_manager_base, + readl(&clock_manager_base->ctrl) | + CLKMGR_CTRL_SAFEMODE); + + /* + * now that safe mode is clear with clocks gated + * it safe to change the source mux for the flashes the the L4_MAIN + */ + writel(cfg->persrc, &clock_manager_base->per_pll.src); + writel(cfg->l4src, &clock_manager_base->main_pll.l4src); + + /* Now ungate non-hw-managed clocks */ + writel(~0, &clock_manager_base->main_pll.en); + writel(~0, &clock_manager_base->per_pll.en); + writel(~0, &clock_manager_base->sdr_pll.en); + + /* Clear the loss of lock bits (write 1 to clear) */ + writel(CLKMGR_INTER_SDRPLLLOST_MASK | CLKMGR_INTER_PERPLLLOST_MASK | + CLKMGR_INTER_MAINPLLLOST_MASK, + &clock_manager_base->inter); + return 0; +} +#endif + static int socfpga_gen5_clk_get_upstream(struct clk *clk, struct clk **upclk) { struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(clk->dev); @@ -246,6 +595,18 @@ static int socfpga_gen5_clk_probe(struct udevice *dev) clk_get_bulk(dev, &plat->clks); +#ifdef CONFIG_SPL_BUILD + /* clock tree init is done only one time, in SPL, before relocation */ + if (!(gd->flags & GD_FLG_RELOC)) { + if (!fdt_node_check_compatible(fdt, offset, "altr,clk-mgr")) { + /* assign default clocks */ + int ret = socfpga_gen5_clk_init(dev); + if (ret) + return ret; + } + } +#endif + if (!fdt_node_check_compatible(fdt, offset, "altr,socfpga-pll-clock")) { /* Main PLL has 3 upstream clock */ From patchwork Tue Oct 15 20:10:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177379 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="W0xorbfq"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6Fb5Bggz9sPF for ; Wed, 16 Oct 2019 07:18:43 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 74D01C21E08; Tue, 15 Oct 2019 20:13:44 +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_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 378C6C21E12; Tue, 15 Oct 2019 20:11:54 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7065CC21BE5; Tue, 15 Oct 2019 20:11:01 +0000 (UTC) Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by lists.denx.de (Postfix) with ESMTPS id B509CC21DAF for ; Tue, 15 Oct 2019 20:10:59 +0000 (UTC) Received: by mail-wm1-f68.google.com with SMTP id v17so358191wml.4 for ; Tue, 15 Oct 2019 13:10:59 -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=sPqbgMeUFVaphT4TOJ/Oek+wGGIhVSDYH4OH/5nMV2s=; b=W0xorbfq6S2a0hHgKOf6KDFCiu0paiMZPSFCGME7H2GAtnbNJ2YX0dLQGlrEalfbXm ZDHiOo1C1Vj7k/5vl5B00KImzDbFQD79l/CTp9psIAF98a/crl2B7DdG8eOfhh2cSfVm V726EW0xy2sxnTN9E1AgU3KTHOu7fXVGcj0R8KE2dfdK+6rbkO5lH0+dmVqUVLmtp8e8 tyAEmJJPjbWlNqmJPNjtrE7DRaH/vMcJ1Hnjguei+4rTeWVoD3eodhMkcBit/dqMr7jz aspoAaUgXgwrFcjx3UwttDDoeilFV2+HqECozzgELadHeaBMs0Lyq/rzJYUg6wpYCI0W ObTw== 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=sPqbgMeUFVaphT4TOJ/Oek+wGGIhVSDYH4OH/5nMV2s=; b=ilQvsSo1Z4U11/k44RNUati1G+BGMwQ64N8IQ4ayzzGdS1A7UVJErdr0oWzGu8jzMa 57f0spNQIucQJw2OSoyzSAIsOEys5S1svp5BaSoE81r3zx72q1fWZqQzL5z2yeGiJL53 v2EJu+uVdgZs20ntP5F5n/z188S2PMGTCuogHhiSeLRYQkvR3Nl1uNkHyA0MGa4i3kmk LQ0BzgdS36E2biz80XC1rEuQQCQnPd2FDMkiT2Sq1D8DgzrXvh9elWpXh7EDwizh/MlU YXDwU4sftCiaZ69ueQtJzPeJURRICX6uTrgrHwC4YQAvth222zN7OW5QXZTJJu65OT50 7QTA== X-Gm-Message-State: APjAAAWMUQCUxTG2O+McpQ4GaUad+18dFEdk5U/P0EIZyG55oV2drqBu BuJXRMOmTQ/5zv9nPtjoNgY= X-Google-Smtp-Source: APXvYqwMqFXk7EHVVN4Yc1/+RzrUijbT7dKhYEZB2w1Tnf1HZ7SxB5S/hEnCCXyP8Q+B0gSMvMoqfw== X-Received: by 2002:a1c:4456:: with SMTP id r83mr265889wma.44.1571170259397; Tue, 15 Oct 2019 13:10:59 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:58 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:28 +0200 Message-Id: <20191015201032.20156-16-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Albert Aribaud , u-boot@lists.denx.de, Tom Rini Subject: [U-Boot] [RFC PATCH v2 15/18] arm: socfpga: gen5: load CLK config from devicetree 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" Instead of using ad-hoc code in arch/arm, load clock config from devicetree. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/clk/altera/clk-gen5.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/clk/altera/clk-gen5.c b/drivers/clk/altera/clk-gen5.c index e8f435a798..a5425b7424 100644 --- a/drivers/clk/altera/clk-gen5.c +++ b/drivers/clk/altera/clk-gen5.c @@ -136,7 +136,13 @@ static int socfpga_gen5_clk_init(struct udevice *dev) struct socfpga_gen5_clk_platdata *plat = dev_get_platdata(dev); const struct socfpga_clock_manager *clock_manager_base = (const struct socfpga_clock_manager *)plat->regs; - const struct cm_config *cfg = cm_get_default_config(); + const struct cm_config *cfg = (const struct cm_config *) + dev_read_u8_array_ptr(dev, "altr,clk-mgr-cfg", sizeof(*cfg)); + + if (!cfg) { + dev_dbg(dev, "Failed to load CLK config\n"); + return -EINVAL; + } /* Start by being paranoid and gate all sw managed clocks */ From patchwork Tue Oct 15 20:10:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177380 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="dcpcFQo3"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6Fs0BKZz9sPF for ; Wed, 16 Oct 2019 07:18:56 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id B2DC4C21DC1; Tue, 15 Oct 2019 20:15:34 +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_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 2C9B9C21D72; Tue, 15 Oct 2019 20:13:50 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 16E33C21D74; Tue, 15 Oct 2019 20:11:03 +0000 (UTC) Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by lists.denx.de (Postfix) with ESMTPS id D7251C21DB6 for ; Tue, 15 Oct 2019 20:11:00 +0000 (UTC) Received: by mail-wr1-f67.google.com with SMTP id j18so25348207wrq.10 for ; Tue, 15 Oct 2019 13:11:00 -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=IU6M/MkHHv2NgclQl6LWQlnEwBq7k5MfJl4jsPK2muo=; b=dcpcFQo3zz0KfhHcmEVfBt61+51G7lrTCqg/yZs0F1o6k0iEhNuEqoORqbY7NWkyWs qlX/2ZAl9oco+k/pk+qP/DYlPjK4XiZPayXLKQfzKhj3/zalse99lXGGTI0AtPW5MQyX eFNIPhjhnTai1Q4Q4NYzw2Ma4y+0VCtqEVVYG6Cd3VH9I8SJ7xkTMd5y3/X7YV+RHvvf 2Obdz1YXav1aw64pwdgkWGbeDMAKV3HbAixsa19K0sOQHFT51K3dh/YrM1smXjjbQlSc k4FG4cwhArvbcNOW1TH5Gx+GePMXke6NIJ/4RIt94UxgCFzks+hdrm97JlMq6mqzMp4v zdfg== 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=IU6M/MkHHv2NgclQl6LWQlnEwBq7k5MfJl4jsPK2muo=; b=izcuEC7tA3wsUgfIFTSpX5Bctq5ChtsQP1wqaUSiQl8xGlaV/SQFcilvthyc8FBp7R A0OE0MMM1AAjHsvCe94UthCniG/z53u3I31wNqYDL+WXbQoLR+qVWL2W6WYgU/CT+EtA lkzokEYahGalC/UTW7OCV/U/9Zz7F49rc6AkZdd5a9BnSqWsUGrEntCThhYjR0ukfZ61 lj4nyzmAHcNrL5femzheIUZfv47eex/rdv3YnTExKgf5OTFl/Hs1iXLUoCitKzcbK7pt tQIehAbUPxCHXKCGZd4ukbZ8s63e6Q+Lf9o6xGJYfV+YGmMD9ZP0e0bsqmZH9WXcxheW Lt3w== X-Gm-Message-State: APjAAAWCpgvApbUDKWpRw/65pLfuO3qyGSS/FB9ZxfK1e8I53sKETwX+ L77YlvNCsv1jCYl+KDoaW+o= X-Google-Smtp-Source: APXvYqzFSxqMB53ADXAsJhRQNoCGzFT20czSAmWbZ2lwLgVoNU8ScGkQeyUBisFSm/oJfxGAkTUo3g== X-Received: by 2002:adf:e98d:: with SMTP id h13mr30747880wrm.70.1571170260544; Tue, 15 Oct 2019 13:11:00 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.10.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:10:59 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:29 +0200 Message-Id: <20191015201032.20156-17-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: u-boot@lists.denx.de Subject: [U-Boot] [RFC PATCH v2 16/18] spi: cadence_qspi: support DM_CLK 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" Support loading clk speed via DM instead of requiring ad-hoc code. Signed-off-by: Simon Goldschmidt --- Changes in v2: None drivers/spi/cadence_qspi.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/drivers/spi/cadence_qspi.c b/drivers/spi/cadence_qspi.c index e2e54cd277..0b89115885 100644 --- a/drivers/spi/cadence_qspi.c +++ b/drivers/spi/cadence_qspi.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -22,12 +23,27 @@ static int cadence_spi_write_speed(struct udevice *bus, uint hz) { struct cadence_spi_platdata *plat = bus->platdata; struct cadence_spi_priv *priv = dev_get_priv(bus); + unsigned int ref_clk_hz; + struct clk clk; + int ret; + + ret = clk_get_by_index(bus, 0, &clk); + if (ret) { +#ifdef CONFIG_CQSPI_REF_CLK + ref_clk_hz = CONFIG_CQSPI_REF_CLK; +#else + return ret; +#endif + } else { + ref_clk_hz = clk_get_rate(&clk); + clk_free(&clk); + } cadence_qspi_apb_config_baudrate_div(priv->regbase, - CONFIG_CQSPI_REF_CLK, hz); + ref_clk_hz, hz); /* Reconfigure delay timing if speed is changed. */ - cadence_qspi_apb_delay(priv->regbase, CONFIG_CQSPI_REF_CLK, hz, + cadence_qspi_apb_delay(priv->regbase, ref_clk_hz, hz, plat->tshsl_ns, plat->tsd2d_ns, plat->tchsh_ns, plat->tslch_ns); From patchwork Tue Oct 15 20:10:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177383 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="JYLc6dJ3"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6GZ4hhmz9sPF for ; Wed, 16 Oct 2019 07:19:34 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 502D4C21E02; Tue, 15 Oct 2019 20:15:43 +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_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 4F011C21D74; Tue, 15 Oct 2019 20:14:26 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 58E76C21D83; Tue, 15 Oct 2019 20:11:04 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id CA7F1C21DA2 for ; Tue, 15 Oct 2019 20:11:01 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id j11so25385167wrp.1 for ; Tue, 15 Oct 2019 13:11:01 -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=M/LWNYuAvcDcCC91QeXlm7nDxSa4zqHhARhFFLduKYA=; b=JYLc6dJ3qt2GILHIcZ336WBJRZW/sJQFK2lvvvSfKomkdE32sUVTeH9y5NEmJ7qCX4 8brStfzR6zd1fjmXqHb6JPKPeMZFoLWaX9JGjEvu64uvD80K8ZBnZkHb3+s1RwO9K0JS 7Kcpyc8KVOu2eJ8rvbcL22Nej1cIqvBocpxUWKwhuq3IHVwx5uzvC76DNSCJ6XZhwLXy 0cpioEMyexT2RWti0xo4QVe3H+QvzlArAZDgxP2CFCK7hSwtvU9jGfSZVZ9hl8nHfYj0 LqWAL8RsF7K9ovHxTn2fHI+z+wG43e6xkaHgY+zR+OncqOjMjMWH1NxVGg/t0F33aOe8 GOBg== 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=M/LWNYuAvcDcCC91QeXlm7nDxSa4zqHhARhFFLduKYA=; b=ONQOPXRwJpcAPLLBNIfryzx31NZS65Cl0CVqEgIM8lS9+MAsV2HwMN/Jw9Z7hD1U+H 6q0uRV7eiPZxFiWBAsnGYW9niCSuzGA86Dn9sZ5S5UCcCazsUvA2CE2LQ+s6xj5oQbrl SNQOfdrF16EPHt7fpMUzFGu4408bt0dfDw3iFp5cx16kaeCU39OUG3C7gJwpH2SfQBAf UBG46bpGu5nLGMLATcBRGTV8SZLIdqUpFXNh8ag8Ik/tPmupD9F8dZmRQHu3Bk7FGVNs ltyzU8tnQkiuenjLMX795a4WFmlyhTKvXIwC21fYnRb8L+EpkPD03xzJVMqYNqcUivGs QkeA== X-Gm-Message-State: APjAAAV03lJkmSf/tE1L2PkVIwBBUiacLPcovXXS0nYMXXXS4+eqBKyh C8ML3KB31zUBu39zz1wsRw8= X-Google-Smtp-Source: APXvYqyBGxZ8tZaNNmsgA7i/imnVPgL1ZJ/ik7pO2itBxK22wPNEHugWzGg9167ILbfju7V6l0CoOQ== X-Received: by 2002:adf:828c:: with SMTP id 12mr4381656wrc.40.1571170261503; Tue, 15 Oct 2019 13:11:01 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.11.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:11:01 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:30 +0200 Message-Id: <20191015201032.20156-18-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Albert Aribaud , Tien Fong Chee , Stefan Roese , u-boot@lists.denx.de, Tom Rini Subject: [U-Boot] [RFC PATCH v2 17/18] arm: socfpga: gen5: parse qspi clock from devictree 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" Remove the need for ad-hoc code for qspi speed. Signed-off-by: Simon Goldschmidt --- Changes in v2: None include/configs/socfpga_common.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h index d1034ac280..e4a5dfc5ef 100644 --- a/include/configs/socfpga_common.h +++ b/include/configs/socfpga_common.h @@ -137,11 +137,6 @@ #ifndef CONFIG_SPL_BUILD #define CONFIG_SPI_FLASH_MTD #endif -/* QSPI reference clock */ -#ifndef __ASSEMBLY__ -unsigned int cm_get_qspi_controller_clk_hz(void); -#define CONFIG_CQSPI_REF_CLK cm_get_qspi_controller_clk_hz() -#endif /* * USB From patchwork Tue Oct 15 20:10:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Goldschmidt X-Patchwork-Id: 1177386 X-Patchwork-Delegate: simon.k.r.goldschmidt@gmail.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="mQhv0AXJ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46t6HH3T3dz9sPF for ; Wed, 16 Oct 2019 07:20:11 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 2EAAEC21E1A; Tue, 15 Oct 2019 20:14:52 +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_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 3B109C21DA2; Tue, 15 Oct 2019 20:13:23 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7DA98C21D9A; Tue, 15 Oct 2019 20:11:07 +0000 (UTC) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by lists.denx.de (Postfix) with ESMTPS id EF1C2C21DD4 for ; Tue, 15 Oct 2019 20:11:03 +0000 (UTC) Received: by mail-wr1-f65.google.com with SMTP id j11so25385273wrp.1 for ; Tue, 15 Oct 2019 13:11:03 -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=1EyTjfZa7O+AWZTF98u7k0ogMRrhRQioHR0spL6m/bg=; b=mQhv0AXJ/HtM/evhDB+Ne3aNycI1HFgiWs+I6XcHdauRQ5E5S61P8xHsaEeO5nTAf3 2KqcXRIUqIeDBFDuw5sZ8QMb4InimDYAkvh6yI1fzyIx8K8DWEYK23ycuHVWCX5dE3zh 18l7WO3NUIg/bDbz9AsMqY+D7QVxoCy1RUn7k1mD+fZZyIFXWRh+rtYVTLIW+hAHlY5A xd3YIBmdH5RP9BIX5dPpIkjUtPJWpWTfOMwSxiXpGCGu5ci0Lh290R6pT1yRtDqaXDap sMvzsCAX/APYuvPM6A68J+4DuhSX4z3I6jwcv2JvIRGqKhPVgIXvL0ctAFTiawNMhxTn H3oA== 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=1EyTjfZa7O+AWZTF98u7k0ogMRrhRQioHR0spL6m/bg=; b=J1XNsVdQSpF7QW7OqGL1IkAVTb2nzOzzV7k9Jfh7G/QwSiJm4OfsTcZVvXsoUZ51Bq GyGDYrFjqPx/4xzO+OZ6ly3DMPZWnVwghJdXDZvpiPk4v/qckonAhax3xChRLLE7aLwQ Ptowqq4PNigsOtYrAYAZJrKkR9w68YM3Lz4FJCWZlm8wUdyU+DJO7iQLqdHEaD1LGCVp ql0wlfxfoT81XBI8TFFi/W6Q1/0Av2hryxAazxvutFMchbS94tY8+KqxQlfEP+rAfHpA /6s6bBVGNbFcxvg7ni0RB/2a5nBc44n94XL7JZpabB3LhErXS8ntV33dZeWqTEQIjLdE KXDA== X-Gm-Message-State: APjAAAUL/tpYf+qT8T0mrzCOKcMQ9W5RQl2SzBgsXj0cTMP8k/6i4sDs xVli7RTjMD0171pAFjnfKz4= X-Google-Smtp-Source: APXvYqxh4xu/NbgHLp0vNGsuw+mXXd8so2panSbTx+PMOUmVG/KvJ1m/jQ9mzWJHnbaIYe65jS7vfQ== X-Received: by 2002:adf:fc0d:: with SMTP id i13mr31605336wrr.354.1571170262750; Tue, 15 Oct 2019 13:11:02 -0700 (PDT) Received: from ubuntu.home ([2a02:8071:6a3:700:9d84:c831:fe55:4622]) by smtp.gmail.com with ESMTPSA id 79sm329194wmb.7.2019.10.15.13.11.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Oct 2019 13:11:02 -0700 (PDT) From: Simon Goldschmidt To: Dalon L Westergreen Date: Tue, 15 Oct 2019 22:10:31 +0200 Message-Id: <20191015201032.20156-19-simon.k.r.goldschmidt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> References: <20191015201032.20156-1-simon.k.r.goldschmidt@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut , Albert Aribaud , u-boot@lists.denx.de, Evgeniy Paltsev , Stefan Roese , Jagan Teki Subject: [U-Boot] [RFC PATCH v2 18/18] socfpga: gen5: move CLK and SDRAM to DM 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" - removed wrapper files for sdram & pll - fix freeze_controller to not depend on OSC1 speed - remove unused function definitions - add autogenerated handoff dtsi for socfpga_socrates Signed-off-by: Simon Goldschmidt --- Changes in v2: None .../dts/socfpga_cyclone5_socrates-u-boot.dtsi | 1 + .../socfpga_cyclone5_socrates_handoff.dtsi | 290 ++++++++++++++++ arch/arm/mach-socfpga/Makefile | 4 - arch/arm/mach-socfpga/freeze_controller.c | 10 +- .../include/mach/clock_manager_gen5.h | 2 - .../mach-socfpga/include/mach/sdram_gen5.h | 8 - arch/arm/mach-socfpga/wrap_pll_config.c | 146 -------- arch/arm/mach-socfpga/wrap_sdram_config.c | 322 ------------------ 8 files changed, 297 insertions(+), 486 deletions(-) create mode 100644 arch/arm/dts/socfpga_cyclone5_socrates_handoff.dtsi delete mode 100644 arch/arm/mach-socfpga/wrap_pll_config.c delete mode 100644 arch/arm/mach-socfpga/wrap_sdram_config.c diff --git a/arch/arm/dts/socfpga_cyclone5_socrates-u-boot.dtsi b/arch/arm/dts/socfpga_cyclone5_socrates-u-boot.dtsi index 0a4d54e304..36ae10ab28 100644 --- a/arch/arm/dts/socfpga_cyclone5_socrates-u-boot.dtsi +++ b/arch/arm/dts/socfpga_cyclone5_socrates-u-boot.dtsi @@ -7,6 +7,7 @@ */ #include "socfpga-common-u-boot.dtsi" +#include "socfpga_cyclone5_socrates_handoff.dtsi" /{ aliases { diff --git a/arch/arm/dts/socfpga_cyclone5_socrates_handoff.dtsi b/arch/arm/dts/socfpga_cyclone5_socrates_handoff.dtsi new file mode 100644 index 0000000000..4e750796be --- /dev/null +++ b/arch/arm/dts/socfpga_cyclone5_socrates_handoff.dtsi @@ -0,0 +1,290 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * + * This code was generated by a tool based on + * handoffs from both Qsys and Quartus. + * + * Changes to this file may be lost if + * the code is regenerated. + * + */ + +&osc1 { + clock-frequency = <25000000>; +}; + +&osc2 { + clock-frequency = <25000000>; +}; + +&f2s_periph_ref_clk { + clock-frequency = <0>; +}; + +&f2s_sdram_ref_clk { + clock-frequency = <0>; +}; + +&clkmgr { + altr,clk-mgr-cfg = <0xf8010000 0x00000000 0x00000000 0x00000000 + 0x03000000 0xff010000 0x0f000000 0x95000000 + 0x04000000 0x00000000 0x03000000 0x38010000 + 0xff010000 0x03000000 0xff010000 0x04000000 + 0x04000000 0xff010000 0x40080000 0x69180000 + 0x1a000000 0x78020200 0x01000000 0x00000000 + 0x01080000 0x05000000 0x01000000>; +}; + +&scanmgr { + altr,pinmux-cfg = [00 02 02 02 02 02 02 02 + 02 00 02 02 02 02 00 00 + 00 00 00 00 03 00 03 03 + 00 00 00 00 00 03 03 03 + 00 01 01 01 01 00 00 01 + 01 03 03 03 03 02 02 01 + 01 01 01 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 00 03 + 03 03 03 03 03 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 + 01 01 01 01 00 00 00 00 + 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00]; + altr,iocsr-scan-chain0-table = <0x00000000 0x00000000 0x0000f00f 0x000000c0 + 0x3f000000 0x00800000 0x24480000 0x00902001 + 0x00004082 0x04800100 0x00000000 0x00400000 + 0x12240000 0x00489000 0x00002041 0x02000080 + 0x04090000 0x00200000 0x09120000 0x00244800 + 0x00009020 0x01000040 0x82040000 0x00100000>; + altr,iocsr-scan-chain1-table = <0x48900000 0x00204102 0xc0008004 0x09000000 + 0x12240000 0x00800000 0x24480000 0x00902001 + 0x00004082 0x04000000 0x09120000 0x00400000 + 0x12240000 0x00489000 0x00002041 0x02000080 + 0x04090000 0x00200000 0x09120006 0x00244800 + 0x0000fe01 0x000000f8 0x07000000 0x00100080 + 0x04090000 0x00122400 0x00004890 0x00300020 + 0x41020000 0x00080000 0x00000000 0x00000000 + 0x00002448 0x00000090 0x20010000 0x00040000 + 0x00000000 0x80040900 0x03000000 0x00000000 + 0x00000000 0x00020090 0x20016000 0x00000000 + 0x00000912 0x00060024 0x48000000 0x00010048 + 0x90003000 0x204102c0 0x00800409 0x00030012 + 0x24000c00 0x80000000>; + altr,iocsr-scan-chain2-table = <0x48900030 0x00000000 0x0000f00f 0x00000000 + 0x1224000c 0x00800000 0x24480018 0x00000000 + 0x00004082 0x04800100 0x09120006 0x00400000 + 0x12240420 0x00489000 0x30000000 0x00000080 + 0x04090003 0x00200000 0x09120010 0x00244800 + 0x00009020 0x01000140 0x82040000 0x00100080 + 0x04090000 0x00000000 0x00004890 0x00800020 + 0x4102c000 0x00080000>; + altr,iocsr-scan-chain3-table = <0x800dc20c 0xff00300c 0x0140800a 0x00009007 + 0x00000208 0x00001000 0x0000800a 0x00009007 + 0x00000208 0x00001000 0x00004320 0x0130000c + 0x8104c000 0x00000000 0x21000000 0x04000082 + 0x00004005 0x0000c803 0x00000104 0x00000800 + 0x00004005 0x0000c803 0x00004005 0x0000c803 + 0x00802190 0x00180086 0x40026000 0x18020980 + 0x01000000 0x02000040 0x0000a002 0x0000e401 + 0x0000a002 0x0000e401 0x0000a002 0x0000e401 + 0x0000a002 0x0000e401 0x00c01048 0x000c0043 + 0x20013000 0x0c8104c0 0x00300412 0x00030020 + 0x00000400 0x00006750 0x10000000 0x00005924 + 0x00100000 0x340000a0 0x0100000d 0x280a68c0 + 0x30400345 0x011a4812 0xd080a280 0x060c0334 + 0x5014a001 0x00000d28 0x0a68c030 0x40034902 + 0x1a0000d0 0x80a28006 0x00000410 0x00002000 + 0x00000410 0x00002000 0x00000015 0x0000200f + 0x00000015 0x0000200f 0x0000fe01 0x00000018 + 0x02098001 0x60082400 0x06807f00 0x00000000 + 0x0100800a 0x00009007 0x0000800a 0x00009007 + 0x0000800a 0x00009007 0x00000208 0x00001000 + 0x00004320 0x0130000c 0x8104c000 0xf00f0000 + 0x00c01048 0x000c0080 0x00004005 0x00004802 + 0x00000004 0x00000800 0x00004005 0x0000c803 + 0x00004005 0x0000c803 0x00802190 0x00180086 + 0x40026000 0x18020980 0x01600824 0x00060040 + 0x4000a002 0x0000e401 0x0000a002 0x0000e401 + 0x0000a002 0x0000e401 0x0000a002 0x0000e401 + 0x00c01048 0x000c0043 0x20013000 0x0c8104c0 + 0x00300412 0x00030020 0x00000400 0x00006750 + 0x10000000 0x00005924 0x00100000 0x340000a0 + 0x0100000d 0x280a68c0 0x30400349 0x021a4812 + 0xd080a280 0x060c0334 0x4000a001 0x02000d28 + 0x0a68c030 0x40034902 0x1a280ad0 0x80a28006 + 0x00000410 0x00002000 0x00000410 0x00002000 + 0x00000015 0x0000200f 0x00000015 0x0000200f + 0x0000fe01 0x00000018 0x02098001 0x60082400 + 0x06807f00 0x00000000 0x01003099 0x00343434 + 0x00400daa 0x00a8c301 0x00400daa 0x00a8c301 + 0x00400daa 0x00a8c301 0x00010400 0x00080000 + 0x00000000 0x08120000 0x00204800 0x00000001 + 0x00000000 0x82044100 0x00a00600 0x00b40100 + 0x00000200 0x00040000 0x00a00200 0x00e40100 + 0x00a00655 0x00d4e100 0x00000000 0x0c094320 + 0x01300000 0x00004090 0x00000000 0x43c22020 + 0x0050832a 0x00ea7000 0x0050832a 0x00ea7000 + 0x0050832a 0x00ea7000 0x40000100 0x00020000 + 0x00000000 0x82040000 0x00081200 0x00200000 + 0x00000080 0x20411000 0x00020000 0x805f0dac + 0xffffffff 0x0d69f314 0x1414041a 0x0000d000 + 0x00408618 0x067a2449 0xd5a328f2 0x1e45d1f6 + 0x88e34203 0x00001a82 0x00d00000 0x80061405 + 0x7a2449d9 0xa328f21e 0x45d1f688 0xe3520300 + 0x00020800 0x00100000 0x00020800 0x00100000 + 0x00800a00 0x00500700 0x00801a54 0x01508703 + 0x00000010 0x00000000 0x00c08000 0x00000041 + 0xc23f0000 0x00008200 0x00400daa 0x00a8c301 + 0x00400daa 0x00a8c301 0x00400daa 0x00a8c301 + 0x00010400 0x00080000 0x00000000 0x08120000 + 0x00204800 0x00800000 0x00000000 0x82044100 + 0x00a00600 0x00b40100 0x00000200 0x00040000 + 0x80000200 0x00040000 0x00a00655 0x00d4e100 + 0x00000000 0x0c090000 0x10000000 0x00004090 + 0x00000000 0x43c22020 0x0050832a 0x00ea7000 + 0x0050832a 0x00ea7000 0x0050832a 0x00ea7000 + 0x00500100 0x00f20000 0x00000000 0x82040000 + 0x00081286 0x40026000 0x00000080 0x20411000 + 0x00020000 0x805f0dac 0xffffffff 0x0d69f314 + 0x1414041a 0x0000d000 0x00408618 0x067a2449 + 0xd523cff3 0x1e45d1f4 0x48924a03 0x8e031a82 + 0x00d00000 0x80060000 0x7a2449d9 0x23cff31e + 0x45d1f488 0xe3520300 0x00020800 0x00100000 + 0x00020800 0x00100000 0x00800a00 0x00500700 + 0x00801a54 0x01508703 0x00000010 0x00000000 + 0x00c08000 0x00000041 0x02000004 0x00008200 + 0x00400daa 0x00a8c301 0x00400daa 0x00a8c301 + 0x00400daa 0x00a8c301 0x00010400 0x00080000 + 0x00000000 0x08120000 0x00204800 0x00800000 + 0x00000000 0x82044100 0x00a00600 0x00b40100 + 0x00000200 0x00040000 0x00a00200 0x00e40100 + 0x00a00655 0x00d4e100 0x00000000 0x0c094320 + 0x01300000 0x00004090 0x00000000 0x43c22020 + 0x0050832a 0x00ea7000 0x0050832a 0x00ea7000 + 0x0050832a 0x00ea7000 0x40000100 0x00020000 + 0x00000000 0x82040000 0x00081200 0x00200000 + 0x00000080 0x20411000 0x00020000 0x805f0dac + 0xffffffff 0x0d69f314 0x1414041a 0x0000d000 + 0x00408618 0x067a2449 0xd9a328f2 0x1e45d1f4 + 0x48924a03 0x00001a82 0x00d00000 0x80060000 + 0x7a2449d9 0xa328f21e 0x45d1f488 0xe3520300 + 0x00020800 0x00100000 0x00020800 0x00100000 + 0x00800a00 0x00500700 0x00801a54 0x01508703 + 0x00000010 0x00000000 0x00c08000 0x00000041 + 0x02000004 0x00008200 0x00400daa 0x00a8c301 + 0x00400daa 0x00a8c301 0x00400daa 0x00a8c301 + 0x00010400 0x00080000 0x00000000 0x08120000 + 0x00204800 0x00800000 0x00000000 0x82044100 + 0x00a00600 0x00b40100 0x00000200 0x00040000 + 0x80000200 0x00040000 0x00a00655 0x00d4e100 + 0x00000000 0x0c090000 0x10000000 0x00004090 + 0x00000000 0x43c22020 0x0050832a 0x00ea7000 + 0x0050832a 0x00ea7000 0x0050832a 0x00ea7000 + 0x40000100 0x00020000 0x00000000 0x82040000 + 0x00081200 0x00004000 0x00000080 0x20411000 + 0x00020000 0x805f0dac 0xffffffff 0x0d69f114 + 0x1414041a 0x0000d000 0x00408608 0x027a2449 + 0xd923cff3 0x1e45d1f4 0x88e34203 0x00001a82 + 0x00d00000 0x80060000 0x7a2449d9 0x23cff31e + 0x79def488 0xa2420300 0x00020800 0x00100000 + 0x00020800 0x00100000 0x00800a00 0x00500700 + 0x00801a54 0x01508703 0x00000010 0x00000000 + 0x00c08000 0x00000041 0x02000004 0x00008200 + 0x00984800 0x1a1a1a80 0x00020000 0x04000080 + 0x00020000 0x04000080 0x00020000 0x04000080 + 0x00020000 0x04000000 0x00000400 0x00000010 + 0x00000000 0x40000000 0x00000100 0x00200040 + 0x00010000 0x02000040 0x00010000 0x02000040 + 0x00010000 0x02000040 0x00010000 0x02000000 + 0x00000200 0x00000008 0x00000000 0x20000000 + 0x00800000 0x00100020 0x80000000 0x01000020 + 0x80000000 0x01000020 0x80000000 0x01000020 + 0x80000000 0x01000000 0x00000100 0x00000004 + 0x0000ff00 0x00000000 0x00400000 0x00080000 + 0x010000c0 0x19140400 0x00000040 0x16080004 + 0x00000d00 0x00680000 0x40030000 0x1a0000d0 + 0x00008006 0x00003400 0x00a00100 0x000d0000 + 0x68000040 0x0300001a 0x0000d000 0x00800600 + 0x00340000 0xa0010000 0x01040000 0x08000000 + 0x01040000 0x08000000 0x01040000 0x08000000 + 0x01040000 0x08000080 0x7f000000 0x00000020 + 0x00000000 0x800000e0 0x1f000000 0x00400000>; +}; + +&sdr { + altr,sdr-cfg = <0x42800a00 0x060c3975 0x14a5aa08 0xc4222200 + 0x000e0000 0x00000800 0x01000000 0x00000000 + 0xea0d0000 0x20000000 0x08000000 0x00000000 + 0x30000000 0x02000000 0x02000000 0x55450400 + 0x0010012c 0x8800b000 0x10027600 0x43059800 + 0x6aa50500 0x00000000 0x00000000 0x00000000 + 0x8810fd3f 0x10420821 0x84ef8180 0x00000000 + 0x00f80000 0x20088220 0x08822008 0x41100441 + 0x10044100 0x01010101 0x01010101 0x01010000 + 0x00020000>; + altr,sdr-rw-mgr-cfg = [0d 0e 10 0f 49 4c 54 18 + 1b 1f 19 1d 00 7b 7a 6f + 74 22 25 24 23 32 21 36 + 39 38 37 46 35 02 08 07 + 0c 03 09 04 0a 05 0b 12 + 59 61 6b 14 01 7d 06 04 + 00 04 20 08 08 04 04 01 + 01 01 01]; + altr,sdr-io-cfg = [77 00 19 19 08 00 1f 00 + 07 1f 04 04 1f 1f 00 00]; + altr,sdr-misc-cfg = [8d 04 55 55 01 07 05 00 + 05 10 52 20 20 52 63 0a]; + altr,sdr-ac-rom-init = <0x00007020 0x00007820 0x21020810 0x20030810 + 0x44000910 0x08000a10 0x00000b10 0x00043810 + 0x41020810 0xc0020810 0x24000a10 0x10000910 + 0x00000b10 0x00007830 0x00007838 0x00007830 + 0x00006810 0x00006b10 0x00042810 0x00004810 + 0x0000981c 0x00009b1c 0x0800981c 0x08009b1c + 0x0000f838 0x0000f83c 0x00007838 0x00001818 + 0x00009818 0x00005813 0x00005b13 0x08005813 + 0x08005b13 0x00007833 0x08005810 0x00007810>; + altr,sdr-inst-rom-init = <0x00000800 0x80060800 0x80810000 0x00820000 + 0x80820000 0x00830000 0x80830000 0x00810000 + 0x80840000 0x00850000 0x80850000 0x00860000 + 0x00840000 0x00080000 0x80860000 0x80080000 + 0x80a60000 0x80060800 0x00090000 0x80060800 + 0x80090000 0x80a60000 0x80860000 0x80060800 + 0x680b0000 0xe8cc0000 0xe80a0000 0xe88c0000 + 0x880b0000 0x88ec0000 0x080a0000 0x88ac0000 + 0x80060800 0x00ce0000 0x80cd0000 0x00e70000 + 0x000c0000 0xe00c0200 0xe00c0200 0xe00c0200 + 0xe00c0200 0x000d0000 0x80060000 0x80060000 + 0x80060000 0x80060000 0x800e0600 0x80100600 + 0x80100600 0x80100600 0x80a60000 0x80860000 + 0x80060800 0x00ce0000 0x80cd0000 0x00e70000 + 0x000c0000 0xe00c0300 0xe00c0300 0xe00c0300 + 0xe00c0300 0x000d0000 0x80060000 0x80060000 + 0x80060000 0x80060000 0x800e0700 0x80100700 + 0x80100700 0x80100700 0x80a60000 0x80860000 + 0x80060800 0x58110000 0xd8060000 0x80060800 + 0x68110000 0xe8070000 0xe8070000 0xe8870000 + 0xe80f0400 0xe8100400 0xe8100400 0xe8100400 + 0x68110000 0xe8070000 0xe8070000 0xe8a70000 + 0x80060800 0x880e0400 0x88100400 0x88100400 + 0x88100400 0x680f0400 0xe8100400 0xe8100400 + 0xe8100400 0x80a60000 0xe80f0400 0xe8100400 + 0xe8100400 0xe8100400 0x08100400 0x88100400 + 0x88100400 0x88100400 0x00110000 0x80c60000 + 0x80860000 0x80e60000 0x80060800 0x00000000 + 0x00800000 0x00a00000 0x00c00000 0x00000800 + 0x80000000 0x80800000 0x80a00000 0x80c00000 + 0x80000800 0x80910000 0x80860000 0x80a60000 + 0x80060800 0x080f0400 0x80060800>; +}; diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach-socfpga/Makefile index 4b77990f74..c6281373f7 100644 --- a/arch/arm/mach-socfpga/Makefile +++ b/arch/arm/mach-socfpga/Makefile @@ -15,7 +15,6 @@ obj-y += reset_manager_gen5.o obj-y += scan_manager.o obj-y += system_manager_gen5.o obj-y += timer.o -obj-y += wrap_pll_config.o obj-y += fpga_manager.o endif @@ -44,7 +43,6 @@ obj-y += spl_gen5.o obj-y += freeze_controller.o obj-y += wrap_iocsr_config.o obj-y += wrap_pinmux_config.o -obj-y += wrap_sdram_config.o endif ifdef CONFIG_TARGET_SOCFPGA_ARRIA10 obj-y += spl_a10.o @@ -58,6 +56,4 @@ ifdef CONFIG_TARGET_SOCFPGA_GEN5 # QTS-generated config file wrappers CFLAGS_wrap_iocsr_config.o += -I$(srctree)/board/$(BOARDDIR) CFLAGS_wrap_pinmux_config.o += -I$(srctree)/board/$(BOARDDIR) -CFLAGS_wrap_pll_config.o += -I$(srctree)/board/$(BOARDDIR) -CFLAGS_wrap_sdram_config.o += -I$(srctree)/board/$(BOARDDIR) endif diff --git a/arch/arm/mach-socfpga/freeze_controller.c b/arch/arm/mach-socfpga/freeze_controller.c index d48aeec374..3ed6229631 100644 --- a/arch/arm/mach-socfpga/freeze_controller.c +++ b/arch/arm/mach-socfpga/freeze_controller.c @@ -109,7 +109,6 @@ void sys_mgr_frzctrl_thaw_req(void) u32 reg_cfg_mask; u32 reg_value; u32 channel_id; - unsigned long eosc1_freq; /* select software FSM */ writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src); @@ -160,9 +159,12 @@ void sys_mgr_frzctrl_thaw_req(void) setbits_le32(&freeze_controller_base->hioctrl, SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK); - /* Delay 1000 intosc cycles. The intosc is based on eosc1. */ - eosc1_freq = cm_get_osc_clk_hz(1) / 1000; /* kHz */ - udelay(DIV_ROUND_UP(1000000, eosc1_freq)); + /* + * Delay 1000 intosc cycles. The intosc is based on eosc1. + * Use worst case which is fatest eosc1=50MHz, delay required + * is 1/50MHz * 1000 = 20us + */ + udelay(20); /* * de-assert active low bhniotri signals, diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h index a9efe2a377..3b52986f78 100644 --- a/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h +++ b/arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h @@ -111,8 +111,6 @@ struct socfpga_clock_manager { u32 _pad_0xe8_0x200[70]; }; -/* Clock configuration accessors */ -const struct cm_config * const cm_get_default_config(void); #endif /* __ASSEMBLER__ */ #define LOCKED_MASK \ diff --git a/arch/arm/mach-socfpga/include/mach/sdram_gen5.h b/arch/arm/mach-socfpga/include/mach/sdram_gen5.h index 7353b1c5e6..47b5793271 100644 --- a/arch/arm/mach-socfpga/include/mach/sdram_gen5.h +++ b/arch/arm/mach-socfpga/include/mach/sdram_gen5.h @@ -7,14 +7,6 @@ #ifndef __ASSEMBLY__ -const struct socfpga_sdram_config *socfpga_get_sdram_config(void); - -void socfpga_get_seq_ac_init(const u32 **init, unsigned int *nelem); -void socfpga_get_seq_inst_init(const u32 **init, unsigned int *nelem); -const struct socfpga_sdram_rw_mgr_config *socfpga_get_sdram_rwmgr_config(void); -const struct socfpga_sdram_io_config *socfpga_get_sdram_io_config(void); -const struct socfpga_sdram_misc_config *socfpga_get_sdram_misc_config(void); - #define SDR_CTRLGRP_ADDRESS (SOCFPGA_SDR_ADDRESS | 0x5000) struct socfpga_sdr_ctrl { diff --git a/arch/arm/mach-socfpga/wrap_pll_config.c b/arch/arm/mach-socfpga/wrap_pll_config.c deleted file mode 100644 index bd631e0fb5..0000000000 --- a/arch/arm/mach-socfpga/wrap_pll_config.c +++ /dev/null @@ -1,146 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (C) 2015 Marek Vasut - */ - -#include -#include -#include - -#define MAIN_VCO_BASE ( \ - (CONFIG_HPS_MAINPLLGRP_VCO_DENOM << \ - CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) | \ - (CONFIG_HPS_MAINPLLGRP_VCO_NUMER << \ - CLKMGR_MAINPLLGRP_VCO_NUMER_OFFSET) \ - ) - -#define PERI_VCO_BASE ( \ - (CONFIG_HPS_PERPLLGRP_VCO_PSRC << \ - CLKMGR_PERPLLGRP_VCO_PSRC_OFFSET) | \ - (CONFIG_HPS_PERPLLGRP_VCO_DENOM << \ - CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) | \ - (CONFIG_HPS_PERPLLGRP_VCO_NUMER << \ - CLKMGR_PERPLLGRP_VCO_NUMER_OFFSET) \ - ) - -#define SDR_VCO_BASE ( \ - (CONFIG_HPS_SDRPLLGRP_VCO_SSRC << \ - CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET) | \ - (CONFIG_HPS_SDRPLLGRP_VCO_DENOM << \ - CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) | \ - (CONFIG_HPS_SDRPLLGRP_VCO_NUMER << \ - CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) \ - ) - -static const struct cm_config cm_default_cfg = { - /* main group */ - MAIN_VCO_BASE, - (CONFIG_HPS_MAINPLLGRP_MPUCLK_CNT << - CLKMGR_MAINPLLGRP_MPUCLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_MAINCLK_CNT << - CLKMGR_MAINPLLGRP_MAINCLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_DBGATCLK_CNT << - CLKMGR_MAINPLLGRP_DBGATCLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_MAINQSPICLK_CNT << - CLKMGR_MAINPLLGRP_MAINQSPICLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_MAINNANDSDMMCCLK_CNT << - CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_CFGS2FUSER0CLK_CNT << - CLKMGR_MAINPLLGRP_CFGS2FUSER0CLK_CNT_OFFSET), - (CONFIG_HPS_MAINPLLGRP_MAINDIV_L3MPCLK << - CLKMGR_MAINPLLGRP_MAINDIV_L3MPCLK_OFFSET) | - (CONFIG_HPS_MAINPLLGRP_MAINDIV_L3SPCLK << - CLKMGR_MAINPLLGRP_MAINDIV_L3SPCLK_OFFSET) | - (CONFIG_HPS_MAINPLLGRP_MAINDIV_L4MPCLK << - CLKMGR_MAINPLLGRP_MAINDIV_L4MPCLK_OFFSET) | - (CONFIG_HPS_MAINPLLGRP_MAINDIV_L4SPCLK << - CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET), - (CONFIG_HPS_MAINPLLGRP_DBGDIV_DBGATCLK << - CLKMGR_MAINPLLGRP_DBGDIV_DBGATCLK_OFFSET) | - (CONFIG_HPS_MAINPLLGRP_DBGDIV_DBGCLK << - CLKMGR_MAINPLLGRP_DBGDIV_DBGCLK_OFFSET), - (CONFIG_HPS_MAINPLLGRP_TRACEDIV_TRACECLK << - CLKMGR_MAINPLLGRP_TRACEDIV_TRACECLK_OFFSET), - (CONFIG_HPS_MAINPLLGRP_L4SRC_L4MP << - CLKMGR_MAINPLLGRP_L4SRC_L4MP_OFFSET) | - (CONFIG_HPS_MAINPLLGRP_L4SRC_L4SP << - CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET), - - /* peripheral group */ - PERI_VCO_BASE, - (CONFIG_HPS_PERPLLGRP_EMAC0CLK_CNT << - CLKMGR_PERPLLGRP_EMAC0CLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_EMAC1CLK_CNT << - CLKMGR_PERPLLGRP_EMAC1CLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_PERQSPICLK_CNT << - CLKMGR_PERPLLGRP_PERQSPICLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_PERNANDSDMMCCLK_CNT << - CLKMGR_PERPLLGRP_PERNANDSDMMCCLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_PERBASECLK_CNT << - CLKMGR_PERPLLGRP_PERBASECLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_S2FUSER1CLK_CNT << - CLKMGR_PERPLLGRP_S2FUSER1CLK_CNT_OFFSET), - (CONFIG_HPS_PERPLLGRP_DIV_USBCLK << - CLKMGR_PERPLLGRP_DIV_USBCLK_OFFSET) | - (CONFIG_HPS_PERPLLGRP_DIV_SPIMCLK << - CLKMGR_PERPLLGRP_DIV_SPIMCLK_OFFSET) | - (CONFIG_HPS_PERPLLGRP_DIV_CAN0CLK << - CLKMGR_PERPLLGRP_DIV_CAN0CLK_OFFSET) | - (CONFIG_HPS_PERPLLGRP_DIV_CAN1CLK << - CLKMGR_PERPLLGRP_DIV_CAN1CLK_OFFSET), - (CONFIG_HPS_PERPLLGRP_GPIODIV_GPIODBCLK << - CLKMGR_PERPLLGRP_GPIODIV_GPIODBCLK_OFFSET), - (CONFIG_HPS_PERPLLGRP_SRC_QSPI << - CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET) | - (CONFIG_HPS_PERPLLGRP_SRC_NAND << - CLKMGR_PERPLLGRP_SRC_NAND_OFFSET) | - (CONFIG_HPS_PERPLLGRP_SRC_SDMMC << - CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET), - - /* sdram pll group */ - SDR_VCO_BASE, - (CONFIG_HPS_SDRPLLGRP_DDRDQSCLK_PHASE << - CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_OFFSET) | - (CONFIG_HPS_SDRPLLGRP_DDRDQSCLK_CNT << - CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET), - (CONFIG_HPS_SDRPLLGRP_DDR2XDQSCLK_PHASE << - CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_OFFSET) | - (CONFIG_HPS_SDRPLLGRP_DDR2XDQSCLK_CNT << - CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_OFFSET), - (CONFIG_HPS_SDRPLLGRP_DDRDQCLK_PHASE << - CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_OFFSET) | - (CONFIG_HPS_SDRPLLGRP_DDRDQCLK_CNT << - CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_OFFSET), - (CONFIG_HPS_SDRPLLGRP_S2FUSER2CLK_PHASE << - CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_OFFSET) | - (CONFIG_HPS_SDRPLLGRP_S2FUSER2CLK_CNT << - CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_OFFSET), - - /* altera group */ - CONFIG_HPS_ALTERAGRP_MPUCLK, -}; - -const struct cm_config * const cm_get_default_config(void) -{ - return &cm_default_cfg; -} - -const unsigned int cm_get_osc_clk_hz(const int osc) -{ - if (osc == 1) - return CONFIG_HPS_CLK_OSC1_HZ; - else if (osc == 2) - return CONFIG_HPS_CLK_OSC2_HZ; - else - return 0; -} - -const unsigned int cm_get_f2s_per_ref_clk_hz(void) -{ - return CONFIG_HPS_CLK_F2S_PER_REF_HZ; -} - -const unsigned int cm_get_f2s_sdr_ref_clk_hz(void) -{ - return CONFIG_HPS_CLK_F2S_SDR_REF_HZ; -} diff --git a/arch/arm/mach-socfpga/wrap_sdram_config.c b/arch/arm/mach-socfpga/wrap_sdram_config.c deleted file mode 100644 index c43c2423a0..0000000000 --- a/arch/arm/mach-socfpga/wrap_sdram_config.c +++ /dev/null @@ -1,322 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (C) 2015 Marek Vasut - */ - -#include -#include -#include - -/* Board-specific header. */ -#include - -static const struct socfpga_sdram_config sdram_config = { - .ctrl_cfg = - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE << - SDR_CTRLGRP_CTRLCFG_MEMTYPE_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL << - SDR_CTRLGRP_CTRLCFG_MEMBL_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER << - SDR_CTRLGRP_CTRLCFG_ADDRORDER_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN << - SDR_CTRLGRP_CTRLCFG_ECCEN_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN << - SDR_CTRLGRP_CTRLCFG_ECCCORREN_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN << - SDR_CTRLGRP_CTRLCFG_REORDEREN_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT << - SDR_CTRLGRP_CTRLCFG_STARVELIMIT_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN << - SDR_CTRLGRP_CTRLCFG_DQSTRKEN_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS << - SDR_CTRLGRP_CTRLCFG_NODMPINS_LSB), - .dram_timing1 = - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL << - SDR_CTRLGRP_DRAMTIMING1_TCWL_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL << - SDR_CTRLGRP_DRAMTIMING1_TAL_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL << - SDR_CTRLGRP_DRAMTIMING1_TCL_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD << - SDR_CTRLGRP_DRAMTIMING1_TRRD_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW << - SDR_CTRLGRP_DRAMTIMING1_TFAW_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC << - SDR_CTRLGRP_DRAMTIMING1_TRFC_LSB), - .dram_timing2 = - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI << - SDR_CTRLGRP_DRAMTIMING2_TREFI_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD << - SDR_CTRLGRP_DRAMTIMING2_TRCD_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP << - SDR_CTRLGRP_DRAMTIMING2_TRP_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR << - SDR_CTRLGRP_DRAMTIMING2_TWR_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR << - SDR_CTRLGRP_DRAMTIMING2_TWTR_LSB), - .dram_timing3 = - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP << - SDR_CTRLGRP_DRAMTIMING3_TRTP_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS << - SDR_CTRLGRP_DRAMTIMING3_TRAS_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC << - SDR_CTRLGRP_DRAMTIMING3_TRC_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD << - SDR_CTRLGRP_DRAMTIMING3_TMRD_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD << - SDR_CTRLGRP_DRAMTIMING3_TCCD_LSB), - .dram_timing4 = - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT << - SDR_CTRLGRP_DRAMTIMING4_SELFRFSHEXIT_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT << - SDR_CTRLGRP_DRAMTIMING4_PWRDOWNEXIT_LSB), - .lowpwr_timing = - (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES << - SDR_CTRLGRP_LOWPWRTIMING_AUTOPDCYCLES_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES << - SDR_CTRLGRP_LOWPWRTIMING_CLKDISABLECYCLES_LSB), - .dram_odt = - (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_READ << - SDR_CTRLGRP_DRAMODT_READ_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMODT_WRITE << - SDR_CTRLGRP_DRAMODT_WRITE_LSB), - .extratime1 = - (CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR << - SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC << - SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_BC_LSB) | -(CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP << - SDR_CTRLGRP_EXTRATIME1_RD_TO_WR_DIFF_LSB), - .dram_addrw = - (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS << - SDR_CTRLGRP_DRAMADDRW_COLBITS_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS << - SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS << - SDR_CTRLGRP_DRAMADDRW_BANKBITS_LSB) | - ((CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS - 1) << - SDR_CTRLGRP_DRAMADDRW_CSBITS_LSB), - .dram_if_width = - (CONFIG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH << - SDR_CTRLGRP_DRAMIFWIDTH_IFWIDTH_LSB), - .dram_dev_width = - (CONFIG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH << - SDR_CTRLGRP_DRAMDEVWIDTH_DEVWIDTH_LSB), - .dram_intr = - (CONFIG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN << - SDR_CTRLGRP_DRAMINTR_INTREN_LSB), - .lowpwr_eq = - (CONFIG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK << - SDR_CTRLGRP_LOWPWREQ_SELFRFSHMASK_LSB), - .static_cfg = - (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL << - SDR_CTRLGRP_STATICCFG_MEMBL_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA << - SDR_CTRLGRP_STATICCFG_USEECCASDATA_LSB), - .ctrl_width = - (CONFIG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH << - SDR_CTRLGRP_CTRLWIDTH_CTRLWIDTH_LSB), - .cport_width = - (CONFIG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH << - SDR_CTRLGRP_CPORTWIDTH_CMDPORTWIDTH_LSB), - .cport_wmap = - (CONFIG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP << - SDR_CTRLGRP_CPORTWMAP_CPORTWFIFOMAP_LSB), - .cport_rmap = - (CONFIG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP << - SDR_CTRLGRP_CPORTRMAP_CPORTRFIFOMAP_LSB), - .rfifo_cmap = - (CONFIG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP << - SDR_CTRLGRP_RFIFOCMAP_RFIFOCPORTMAP_LSB), - .wfifo_cmap = - (CONFIG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP << - SDR_CTRLGRP_WFIFOCMAP_WFIFOCPORTMAP_LSB), - .cport_rdwr = - (CONFIG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR << - SDR_CTRLGRP_CPORTRDWR_CPORTRDWR_LSB), - .port_cfg = - (CONFIG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN << - SDR_CTRLGRP_PORTCFG_AUTOPCHEN_LSB), - .fpgaport_rst = CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST, - .fifo_cfg = - (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE << - SDR_CTRLGRP_FIFOCFG_SYNCMODE_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC << - SDR_CTRLGRP_FIFOCFG_INCSYNC_LSB), - .mp_priority = - (CONFIG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY << - SDR_CTRLGRP_MPPRIORITY_USERPRIORITY_LSB), - .mp_weight0 = - (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0 << - SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_0_STATICWEIGHT_31_0_LSB), - .mp_weight1 = - (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32 << - SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_STATICWEIGHT_49_32_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0 << - SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_1_SUMOFWEIGHTS_13_0_LSB), - .mp_weight2 = - (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14 << - SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_2_SUMOFWEIGHTS_45_14_LSB), - .mp_weight3 = - (CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46 << - SDR_CTRLGRP_MPWEIGHT_MPWEIGHT_3_SUMOFWEIGHTS_63_46_LSB), - .mp_pacing0 = - (CONFIG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0 << - SDR_CTRLGRP_MPPACING_MPPACING_0_THRESHOLD1_31_0_LSB), - .mp_pacing1 = - (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32 << - SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD1_59_32_LSB) | - (CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0 << - SDR_CTRLGRP_MPPACING_MPPACING_1_THRESHOLD2_3_0_LSB), - .mp_pacing2 = - (CONFIG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4 << - SDR_CTRLGRP_MPPACING_MPPACING_2_THRESHOLD2_35_4_LSB), - .mp_pacing3 = - (CONFIG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36 << - SDR_CTRLGRP_MPPACING_MPPACING_3_THRESHOLD2_59_36_LSB), - .mp_threshold0 = - (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0 << - SDR_CTRLGRP_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0_LSB), - .mp_threshold1 = - (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32 << - SDR_CTRLGRP_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32_LSB), - .mp_threshold2 = - (CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64 << - SDR_CTRLGRP_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64_LSB), - .phy_ctrl0 = CONFIG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0, -}; - -static const struct socfpga_sdram_rw_mgr_config rw_mgr_config = { - .activate_0_and_1 = RW_MGR_ACTIVATE_0_AND_1, - .activate_0_and_1_wait1 = RW_MGR_ACTIVATE_0_AND_1_WAIT1, - .activate_0_and_1_wait2 = RW_MGR_ACTIVATE_0_AND_1_WAIT2, - .activate_1 = RW_MGR_ACTIVATE_1, - .clear_dqs_enable = RW_MGR_CLEAR_DQS_ENABLE, - .guaranteed_read = RW_MGR_GUARANTEED_READ, - .guaranteed_read_cont = RW_MGR_GUARANTEED_READ_CONT, - .guaranteed_write = RW_MGR_GUARANTEED_WRITE, - .guaranteed_write_wait0 = RW_MGR_GUARANTEED_WRITE_WAIT0, - .guaranteed_write_wait1 = RW_MGR_GUARANTEED_WRITE_WAIT1, - .guaranteed_write_wait2 = RW_MGR_GUARANTEED_WRITE_WAIT2, - .guaranteed_write_wait3 = RW_MGR_GUARANTEED_WRITE_WAIT3, - .idle = RW_MGR_IDLE, - .idle_loop1 = RW_MGR_IDLE_LOOP1, - .idle_loop2 = RW_MGR_IDLE_LOOP2, - .init_reset_0_cke_0 = RW_MGR_INIT_RESET_0_CKE_0, - .init_reset_1_cke_0 = RW_MGR_INIT_RESET_1_CKE_0, - .lfsr_wr_rd_bank_0 = RW_MGR_LFSR_WR_RD_BANK_0, - .lfsr_wr_rd_bank_0_data = RW_MGR_LFSR_WR_RD_BANK_0_DATA, - .lfsr_wr_rd_bank_0_dqs = RW_MGR_LFSR_WR_RD_BANK_0_DQS, - .lfsr_wr_rd_bank_0_nop = RW_MGR_LFSR_WR_RD_BANK_0_NOP, - .lfsr_wr_rd_bank_0_wait = RW_MGR_LFSR_WR_RD_BANK_0_WAIT, - .lfsr_wr_rd_bank_0_wl_1 = RW_MGR_LFSR_WR_RD_BANK_0_WL_1, - .lfsr_wr_rd_dm_bank_0 = RW_MGR_LFSR_WR_RD_DM_BANK_0, - .lfsr_wr_rd_dm_bank_0_data = RW_MGR_LFSR_WR_RD_DM_BANK_0_DATA, - .lfsr_wr_rd_dm_bank_0_dqs = RW_MGR_LFSR_WR_RD_DM_BANK_0_DQS, - .lfsr_wr_rd_dm_bank_0_nop = RW_MGR_LFSR_WR_RD_DM_BANK_0_NOP, - .lfsr_wr_rd_dm_bank_0_wait = RW_MGR_LFSR_WR_RD_DM_BANK_0_WAIT, - .lfsr_wr_rd_dm_bank_0_wl_1 = RW_MGR_LFSR_WR_RD_DM_BANK_0_WL_1, - .mrs0_dll_reset = RW_MGR_MRS0_DLL_RESET, - .mrs0_dll_reset_mirr = RW_MGR_MRS0_DLL_RESET_MIRR, - .mrs0_user = RW_MGR_MRS0_USER, - .mrs0_user_mirr = RW_MGR_MRS0_USER_MIRR, - .mrs1 = RW_MGR_MRS1, - .mrs1_mirr = RW_MGR_MRS1_MIRR, - .mrs2 = RW_MGR_MRS2, - .mrs2_mirr = RW_MGR_MRS2_MIRR, - .mrs3 = RW_MGR_MRS3, - .mrs3_mirr = RW_MGR_MRS3_MIRR, - .precharge_all = RW_MGR_PRECHARGE_ALL, - .read_b2b = RW_MGR_READ_B2B, - .read_b2b_wait1 = RW_MGR_READ_B2B_WAIT1, - .read_b2b_wait2 = RW_MGR_READ_B2B_WAIT2, - .refresh_all = RW_MGR_REFRESH_ALL, - .rreturn = RW_MGR_RETURN, - .sgle_read = RW_MGR_SGLE_READ, - .zqcl = RW_MGR_ZQCL, - - .true_mem_data_mask_width = RW_MGR_TRUE_MEM_DATA_MASK_WIDTH, - .mem_address_mirroring = RW_MGR_MEM_ADDRESS_MIRRORING, - .mem_data_mask_width = RW_MGR_MEM_DATA_MASK_WIDTH, - .mem_data_width = RW_MGR_MEM_DATA_WIDTH, - .mem_dq_per_read_dqs = RW_MGR_MEM_DQ_PER_READ_DQS, - .mem_dq_per_write_dqs = RW_MGR_MEM_DQ_PER_WRITE_DQS, - .mem_if_read_dqs_width = RW_MGR_MEM_IF_READ_DQS_WIDTH, - .mem_if_write_dqs_width = RW_MGR_MEM_IF_WRITE_DQS_WIDTH, - .mem_number_of_cs_per_dimm = RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM, - .mem_number_of_ranks = RW_MGR_MEM_NUMBER_OF_RANKS, - .mem_virtual_groups_per_read_dqs = - RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS, - .mem_virtual_groups_per_write_dqs = - RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS, -}; - -static const struct socfpga_sdram_io_config io_config = { - .delay_per_dchain_tap = IO_DELAY_PER_DCHAIN_TAP, - .delay_per_dqs_en_dchain_tap = IO_DELAY_PER_DQS_EN_DCHAIN_TAP, - .delay_per_opa_tap_lo = IO_DELAY_PER_OPA_TAP & 0xff, - .delay_per_opa_tap_hi = (IO_DELAY_PER_OPA_TAP << 8) & 0xff, - .dll_chain_length = IO_DLL_CHAIN_LENGTH, - .dqdqs_out_phase_max = IO_DQDQS_OUT_PHASE_MAX, - .dqs_en_delay_max = IO_DQS_EN_DELAY_MAX, - .dqs_en_delay_offset = IO_DQS_EN_DELAY_OFFSET, - .dqs_en_phase_max = IO_DQS_EN_PHASE_MAX, - .dqs_in_delay_max = IO_DQS_IN_DELAY_MAX, - .dqs_in_reserve = IO_DQS_IN_RESERVE, - .dqs_out_reserve = IO_DQS_OUT_RESERVE, - .io_in_delay_max = IO_IO_IN_DELAY_MAX, - .io_out1_delay_max = IO_IO_OUT1_DELAY_MAX, - .io_out2_delay_max = IO_IO_OUT2_DELAY_MAX, - .shift_dqs_en_when_shift_dqs = IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS, -}; - -static const struct socfpga_sdram_misc_config misc_config = { - .afi_rate_ratio = AFI_RATE_RATIO, - .calib_lfifo_offset = CALIB_LFIFO_OFFSET, - .calib_vfifo_offset = CALIB_VFIFO_OFFSET, - .enable_super_quick_calibration = ENABLE_SUPER_QUICK_CALIBRATION, - .max_latency_count_width = MAX_LATENCY_COUNT_WIDTH, - .read_valid_fifo_size = READ_VALID_FIFO_SIZE, - .reg_file_init_seq_signature_ll = REG_FILE_INIT_SEQ_SIGNATURE & 0xff, - .reg_file_init_seq_signature_lh = (REG_FILE_INIT_SEQ_SIGNATURE >> 8) & 0xff, - .reg_file_init_seq_signature_hl = (REG_FILE_INIT_SEQ_SIGNATURE >> 16) & 0xff, - .reg_file_init_seq_signature_hh = (REG_FILE_INIT_SEQ_SIGNATURE >> 24) & 0xff, - .tinit_cntr0_val = TINIT_CNTR0_VAL, - .tinit_cntr1_val = TINIT_CNTR1_VAL, - .tinit_cntr2_val = TINIT_CNTR2_VAL, - .treset_cntr0_val = TRESET_CNTR0_VAL, - .treset_cntr1_val = TRESET_CNTR1_VAL, - .treset_cntr2_val = TRESET_CNTR2_VAL, -}; - -const struct socfpga_sdram_config *socfpga_get_sdram_config(void) -{ - return &sdram_config; -} - -void socfpga_get_seq_ac_init(const u32 **init, unsigned int *nelem) -{ - *init = ac_rom_init; - *nelem = ARRAY_SIZE(ac_rom_init); -} - -void socfpga_get_seq_inst_init(const u32 **init, unsigned int *nelem) -{ - *init = inst_rom_init; - *nelem = ARRAY_SIZE(inst_rom_init); -} - -const struct socfpga_sdram_rw_mgr_config *socfpga_get_sdram_rwmgr_config(void) -{ - return &rw_mgr_config; -} - -const struct socfpga_sdram_io_config *socfpga_get_sdram_io_config(void) -{ - return &io_config; -} - -const struct socfpga_sdram_misc_config *socfpga_get_sdram_misc_config(void) -{ - return &misc_config; -}