Module Name: src Committed By: jmcneill Date: Sat Dec 5 13:31:07 UTC 2015
Modified Files: src/sys/conf: files Added Files: src/sys/dev/clk: clk.c clk.h clk_backend.h files.clk Log Message: Add basic clock device infrastructure. To generate a diff of this commit: cvs rdiff -u -r1.1150 -r1.1151 src/sys/conf/files cvs rdiff -u -r0 -r1.1 src/sys/dev/clk/clk.c src/sys/dev/clk/clk.h \ src/sys/dev/clk/clk_backend.h src/sys/dev/clk/files.clk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/conf/files diff -u src/sys/conf/files:1.1150 src/sys/conf/files:1.1151 --- src/sys/conf/files:1.1150 Fri Sep 4 06:10:47 2015 +++ src/sys/conf/files Sat Dec 5 13:31:07 2015 @@ -1,4 +1,4 @@ -# $NetBSD: files,v 1.1150 2015/09/04 06:10:47 uebayasi Exp $ +# $NetBSD: files,v 1.1151 2015/12/05 13:31:07 jmcneill Exp $ # @(#)files.newconf 7.5 (Berkeley) 5/10/93 version 20150846 @@ -1565,3 +1565,8 @@ include "dev/iscsi/files.iscsi" # athn # include "dev/ic/files.athn" + +# +# MI clk api +# +include "dev/clk/files.clk" Added files: Index: src/sys/dev/clk/clk.c diff -u /dev/null src/sys/dev/clk/clk.c:1.1 --- /dev/null Sat Dec 5 13:31:07 2015 +++ src/sys/dev/clk/clk.c Sat Dec 5 13:31:07 2015 @@ -0,0 +1,105 @@ +/* $NetBSD: clk.c,v 1.1 2015/12/05 13:31:07 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: clk.c,v 1.1 2015/12/05 13:31:07 jmcneill Exp $"); + +#include <sys/param.h> + +#include <dev/clk/clk.h> +#include <dev/clk/clk_backend.h> + +static const char *clk_backend = NULL; +static const struct clk_funcs *clk_funcs = NULL; +static void *clk_priv = NULL; + +int +clk_backend_register(const char *name, const struct clk_funcs *funcs, void *priv) +{ + KASSERT(clk_funcs == NULL); + + clk_backend = name; + clk_funcs = funcs; + clk_priv = priv; + + return 0; +} + +struct clk * +clk_get(const char *name) +{ + if (clk_funcs == NULL) + return NULL; + return clk_funcs->get(clk_priv, name); +} + +void +clk_put(struct clk *clk) +{ + return clk_funcs->put(clk_priv, clk); +} + +u_int +clk_get_rate(struct clk *clk) +{ + return clk_funcs->get_rate(clk_priv, clk); +} + +int +clk_set_rate(struct clk *clk, u_int rate) +{ + if (clk->flags & CLK_SET_RATE_PARENT) { + return clk_set_rate(clk_get_parent(clk), rate); + } else { + return clk_funcs->set_rate(clk_priv, clk, rate); + } +} + +int +clk_enable(struct clk *clk) +{ + return clk_funcs->enable(clk_priv, clk); +} + +int +clk_disable(struct clk *clk) +{ + return clk_funcs->disable(clk_priv, clk); +} + +int +clk_set_parent(struct clk *clk, struct clk *parent_clk) +{ + return clk_funcs->set_parent(clk_priv, clk, parent_clk); +} + +struct clk * +clk_get_parent(struct clk *clk) +{ + return clk_funcs->get_parent(clk_priv, clk); +} Index: src/sys/dev/clk/clk.h diff -u /dev/null src/sys/dev/clk/clk.h:1.1 --- /dev/null Sat Dec 5 13:31:07 2015 +++ src/sys/dev/clk/clk.h Sat Dec 5 13:31:07 2015 @@ -0,0 +1,43 @@ +/* $NetBSD: clk.h,v 1.1 2015/12/05 13:31:07 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _DEV_CLK_CLK_H +#define _DEV_CLK_CLK_H + +struct clk; + +struct clk * clk_get(const char *); +void clk_put(struct clk *); +u_int clk_get_rate(struct clk *); +int clk_set_rate(struct clk *, u_int); +int clk_enable(struct clk *); +int clk_disable(struct clk *); +int clk_set_parent(struct clk *, struct clk *); +struct clk * clk_get_parent(struct clk *); + +#endif /* _DEV_CLK_CLK_H */ Index: src/sys/dev/clk/clk_backend.h diff -u /dev/null src/sys/dev/clk/clk_backend.h:1.1 --- /dev/null Sat Dec 5 13:31:07 2015 +++ src/sys/dev/clk/clk_backend.h Sat Dec 5 13:31:07 2015 @@ -0,0 +1,54 @@ +/* $NetBSD: clk_backend.h,v 1.1 2015/12/05 13:31:07 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _DEV_CLK_CLK_BACKEND_H +#define _DEV_CLK_CLK_BACKEND_H + +#include <dev/clk/clk.h> + +struct clk { + const char *name; + u_int flags; +#define CLK_SET_RATE_PARENT 0x01 +}; + +struct clk_funcs { + struct clk *(*get)(void *, const char *); + void (*put)(void *, struct clk *); + + u_int (*get_rate)(void *, struct clk *); + int (*set_rate)(void *, struct clk *, u_int); + int (*enable)(void *, struct clk *); + int (*disable)(void *, struct clk *); + int (*set_parent)(void *, struct clk *, struct clk *); + struct clk *(*get_parent)(void *, struct clk *); +}; + +int clk_backend_register(const char *, const struct clk_funcs *, void *); + +#endif /* _DEV_CLK_CLK_BACKEND_H */ Index: src/sys/dev/clk/files.clk diff -u /dev/null src/sys/dev/clk/files.clk:1.1 --- /dev/null Sat Dec 5 13:31:07 2015 +++ src/sys/dev/clk/files.clk Sat Dec 5 13:31:07 2015 @@ -0,0 +1,4 @@ +# $NetBSD: files.clk,v 1.1 2015/12/05 13:31:07 jmcneill Exp $ + +define clk +file dev/clk/clk.c clk