Module Name: src Committed By: jakllsch Date: Wed Feb 27 16:56:00 UTC 2019
Modified Files: src/sys/dev/fdt: fdt_clock.c fdt_dma.c fdt_phy.c fdt_pinctrl.c fdt_reset.c fdt_subr.c fdtvar.h Log Message: Consolidate FDT [find "names" index by string] logic. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/dev/fdt/fdt_clock.c \ src/sys/dev/fdt/fdt_pinctrl.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/fdt/fdt_dma.c \ src/sys/dev/fdt/fdt_reset.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/fdt/fdt_phy.c cvs rdiff -u -r1.28 -r1.29 src/sys/dev/fdt/fdt_subr.c cvs rdiff -u -r1.48 -r1.49 src/sys/dev/fdt/fdtvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/fdt/fdt_clock.c diff -u src/sys/dev/fdt/fdt_clock.c:1.7 src/sys/dev/fdt/fdt_clock.c:1.8 --- src/sys/dev/fdt/fdt_clock.c:1.7 Wed Feb 27 16:30:40 2019 +++ src/sys/dev/fdt/fdt_clock.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_clock.c,v 1.7 2019/02/27 16:30:40 jakllsch Exp $ */ +/* $NetBSD: fdt_clock.c,v 1.8 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_clock.c,v 1.7 2019/02/27 16:30:40 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_clock.c,v 1.8 2019/02/27 16:56:00 jakllsch Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -123,25 +123,14 @@ fdtbus_clock_get_index(int phandle, u_in static struct clk * fdtbus_clock_get_prop(int phandle, const char *clkname, const char *prop) { - struct clk *clk = NULL; - const char *p; u_int index; - int len, resid; + int err; - p = fdtbus_get_prop(phandle, prop, &len); - if (p == NULL) + err = fdtbus_get_index(phandle, prop, clkname, &index); + if (err != 0) return NULL; - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, clkname) == 0) { - clk = fdtbus_clock_get_index(phandle, index); - break; - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } - - return clk; + return fdtbus_clock_get_index(phandle, index); } static u_int @@ -182,26 +171,20 @@ struct clk * fdtbus_clock_byname(const char *clkname) { struct fdtbus_clock_controller *cc; - u_int len, resid, index, clock_cells; - const char *p; + u_int index, clock_cells; + int err; LIST_FOREACH(cc, &fdtbus_clock_controllers, cc_next) { - if (!of_hasprop(cc->cc_phandle, "clock-output-names")) + err = fdtbus_get_index(cc->cc_phandle, "clock-output-names", clkname, &index); + if (err != 0) continue; - p = fdtbus_get_prop(cc->cc_phandle, "clock-output-names", &len); - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, clkname) == 0) { - if (of_getprop_uint32(cc->cc_phandle, "#clock-cells", &clock_cells)) - break; - const u_int index_raw = htobe32(index); - return cc->cc_funcs->decode(cc->cc_dev, - cc->cc_phandle, - clock_cells > 0 ? &index_raw : NULL, - clock_cells > 0 ? 4 : 0); - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } + if (of_getprop_uint32(cc->cc_phandle, "#clock-cells", &clock_cells)) + continue; + const u_int index_raw = htobe32(index); + return cc->cc_funcs->decode(cc->cc_dev, + cc->cc_phandle, + clock_cells > 0 ? &index_raw : NULL, + clock_cells > 0 ? 4 : 0); } return NULL; Index: src/sys/dev/fdt/fdt_pinctrl.c diff -u src/sys/dev/fdt/fdt_pinctrl.c:1.7 src/sys/dev/fdt/fdt_pinctrl.c:1.8 --- src/sys/dev/fdt/fdt_pinctrl.c:1.7 Wed Jan 23 04:23:01 2019 +++ src/sys/dev/fdt/fdt_pinctrl.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_pinctrl.c,v 1.7 2019/01/23 04:23:01 thorpej Exp $ */ +/* $NetBSD: fdt_pinctrl.c,v 1.8 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2019 Jason R. Thorpe @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.7 2019/01/23 04:23:01 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.8 2019/02/27 16:56:00 jakllsch Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -118,22 +118,14 @@ fdtbus_pinctrl_set_config_index(int phan int fdtbus_pinctrl_set_config(int phandle, const char *cfgname) { - const char *pinctrl_names, *name; - int len, index; + u_int index; + int err; - if ((len = OF_getproplen(phandle, "pinctrl-names")) < 0) + err = fdtbus_get_index(phandle, "pinctrl-names", cfgname, &index); + if (err != 0) return -1; - pinctrl_names = fdtbus_get_string(phandle, "pinctrl-names"); - - for (name = pinctrl_names, index = 0; len > 0; - len -= strlen(name) + 1, name += strlen(name) + 1, index++) { - if (strcmp(name, cfgname) == 0) - return fdtbus_pinctrl_set_config_index(phandle, index); - } - - /* Not found */ - return -1; + return fdtbus_pinctrl_set_config_index(phandle, index); } static void Index: src/sys/dev/fdt/fdt_dma.c diff -u src/sys/dev/fdt/fdt_dma.c:1.3 src/sys/dev/fdt/fdt_dma.c:1.4 --- src/sys/dev/fdt/fdt_dma.c:1.3 Wed Feb 27 16:30:40 2019 +++ src/sys/dev/fdt/fdt_dma.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_dma.c,v 1.3 2019/02/27 16:30:40 jakllsch Exp $ */ +/* $NetBSD: fdt_dma.c,v 1.4 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_dma.c,v 1.3 2019/02/27 16:30:40 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_dma.c,v 1.4 2019/02/27 16:56:00 jakllsch Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -132,36 +132,14 @@ done: struct fdtbus_dma * fdtbus_dma_get(int phandle, const char *name, void (*cb)(void *), void *cbarg) { - struct fdtbus_dma *dma = NULL; - char *dma_names = NULL; - const char *p; u_int index; - int len, resid; - - len = OF_getproplen(phandle, "dma-names"); - if (len <= 0) - return NULL; + int err; - dma_names = kmem_alloc(len, KM_SLEEP); - if (OF_getprop(phandle, "dma-names", dma_names, len) != len) { - kmem_free(dma_names, len); + err = fdtbus_get_index(phandle, "dma-names", name, &index); + if (err != 0) return NULL; - } - p = dma_names; - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, name) == 0) { - dma = fdtbus_dma_get_index(phandle, index, cb, cbarg); - break; - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } - - if (dma_names) - kmem_free(dma_names, len); - - return dma; + return fdtbus_dma_get_index(phandle, index, cb, cbarg); } void Index: src/sys/dev/fdt/fdt_reset.c diff -u src/sys/dev/fdt/fdt_reset.c:1.3 src/sys/dev/fdt/fdt_reset.c:1.4 --- src/sys/dev/fdt/fdt_reset.c:1.3 Wed Feb 27 16:30:40 2019 +++ src/sys/dev/fdt/fdt_reset.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_reset.c,v 1.3 2019/02/27 16:30:40 jakllsch Exp $ */ +/* $NetBSD: fdt_reset.c,v 1.4 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_reset.c,v 1.3 2019/02/27 16:30:40 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_reset.c,v 1.4 2019/02/27 16:56:00 jakllsch Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -131,36 +131,14 @@ done: struct fdtbus_reset * fdtbus_reset_get(int phandle, const char *rstname) { - struct fdtbus_reset *rst = NULL; - char *reset_names = NULL; - const char *p; u_int index; - int len, resid; - - len = OF_getproplen(phandle, "reset-names"); - if (len <= 0) - return NULL; + int err; - reset_names = kmem_alloc(len, KM_SLEEP); - if (OF_getprop(phandle, "reset-names", reset_names, len) != len) { - kmem_free(reset_names, len); + err = fdtbus_get_index(phandle, "reset-names", rstname, &index); + if (err != 0) return NULL; - } - p = reset_names; - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, rstname) == 0) { - rst = fdtbus_reset_get_index(phandle, index); - break; - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } - - if (reset_names) - kmem_free(reset_names, len); - - return rst; + return fdtbus_reset_get_index(phandle, index); } void Index: src/sys/dev/fdt/fdt_phy.c diff -u src/sys/dev/fdt/fdt_phy.c:1.4 src/sys/dev/fdt/fdt_phy.c:1.5 --- src/sys/dev/fdt/fdt_phy.c:1.4 Wed Feb 27 16:30:40 2019 +++ src/sys/dev/fdt/fdt_phy.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_phy.c,v 1.4 2019/02/27 16:30:40 jakllsch Exp $ */ +/* $NetBSD: fdt_phy.c,v 1.5 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_phy.c,v 1.4 2019/02/27 16:30:40 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_phy.c,v 1.5 2019/02/27 16:56:00 jakllsch Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -131,36 +131,14 @@ done: struct fdtbus_phy * fdtbus_phy_get(int phandle, const char *phyname) { - struct fdtbus_phy *phy = NULL; - char *phy_names = NULL; - const char *p; u_int index; - int len, resid; - - len = OF_getproplen(phandle, "phy-names"); - if (len <= 0) - return NULL; + int err; - phy_names = kmem_alloc(len, KM_SLEEP); - if (OF_getprop(phandle, "phy-names", phy_names, len) != len) { - kmem_free(phy_names, len); + err = fdtbus_get_index(phandle, "phy-names", phyname, &index); + if (err != 0) return NULL; - } - p = phy_names; - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, phyname) == 0) { - phy = fdtbus_phy_get_index(phandle, index); - break; - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } - - if (phy_names) - kmem_free(phy_names, len); - - return phy; + return fdtbus_phy_get_index(phandle, index); } void Index: src/sys/dev/fdt/fdt_subr.c diff -u src/sys/dev/fdt/fdt_subr.c:1.28 src/sys/dev/fdt/fdt_subr.c:1.29 --- src/sys/dev/fdt/fdt_subr.c:1.28 Wed Feb 27 16:30:40 2019 +++ src/sys/dev/fdt/fdt_subr.c Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_subr.c,v 1.28 2019/02/27 16:30:40 jakllsch Exp $ */ +/* $NetBSD: fdt_subr.c,v 1.29 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_subr.c,v 1.28 2019/02/27 16:30:40 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_subr.c,v 1.29 2019/02/27 16:56:00 jakllsch Exp $"); #include "opt_fdt.h" @@ -215,26 +215,14 @@ int fdtbus_get_reg_byname(int phandle, const char *name, bus_addr_t *paddr, bus_size_t *psize) { - const char *reg_names, *p; u_int index; - int len, resid; - int error = ENOENT; - - reg_names = fdtbus_get_prop(phandle, "reg-names", &len); - if (len <= 0) - return error; + int error; - p = reg_names; - for (index = 0, resid = len; resid > 0; index++) { - if (strcmp(p, name) == 0) { - error = fdtbus_get_reg(phandle, index, paddr, psize); - break; - } - resid -= strlen(p) + 1; - p += strlen(p) + 1; - } + error = fdtbus_get_index(phandle, "reg-names", name, &index); + if (error != 0) + return ENOENT; - return error; + return fdtbus_get_reg(phandle, index, paddr, psize); } int @@ -480,3 +468,26 @@ fdtbus_get_string_index(int phandle, con return NULL; } + +int +fdtbus_get_index(int phandle, const char *prop, const char *name, u_int *idx) +{ + const char *p; + size_t pl; + u_int index; + int len; + + p = fdtbus_get_prop(phandle, prop, &len); + if (p == NULL || len <= 0) + return -1; + + for (index = 0; len > 0; + pl = strlen(p) + 1, len -= pl, p += pl, index++) { + if (strcmp(p, name) == 0) { + *idx = index; + return 0; + } + } + + return -1; +} Index: src/sys/dev/fdt/fdtvar.h diff -u src/sys/dev/fdt/fdtvar.h:1.48 src/sys/dev/fdt/fdtvar.h:1.49 --- src/sys/dev/fdt/fdtvar.h:1.48 Wed Jan 30 01:24:00 2019 +++ src/sys/dev/fdt/fdtvar.h Wed Feb 27 16:56:00 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fdtvar.h,v 1.48 2019/01/30 01:24:00 jmcneill Exp $ */ +/* $NetBSD: fdtvar.h,v 1.49 2019/02/27 16:56:00 jakllsch Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -379,6 +379,7 @@ bool fdtbus_status_okay(int); const void * fdtbus_get_prop(int, const char *, int *); const char * fdtbus_get_string(int, const char *); const char * fdtbus_get_string_index(int, const char *, u_int); +int fdtbus_get_index(int, const char *, const char *, u_int *); void fdt_add_bus(device_t, int, struct fdt_attach_args *); void fdt_add_bus_match(device_t, int, struct fdt_attach_args *,