diff options
Diffstat (limited to 'Documentation/bus-devices/ti-gpmc.txt')
-rw-r--r-- | Documentation/bus-devices/ti-gpmc.txt | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Documentation/bus-devices/ti-gpmc.txt b/Documentation/bus-devices/ti-gpmc.txt new file mode 100644 index 000000000000..cc9ce57e0a26 --- /dev/null +++ b/Documentation/bus-devices/ti-gpmc.txt | |||
@@ -0,0 +1,122 @@ | |||
1 | GPMC (General Purpose Memory Controller): | ||
2 | ========================================= | ||
3 | |||
4 | GPMC is an unified memory controller dedicated to interfacing external | ||
5 | memory devices like | ||
6 | * Asynchronous SRAM like memories and application specific integrated | ||
7 | circuit devices. | ||
8 | * Asynchronous, synchronous, and page mode burst NOR flash devices | ||
9 | NAND flash | ||
10 | * Pseudo-SRAM devices | ||
11 | |||
12 | GPMC is found on Texas Instruments SoC's (OMAP based) | ||
13 | IP details: http://www.ti.com/lit/pdf/spruh73 section 7.1 | ||
14 | |||
15 | |||
16 | GPMC generic timing calculation: | ||
17 | ================================ | ||
18 | |||
19 | GPMC has certain timings that has to be programmed for proper | ||
20 | functioning of the peripheral, while peripheral has another set of | ||
21 | timings. To have peripheral work with gpmc, peripheral timings has to | ||
22 | be translated to the form gpmc can understand. The way it has to be | ||
23 | translated depends on the connected peripheral. Also there is a | ||
24 | dependency for certain gpmc timings on gpmc clock frequency. Hence a | ||
25 | generic timing routine was developed to achieve above requirements. | ||
26 | |||
27 | Generic routine provides a generic method to calculate gpmc timings | ||
28 | from gpmc peripheral timings. struct gpmc_device_timings fields has to | ||
29 | be updated with timings from the datasheet of the peripheral that is | ||
30 | connected to gpmc. A few of the peripheral timings can be fed either | ||
31 | in time or in cycles, provision to handle this scenario has been | ||
32 | provided (refer struct gpmc_device_timings definition). It may so | ||
33 | happen that timing as specified by peripheral datasheet is not present | ||
34 | in timing structure, in this scenario, try to correlate peripheral | ||
35 | timing to the one available. If that doesn't work, try to add a new | ||
36 | field as required by peripheral, educate generic timing routine to | ||
37 | handle it, make sure that it does not break any of the existing. | ||
38 | Then there may be cases where peripheral datasheet doesn't mention | ||
39 | certain fields of struct gpmc_device_timings, zero those entries. | ||
40 | |||
41 | Generic timing routine has been verified to work properly on | ||
42 | multiple onenand's and tusb6010 peripherals. | ||
43 | |||
44 | A word of caution: generic timing routine has been developed based | ||
45 | on understanding of gpmc timings, peripheral timings, available | ||
46 | custom timing routines, a kind of reverse engineering without | ||
47 | most of the datasheets & hardware (to be exact none of those supported | ||
48 | in mainline having custom timing routine) and by simulation. | ||
49 | |||
50 | gpmc timing dependency on peripheral timings: | ||
51 | [<gpmc_timing>: <peripheral timing1>, <peripheral timing2> ...] | ||
52 | |||
53 | 1. common | ||
54 | cs_on: t_ceasu | ||
55 | adv_on: t_avdasu, t_ceavd | ||
56 | |||
57 | 2. sync common | ||
58 | sync_clk: clk | ||
59 | page_burst_access: t_bacc | ||
60 | clk_activation: t_ces, t_avds | ||
61 | |||
62 | 3. read async muxed | ||
63 | adv_rd_off: t_avdp_r | ||
64 | oe_on: t_oeasu, t_aavdh | ||
65 | access: t_iaa, t_oe, t_ce, t_aa | ||
66 | rd_cycle: t_rd_cycle, t_cez_r, t_oez | ||
67 | |||
68 | 4. read async non-muxed | ||
69 | adv_rd_off: t_avdp_r | ||
70 | oe_on: t_oeasu | ||
71 | access: t_iaa, t_oe, t_ce, t_aa | ||
72 | rd_cycle: t_rd_cycle, t_cez_r, t_oez | ||
73 | |||
74 | 5. read sync muxed | ||
75 | adv_rd_off: t_avdp_r, t_avdh | ||
76 | oe_on: t_oeasu, t_ach, cyc_aavdh_oe | ||
77 | access: t_iaa, cyc_iaa, cyc_oe | ||
78 | rd_cycle: t_cez_r, t_oez, t_ce_rdyz | ||
79 | |||
80 | 6. read sync non-muxed | ||
81 | adv_rd_off: t_avdp_r | ||
82 | oe_on: t_oeasu | ||
83 | access: t_iaa, cyc_iaa, cyc_oe | ||
84 | rd_cycle: t_cez_r, t_oez, t_ce_rdyz | ||
85 | |||
86 | 7. write async muxed | ||
87 | adv_wr_off: t_avdp_w | ||
88 | we_on, wr_data_mux_bus: t_weasu, t_aavdh, cyc_aavhd_we | ||
89 | we_off: t_wpl | ||
90 | cs_wr_off: t_wph | ||
91 | wr_cycle: t_cez_w, t_wr_cycle | ||
92 | |||
93 | 8. write async non-muxed | ||
94 | adv_wr_off: t_avdp_w | ||
95 | we_on, wr_data_mux_bus: t_weasu | ||
96 | we_off: t_wpl | ||
97 | cs_wr_off: t_wph | ||
98 | wr_cycle: t_cez_w, t_wr_cycle | ||
99 | |||
100 | 9. write sync muxed | ||
101 | adv_wr_off: t_avdp_w, t_avdh | ||
102 | we_on, wr_data_mux_bus: t_weasu, t_rdyo, t_aavdh, cyc_aavhd_we | ||
103 | we_off: t_wpl, cyc_wpl | ||
104 | cs_wr_off: t_wph | ||
105 | wr_cycle: t_cez_w, t_ce_rdyz | ||
106 | |||
107 | 10. write sync non-muxed | ||
108 | adv_wr_off: t_avdp_w | ||
109 | we_on, wr_data_mux_bus: t_weasu, t_rdyo | ||
110 | we_off: t_wpl, cyc_wpl | ||
111 | cs_wr_off: t_wph | ||
112 | wr_cycle: t_cez_w, t_ce_rdyz | ||
113 | |||
114 | |||
115 | Note: Many of gpmc timings are dependent on other gpmc timings (a few | ||
116 | gpmc timings purely dependent on other gpmc timings, a reason that | ||
117 | some of the gpmc timings are missing above), and it will result in | ||
118 | indirect dependency of peripheral timings to gpmc timings other than | ||
119 | mentioned above, refer timing routine for more details. To know what | ||
120 | these peripheral timings correspond to, please see explanations in | ||
121 | struct gpmc_device_timings definition. And for gpmc timings refer | ||
122 | IP details (link above). | ||