Sun Jun 10 13:26:30 2018 UTC ()
Add fdtbus_clock_byname, which can be used by clock backends to
lookup clocks in other domains by "clock-output-names" property.
Not intended for ordinary driver use.


(jmcneill)
diff -r1.1 -r1.2 src/sys/dev/fdt/fdt_clock.c
diff -r1.32 -r1.33 src/sys/dev/fdt/fdtvar.h

cvs diff -r1.1 -r1.2 src/sys/dev/fdt/fdt_clock.c (expand / switch to unified diff)

--- src/sys/dev/fdt/fdt_clock.c 2015/12/22 21:42:11 1.1
+++ src/sys/dev/fdt/fdt_clock.c 2018/06/10 13:26:29 1.2
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: fdt_clock.c,v 1.1 2015/12/22 21:42:11 jmcneill Exp $ */ 1/* $NetBSD: fdt_clock.c,v 1.2 2018/06/10 13:26:29 jmcneill Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca> 4 * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -17,27 +17,27 @@ @@ -17,27 +17,27 @@
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE. 26 * SUCH DAMAGE.
27 */ 27 */
28 28
29#include <sys/cdefs.h> 29#include <sys/cdefs.h>
30__KERNEL_RCSID(0, "$NetBSD: fdt_clock.c,v 1.1 2015/12/22 21:42:11 jmcneill Exp $"); 30__KERNEL_RCSID(0, "$NetBSD: fdt_clock.c,v 1.2 2018/06/10 13:26:29 jmcneill Exp $");
31 31
32#include <sys/param.h> 32#include <sys/param.h>
33#include <sys/bus.h> 33#include <sys/bus.h>
34#include <sys/kmem.h> 34#include <sys/kmem.h>
35 35
36#include <libfdt.h> 36#include <libfdt.h>
37#include <dev/fdt/fdtvar.h> 37#include <dev/fdt/fdtvar.h>
38 38
39struct fdtbus_clock_controller { 39struct fdtbus_clock_controller {
40 device_t cc_dev; 40 device_t cc_dev;
41 int cc_phandle; 41 int cc_phandle;
42 const struct fdtbus_clock_controller_func *cc_funcs; 42 const struct fdtbus_clock_controller_func *cc_funcs;
43 43
@@ -146,13 +146,47 @@ fdtbus_clock_get(int phandle, const char @@ -146,13 +146,47 @@ fdtbus_clock_get(int phandle, const char
146 if (strcmp(p, clkname) == 0) { 146 if (strcmp(p, clkname) == 0) {
147 clk = fdtbus_clock_get_index(phandle, index); 147 clk = fdtbus_clock_get_index(phandle, index);
148 break; 148 break;
149 } 149 }
150 resid -= strlen(p); 150 resid -= strlen(p);
151 p += strlen(p) + 1; 151 p += strlen(p) + 1;
152 } 152 }
153 153
154 if (clock_names) 154 if (clock_names)
155 kmem_free(clock_names, len); 155 kmem_free(clock_names, len);
156 156
157 return clk; 157 return clk;
158} 158}
 159
 160/*
 161 * Search the DT for a clock by "clock-output-names" property.
 162 *
 163 * This should only be used by clk backends. Not for use by ordinary
 164 * clock consumers!
 165 */
 166struct clk *
 167fdtbus_clock_byname(const char *clkname)
 168{
 169 struct fdtbus_clock_controller *cc;
 170 u_int len, resid, index, clock_cells;
 171 const char *p;
 172
 173 for (cc = fdtbus_cc; cc; cc = cc->cc_next) {
 174 if (!of_hasprop(cc->cc_phandle, "clock-output-names"))
 175 continue;
 176 p = fdtbus_get_prop(cc->cc_phandle, "clock-output-names", &len);
 177 for (index = 0, resid = len; resid > 0; index++) {
 178 if (strcmp(p, clkname) == 0) {
 179 if (of_getprop_uint32(cc->cc_phandle, "#clock-cells", &clock_cells))
 180 break;
 181 const u_int index_raw = htobe32(index);
 182 return cc->cc_funcs->decode(cc->cc_dev,
 183 clock_cells > 0 ? &index_raw : NULL,
 184 clock_cells > 0 ? 4 : 0);
 185 }
 186 resid -= strlen(p) + 1;
 187 p += strlen(p) + 1;
 188 }
 189 }
 190
 191 return NULL;
 192}

cvs diff -r1.32 -r1.33 src/sys/dev/fdt/fdtvar.h (expand / switch to unified diff)

--- src/sys/dev/fdt/fdtvar.h 2018/05/15 10:17:55 1.32
+++ src/sys/dev/fdt/fdtvar.h 2018/06/10 13:26:29 1.33
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: fdtvar.h,v 1.32 2018/05/15 10:17:55 jmcneill Exp $ */ 1/* $NetBSD: fdtvar.h,v 1.33 2018/06/10 13:26:29 jmcneill Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca> 4 * Copyright (c) 2015 Jared D. McNeill <jmcneill@invisible.ca>
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
@@ -293,26 +293,27 @@ int fdtbus_regulator_set_voltage(struct @@ -293,26 +293,27 @@ int fdtbus_regulator_set_voltage(struct
293int fdtbus_regulator_get_voltage(struct fdtbus_regulator *, 293int fdtbus_regulator_get_voltage(struct fdtbus_regulator *,
294 u_int *); 294 u_int *);
295 295
296struct fdtbus_dma *fdtbus_dma_get(int, const char *, void (*)(void *), void *); 296struct fdtbus_dma *fdtbus_dma_get(int, const char *, void (*)(void *), void *);
297struct fdtbus_dma *fdtbus_dma_get_index(int, u_int, void (*)(void *), 297struct fdtbus_dma *fdtbus_dma_get_index(int, u_int, void (*)(void *),
298 void *); 298 void *);
299void fdtbus_dma_put(struct fdtbus_dma *); 299void fdtbus_dma_put(struct fdtbus_dma *);
300int fdtbus_dma_transfer(struct fdtbus_dma *, 300int fdtbus_dma_transfer(struct fdtbus_dma *,
301 struct fdtbus_dma_req *); 301 struct fdtbus_dma_req *);
302void fdtbus_dma_halt(struct fdtbus_dma *); 302void fdtbus_dma_halt(struct fdtbus_dma *);
303 303
304struct clk * fdtbus_clock_get(int, const char *); 304struct clk * fdtbus_clock_get(int, const char *);
305struct clk * fdtbus_clock_get_index(int, u_int); 305struct clk * fdtbus_clock_get_index(int, u_int);
 306struct clk * fdtbus_clock_byname(const char *);
306 307
307struct fdtbus_reset *fdtbus_reset_get(int, const char *); 308struct fdtbus_reset *fdtbus_reset_get(int, const char *);
308struct fdtbus_reset *fdtbus_reset_get_index(int, u_int); 309struct fdtbus_reset *fdtbus_reset_get_index(int, u_int);
309void fdtbus_reset_put(struct fdtbus_reset *); 310void fdtbus_reset_put(struct fdtbus_reset *);
310int fdtbus_reset_assert(struct fdtbus_reset *); 311int fdtbus_reset_assert(struct fdtbus_reset *);
311int fdtbus_reset_deassert(struct fdtbus_reset *); 312int fdtbus_reset_deassert(struct fdtbus_reset *);
312 313
313struct fdtbus_phy *fdtbus_phy_get(int, const char *); 314struct fdtbus_phy *fdtbus_phy_get(int, const char *);
314struct fdtbus_phy *fdtbus_phy_get_index(int, u_int); 315struct fdtbus_phy *fdtbus_phy_get_index(int, u_int);
315void fdtbus_phy_put(struct fdtbus_phy *); 316void fdtbus_phy_put(struct fdtbus_phy *);
316int fdtbus_phy_enable(struct fdtbus_phy *, bool); 317int fdtbus_phy_enable(struct fdtbus_phy *, bool);
317 318
318struct fdtbus_mmc_pwrseq *fdtbus_mmc_pwrseq_get(int); 319struct fdtbus_mmc_pwrseq *fdtbus_mmc_pwrseq_get(int);