1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| static int stm32_fmc_of_to_plat(struct udevice *dev) { struct stm32_sdram_params *params = dev_get_plat(dev); struct bank_params *bank_params; struct ofnode_phandle_args args; u32 *syscfg_base; u32 mem_remap; u32 swp_fmc; ofnode bank_node; char *bank_name; char _bank_name[128] = {0}; u8 bank = 0; int ret;
ret = dev_read_phandle_with_args(dev, "st,syscfg", NULL, 0, 0, &args); if (ret) { dev_dbg(dev, "can't find syscon device (%d)\n", ret); }
dev_for_each_subnode(bank_node, dev) { bank_name = (char *)ofnode_get_name(bank_node); strlcpy(_bank_name, bank_name, sizeof(_bank_name)); bank_name = (char *)_bank_name; strsep(&bank_name, "@"); if (!bank_name) { pr_err("missing sdram bank index"); return -EINVAL; }
bank_params = ¶ms->bank_params[bank]; strict_strtoul(bank_name, 10, (long unsigned int *)&bank_params->target_bank);
if (bank_params->target_bank >= MAX_SDRAM_BANK) { pr_err("Found bank %d , but only bank 0 and 1 are supported", bank_params->target_bank); return -EINVAL; }
debug("Find bank %s %u\n", bank_name, bank_params->target_bank);
params->bank_params[bank].sdram_control = (struct stm32_sdram_control *) ofnode_read_u8_array_ptr(bank_node, "st,sdram-control", sizeof(struct stm32_sdram_control));
if (!params->bank_params[bank].sdram_control) { pr_err("st,sdram-control not found for %s", ofnode_get_name(bank_node)); return -EINVAL; }
params->bank_params[bank].sdram_timing = (struct stm32_sdram_timing *) ofnode_read_u8_array_ptr(bank_node, "st,sdram-timing", sizeof(struct stm32_sdram_timing));
if (!params->bank_params[bank].sdram_timing) { pr_err("st,sdram-timing not found for %s", ofnode_get_name(bank_node)); return -EINVAL; }
bank_params->sdram_ref_count = ofnode_read_u32_default(bank_node, "st,sdram-refcount", 8196); bank++; }
params->no_sdram_banks = bank; dev_dbg(dev, "no of banks = %d\n", params->no_sdram_banks);
return 0; }
|