diff options
| -rw-r--r-- | arch/arm/mach-omap2/gpmc-onenand.c | 30 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/gpmc.c | 48 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/gpmc.h | 19 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/usb-tusb6010.c | 3 |
4 files changed, 75 insertions, 25 deletions
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c index d102183ed9a5..206008837294 100644 --- a/arch/arm/mach-omap2/gpmc-onenand.c +++ b/arch/arm/mach-omap2/gpmc-onenand.c | |||
| @@ -181,10 +181,8 @@ omap2_onenand_calc_sync_timings(struct omap_onenand_platform_data *cfg, | |||
| 181 | const int t_wpl = 40; | 181 | const int t_wpl = 40; |
| 182 | const int t_wph = 30; | 182 | const int t_wph = 30; |
| 183 | int min_gpmc_clk_period, t_ces, t_avds, t_avdh, t_ach, t_aavdh, t_rdyo; | 183 | int min_gpmc_clk_period, t_ces, t_avds, t_avdh, t_ach, t_aavdh, t_rdyo; |
| 184 | u32 reg; | ||
| 185 | int div, fclk_offset_ns, gpmc_clk_ns; | 184 | int div, fclk_offset_ns, gpmc_clk_ns; |
| 186 | int ticks_cez; | 185 | int ticks_cez; |
| 187 | int cs = cfg->cs; | ||
| 188 | 186 | ||
| 189 | if (cfg->flags & ONENAND_SYNC_READ) | 187 | if (cfg->flags & ONENAND_SYNC_READ) |
| 190 | onenand_flags = ONENAND_FLAG_SYNCREAD; | 188 | onenand_flags = ONENAND_FLAG_SYNCREAD; |
| @@ -254,27 +252,10 @@ omap2_onenand_calc_sync_timings(struct omap_onenand_platform_data *cfg, | |||
| 254 | memset(&t, 0, sizeof(t)); | 252 | memset(&t, 0, sizeof(t)); |
| 255 | 253 | ||
| 256 | if (div == 1) { | 254 | if (div == 1) { |
| 257 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG2); | 255 | t.bool_timings.cs_extra_delay = true; |
| 258 | reg |= (1 << 7); | 256 | t.bool_timings.adv_extra_delay = true; |
| 259 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG2, reg); | 257 | t.bool_timings.oe_extra_delay = true; |
| 260 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG3); | 258 | t.bool_timings.we_extra_delay = true; |
| 261 | reg |= (1 << 7); | ||
| 262 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG3, reg); | ||
| 263 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG4); | ||
| 264 | reg |= (1 << 7); | ||
| 265 | reg |= (1 << 23); | ||
| 266 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG4, reg); | ||
| 267 | } else { | ||
| 268 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG2); | ||
| 269 | reg &= ~(1 << 7); | ||
| 270 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG2, reg); | ||
| 271 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG3); | ||
| 272 | reg &= ~(1 << 7); | ||
| 273 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG3, reg); | ||
| 274 | reg = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG4); | ||
| 275 | reg &= ~(1 << 7); | ||
| 276 | reg &= ~(1 << 23); | ||
| 277 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG4, reg); | ||
| 278 | } | 259 | } |
| 279 | 260 | ||
| 280 | t.sync_clk = min_gpmc_clk_period; | 261 | t.sync_clk = min_gpmc_clk_period; |
| @@ -297,6 +278,8 @@ omap2_onenand_calc_sync_timings(struct omap_onenand_platform_data *cfg, | |||
| 297 | t.rd_cycle = gpmc_ticks_to_ns(fclk_offset + (latency + 1) * div + | 278 | t.rd_cycle = gpmc_ticks_to_ns(fclk_offset + (latency + 1) * div + |
| 298 | ticks_cez); | 279 | ticks_cez); |
| 299 | 280 | ||
| 281 | t.clk_activation = fclk_offset_ns; | ||
| 282 | |||
| 300 | /* Write */ | 283 | /* Write */ |
| 301 | if (onenand_flags & ONENAND_FLAG_SYNCWRITE) { | 284 | if (onenand_flags & ONENAND_FLAG_SYNCWRITE) { |
| 302 | t.adv_wr_off = t.adv_rd_off; | 285 | t.adv_wr_off = t.adv_rd_off; |
| @@ -338,7 +321,6 @@ static int gpmc_set_sync_mode(int cs, struct gpmc_timings *t) | |||
| 338 | (sync_read ? GPMC_CONFIG1_READTYPE_SYNC : 0) | | 321 | (sync_read ? GPMC_CONFIG1_READTYPE_SYNC : 0) | |
| 339 | (sync_write ? GPMC_CONFIG1_WRITEMULTIPLE_SUPP : 0) | | 322 | (sync_write ? GPMC_CONFIG1_WRITEMULTIPLE_SUPP : 0) | |
| 340 | (sync_write ? GPMC_CONFIG1_WRITETYPE_SYNC : 0) | | 323 | (sync_write ? GPMC_CONFIG1_WRITETYPE_SYNC : 0) | |
| 341 | GPMC_CONFIG1_CLKACTIVATIONTIME(fclk_offset) | | ||
| 342 | GPMC_CONFIG1_PAGE_LEN(2) | | 324 | GPMC_CONFIG1_PAGE_LEN(2) | |
| 343 | (cpu_is_omap34xx() ? 0 : | 325 | (cpu_is_omap34xx() ? 0 : |
| 344 | (GPMC_CONFIG1_WAIT_READ_MON | | 326 | (GPMC_CONFIG1_WAIT_READ_MON | |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index bf6117c32f4b..5619d1b48668 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -74,6 +74,13 @@ | |||
| 74 | #define GPMC_ECC_CTRL_ECCREG8 0x008 | 74 | #define GPMC_ECC_CTRL_ECCREG8 0x008 |
| 75 | #define GPMC_ECC_CTRL_ECCREG9 0x009 | 75 | #define GPMC_ECC_CTRL_ECCREG9 0x009 |
| 76 | 76 | ||
| 77 | #define GPMC_CONFIG2_CSEXTRADELAY BIT(7) | ||
| 78 | #define GPMC_CONFIG3_ADVEXTRADELAY BIT(7) | ||
| 79 | #define GPMC_CONFIG4_OEEXTRADELAY BIT(7) | ||
| 80 | #define GPMC_CONFIG4_WEEXTRADELAY BIT(23) | ||
| 81 | #define GPMC_CONFIG6_CYCLE2CYCLEDIFFCSEN BIT(6) | ||
| 82 | #define GPMC_CONFIG6_CYCLE2CYCLESAMECSEN BIT(7) | ||
| 83 | |||
| 77 | #define GPMC_CS0_OFFSET 0x60 | 84 | #define GPMC_CS0_OFFSET 0x60 |
| 78 | #define GPMC_CS_SIZE 0x30 | 85 | #define GPMC_CS_SIZE 0x30 |
| 79 | #define GPMC_BCH_SIZE 0x10 | 86 | #define GPMC_BCH_SIZE 0x10 |
| @@ -223,6 +230,39 @@ unsigned int gpmc_round_ns_to_ticks(unsigned int time_ns) | |||
| 223 | return ticks * gpmc_get_fclk_period() / 1000; | 230 | return ticks * gpmc_get_fclk_period() / 1000; |
| 224 | } | 231 | } |
| 225 | 232 | ||
| 233 | static inline void gpmc_cs_modify_reg(int cs, int reg, u32 mask, bool value) | ||
| 234 | { | ||
| 235 | u32 l; | ||
| 236 | |||
| 237 | l = gpmc_cs_read_reg(cs, reg); | ||
| 238 | if (value) | ||
| 239 | l |= mask; | ||
| 240 | else | ||
| 241 | l &= ~mask; | ||
| 242 | gpmc_cs_write_reg(cs, reg, l); | ||
| 243 | } | ||
| 244 | |||
| 245 | static void gpmc_cs_bool_timings(int cs, const struct gpmc_bool_timings *p) | ||
| 246 | { | ||
| 247 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG1, | ||
| 248 | GPMC_CONFIG1_TIME_PARA_GRAN, | ||
| 249 | p->time_para_granularity); | ||
| 250 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG2, | ||
| 251 | GPMC_CONFIG2_CSEXTRADELAY, p->cs_extra_delay); | ||
| 252 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, | ||
| 253 | GPMC_CONFIG3_ADVEXTRADELAY, p->adv_extra_delay); | ||
| 254 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, | ||
| 255 | GPMC_CONFIG4_OEEXTRADELAY, p->oe_extra_delay); | ||
| 256 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, | ||
| 257 | GPMC_CONFIG4_OEEXTRADELAY, p->we_extra_delay); | ||
| 258 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6, | ||
| 259 | GPMC_CONFIG6_CYCLE2CYCLESAMECSEN, | ||
| 260 | p->cycle2cyclesamecsen); | ||
| 261 | gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6, | ||
| 262 | GPMC_CONFIG6_CYCLE2CYCLEDIFFCSEN, | ||
| 263 | p->cycle2cyclediffcsen); | ||
| 264 | } | ||
| 265 | |||
| 226 | #ifdef DEBUG | 266 | #ifdef DEBUG |
| 227 | static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, | 267 | static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, |
| 228 | int time, const char *name) | 268 | int time, const char *name) |
| @@ -316,6 +356,12 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t) | |||
| 316 | 356 | ||
| 317 | GPMC_SET_ONE(GPMC_CS_CONFIG5, 24, 27, page_burst_access); | 357 | GPMC_SET_ONE(GPMC_CS_CONFIG5, 24, 27, page_burst_access); |
| 318 | 358 | ||
| 359 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 0, 3, bus_turnaround); | ||
| 360 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 8, 11, cycle2cycle_delay); | ||
| 361 | |||
| 362 | GPMC_SET_ONE(GPMC_CS_CONFIG1, 18, 19, wait_monitoring); | ||
| 363 | GPMC_SET_ONE(GPMC_CS_CONFIG1, 25, 26, clk_activation); | ||
| 364 | |||
| 319 | if (gpmc_capability & GPMC_HAS_WR_DATA_MUX_BUS) | 365 | if (gpmc_capability & GPMC_HAS_WR_DATA_MUX_BUS) |
| 320 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 16, 19, wr_data_mux_bus); | 366 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 16, 19, wr_data_mux_bus); |
| 321 | if (gpmc_capability & GPMC_HAS_WR_ACCESS) | 367 | if (gpmc_capability & GPMC_HAS_WR_ACCESS) |
| @@ -335,6 +381,8 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t) | |||
| 335 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); | 381 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); |
| 336 | } | 382 | } |
| 337 | 383 | ||
| 384 | gpmc_cs_bool_timings(cs, &t->bool_timings); | ||
| 385 | |||
| 338 | return 0; | 386 | return 0; |
| 339 | } | 387 | } |
| 340 | 388 | ||
diff --git a/arch/arm/mach-omap2/gpmc.h b/arch/arm/mach-omap2/gpmc.h index 79f4dfc2adb3..e08a51a7a76a 100644 --- a/arch/arm/mach-omap2/gpmc.h +++ b/arch/arm/mach-omap2/gpmc.h | |||
| @@ -74,6 +74,17 @@ | |||
| 74 | #define GPMC_IRQ_COUNT_EVENT 0x02 | 74 | #define GPMC_IRQ_COUNT_EVENT 0x02 |
| 75 | 75 | ||
| 76 | 76 | ||
| 77 | /* bool type time settings */ | ||
| 78 | struct gpmc_bool_timings { | ||
| 79 | bool cycle2cyclediffcsen; | ||
| 80 | bool cycle2cyclesamecsen; | ||
| 81 | bool we_extra_delay; | ||
| 82 | bool oe_extra_delay; | ||
| 83 | bool adv_extra_delay; | ||
| 84 | bool cs_extra_delay; | ||
| 85 | bool time_para_granularity; | ||
| 86 | }; | ||
| 87 | |||
| 77 | /* | 88 | /* |
| 78 | * Note that all values in this struct are in nanoseconds except sync_clk | 89 | * Note that all values in this struct are in nanoseconds except sync_clk |
| 79 | * (which is in picoseconds), while the register values are in gpmc_fck cycles. | 90 | * (which is in picoseconds), while the register values are in gpmc_fck cycles. |
| @@ -106,9 +117,17 @@ struct gpmc_timings { | |||
| 106 | u16 rd_cycle; /* Total read cycle time */ | 117 | u16 rd_cycle; /* Total read cycle time */ |
| 107 | u16 wr_cycle; /* Total write cycle time */ | 118 | u16 wr_cycle; /* Total write cycle time */ |
| 108 | 119 | ||
| 120 | u16 bus_turnaround; | ||
| 121 | u16 cycle2cycle_delay; | ||
| 122 | |||
| 123 | u16 wait_monitoring; | ||
| 124 | u16 clk_activation; | ||
| 125 | |||
| 109 | /* The following are only on OMAP3430 */ | 126 | /* The following are only on OMAP3430 */ |
| 110 | u16 wr_access; /* WRACCESSTIME */ | 127 | u16 wr_access; /* WRACCESSTIME */ |
| 111 | u16 wr_data_mux_bus; /* WRDATAONADMUXBUS */ | 128 | u16 wr_data_mux_bus; /* WRDATAONADMUXBUS */ |
| 129 | |||
| 130 | struct gpmc_bool_timings bool_timings; | ||
| 112 | }; | 131 | }; |
| 113 | 132 | ||
| 114 | extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs); | 133 | extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs); |
diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c index a8795ff19e6d..5be96c6e1416 100644 --- a/arch/arm/mach-omap2/usb-tusb6010.c +++ b/arch/arm/mach-omap2/usb-tusb6010.c | |||
| @@ -175,6 +175,8 @@ static int tusb_set_sync_mode(unsigned sysclk_ps, unsigned fclk_ps) | |||
| 175 | tmp = t.cs_wr_off * 1000 + 7000 /* t_scsn_rdy_z */; | 175 | tmp = t.cs_wr_off * 1000 + 7000 /* t_scsn_rdy_z */; |
| 176 | t.wr_cycle = next_clk(t.cs_wr_off, tmp, fclk_ps); | 176 | t.wr_cycle = next_clk(t.cs_wr_off, tmp, fclk_ps); |
| 177 | 177 | ||
| 178 | t.clk_activation = gpmc_ticks_to_ns(1); | ||
| 179 | |||
| 178 | return gpmc_cs_set_timings(sync_cs, &t); | 180 | return gpmc_cs_set_timings(sync_cs, &t); |
| 179 | } | 181 | } |
| 180 | 182 | ||
| @@ -284,7 +286,6 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data, | |||
| 284 | | GPMC_CONFIG1_READTYPE_SYNC | 286 | | GPMC_CONFIG1_READTYPE_SYNC |
| 285 | | GPMC_CONFIG1_WRITEMULTIPLE_SUPP | 287 | | GPMC_CONFIG1_WRITEMULTIPLE_SUPP |
| 286 | | GPMC_CONFIG1_WRITETYPE_SYNC | 288 | | GPMC_CONFIG1_WRITETYPE_SYNC |
| 287 | | GPMC_CONFIG1_CLKACTIVATIONTIME(1) | ||
| 288 | | GPMC_CONFIG1_PAGE_LEN(2) | 289 | | GPMC_CONFIG1_PAGE_LEN(2) |
| 289 | | GPMC_CONFIG1_WAIT_READ_MON | 290 | | GPMC_CONFIG1_WAIT_READ_MON |
| 290 | | GPMC_CONFIG1_WAIT_WRITE_MON | 291 | | GPMC_CONFIG1_WAIT_WRITE_MON |
