Module Name: src
Committed By: marty
Date: Fri Jan 1 22:35:44 UTC 2016
Modified Files:
src/sys/dev/fdt: fdt_pinctrl.c fdtvar.h
Log Message:
FDT pinctl - review from Jared
These changes reflect a redesign based on a preliminary review by Jared.
Instead of the acquire/release/set/get approach of the original, this uses
a much simpler, and cleaner register/set approach.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/fdt/fdt_pinctrl.c
cvs rdiff -u -r1.5 -r1.6 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_pinctrl.c
diff -u src/sys/dev/fdt/fdt_pinctrl.c:1.1 src/sys/dev/fdt/fdt_pinctrl.c:1.2
--- src/sys/dev/fdt/fdt_pinctrl.c:1.1 Wed Dec 30 04:23:39 2015
+++ src/sys/dev/fdt/fdt_pinctrl.c Fri Jan 1 22:35:44 2016
@@ -1,7 +1,7 @@
-/* $NetBSD: fdt_pinctrl.c,v 1.1 2015/12/30 04:23:39 marty Exp $ */
+/* $NetBSD: fdt_pinctrl.c,v 1.2 2016/01/01 22:35:44 marty Exp $ */
/*-
- * Copyright (c) 2015 Jared D. McNeill <[email protected]>
+ * Copyright (c) 2015 Martin Fouts
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.1 2015/12/30 04:23:39 marty Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.c,v 1.2 2016/01/01 22:35:44 marty Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -37,8 +37,8 @@ __KERNEL_RCSID(0, "$NetBSD: fdt_pinctrl.
#include <dev/fdt/fdtvar.h>
struct fdtbus_pinctrl_controller {
- device_t pc_dev;
int pc_phandle;
+ void *pc_cookie;
const struct fdtbus_pinctrl_controller_func *pc_funcs;
struct fdtbus_pinctrl_controller *pc_next;
@@ -47,13 +47,13 @@ struct fdtbus_pinctrl_controller {
static struct fdtbus_pinctrl_controller *fdtbus_pc = NULL;
int
-fdtbus_register_pinctrl_controller(device_t dev, int phandle,
+fdtbus_register_pinctrl_config(void *cookie, int phandle,
const struct fdtbus_pinctrl_controller_func *funcs)
{
struct fdtbus_pinctrl_controller *pc;
pc = kmem_alloc(sizeof(*pc), KM_SLEEP);
- pc->pc_dev = dev;
+ pc->pc_cookie = cookie;
pc->pc_phandle = phandle;
pc->pc_funcs = funcs;
@@ -63,49 +63,70 @@ fdtbus_register_pinctrl_controller(devic
return 0;
}
-struct fdtbus_pinctrl_pin *
-fdtbus_pinctrl_acquire(int phandle, const char *prop)
+static struct fdtbus_pinctrl_controller *
+fdtbus_pinctrl_lookup(int phandle)
{
struct fdtbus_pinctrl_controller *pc;
- struct fdtbus_pinctrl_pin *gp;
- gp = kmem_alloc(sizeof(*gp), KM_SLEEP);
- for (pc = fdtbus_pc; pc; pc = pc->pc_next) {
- gp->pp_pc = pc;
- gp->pp_priv = pc->pc_funcs->acquire(pc->pc_dev, prop);
- if (gp->pp_priv != NULL)
- break;
- }
-
- if (gp->pp_priv == NULL) {
- kmem_free(gp, sizeof(*gp));
- return NULL;
- }
+ for (pc = fdtbus_pc; pc; pc = pc->pc_next)
+ if (pc->pc_phandle == phandle)
+ return pc;
- return gp;
+ return NULL;
}
-void
-fdtbus_pinctrl_release(struct fdtbus_pinctrl_pin *gp)
+int
+fdtbus_pinctrl_set_config_index(int phandle, u_int index)
{
- struct fdtbus_pinctrl_controller *pc = gp->pp_pc;
+ char buf[80];
+ int len, handle;
+ struct fdtbus_pinctrl_controller *pc;
- pc->pc_funcs->release(pc->pc_dev, gp->pp_priv);
- kmem_free(gp, sizeof(*gp));
-}
+ snprintf(buf, 80, "pinctrl-%d", index);
-void
-fdtbus_pinctrl_get_cfg(struct fdtbus_pinctrl_pin *gp, void *cookie)
-{
- struct fdtbus_pinctrl_controller *pc = gp->pp_pc;
+ len = OF_getprop(phandle, buf, (char *)&handle,
+ sizeof(handle));
+ if (len != sizeof(int)) {
+ printf("%s: couldn't get %s.\n", __func__, buf);
+ return -1;
+ }
+
+ handle = fdtbus_get_phandle_from_native(be32toh(handle));
+
+ pc = fdtbus_pinctrl_lookup(handle);
+ if (!pc) {
+ printf("%s: Couldn't get handle %d for %s\n", __func__, handle,
+ buf);
+ return -1;
+ }
- pc->pc_funcs->get(gp, cookie);
+ return pc->pc_funcs->set_config(pc->pc_cookie);
}
-void
-fdtbus_pinctrl_set_cfg(struct fdtbus_pinctrl_pin *gp, void *cookie)
+int
+fdtbus_pinctrl_set_config(int phandle, const char *cfgname)
{
- struct fdtbus_pinctrl_controller *pc = gp->pp_pc;
+ int index = 0;
+ int len;
+ char *result;
+ char *next;
+
+ len = OF_getproplen(phandle, "pinctrl-names");
+ if (len <= 0)
+ return -1;
+ result = kmem_zalloc(len, KM_SLEEP);
+ OF_getprop(phandle, "pinctrl-names", result, len);
+
+ next = result;
+ while (next - result < len) {
+ if (!strcmp(next, cfgname)) {
+ return fdtbus_pinctrl_set_config_index(phandle, index);
+ }
+ index++;
+ while (*next)
+ next++;
+ next++;
+ }
- pc->pc_funcs->set(gp, cookie);
+ return -1;
}
Index: src/sys/dev/fdt/fdtvar.h
diff -u src/sys/dev/fdt/fdtvar.h:1.5 src/sys/dev/fdt/fdtvar.h:1.6
--- src/sys/dev/fdt/fdtvar.h:1.5 Wed Dec 30 04:23:39 2015
+++ src/sys/dev/fdt/fdtvar.h Fri Jan 1 22:35:44 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtvar.h,v 1.5 2015/12/30 04:23:39 marty Exp $ */
+/* $NetBSD: fdtvar.h,v 1.6 2016/01/01 22:35:44 marty Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -84,10 +84,7 @@ struct fdtbus_pinctrl_pin {
};
struct fdtbus_pinctrl_controller_func {
- void * (*acquire)(device_t, const char *);
- void (*release)(device_t, void *);
- void (*get)(struct fdtbus_pinctrl_pin *, void *);
- void (*set)(struct fdtbus_pinctrl_pin *, void *);
+ int (*set_config)(void *);
};
struct fdtbus_regulator_controller;
@@ -126,7 +123,7 @@ int fdtbus_register_i2c_controller(devi
const struct fdtbus_i2c_controller_func *);
int fdtbus_register_gpio_controller(device_t, int,
const struct fdtbus_gpio_controller_func *);
-int fdtbus_register_pinctrl_controller(device_t, int,
+int fdtbus_register_pinctrl_config(void *, int,
const struct fdtbus_pinctrl_controller_func *);
int fdtbus_register_regulator_controller(device_t, int,
const struct fdtbus_regulator_controller_func *);
@@ -149,10 +146,8 @@ int fdtbus_gpio_read(struct fdtbus_gpio
void fdtbus_gpio_write(struct fdtbus_gpio_pin *, int);
int fdtbus_gpio_read_raw(struct fdtbus_gpio_pin *);
void fdtbus_gpio_write_raw(struct fdtbus_gpio_pin *, int);
-struct fdtbus_pinctrl_pin *fdtbus_pinctrl_acquire(int, const char *);
-void fdtbus_pinctrl_release(struct fdtbus_pinctrl_pin *);
-void fdtbus_pinctrl_set_cfg(struct fdtbus_pinctrl_pin *, void *);
-void fdtbus_pinctrl_get_cfg(struct fdtbus_pinctrl_pin *, void *);
+int fdtbus_pinctrl_set_config_index(int, u_int);
+int fdtbus_pinctrl_set_config(int, const char *);
struct fdtbus_regulator *fdtbus_regulator_acquire(int, const char *);
void fdtbus_regulator_release(struct fdtbus_regulator *);
int fdtbus_regulator_enable(struct fdtbus_regulator *);