| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * (C) 2019 Angelo Dureghello <angelo.dureghello@timesys.com> | |
| */ | |
| #include <asm/global_data.h> | |
| #include <linux/errno.h> | |
| #include <linux/libfdt.h> | |
| #include <fdt_support.h> | |
| DECLARE_GLOBAL_DATA_PTR; | |
| #if defined(CONFIG_MCFFEC) | |
| static int fec_get_node(int fec_idx) | |
| { | |
| char fec_alias[5] = {"fec"}; | |
| const char *path; | |
| int node; | |
| if (fec_idx > 1) { | |
| puts("Invalid MII base index"); | |
| return -ENOENT; | |
| } | |
| fec_alias[3] = fec_idx + '0'; | |
| path = fdt_get_alias(gd->fdt_blob, fec_alias); | |
| if (!path) { | |
| puts("Invalid MII path"); | |
| return -ENOENT; | |
| } | |
| node = fdt_path_offset(gd->fdt_blob, path); | |
| if (node < 0) | |
| return -ENOENT; | |
| return node; | |
| } | |
| int fec_get_fdt_prop(int fec_idx, const char *prop, u32 *value) | |
| { | |
| int node; | |
| const u32 *val; | |
| node = fec_get_node(fec_idx); | |
| if (node < 0) | |
| return node; | |
| val = fdt_getprop(gd->fdt_blob, node, prop, NULL); | |
| if (!val) | |
| return -ENOENT; | |
| *value = fdt32_to_cpu(*val); | |
| return 0; | |
| } | |
| int fec_get_base_addr(int fec_idx, u32 *fec_iobase) | |
| { | |
| int node; | |
| fdt_size_t size; | |
| fdt_addr_t addr; | |
| node = fec_get_node(fec_idx); | |
| if (node < 0) | |
| return node; | |
| addr = fdtdec_get_addr_size(gd->fdt_blob, node, "reg", &size); | |
| *fec_iobase = (u32)addr; | |
| return 0; | |
| } | |
| int fec_get_mii_base(int fec_idx, u32 *mii_base) | |
| { | |
| return fec_get_fdt_prop(fec_idx, "mii-base", mii_base); | |
| } | |
| #endif //CONFIG_MCFFEC |