Commit 909ea9aa264423c99cd3039475c98f4a069cb7a4
Committed by
Tom Rini
1 parent
3e01ed00da
Exists in
v2017.01-smarct4x
and in
40 other branches
ARM: keystone: aemif: move aemif driver to drivers/memory/ti-aemif.c
Move AEMIF driver to drivers/memory/ti-aemif.c along with AEMIF definitions collected in arch/arm/include/asm/ti-common/ti-aemif.h Acked-by: Vitaly Andrianov <vitalya@ti.com> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
Showing 10 changed files with 134 additions and 109 deletions Side-by-side Diff
- arch/arm/cpu/armv7/keystone/Makefile
- arch/arm/cpu/armv7/keystone/aemif.c
- arch/arm/include/asm/arch-keystone/hardware-k2hk.h
- arch/arm/include/asm/arch-keystone/hardware.h
- arch/arm/include/asm/ti-common/ti-aemif.h
- board/ti/k2hk_evm/board.c
- drivers/Makefile
- drivers/memory/Makefile
- drivers/memory/ti-aemif.c
- include/configs/k2hk_evm.h
arch/arm/cpu/armv7/keystone/Makefile
arch/arm/cpu/armv7/keystone/aemif.c
1 | -/* | |
2 | - * Keystone2: Asynchronous EMIF Configuration | |
3 | - * | |
4 | - * (C) Copyright 2012-2014 | |
5 | - * Texas Instruments Incorporated, <www.ti.com> | |
6 | - * | |
7 | - * SPDX-License-Identifier: GPL-2.0+ | |
8 | - */ | |
9 | - | |
10 | -#include <common.h> | |
11 | -#include <asm/io.h> | |
12 | -#include <asm/arch/clock.h> | |
13 | -#include <asm/ti-common/davinci_nand.h> | |
14 | - | |
15 | -#define AEMIF_CFG_SELECT_STROBE(v) ((v) ? 1 << 31 : 0) | |
16 | -#define AEMIF_CFG_EXTEND_WAIT(v) ((v) ? 1 << 30 : 0) | |
17 | -#define AEMIF_CFG_WR_SETUP(v) (((v) & 0x0f) << 26) | |
18 | -#define AEMIF_CFG_WR_STROBE(v) (((v) & 0x3f) << 20) | |
19 | -#define AEMIF_CFG_WR_HOLD(v) (((v) & 0x07) << 17) | |
20 | -#define AEMIF_CFG_RD_SETUP(v) (((v) & 0x0f) << 13) | |
21 | -#define AEMIF_CFG_RD_STROBE(v) (((v) & 0x3f) << 7) | |
22 | -#define AEMIF_CFG_RD_HOLD(v) (((v) & 0x07) << 4) | |
23 | -#define AEMIF_CFG_TURN_AROUND(v) (((v) & 0x03) << 2) | |
24 | -#define AEMIF_CFG_WIDTH(v) (((v) & 0x03) << 0) | |
25 | - | |
26 | -#define set_config_field(reg, field, val) \ | |
27 | - do { \ | |
28 | - if (val != -1) { \ | |
29 | - reg &= ~AEMIF_CFG_##field(0xffffffff); \ | |
30 | - reg |= AEMIF_CFG_##field(val); \ | |
31 | - } \ | |
32 | - } while (0) | |
33 | - | |
34 | -void configure_async_emif(int cs, struct async_emif_config *cfg) | |
35 | -{ | |
36 | - unsigned long tmp; | |
37 | - | |
38 | - if (cfg->mode == ASYNC_EMIF_MODE_NAND) { | |
39 | - tmp = __raw_readl(&davinci_emif_regs->nandfcr); | |
40 | - tmp |= (1 << cs); | |
41 | - __raw_writel(tmp, &davinci_emif_regs->nandfcr); | |
42 | - | |
43 | - } else if (cfg->mode == ASYNC_EMIF_MODE_ONENAND) { | |
44 | - tmp = __raw_readl(&davinci_emif_regs->one_nand_cr); | |
45 | - tmp |= (1 << cs); | |
46 | - __raw_writel(tmp, &davinci_emif_regs->one_nand_cr); | |
47 | - } | |
48 | - | |
49 | - tmp = __raw_readl(&davinci_emif_regs->abncr[cs]); | |
50 | - | |
51 | - set_config_field(tmp, SELECT_STROBE, cfg->select_strobe); | |
52 | - set_config_field(tmp, EXTEND_WAIT, cfg->extend_wait); | |
53 | - set_config_field(tmp, WR_SETUP, cfg->wr_setup); | |
54 | - set_config_field(tmp, WR_STROBE, cfg->wr_strobe); | |
55 | - set_config_field(tmp, WR_HOLD, cfg->wr_hold); | |
56 | - set_config_field(tmp, RD_SETUP, cfg->rd_setup); | |
57 | - set_config_field(tmp, RD_STROBE, cfg->rd_strobe); | |
58 | - set_config_field(tmp, RD_HOLD, cfg->rd_hold); | |
59 | - set_config_field(tmp, TURN_AROUND, cfg->turn_around); | |
60 | - set_config_field(tmp, WIDTH, cfg->width); | |
61 | - | |
62 | - __raw_writel(tmp, &davinci_emif_regs->abncr[cs]); | |
63 | -} | |
64 | - | |
65 | -void init_async_emif(int num_cs, struct async_emif_config *config) | |
66 | -{ | |
67 | - int cs; | |
68 | - | |
69 | - for (cs = 0; cs < num_cs; cs++) | |
70 | - configure_async_emif(cs, config + cs); | |
71 | -} |
arch/arm/include/asm/arch-keystone/hardware-k2hk.h
... | ... | @@ -9,13 +9,6 @@ |
9 | 9 | #ifndef __ASM_ARCH_HARDWARE_K2HK_H |
10 | 10 | #define __ASM_ARCH_HARDWARE_K2HK_H |
11 | 11 | |
12 | -#define K2HK_ASYNC_EMIF_CNTRL_BASE 0x21000a00 | |
13 | -#define DAVINCI_ASYNC_EMIF_CNTRL_BASE K2HK_ASYNC_EMIF_CNTRL_BASE | |
14 | -#define K2HK_ASYNC_EMIF_DATA_CE0_BASE 0x30000000 | |
15 | -#define K2HK_ASYNC_EMIF_DATA_CE1_BASE 0x34000000 | |
16 | -#define K2HK_ASYNC_EMIF_DATA_CE2_BASE 0x38000000 | |
17 | -#define K2HK_ASYNC_EMIF_DATA_CE3_BASE 0x3c000000 | |
18 | - | |
19 | 12 | #define K2HK_PLL_CNTRL_BASE 0x02310000 |
20 | 13 | #define CLOCK_BASE K2HK_PLL_CNTRL_BASE |
21 | 14 | #define KS2_RSTCTRL (K2HK_PLL_CNTRL_BASE + 0xe8) |
arch/arm/include/asm/arch-keystone/hardware.h
... | ... | @@ -22,32 +22,6 @@ |
22 | 22 | typedef volatile unsigned int dv_reg; |
23 | 23 | typedef volatile unsigned int *dv_reg_p; |
24 | 24 | |
25 | -#define ASYNC_EMIF_NUM_CS 4 | |
26 | -#define ASYNC_EMIF_MODE_NOR 0 | |
27 | -#define ASYNC_EMIF_MODE_NAND 1 | |
28 | -#define ASYNC_EMIF_MODE_ONENAND 2 | |
29 | -#define ASYNC_EMIF_PRESERVE -1 | |
30 | - | |
31 | -struct async_emif_config { | |
32 | - unsigned mode; | |
33 | - unsigned select_strobe; | |
34 | - unsigned extend_wait; | |
35 | - unsigned wr_setup; | |
36 | - unsigned wr_strobe; | |
37 | - unsigned wr_hold; | |
38 | - unsigned rd_setup; | |
39 | - unsigned rd_strobe; | |
40 | - unsigned rd_hold; | |
41 | - unsigned turn_around; | |
42 | - enum { | |
43 | - ASYNC_EMIF_8 = 0, | |
44 | - ASYNC_EMIF_16 = 1, | |
45 | - ASYNC_EMIF_32 = 2, | |
46 | - } width; | |
47 | -}; | |
48 | - | |
49 | -void init_async_emif(int num_cs, struct async_emif_config *config); | |
50 | - | |
51 | 25 | struct ddr3_phy_config { |
52 | 26 | unsigned int pllcr; |
53 | 27 | unsigned int pgcr1_mask; |
... | ... | @@ -144,6 +118,10 @@ |
144 | 118 | |
145 | 119 | #define KS2_UART0_BASE 0x02530c00 |
146 | 120 | #define KS2_UART1_BASE 0x02531000 |
121 | + | |
122 | +/* AEMIF */ | |
123 | +#define KS2_AEMIF_CNTRL_BASE 0x21000a00 | |
124 | +#define DAVINCI_ASYNC_EMIF_CNTRL_BASE KS2_AEMIF_CNTRL_BASE | |
147 | 125 | |
148 | 126 | #ifdef CONFIG_SOC_K2HK |
149 | 127 | #include <asm/arch/hardware-k2hk.h> |
arch/arm/include/asm/ti-common/ti-aemif.h
1 | +/* | |
2 | + * AEMIF definitions | |
3 | + * | |
4 | + * (C) Copyright 2012-2014 | |
5 | + * Texas Instruments Incorporated, <www.ti.com> | |
6 | + * | |
7 | + * SPDX-License-Identifier: GPL-2.0+ | |
8 | + */ | |
9 | + | |
10 | +#ifndef _AEMIF_H_ | |
11 | +#define _AEMIF_H_ | |
12 | + | |
13 | +#define AEMIF_NUM_CS 4 | |
14 | +#define AEMIF_MODE_NOR 0 | |
15 | +#define AEMIF_MODE_NAND 1 | |
16 | +#define AEMIF_MODE_ONENAND 2 | |
17 | +#define AEMIF_PRESERVE -1 | |
18 | + | |
19 | +struct aemif_config { | |
20 | + unsigned mode; | |
21 | + unsigned select_strobe; | |
22 | + unsigned extend_wait; | |
23 | + unsigned wr_setup; | |
24 | + unsigned wr_strobe; | |
25 | + unsigned wr_hold; | |
26 | + unsigned rd_setup; | |
27 | + unsigned rd_strobe; | |
28 | + unsigned rd_hold; | |
29 | + unsigned turn_around; | |
30 | + enum { | |
31 | + AEMIF_WIDTH_8 = 0, | |
32 | + AEMIF_WIDTH_16 = 1, | |
33 | + AEMIF_WIDTH_32 = 2, | |
34 | + } width; | |
35 | +}; | |
36 | + | |
37 | +void aemif_init(int num_cs, struct aemif_config *config); | |
38 | + | |
39 | +#endif |
board/ti/k2hk_evm/board.c
... | ... | @@ -18,6 +18,7 @@ |
18 | 18 | #include <asm/mach-types.h> |
19 | 19 | #include <asm/arch/emac_defs.h> |
20 | 20 | #include <asm/arch/psc_defs.h> |
21 | +#include <asm/ti-common/ti-aemif.h> | |
21 | 22 | |
22 | 23 | DECLARE_GLOBAL_DATA_PTR; |
23 | 24 | |
24 | 25 | |
... | ... | @@ -39,9 +40,9 @@ |
39 | 40 | what is that */ |
40 | 41 | }; |
41 | 42 | |
42 | -static struct async_emif_config async_emif_config[ASYNC_EMIF_NUM_CS] = { | |
43 | +static struct aemif_config aemif_configs[] = { | |
43 | 44 | { /* CS0 */ |
44 | - .mode = ASYNC_EMIF_MODE_NAND, | |
45 | + .mode = AEMIF_MODE_NAND, | |
45 | 46 | .wr_setup = 0xf, |
46 | 47 | .wr_strobe = 0x3f, |
47 | 48 | .wr_hold = 7, |
... | ... | @@ -49,7 +50,7 @@ |
49 | 50 | .rd_strobe = 0x3f, |
50 | 51 | .rd_hold = 7, |
51 | 52 | .turn_around = 3, |
52 | - .width = ASYNC_EMIF_8, | |
53 | + .width = AEMIF_WIDTH_8, | |
53 | 54 | }, |
54 | 55 | |
55 | 56 | }; |
... | ... | @@ -66,7 +67,7 @@ |
66 | 67 | |
67 | 68 | gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, |
68 | 69 | CONFIG_MAX_RAM_BANK_SIZE); |
69 | - init_async_emif(ARRAY_SIZE(async_emif_config), async_emif_config); | |
70 | + aemif_init(ARRAY_SIZE(aemif_configs), aemif_configs); | |
70 | 71 | return 0; |
71 | 72 | } |
72 | 73 |
drivers/Makefile
drivers/memory/Makefile
1 | +obj-$(CONFIG_TI_AEMIF) += ti-aemif.o |
drivers/memory/ti-aemif.c
1 | +/* | |
2 | + * Keystone2: Asynchronous EMIF Configuration | |
3 | + * | |
4 | + * (C) Copyright 2012-2014 | |
5 | + * Texas Instruments Incorporated, <www.ti.com> | |
6 | + * | |
7 | + * SPDX-License-Identifier: GPL-2.0+ | |
8 | + */ | |
9 | + | |
10 | +#include <common.h> | |
11 | +#include <asm/ti-common/ti-aemif.h> | |
12 | + | |
13 | +#define AEMIF_WAITCYCLE_CONFIG (CONFIG_AEMIF_CNTRL_BASE + 0x4) | |
14 | +#define AEMIF_NAND_CONTROL (CONFIG_AEMIF_CNTRL_BASE + 0x60) | |
15 | +#define AEMIF_ONENAND_CONTROL (CONFIG_AEMIF_CNTRL_BASE + 0x5c) | |
16 | +#define AEMIF_CONFIG(cs) (CONFIG_AEMIF_CNTRL_BASE + 0x10 \ | |
17 | + + (cs * 4)) | |
18 | + | |
19 | +#define AEMIF_CFG_SELECT_STROBE(v) ((v) ? 1 << 31 : 0) | |
20 | +#define AEMIF_CFG_EXTEND_WAIT(v) ((v) ? 1 << 30 : 0) | |
21 | +#define AEMIF_CFG_WR_SETUP(v) (((v) & 0x0f) << 26) | |
22 | +#define AEMIF_CFG_WR_STROBE(v) (((v) & 0x3f) << 20) | |
23 | +#define AEMIF_CFG_WR_HOLD(v) (((v) & 0x07) << 17) | |
24 | +#define AEMIF_CFG_RD_SETUP(v) (((v) & 0x0f) << 13) | |
25 | +#define AEMIF_CFG_RD_STROBE(v) (((v) & 0x3f) << 7) | |
26 | +#define AEMIF_CFG_RD_HOLD(v) (((v) & 0x07) << 4) | |
27 | +#define AEMIF_CFG_TURN_AROUND(v) (((v) & 0x03) << 2) | |
28 | +#define AEMIF_CFG_WIDTH(v) (((v) & 0x03) << 0) | |
29 | + | |
30 | +#define set_config_field(reg, field, val) \ | |
31 | + do { \ | |
32 | + if (val != -1) { \ | |
33 | + reg &= ~AEMIF_CFG_##field(0xffffffff); \ | |
34 | + reg |= AEMIF_CFG_##field(val); \ | |
35 | + } \ | |
36 | + } while (0) | |
37 | + | |
38 | +static void aemif_configure(int cs, struct aemif_config *cfg) | |
39 | +{ | |
40 | + unsigned long tmp; | |
41 | + | |
42 | + if (cfg->mode == AEMIF_MODE_NAND) { | |
43 | + tmp = __raw_readl(AEMIF_NAND_CONTROL); | |
44 | + tmp |= (1 << cs); | |
45 | + __raw_writel(tmp, AEMIF_NAND_CONTROL); | |
46 | + | |
47 | + } else if (cfg->mode == AEMIF_MODE_ONENAND) { | |
48 | + tmp = __raw_readl(AEMIF_ONENAND_CONTROL); | |
49 | + tmp |= (1 << cs); | |
50 | + __raw_writel(tmp, AEMIF_ONENAND_CONTROL); | |
51 | + } | |
52 | + | |
53 | + tmp = __raw_readl(AEMIF_CONFIG(cs)); | |
54 | + | |
55 | + set_config_field(tmp, SELECT_STROBE, cfg->select_strobe); | |
56 | + set_config_field(tmp, EXTEND_WAIT, cfg->extend_wait); | |
57 | + set_config_field(tmp, WR_SETUP, cfg->wr_setup); | |
58 | + set_config_field(tmp, WR_STROBE, cfg->wr_strobe); | |
59 | + set_config_field(tmp, WR_HOLD, cfg->wr_hold); | |
60 | + set_config_field(tmp, RD_SETUP, cfg->rd_setup); | |
61 | + set_config_field(tmp, RD_STROBE, cfg->rd_strobe); | |
62 | + set_config_field(tmp, RD_HOLD, cfg->rd_hold); | |
63 | + set_config_field(tmp, TURN_AROUND, cfg->turn_around); | |
64 | + set_config_field(tmp, WIDTH, cfg->width); | |
65 | + | |
66 | + __raw_writel(tmp, AEMIF_CONFIG(cs)); | |
67 | +} | |
68 | + | |
69 | +void aemif_init(int num_cs, struct aemif_config *config) | |
70 | +{ | |
71 | + int cs; | |
72 | + | |
73 | + if (num_cs > AEMIF_NUM_CS) { | |
74 | + num_cs = AEMIF_NUM_CS; | |
75 | + printf("AEMIF: csnum has to be <= 5"); | |
76 | + } | |
77 | + | |
78 | + for (cs = 0; cs < num_cs; cs++) | |
79 | + aemif_configure(cs, config + cs); | |
80 | +} |
include/configs/k2hk_evm.h
... | ... | @@ -129,6 +129,10 @@ |
129 | 129 | #define CONFIG_SYS_SGMII_LINERATE_MHZ 1250 |
130 | 130 | #define CONFIG_SYS_SGMII_RATESCALE 2 |
131 | 131 | |
132 | +/* AEMIF */ | |
133 | +#define CONFIG_TI_AEMIF | |
134 | +#define CONFIG_AEMIF_CNTRL_BASE KS2_AEMIF_CNTRL_BASE | |
135 | + | |
132 | 136 | /* NAND Configuration */ |
133 | 137 | #define CONFIG_NAND_DAVINCI |
134 | 138 | #define CONFIG_CMD_NAND_ECCLAYOUT |