aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2015-08-05 06:58:01 -0400
committerRoger Quadros <rogerq@ti.com>2016-04-15 04:51:34 -0400
commitf47fcad63f6847ea677c6c7030f30fd6438e0052 (patch)
tree756f2115f570e1c35a47f4e254d0196bc220ec0e
parentfabe7d7756d17f5da4bd80fa2373c4bd93ed39e5 (diff)
memory: omap-gpmc: Introduce GPMC to NAND interface
The OMAP GPMC module has certain registers dedicated for NAND access and some NAND bits mixed with other GPMC functionality. For the NAND dedicated registers we have the struct gpmc_nand_regs. The NAND driver needs to access NAND specific bits from the following non-dedicated registers - EMPTYWRITEBUFFERSTATUS from GPMC_STATUS For accessing these bits we introduce the struct gpmc_nand_ops. Add gpmc_omap_get_nand_ops() that returns the gpmc_nand_ops along with updating the gpmc_nand_regs. This API will be called by the OMAP NAND driver to access the necessary bits in GPMC register space. Signed-off-by: Roger Quadros <rogerq@ti.com> Acked-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--drivers/memory/omap-gpmc.c21
-rw-r--r--include/linux/omap-gpmc.h35
2 files changed, 54 insertions, 2 deletions
diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c
index 21825ddce4a3..0b62afd86f7e 100644
--- a/drivers/memory/omap-gpmc.c
+++ b/drivers/memory/omap-gpmc.c
@@ -1118,6 +1118,27 @@ void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs)
1118 } 1118 }
1119} 1119}
1120 1120
1121static struct gpmc_nand_ops nand_ops;
1122
1123/**
1124 * gpmc_omap_get_nand_ops - Get the GPMC NAND interface
1125 * @regs: the GPMC NAND register map exclusive for NAND use.
1126 * @cs: GPMC chip select number on which the NAND sits. The
1127 * register map returned will be specific to this chip select.
1128 *
1129 * Returns NULL on error e.g. invalid cs.
1130 */
1131struct gpmc_nand_ops *gpmc_omap_get_nand_ops(struct gpmc_nand_regs *reg, int cs)
1132{
1133 if (cs >= gpmc_cs_num)
1134 return NULL;
1135
1136 gpmc_update_nand_reg(reg, cs);
1137
1138 return &nand_ops;
1139}
1140EXPORT_SYMBOL_GPL(gpmc_omap_get_nand_ops);
1141
1121int gpmc_get_client_irq(unsigned irq_config) 1142int gpmc_get_client_irq(unsigned irq_config)
1122{ 1143{
1123 int i; 1144 int i;
diff --git a/include/linux/omap-gpmc.h b/include/linux/omap-gpmc.h
index 2dcef1c8c8d4..dc2ada6fb9b4 100644
--- a/include/linux/omap-gpmc.h
+++ b/include/linux/omap-gpmc.h
@@ -14,14 +14,45 @@
14#define GPMC_IRQ_FIFOEVENTENABLE 0x01 14#define GPMC_IRQ_FIFOEVENTENABLE 0x01
15#define GPMC_IRQ_COUNT_EVENT 0x02 15#define GPMC_IRQ_COUNT_EVENT 0x02
16 16
17/**
18 * gpmc_nand_ops - Interface between NAND and GPMC
19 * @nand_write_buffer_empty: get the NAND write buffer empty status.
20 */
21struct gpmc_nand_ops {
22 bool (*nand_writebuffer_empty)(void);
23};
24
25struct gpmc_nand_regs;
26
27#if IS_ENABLED(CONFIG_OMAP_GPMC)
28struct gpmc_nand_ops *gpmc_omap_get_nand_ops(struct gpmc_nand_regs *regs,
29 int cs);
30#else
31static inline gpmc_nand_ops *gpmc_omap_get_nand_ops(struct gpmc_nand_regs *regs,
32 int cs)
33{
34 return NULL;
35}
36#endif /* CONFIG_OMAP_GPMC */
37
38/*--------------------------------*/
39
40/* deprecated APIs */
41#if IS_ENABLED(CONFIG_OMAP_GPMC)
42void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs);
43#else
44static inline void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs)
45{
46}
47#endif /* CONFIG_OMAP_GPMC */
48/*--------------------------------*/
49
17extern int gpmc_calc_timings(struct gpmc_timings *gpmc_t, 50extern int gpmc_calc_timings(struct gpmc_timings *gpmc_t,
18 struct gpmc_settings *gpmc_s, 51 struct gpmc_settings *gpmc_s,
19 struct gpmc_device_timings *dev_t); 52 struct gpmc_device_timings *dev_t);
20 53
21struct gpmc_nand_regs;
22struct device_node; 54struct device_node;
23 55
24extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs);
25extern int gpmc_get_client_irq(unsigned irq_config); 56extern int gpmc_get_client_irq(unsigned irq_config);
26 57
27extern unsigned int gpmc_ticks_to_ns(unsigned int ticks); 58extern unsigned int gpmc_ticks_to_ns(unsigned int ticks);