Module Name:    src
Committed By:   jmcneill
Date:           Sun Jul  2 16:19:47 UTC 2017

Modified Files:
        src/sys/arch/arm/samsung: exynos_pinctrl.c

Log Message:
Adjust to new pinctrl API


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/samsung/exynos_pinctrl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/samsung/exynos_pinctrl.c
diff -u src/sys/arch/arm/samsung/exynos_pinctrl.c:1.10 src/sys/arch/arm/samsung/exynos_pinctrl.c:1.11
--- src/sys/arch/arm/samsung/exynos_pinctrl.c:1.10	Thu Jun 22 06:42:38 2017
+++ src/sys/arch/arm/samsung/exynos_pinctrl.c	Sun Jul  2 16:19:46 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: exynos_pinctrl.c,v 1.10 2017/06/22 06:42:38 skrll Exp $ */
+/*	$NetBSD: exynos_pinctrl.c,v 1.11 2017/07/02 16:19:46 jmcneill Exp $ */
 
 /*-
 * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
 #include "gpio.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exynos_pinctrl.c,v 1.10 2017/06/22 06:42:38 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exynos_pinctrl.c,v 1.11 2017/07/02 16:19:46 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -55,16 +55,15 @@ __KERNEL_RCSID(1, "$NetBSD: exynos_pinct
 
 struct exynos_pinctrl_config {
 	int pc_phandle;
-	struct exynos_gpio_pin_cfg *pc_pincfg;
+	struct exynos_gpio_pin_cfg pc_pincfg;
 	struct exynos_pinctrl_softc *pc_sc;
 };
 
 static int exynos_pinctrl_match(device_t, cfdata_t, void *);
 static void exynos_pinctrl_attach(device_t, device_t, void *);
 
-static int  exynos_pinctrl_set_cfg(void *);
-static struct exynos_gpio_pin_cfg *
-exynos_parse_config(struct exynos_pinctrl_config *pc);
+static int  exynos_pinctrl_set_cfg(device_t, const void *, size_t);
+static void exynos_parse_config(int, struct exynos_gpio_pin_cfg *);
 
 static struct fdtbus_pinctrl_controller_func exynos_pinctrl_controller_func = {
 	.set_config = exynos_pinctrl_set_cfg
@@ -128,90 +127,59 @@ exynos_pinctrl_attach(device_t parent, d
 		}
 
 		if (is_pinctrl(child)) {
-			struct exynos_pinctrl_config *pc;
-			pc = kmem_alloc(sizeof(*pc), KM_SLEEP);
-			pc->pc_phandle = child;
-			pc->pc_sc = sc;
-			pc->pc_pincfg = exynos_parse_config(pc);
-			fdtbus_register_pinctrl_config(pc, child,
+			fdtbus_register_pinctrl_config(self, child,
 						       &exynos_pinctrl_controller_func);
 		}
 	}
 }
 
-static struct exynos_gpio_pin_cfg *
-exynos_parse_config(struct exynos_pinctrl_config *pc)
+static void
+exynos_parse_config(int phandle, struct exynos_gpio_pin_cfg *gc)
 {
-	struct exynos_gpio_pin_cfg *gc = kmem_zalloc(sizeof(*gc), KM_SLEEP);
-	int len;
-	int value;
-
-	len = OF_getprop(pc->pc_phandle, "samsung,pin-function",
-			 &value, sizeof(value));
-	if (len > 0) {
-		gc->cfg = be32toh(value);
-	}
-
-	len = OF_getprop(pc->pc_phandle, "samsung,pin-pud", &value,
-			 sizeof(&value));
-	if (len > 0) {
-		gc->pud = be32toh(value);
-	}
-
-	len = OF_getprop(pc->pc_phandle, "samsung,pin-drv", &value,
-			 sizeof(&value));
-	if (len > 0) {
-		gc->drv = be32toh(value);
-	}
-
-	len = OF_getprop(pc->pc_phandle, "samsung,pin-conpwd", &value,
-			 sizeof(&value));
-	if (len > 0) {
-		gc->conpwd = be32toh(value);
-	}
-
-	len = OF_getprop(pc->pc_phandle, "samsung,pin-pudpwd", &value,
-			 sizeof(&value));
-	if (len > 0) {
-		gc->pudpwd = be32toh(value);
-	}
-	return gc;
+	of_getprop_uint32(phandle, "samsung,pin-function", &gc->cfg);
+	of_getprop_uint32(phandle, "samsung,pin-pud", &gc->pud);
+	of_getprop_uint32(phandle, "samsung,pin-drv", &gc->drv);
+	of_getprop_uint32(phandle, "samsung,pin-conpwd", &gc->conpwd);
+	of_getprop_uint32(phandle, "samsung,pin-pudpwd", &gc->pudpwd);
 }
 
 static int
 exynos_do_config(struct exynos_pinctrl_config *pc)
 {
-	struct exynos_gpio_pin_cfg *gc = pc->pc_pincfg;
+	struct exynos_gpio_pin_cfg *gc = &pc->pc_pincfg;
 	struct exynos_gpio_bank *bank;
-	int len;
-	char result[20];
+	const char *pins;
 
-	if (gc == NULL) {
-		printf("%s: No configuration available\n", __func__);
+	int pins_len = OF_getproplen(pc->pc_phandle, "samsung,pins");
+	if (pins_len <= 0)
 		return -1;
-	}
 
-	len = OF_getprop(pc->pc_phandle, "samsung,pins", result,
-			 sizeof(result));
-	if (len <= 0) {
-		printf("%s: couldn't get pins. (%d)\n", __func__,
-			pc->pc_phandle);
-		return -1;
-	}
-
-	bank = exynos_gpio_bank_lookup(&result[0]);
-	if (!bank) {
-		printf("%s: Couldn't get bank \"%s\".\n", __func__, result);
-		return -1;
+	for (pins = fdtbus_get_string(pc->pc_phandle, "samsung,pins");
+	     pins_len > 0;
+	     pins_len -= strlen(pins) + 1, pins += strlen(pins) + 1) {
+		bank = exynos_gpio_bank_lookup(pins);
+		if (bank == NULL) {
+			aprint_error_dev(pc->pc_sc->sc_dev,
+			    "unknown pin name '%s'\n", pins);
+			continue;
+		}
+		exynos_gpio_pin_ctl_write(bank, gc);
 	}
 
-	exynos_gpio_pin_ctl_write(bank, gc);
 	return 0;
 }
 	
 static int
-exynos_pinctrl_set_cfg(void *cookie)
+exynos_pinctrl_set_cfg(device_t dev, const void *data, size_t len)
 {
-	struct exynos_pinctrl_config *pc = cookie;
-	return exynos_do_config(pc);
+	struct exynos_pinctrl_config pc;
+
+	if (len != 4)
+		return -1;
+
+	pc.pc_phandle = fdtbus_get_phandle_from_native(be32dec(data));
+	pc.pc_sc = device_private(dev);
+	exynos_parse_config(pc.pc_phandle, &pc.pc_pincfg);
+
+	return exynos_do_config(&pc);
 }

Reply via email to