Lines Matching full:cs
204 /* Structure to save gpmc cs context */
265 void gpmc_cs_write_reg(int cs, int idx, u32 val) in gpmc_cs_write_reg() argument
269 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_write_reg()
273 static u32 gpmc_cs_read_reg(int cs, int idx) in gpmc_cs_read_reg() argument
277 reg_addr = gpmc_base + GPMC_CS0_OFFSET + (cs * GPMC_CS_SIZE) + idx; in gpmc_cs_read_reg()
294 * @cs Chip Select Region.
297 * GPMC_CS_CONFIG1 GPMCFCLKDIVIDER for cs has to be setup
300 static unsigned long gpmc_get_clk_period(int cs, enum gpmc_clk_domain cd) in gpmc_get_clk_period() argument
310 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_get_clk_period()
325 static unsigned int gpmc_ns_to_clk_ticks(unsigned int time_ns, int cs, in gpmc_ns_to_clk_ticks() argument
331 tick_ps = gpmc_get_clk_period(cs, cd); in gpmc_ns_to_clk_ticks()
338 return gpmc_ns_to_clk_ticks(time_ns, /* any CS */ 0, GPMC_CD_FCLK); in gpmc_ns_to_ticks()
351 static unsigned int gpmc_clk_ticks_to_ns(unsigned int ticks, int cs, in gpmc_clk_ticks_to_ns() argument
354 return ticks * gpmc_get_clk_period(cs, cd) / 1000; in gpmc_clk_ticks_to_ns()
359 return gpmc_clk_ticks_to_ns(ticks, /* any CS */ 0, GPMC_CD_FCLK); in gpmc_ticks_to_ns()
374 static inline void gpmc_cs_modify_reg(int cs, int reg, u32 mask, bool value) in gpmc_cs_modify_reg() argument
378 l = gpmc_cs_read_reg(cs, reg); in gpmc_cs_modify_reg()
383 gpmc_cs_write_reg(cs, reg, l); in gpmc_cs_modify_reg()
386 static void gpmc_cs_bool_timings(int cs, const struct gpmc_bool_timings *p) in gpmc_cs_bool_timings() argument
388 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG1, in gpmc_cs_bool_timings()
391 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG2, in gpmc_cs_bool_timings()
393 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG3, in gpmc_cs_bool_timings()
395 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, in gpmc_cs_bool_timings()
397 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4, in gpmc_cs_bool_timings()
399 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6, in gpmc_cs_bool_timings()
402 gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6, in gpmc_cs_bool_timings()
410 * @cs: Chip Select Region
430 int cs, int reg, int st_bit, int end_bit, int max, in get_gpmc_timing_reg() argument
442 l = gpmc_cs_read_reg(cs, reg); in get_gpmc_timing_reg()
459 time_ns_min = gpmc_clk_ticks_to_ns(l - 1, cs, cd) + 1; in get_gpmc_timing_reg()
460 time_ns = gpmc_clk_ticks_to_ns(l, cs, cd); in get_gpmc_timing_reg()
473 #define GPMC_PRINT_CONFIG(cs, config) \ argument
474 pr_info("cs%i %s: 0x%08x\n", cs, #config, \
475 gpmc_cs_read_reg(cs, config))
477 get_gpmc_timing_reg(cs, (reg), (st), (end), 0, field, GPMC_CD_FCLK, 0, 1, 0)
479 get_gpmc_timing_reg(cs, (reg), (st), (end), (max), field, GPMC_CD_FCLK, 0, 1, 0)
481 get_gpmc_timing_reg(cs, (reg), (st), (end), 0, field, GPMC_CD_FCLK, 0, 1, 1)
483 get_gpmc_timing_reg(cs, (reg), (st), (end), (max), field, GPMC_CD_FCLK, (shift), 1, 1)
485 get_gpmc_timing_reg(cs, (reg), (st), (end), 0, field, GPMC_CD_FCLK, 0, 0, 0)
487 get_gpmc_timing_reg(cs, (reg), (st), (end), 0, field, (cd), 0, 0, 0)
489 get_gpmc_timing_reg(cs, (reg), (st), (end), (max), field, (cd), 0, 0, 0)
491 static void gpmc_show_regs(int cs, const char *desc) in gpmc_show_regs() argument
493 pr_info("gpmc cs%i %s:\n", cs, desc); in gpmc_show_regs()
494 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG1); in gpmc_show_regs()
495 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG2); in gpmc_show_regs()
496 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG3); in gpmc_show_regs()
497 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG4); in gpmc_show_regs()
498 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG5); in gpmc_show_regs()
499 GPMC_PRINT_CONFIG(cs, GPMC_CS_CONFIG6); in gpmc_show_regs()
506 static void gpmc_cs_show_timings(int cs, const char *desc) in gpmc_cs_show_timings() argument
508 gpmc_show_regs(cs, desc); in gpmc_cs_show_timings()
510 pr_info("gpmc cs%i access configuration:\n", cs); in gpmc_cs_show_timings()
527 GPMC_GET_RAW_BOOL(GPMC_CS_CONFIG2, 7, 7, "cs-extra-delay"); in gpmc_cs_show_timings()
537 pr_info("gpmc cs%i timings configuration:\n", cs); in gpmc_cs_show_timings()
538 GPMC_GET_TICKS(GPMC_CS_CONFIG2, 0, 3, "cs-on-ns"); in gpmc_cs_show_timings()
539 GPMC_GET_TICKS(GPMC_CS_CONFIG2, 8, 12, "cs-rd-off-ns"); in gpmc_cs_show_timings()
540 GPMC_GET_TICKS(GPMC_CS_CONFIG2, 16, 20, "cs-wr-off-ns"); in gpmc_cs_show_timings()
582 static inline void gpmc_cs_show_timings(int cs, const char *desc) in gpmc_cs_show_timings() argument
592 * @cs: Chip Select Region.
603 static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, int max, in set_gpmc_timing_reg() argument
612 ticks = gpmc_ns_to_clk_ticks(time, cs, cd); in set_gpmc_timing_reg()
620 pr_err("%s: GPMC CS%d: %s %d ns, %d ticks > %d ticks\n", in set_gpmc_timing_reg()
621 __func__, cs, name, time, ticks, max); in set_gpmc_timing_reg()
626 l = gpmc_cs_read_reg(cs, reg); in set_gpmc_timing_reg()
629 "GPMC CS%d: %-17s: %3d ticks, %3lu ns (was %3i ticks) %3d ns\n", in set_gpmc_timing_reg()
630 cs, name, ticks, gpmc_get_clk_period(cs, cd) * ticks / 1000, in set_gpmc_timing_reg()
635 gpmc_cs_write_reg(cs, reg, l); in set_gpmc_timing_reg()
641 if (set_gpmc_timing_reg(cs, (reg), (st), (end), (max), \
700 * @cs: Chip Select Region.
705 int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t, in gpmc_cs_set_timings() argument
778 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); in gpmc_cs_set_timings()
781 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); in gpmc_cs_set_timings()
791 pr_info("GPMC CS%d CLK period is %lu ns (div %d)\n", in gpmc_cs_set_timings()
792 cs, (div * gpmc_get_fclk_period()) / 1000, div); in gpmc_cs_set_timings()
795 gpmc_cs_bool_timings(cs, &t->bool_timings); in gpmc_cs_set_timings()
796 gpmc_cs_show_timings(cs, "after gpmc_cs_set_timings"); in gpmc_cs_set_timings()
801 static int gpmc_cs_set_memconf(int cs, u32 base, u32 size) in gpmc_cs_set_memconf() argument
818 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_set_memconf()
823 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); in gpmc_cs_set_memconf()
828 static void gpmc_cs_enable_mem(int cs) in gpmc_cs_enable_mem() argument
832 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_enable_mem()
834 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); in gpmc_cs_enable_mem()
837 static void gpmc_cs_disable_mem(int cs) in gpmc_cs_disable_mem() argument
841 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_disable_mem()
843 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); in gpmc_cs_disable_mem()
846 static void gpmc_cs_get_memconf(int cs, u32 *base, u32 *size) in gpmc_cs_get_memconf() argument
851 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_get_memconf()
857 static int gpmc_cs_mem_enabled(int cs) in gpmc_cs_mem_enabled() argument
861 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); in gpmc_cs_mem_enabled()
865 static void gpmc_cs_set_reserved(int cs, int reserved) in gpmc_cs_set_reserved() argument
867 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_set_reserved()
872 static bool gpmc_cs_reserved(int cs) in gpmc_cs_reserved() argument
874 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_reserved()
879 static void gpmc_cs_set_name(int cs, const char *name) in gpmc_cs_set_name() argument
881 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_set_name()
886 static const char *gpmc_cs_get_name(int cs) in gpmc_cs_get_name() argument
888 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_get_name()
907 static int gpmc_cs_insert_mem(int cs, unsigned long base, unsigned long size) in gpmc_cs_insert_mem() argument
909 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_insert_mem()
923 static int gpmc_cs_delete_mem(int cs) in gpmc_cs_delete_mem() argument
925 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_delete_mem()
940 * @cs: chip-select to remap
947 static int gpmc_cs_remap(int cs, u32 base) in gpmc_cs_remap() argument
952 if (cs > gpmc_cs_num) { in gpmc_cs_remap()
964 gpmc_cs_get_memconf(cs, &old_base, &size); in gpmc_cs_remap()
968 ret = gpmc_cs_delete_mem(cs); in gpmc_cs_remap()
972 ret = gpmc_cs_insert_mem(cs, base, size); in gpmc_cs_remap()
976 ret = gpmc_cs_set_memconf(cs, base, size); in gpmc_cs_remap()
981 int gpmc_cs_request(int cs, unsigned long size, unsigned long *base) in gpmc_cs_request() argument
983 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_request()
987 if (cs > gpmc_cs_num) { in gpmc_cs_request()
996 if (gpmc_cs_reserved(cs)) { in gpmc_cs_request()
1000 if (gpmc_cs_mem_enabled(cs)) in gpmc_cs_request()
1008 /* Disable CS while changing base address and size mask */ in gpmc_cs_request()
1009 gpmc_cs_disable_mem(cs); in gpmc_cs_request()
1011 r = gpmc_cs_set_memconf(cs, res->start, resource_size(res)); in gpmc_cs_request()
1017 /* Enable CS */ in gpmc_cs_request()
1018 gpmc_cs_enable_mem(cs); in gpmc_cs_request()
1020 gpmc_cs_set_reserved(cs, 1); in gpmc_cs_request()
1027 void gpmc_cs_free(int cs) in gpmc_cs_free() argument
1029 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_free()
1033 if (cs >= gpmc_cs_num || cs < 0 || !gpmc_cs_reserved(cs)) { in gpmc_cs_free()
1034 printk(KERN_ERR "Trying to free non-reserved GPMC CS%d\n", cs); in gpmc_cs_free()
1039 gpmc_cs_disable_mem(cs); in gpmc_cs_free()
1042 gpmc_cs_set_reserved(cs, 0); in gpmc_cs_free()
1091 * @cs: GPMC chip select number on which the NAND sits. The
1094 * Returns NULL on error e.g. invalid cs.
1096 struct gpmc_nand_ops *gpmc_omap_get_nand_ops(struct gpmc_nand_regs *reg, int cs) in gpmc_omap_get_nand_ops() argument
1100 if (cs >= gpmc_cs_num) in gpmc_omap_get_nand_ops()
1104 GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs; in gpmc_omap_get_nand_ops()
1106 GPMC_CS_NAND_ADDRESS + GPMC_CS_SIZE * cs; in gpmc_omap_get_nand_ops()
1108 GPMC_CS_NAND_DATA + GPMC_CS_SIZE * cs; in gpmc_omap_get_nand_ops()
1218 int gpmc_omap_onenand_set_timings(struct device *dev, int cs, int freq, in gpmc_omap_onenand_set_timings() argument
1237 ret = gpmc_cs_program_settings(cs, &gpmc_s); in gpmc_omap_onenand_set_timings()
1241 return gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s); in gpmc_omap_onenand_set_timings()
1461 int cs; in gpmc_mem_exit() local
1463 for (cs = 0; cs < gpmc_cs_num; cs++) { in gpmc_mem_exit()
1464 if (!gpmc_cs_mem_enabled(cs)) in gpmc_mem_exit()
1466 gpmc_cs_delete_mem(cs); in gpmc_mem_exit()
1473 int cs; in gpmc_mem_init() local
1479 for (cs = 0; cs < gpmc_cs_num; cs++) { in gpmc_mem_init()
1482 if (!gpmc_cs_mem_enabled(cs)) in gpmc_mem_init()
1484 gpmc_cs_get_memconf(cs, &base, &size); in gpmc_mem_init()
1485 if (gpmc_cs_insert_mem(cs, base, size)) { in gpmc_mem_init()
1486 pr_warn("%s: disabling cs %d mapped at 0x%x-0x%x\n", in gpmc_mem_init()
1487 __func__, cs, base, base + size); in gpmc_mem_init()
1488 gpmc_cs_disable_mem(cs); in gpmc_mem_init()
1817 * @cs: GPMC chip-select to program
1827 int gpmc_cs_program_settings(int cs, struct gpmc_settings *p) in gpmc_cs_program_settings() argument
1893 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, config1); in gpmc_cs_program_settings()
1961 of_property_read_u32(np, "gpmc,cs-on-ns", &gpmc_t->cs_on); in gpmc_read_timings_dt()
1962 of_property_read_u32(np, "gpmc,cs-rd-off-ns", &gpmc_t->cs_rd_off); in gpmc_read_timings_dt()
1963 of_property_read_u32(np, "gpmc,cs-wr-off-ns", &gpmc_t->cs_wr_off); in gpmc_read_timings_dt()
2018 p->cs_extra_delay = of_property_read_bool(np, "gpmc,cs-extra-delay"); in gpmc_read_timings_dt()
2039 int ret, cs; in gpmc_probe_generic_child() local
2044 if (of_property_read_u32(child, "reg", &cs) < 0) { in gpmc_probe_generic_child()
2061 name = gpmc_cs_get_name(cs); in gpmc_probe_generic_child()
2065 ret = gpmc_cs_request(cs, resource_size(&res), &base); in gpmc_probe_generic_child()
2067 dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs); in gpmc_probe_generic_child()
2070 gpmc_cs_set_name(cs, child->full_name); in gpmc_probe_generic_child()
2081 WARN(1, "enable GPMC debug to configure .dts timings for CS%i\n", in gpmc_probe_generic_child()
2082 cs); in gpmc_probe_generic_child()
2083 gpmc_cs_show_timings(cs, in gpmc_probe_generic_child()
2088 /* CS must be disabled while making changes to gpmc configuration */ in gpmc_probe_generic_child()
2089 gpmc_cs_disable_mem(cs); in gpmc_probe_generic_child()
2092 * FIXME: gpmc_cs_request() will map the CS to an arbitary in gpmc_probe_generic_child()
2096 * CS to this location. Once DT migration is complete should in gpmc_probe_generic_child()
2099 ret = gpmc_cs_remap(cs, res.start); in gpmc_probe_generic_child()
2101 dev_err(&pdev->dev, "cannot remap GPMC CS %d to %pa\n", in gpmc_probe_generic_child()
2102 cs, &res.start); in gpmc_probe_generic_child()
2105 "GPMC CS %d start cannot be lesser than 0x%x\n", in gpmc_probe_generic_child()
2106 cs, GPMC_MEM_START); in gpmc_probe_generic_child()
2109 "GPMC CS %d end cannot be greater than 0x%x\n", in gpmc_probe_generic_child()
2110 cs, GPMC_MEM_END); in gpmc_probe_generic_child()
2182 gpmc_cs_show_timings(cs, "before gpmc_cs_program_settings"); in gpmc_probe_generic_child()
2184 ret = gpmc_cs_program_settings(cs, &gpmc_s); in gpmc_probe_generic_child()
2188 ret = gpmc_cs_set_timings(cs, &gpmc_t, &gpmc_s); in gpmc_probe_generic_child()
2200 /* Enable CS region */ in gpmc_probe_generic_child()
2201 gpmc_cs_enable_mem(cs); in gpmc_probe_generic_child()
2225 gpmc_cs_free(cs); in gpmc_probe_generic_child()
2239 ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-cs", in gpmc_probe_dt()