unsigned long get_tbclk (void) { void *fdt = get_fdt_virt(); int cpus_node = fdt_path_offset(fdt, "/cpus"); int cpu_node = fdt_first_subnode(fdt, cpus_node); const char *prop = "timebase-frequency"; return fdt_getprop_u32_default_node(fdt, cpu_node, 0, prop, 0); }
static uint32_t get_cpu_freq(void) { void *fdt = get_fdt_virt(); int cpus_node = fdt_path_offset(fdt, "/cpus"); int cpu_node = fdt_first_subnode(fdt, cpus_node); const char *prop = "clock-frequency"; return fdt_getprop_u32_default_node(fdt, cpu_node, 0, prop, 0); }
/** * fdt_getprop_u32_default - Find a node and return it's property or a default * * @fdt: ptr to device tree * @path: path of node * @prop: property name * @dflt: default value if the property isn't found * * Convenience function to find a node and return it's property or a * default value if it doesn't exist. */ u32 fdt_getprop_u32_default(const void *fdt, const char *path, const char *prop, const u32 dflt) { int off; off = fdt_path_offset(fdt, path); if (off < 0) return dflt; return fdt_getprop_u32_default_node(fdt, off, 0, prop, dflt); }
static int sun4i_spi_parse_pins(struct udevice *dev) { const void *fdt = gd->fdt_blob; const char *pin_name; const fdt32_t *list; u32 phandle; int drive, pull = 0, pin, i; int offset; int size; list = fdt_getprop(fdt, dev_of_offset(dev), "pinctrl-0", &size); if (!list) { printf("WARNING: sun4i_spi: cannot find pinctrl-0 node\n"); return -EINVAL; } while (size) { phandle = fdt32_to_cpu(*list++); size -= sizeof(*list); offset = fdt_node_offset_by_phandle(fdt, phandle); if (offset < 0) return offset; drive = fdt_getprop_u32_default_node(fdt, offset, 0, "drive-strength", 0); if (drive) { if (drive <= 10) drive = 0; else if (drive <= 20) drive = 1; else if (drive <= 30) drive = 2; else drive = 3; } else { drive = fdt_getprop_u32_default_node(fdt, offset, 0, "allwinner,drive", 0); drive = min(drive, 3); } if (fdt_get_property(fdt, offset, "bias-disable", NULL)) pull = 0; else if (fdt_get_property(fdt, offset, "bias-pull-up", NULL)) pull = 1; else if (fdt_get_property(fdt, offset, "bias-pull-down", NULL)) pull = 2; else pull = fdt_getprop_u32_default_node(fdt, offset, 0, "allwinner,pull", 0); pull = min(pull, 2); for (i = 0; ; i++) { pin_name = fdt_stringlist_get(fdt, offset, "pins", i, NULL); if (!pin_name) { pin_name = fdt_stringlist_get(fdt, offset, "allwinner,pins", i, NULL); if (!pin_name) break; } pin = name_to_gpio(pin_name); if (pin < 0) break; sunxi_gpio_set_cfgpin(pin, SUNXI_GPC_SPI0); sunxi_gpio_set_drv(pin, drive); sunxi_gpio_set_pull(pin, pull); } } return 0; }