diff options
author | Tom Rini <trini@konsulko.com> | 2020-01-10 16:38:40 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2020-01-10 16:38:40 -0500 |
commit | ef2f0d323652c1162937df668b33b3bfe0ca3904 (patch) | |
tree | f957b7e9edcf79403f8a582d17dc4103f293fc10 /arch/m68k/lib/fec.c | |
parent | c00bd81ae0d6eb1f94e26b31be3a64cadaa05bcb (diff) | |
parent | 4f731c795d75aee548f6886f4f0da0a49a99354d (diff) |
Merge branch '2020-01-10-master-imports'
- Android image support enhancements
- Assorted ARM fixes and enhancements
- m68k update
Diffstat (limited to 'arch/m68k/lib/fec.c')
-rw-r--r-- | arch/m68k/lib/fec.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/arch/m68k/lib/fec.c b/arch/m68k/lib/fec.c new file mode 100644 index 0000000000..dde353ad17 --- /dev/null +++ b/arch/m68k/lib/fec.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) 2019 Angelo Dureghello <angelo.dureghello@timesys.com> + */ + +#include <common.h> +#include <linux/libfdt.h> +#include <fdt_support.h> + +DECLARE_GLOBAL_DATA_PTR; + +#if defined(CONFIG_MCFFEC) || defined(CONFIG_FSLDMAFEC) +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 || CONFIG_FSLDMAFEC |