2 * linux/arch/arm/mach-at91/sam9_smc.c
4 * Copyright (C) 2008 Andrew Victor
5 * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/module.h>
15 #include <linux/of_address.h>
17 #include <mach/at91sam9_smc.h>
22 #define AT91_SMC_CS(id, n) (smc_base_addr[id] + ((n) * 0x10))
24 static void __iomem
*smc_base_addr
[2];
26 static void sam9_smc_cs_write_mode(void __iomem
*base
,
27 struct sam9_smc_config
*config
)
29 __raw_writel(config
->mode
30 | AT91_SMC_TDF_(config
->tdf_cycles
),
31 base
+ AT91_SMC_MODE
);
34 void sam9_smc_write_mode(int id
, int cs
,
35 struct sam9_smc_config
*config
)
37 sam9_smc_cs_write_mode(AT91_SMC_CS(id
, cs
), config
);
40 static void sam9_smc_cs_configure(void __iomem
*base
,
41 struct sam9_smc_config
*config
)
45 __raw_writel(AT91_SMC_NWESETUP_(config
->nwe_setup
)
46 | AT91_SMC_NCS_WRSETUP_(config
->ncs_write_setup
)
47 | AT91_SMC_NRDSETUP_(config
->nrd_setup
)
48 | AT91_SMC_NCS_RDSETUP_(config
->ncs_read_setup
),
49 base
+ AT91_SMC_SETUP
);
52 __raw_writel(AT91_SMC_NWEPULSE_(config
->nwe_pulse
)
53 | AT91_SMC_NCS_WRPULSE_(config
->ncs_write_pulse
)
54 | AT91_SMC_NRDPULSE_(config
->nrd_pulse
)
55 | AT91_SMC_NCS_RDPULSE_(config
->ncs_read_pulse
),
56 base
+ AT91_SMC_PULSE
);
59 __raw_writel(AT91_SMC_NWECYCLE_(config
->write_cycle
)
60 | AT91_SMC_NRDCYCLE_(config
->read_cycle
),
61 base
+ AT91_SMC_CYCLE
);
64 sam9_smc_cs_write_mode(base
, config
);
67 void sam9_smc_configure(int id
, int cs
,
68 struct sam9_smc_config
*config
)
70 sam9_smc_cs_configure(AT91_SMC_CS(id
, cs
), config
);
73 static void sam9_smc_cs_read_mode(void __iomem
*base
,
74 struct sam9_smc_config
*config
)
76 u32 val
= __raw_readl(base
+ AT91_SMC_MODE
);
78 config
->mode
= (val
& ~AT91_SMC_NWECYCLE
);
79 config
->tdf_cycles
= (val
& AT91_SMC_NWECYCLE
) >> 16 ;
82 void sam9_smc_read_mode(int id
, int cs
,
83 struct sam9_smc_config
*config
)
85 sam9_smc_cs_read_mode(AT91_SMC_CS(id
, cs
), config
);
88 static void sam9_smc_cs_read(void __iomem
*base
,
89 struct sam9_smc_config
*config
)
94 val
= __raw_readl(base
+ AT91_SMC_SETUP
);
96 config
->nwe_setup
= val
& AT91_SMC_NWESETUP
;
97 config
->ncs_write_setup
= (val
& AT91_SMC_NCS_WRSETUP
) >> 8;
98 config
->nrd_setup
= (val
& AT91_SMC_NRDSETUP
) >> 16;
99 config
->ncs_read_setup
= (val
& AT91_SMC_NCS_RDSETUP
) >> 24;
102 val
= __raw_readl(base
+ AT91_SMC_PULSE
);
104 config
->nwe_setup
= val
& AT91_SMC_NWEPULSE
;
105 config
->ncs_write_pulse
= (val
& AT91_SMC_NCS_WRPULSE
) >> 8;
106 config
->nrd_pulse
= (val
& AT91_SMC_NRDPULSE
) >> 16;
107 config
->ncs_read_pulse
= (val
& AT91_SMC_NCS_RDPULSE
) >> 24;
110 val
= __raw_readl(base
+ AT91_SMC_CYCLE
);
112 config
->write_cycle
= val
& AT91_SMC_NWECYCLE
;
113 config
->read_cycle
= (val
& AT91_SMC_NRDCYCLE
) >> 16;
116 sam9_smc_cs_read_mode(base
, config
);
119 void sam9_smc_read(int id
, int cs
, struct sam9_smc_config
*config
)
121 sam9_smc_cs_read(AT91_SMC_CS(id
, cs
), config
);
124 void __init
at91sam9_ioremap_smc(int id
, u32 addr
)
127 pr_warn("%s: id > 2\n", __func__
);
130 smc_base_addr
[id
] = ioremap(addr
, 512);
131 if (!smc_base_addr
[id
])
132 pr_warn("Impossible to ioremap smc.%d 0x%x\n", id
, addr
);