Lines Matching +full:cs +full:- +full:3

4  * Copyright (C) 2005-2006 Nokia Corporation
9 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
28 #include <asm/mach-types.h>
67 /* Structure to save gpmc cs context */
97 static unsigned int gpmc_cs_map; /* flag for cs which are initialized */
98 static int gpmc_ecc_used = -EINVAL; /* cs using ecc engine */
116 static void gpmc_cs_write_byte(int cs, int idx, u8 val) in gpmc_cs_write_byte() argument
120 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_write_byte()
124 static u8 gpmc_cs_read_byte(int cs, int idx) in gpmc_cs_read_byte() argument
128 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_read_byte()
132 void gpmc_cs_write_reg(int cs, int idx, u32 val) in gpmc_cs_write_reg() argument
136 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_write_reg()
140 u32 gpmc_cs_read_reg(int cs, int idx) in gpmc_cs_read_reg() argument
144 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_read_reg()
171 return (time_ns * 1000 + tick_ps - 1) / tick_ps; in gpmc_ns_to_ticks()
181 return (time_ps + tick_ps - 1) / tick_ps; in gpmc_ps_to_ticks()
197 static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, in set_gpmc_timing_reg() argument
200 static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, in set_gpmc_timing_reg()
211 nr_bits = end_bit - st_bit + 1; in set_gpmc_timing_reg()
214 printk(KERN_INFO "GPMC CS%d: %-10s* %3d ns, %3d ticks >= %d\n", in set_gpmc_timing_reg()
215 cs, name, time, ticks, 1 << nr_bits); in set_gpmc_timing_reg()
217 return -1; in set_gpmc_timing_reg()
220 mask = (1 << nr_bits) - 1; in set_gpmc_timing_reg()
221 l = gpmc_cs_read_reg(cs, reg); in set_gpmc_timing_reg()
224 "GPMC CS%d: %-10s: %3d ticks, %3lu ns (was %3i ticks) %3d ns\n", in set_gpmc_timing_reg()
225 cs, name, ticks, gpmc_get_fclk_period() * ticks / 1000, in set_gpmc_timing_reg()
230 gpmc_cs_write_reg(cs, reg, l); in set_gpmc_timing_reg()
237 if (set_gpmc_timing_reg(cs, (reg), (st), (end), \
238 t->field, #field) < 0) \
239 return -1
242 if (set_gpmc_timing_reg(cs, (reg), (st), (end), t->field) < 0) \
243 return -1
246 int gpmc_cs_calc_divider(int cs, unsigned int sync_clk) in gpmc_cs_calc_divider() argument
251 l = sync_clk + (gpmc_get_fclk_period() - 1); in gpmc_cs_calc_divider()
254 return -1; in gpmc_cs_calc_divider()
261 int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t) in gpmc_cs_set_timings() argument
266 div = gpmc_cs_calc_divider(cs, t->sync_clk); in gpmc_cs_set_timings()
268 return -1; in gpmc_cs_set_timings()
270 GPMC_SET_ONE(GPMC_CS_CONFIG2, 0, 3, cs_on); in gpmc_cs_set_timings()
274 GPMC_SET_ONE(GPMC_CS_CONFIG3, 0, 3, adv_on); in gpmc_cs_set_timings()
278 GPMC_SET_ONE(GPMC_CS_CONFIG4, 0, 3, oe_on); in gpmc_cs_set_timings()
297 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_cs_set_timings()
300 printk(KERN_INFO "GPMC CS%d CLK period is %lu ns (div %d)\n", in gpmc_cs_set_timings()
301 cs, (div * gpmc_get_fclk_period()) / 1000, div); in gpmc_cs_set_timings()
304 l |= (div - 1); in gpmc_cs_set_timings()
305 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); in gpmc_cs_set_timings()
311 static void gpmc_cs_enable_mem(int cs, u32 base, u32 size) in gpmc_cs_enable_mem() argument
316 mask = (1 << GPMC_SECTION_SHIFT) - size; in gpmc_cs_enable_mem()
317 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_enable_mem()
323 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); in gpmc_cs_enable_mem()
326 static void gpmc_cs_disable_mem(int cs) in gpmc_cs_disable_mem() argument
330 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_disable_mem()
332 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); in gpmc_cs_disable_mem()
335 static void gpmc_cs_get_memconf(int cs, u32 *base, u32 *size) in gpmc_cs_get_memconf() argument
340 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_get_memconf()
343 *size = (1 << GPMC_SECTION_SHIFT) - (mask << GPMC_CHUNK_SHIFT); in gpmc_cs_get_memconf()
346 static int gpmc_cs_mem_enabled(int cs) in gpmc_cs_mem_enabled() argument
350 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_mem_enabled()
354 int gpmc_cs_set_reserved(int cs, int reserved) in gpmc_cs_set_reserved() argument
356 if (cs > GPMC_CS_NUM) in gpmc_cs_set_reserved()
357 return -ENODEV; in gpmc_cs_set_reserved()
359 gpmc_cs_map &= ~(1 << cs); in gpmc_cs_set_reserved()
360 gpmc_cs_map |= (reserved ? 1 : 0) << cs; in gpmc_cs_set_reserved()
365 int gpmc_cs_reserved(int cs) in gpmc_cs_reserved() argument
367 if (cs > GPMC_CS_NUM) in gpmc_cs_reserved()
368 return -ENODEV; in gpmc_cs_reserved()
370 return gpmc_cs_map & (1 << cs); in gpmc_cs_reserved()
377 size = (size - 1) >> (GPMC_CHUNK_SHIFT - 1); in gpmc_mem_align()
378 order = GPMC_CHUNK_SHIFT - 1; in gpmc_mem_align()
387 static int gpmc_cs_insert_mem(int cs, unsigned long base, unsigned long size) in gpmc_cs_insert_mem() argument
389 struct resource *res = &gpmc_cs_mem[cs]; in gpmc_cs_insert_mem()
394 res->start = base; in gpmc_cs_insert_mem()
395 res->end = base + size - 1; in gpmc_cs_insert_mem()
402 int gpmc_cs_request(int cs, unsigned long size, unsigned long *base) in gpmc_cs_request() argument
404 struct resource *res = &gpmc_cs_mem[cs]; in gpmc_cs_request()
405 int r = -1; in gpmc_cs_request()
407 if (cs > GPMC_CS_NUM) in gpmc_cs_request()
408 return -ENODEV; in gpmc_cs_request()
412 return -ENOMEM; in gpmc_cs_request()
415 if (gpmc_cs_reserved(cs)) { in gpmc_cs_request()
416 r = -EBUSY; in gpmc_cs_request()
419 if (gpmc_cs_mem_enabled(cs)) in gpmc_cs_request()
420 r = adjust_resource(res, res->start & ~(size - 1), size); in gpmc_cs_request()
427 gpmc_cs_enable_mem(cs, res->start, resource_size(res)); in gpmc_cs_request()
428 *base = res->start; in gpmc_cs_request()
429 gpmc_cs_set_reserved(cs, 1); in gpmc_cs_request()
436 void gpmc_cs_free(int cs) in gpmc_cs_free() argument
439 if (cs >= GPMC_CS_NUM || cs < 0 || !gpmc_cs_reserved(cs)) { in gpmc_cs_free()
440 printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); in gpmc_cs_free()
445 gpmc_cs_disable_mem(cs); in gpmc_cs_free()
446 release_resource(&gpmc_cs_mem[cs]); in gpmc_cs_free()
447 gpmc_cs_set_reserved(cs, 0); in gpmc_cs_free()
453 * gpmc_read_status - read access request to get the different gpmc status
459 int status = -EINVAL; in gpmc_read_status()
491 * gpmc_cs_configure - write request to configure gpmc
492 * @cs: chip select number
497 int gpmc_cs_configure(int cs, int cmd, int wval) in gpmc_cs_configure() argument
521 regval = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_cs_configure()
526 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval); in gpmc_cs_configure()
530 regval = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_cs_configure()
533 regval &= ~GPMC_CONFIG1_DEVICESIZE(3); in gpmc_cs_configure()
538 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval); in gpmc_cs_configure()
542 regval = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_cs_configure()
546 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval); in gpmc_cs_configure()
551 err = -EINVAL; in gpmc_cs_configure()
559 * gpmc_nand_read - nand specific read access request
560 * @cs: chip select number
563 int gpmc_nand_read(int cs, int cmd) in gpmc_nand_read() argument
565 int rval = -EINVAL; in gpmc_nand_read()
569 rval = gpmc_cs_read_byte(cs, GPMC_CS_NAND_DATA); in gpmc_nand_read()
580 * gpmc_nand_write - nand specific write request
581 * @cs: chip select number
585 int gpmc_nand_write(int cs, int cmd, int wval) in gpmc_nand_write() argument
591 gpmc_cs_write_byte(cs, GPMC_CS_NAND_COMMAND, wval); in gpmc_nand_write()
595 gpmc_cs_write_byte(cs, GPMC_CS_NAND_ADDRESS, wval); in gpmc_nand_write()
599 gpmc_cs_write_byte(cs, GPMC_CS_NAND_DATA, wval); in gpmc_nand_write()
603 err = -EINVAL; in gpmc_nand_write()
612 * gpmc_prefetch_enable - configures and starts prefetch transfer
613 * @cs: cs (chip select) number
619 int gpmc_prefetch_enable(int cs, int fifo_th, int dma_mode, in gpmc_prefetch_enable() argument
625 return -1; in gpmc_prefetch_enable()
631 * enable the engine. Set which cs is has requested for. in gpmc_prefetch_enable()
633 gpmc_write_reg(GPMC_PREFETCH_CONFIG1, ((cs << CS_NUM_SHIFT) | in gpmc_prefetch_enable()
642 return -EBUSY; in gpmc_prefetch_enable()
650 * gpmc_prefetch_reset - disables and stops the prefetch engine
652 int gpmc_prefetch_reset(int cs) in gpmc_prefetch_reset() argument
656 /* check if the same module/cs is trying to reset */ in gpmc_prefetch_reset()
658 if (((config1 >> CS_NUM_SHIFT) & 0x7) != cs) in gpmc_prefetch_reset()
659 return -EINVAL; in gpmc_prefetch_reset()
673 int cs; in gpmc_mem_init() local
687 for (cs = 0; cs < GPMC_CS_NUM; cs++) { in gpmc_mem_init()
690 if (!gpmc_cs_mem_enabled(cs)) in gpmc_mem_init()
692 gpmc_cs_get_memconf(cs, &base, &size); in gpmc_mem_init()
693 if (gpmc_cs_insert_mem(cs, base, size) < 0) in gpmc_mem_init()
701 int cs, ret = -EINVAL; in gpmc_init() local
744 l &= 0x03 << 3; in gpmc_init()
745 l |= (0x02 << 3) | (1 << 0); in gpmc_init()
751 for (cs = 0; cs < GPMC_CS_NUM; cs++) { in gpmc_init()
761 pr_err("gpmc: irq-%d could not claim: err %d\n", in gpmc_init()
769 u8 cs; in gpmc_handle_irq() local
771 /* check cs to invoke the irq */ in gpmc_handle_irq()
772 cs = ((gpmc_read_reg(GPMC_PREFETCH_CONFIG1)) >> CS_NUM_SHIFT) & 0x7; in gpmc_handle_irq()
773 if (OMAP_GPMC_IRQ_BASE+cs <= OMAP_GPMC_IRQ_END) in gpmc_handle_irq()
774 generic_handle_irq(OMAP_GPMC_IRQ_BASE+cs); in gpmc_handle_irq()
847 * gpmc_enable_hwecc - enable hardware ecc functionality
848 * @cs: chip select number
853 int gpmc_enable_hwecc(int cs, int mode, int dev_width, int ecc_size) in gpmc_enable_hwecc() argument
858 if (gpmc_ecc_used != -EINVAL) in gpmc_enable_hwecc()
859 return -EINVAL; in gpmc_enable_hwecc()
861 gpmc_ecc_used = cs; in gpmc_enable_hwecc()
868 val = ((((ecc_size >> 1) - 1) << 22) | (0x0000000F)); in gpmc_enable_hwecc()
886 /* (ECC 16 or 8 bit col) | ( CS ) | ECC Enable */ in gpmc_enable_hwecc()
887 val = (dev_width << 7) | (cs << 1) | (0x1); in gpmc_enable_hwecc()
893 * gpmc_calculate_ecc - generate non-inverted ecc bytes
894 * @cs: chip select number
898 * Using non-inverted ECC is considered ugly since writing a blank
904 int gpmc_calculate_ecc(int cs, const u_char *dat, u_char *ecc_code) in gpmc_calculate_ecc() argument
908 if (gpmc_ecc_used != cs) in gpmc_calculate_ecc()
909 return -EINVAL; in gpmc_calculate_ecc()
918 gpmc_ecc_used = -EINVAL; in gpmc_calculate_ecc()