From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v7 2/7] mips: ath79: add support for AR933x SOCs
Date: Sat, 16 Jan 2016 20:31:38 +0100 [thread overview]
Message-ID: <201601162031.38563.marex@denx.de> (raw)
In-Reply-To: <BLU436-SMTP89047880CC5D693E5FDE56FFCE0@phx.gbl>
On Saturday, January 16, 2016 at 07:13:48 PM, Wills Wang wrote:
> This patch enable work for ar933x SOC.
And it adds DDR code and clock code ... which is missing from the commit
message.
> Signed-off-by: Wills Wang <wills.wang@live.com>
> ---
[...]
> +void ddr_init(void)
> +{
> + void __iomem *regs;
> + u32 val;
> +
> + regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
> + MAP_NOCACHE);
> +
> + writel(DDR_CONF_REG_VAL, regs + AR71XX_DDR_REG_CONFIG);
> + writel(DDR_CONF2_REG_VAL, regs + AR71XX_DDR_REG_CONFIG2);
> +
> + val = get_bootstrap();
> + if (val & AR933X_BOOTSTRAP_DDR2) {
> + /* AHB maximum timeout */
> + writel(0xfffff, regs + AR933X_DDR_REG_TIMEOUT_MAX);
> +
> + /* Enable DDR2 */
> + writel(DDR2_CONF_VAL, regs + AR933X_DDR_REG_DDR2_CONFIG);
> +
> + /* Precharge All */
> + writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Disable High Temperature Self-Refresh, Full Array */
> + writel(0x00, regs + AR933X_DDR_REG_EMR2);
> + /* Extended Mode Register 2 Set (EMR2S) */
> + writel(DDR_CTRL_UPD_EMR2S, regs + AR71XX_DDR_REG_CONTROL);
> +
> + writel(0x00, regs + AR933X_DDR_REG_EMR3);
> + /* Extended Mode Register 3 Set (EMR3S) */
> + writel(DDR_CTRL_UPD_EMR3S, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Enable DLL, Full strength, ODT Disabled */
> + writel(0x00, regs + AR71XX_DDR_REG_EMR);
> + /* Extended Mode Register Set (EMRS) */
> + writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Reset DLL */
> + writel(DDR2_MODE_DLL_VAL, regs + AR71XX_DDR_REG_MODE);
> + /* Mode Register Set (MRS) */
> + writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
Make sure that there is at least a newline before comment, to improve the
readability of the code.
> + /* Precharge All */
> + writel(DDR_CTRL_PRECHARGE, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Auto Refresh */
> + writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
> + writel(DDR_CTRL_AUTO_REFRESH, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Write recovery (WR) 6 clock, CAS Latency 3,
> + * Burst Length 8 */
Fix the multiline comments please.
> + writel(DDR2_MODE_VAL, regs + AR71XX_DDR_REG_MODE);
> + /* Mode Register Set (MRS) */
> + writel(DDR_CTRL_UPD_MRS, regs + AR71XX_DDR_REG_CONTROL);
> +
> + /* Enable OCD defaults, Enable DLL,
> + * Reduced Drive Strength */
> + writel(DDR2_EXT_MODE_OCD_VAL, regs + AR71XX_DDR_REG_EMR);
> + /* Extended Mode Register Set (EMRS) */
> + writel(DDR_CTRL_UPD_EMRS, regs + AR71XX_DDR_REG_CONTROL);
[...]
> +void ddr_tap_tuning(void)
> +{
> + void __iomem *regs;
> + u32 *addr_k0, *addr_k1, *addr;
> + u32 val, tap, upper, lower;
> + int i, j, dir, err, done;
> +
> + regs = map_physmem(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE,
> + MAP_NOCACHE);
Explanation of this code would be great. To an external reviewer, this
is entirely inobvious.
> + addr = (void *)CKSEG0ADDR(0x2000);
> + for (i = 0; i < 256; i++) {
> + val = 0;
> + for (j = 0; j < 8; j++) {
> + if (i & (1 << j)) {
> + if (j % 2)
> + val |= 0xffff0000;
> + else
> + val |= 0x0000ffff;
> + }
> +
> + if (j % 2) {
> + *addr++ = val;
> + val = 0;
> + }
> + }
> + }
> +
> + err = 0;
> + done = 0;
> + dir = 1;
> + tap = readl(regs + AR71XX_DDR_REG_TAP_CTRL0);
> + val = tap;
> + while (!done) {
> + err = 0;
> + writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
> + writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
> + for (i = 0; i < 2; i++) {
> + addr_k1 = (void *)CKSEG1ADDR(0x2000);
> + addr_k0 = (void *)CKSEG0ADDR(0x2000);
> + addr = (void *)CKSEG0ADDR(0x3000);
> +
> + while (addr_k0 < addr) {
> + if (*addr_k1++ != *addr_k0++) {
> + err = 1;
> + break;
> + }
> + }
> +
> + if (err)
> + break;
> + }
> +
> + if (err) {
> + if (dir) {
> + dir = 0;
> + val--;
> + upper = val;
> + val = tap;
> + } else {
> + val++;
> + lower = val;
> + done = 1;
> + }
> + } else {
> + if (dir) {
> + if (val < 0x20) {
> + val++;
> + } else {
> + dir = 0;
> + upper = val;
> + val = tap;
> + }
> + } else {
> + if (!val) {
> + lower = val;
> + done = 1;
> + } else {
> + val--;
> + }
> + }
> + }
> + }
> + val = (upper + lower) / 2;
> + writel(val, regs + AR71XX_DDR_REG_TAP_CTRL0);
> + val++;
> + writel(val, regs + AR71XX_DDR_REG_TAP_CTRL1);
> +}
[...]
next prev parent reply other threads:[~2016-01-16 19:31 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1452968033-4460-1-git-send-email-wills.wang@live.com>
2016-01-16 18:13 ` [U-Boot] [PATCH v7 1/7] mips: add base support for QCA/Atheros ath79 SOCs Wills Wang
2016-01-16 19:19 ` Marek Vasut
2016-01-22 9:02 ` Wills Wang
2016-01-22 14:44 ` Marek Vasut
2016-01-23 1:31 ` Wills Wang
2016-01-23 3:06 ` Marek Vasut
2016-01-23 5:25 ` Wills Wang
2016-02-01 19:19 ` Marek Vasut
2016-01-16 18:13 ` [U-Boot] [PATCH v7 2/7] mips: ath79: add support for AR933x SOCs Wills Wang
2016-01-16 19:31 ` Marek Vasut [this message]
2016-01-22 9:10 ` Wills Wang
2016-01-22 14:46 ` Marek Vasut
2016-01-16 18:13 ` [U-Boot] [PATCH v7 3/7] mips: ath79: add support for QCA953x SOCs Wills Wang
2016-01-16 19:33 ` Marek Vasut
2016-01-22 9:17 ` Wills Wang
2016-01-22 14:49 ` Marek Vasut
2016-01-16 18:13 ` [U-Boot] [PATCH v7 4/7] mips: ath79: add serial driver for ar933x SOC Wills Wang
2016-01-16 19:17 ` Daniel Schwierzeck
2016-01-18 3:58 ` Simon Glass
2016-01-16 18:13 ` [U-Boot] [PATCH v7 5/7] mips: ath79: add spi driver Wills Wang
2016-01-16 19:37 ` Daniel Schwierzeck
2016-01-22 9:24 ` Wills Wang
2016-01-27 1:33 ` Marek Vasut
2016-02-02 15:38 ` Wills Wang
2016-02-02 16:07 ` Marek Vasut
2016-01-16 18:13 ` [U-Boot] [PATCH v7 6/7] mips: ath79: add AP121 reference board Wills Wang
2016-01-16 19:50 ` Daniel Schwierzeck
2016-01-22 9:36 ` Wills Wang
2016-01-16 18:13 ` [U-Boot] [PATCH v7 7/7] mips: ath79: add AP143 " Wills Wang
2016-01-16 19:53 ` Daniel Schwierzeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201601162031.38563.marex@denx.de \
--to=marex@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox