Module Name:    src
Committed By:   phx
Date:           Wed Sep 30 14:18:54 UTC 2015

Modified Files:
        src/sys/arch/sandpoint/sandpoint: autoconf.c machdep.c

Log Message:
Now more than a single I2C device per model may be configured directly.
An additional flags argument makes the configuration depend on the model-
flags in an optional BTINFO_MODEL bootinfo node.
Print the model name together with the vendor name, when known.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/sandpoint/sandpoint/autoconf.c
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/sandpoint/sandpoint/machdep.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/sandpoint/sandpoint/autoconf.c
diff -u src/sys/arch/sandpoint/sandpoint/autoconf.c:1.27 src/sys/arch/sandpoint/sandpoint/autoconf.c:1.28
--- src/sys/arch/sandpoint/sandpoint/autoconf.c:1.27	Sun Jul 29 18:05:45 2012
+++ src/sys/arch/sandpoint/sandpoint/autoconf.c	Wed Sep 30 14:18:54 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.27 2012/07/29 18:05:45 mlelstv Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.28 2015/09/30 14:18:54 phx Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.27 2012/07/29 18:05:45 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.28 2015/09/30 14:18:54 phx Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -55,21 +55,30 @@ static struct btinfo_rootdevice *bi_rdev
 static struct btinfo_bootpath *bi_path;
 static struct btinfo_net *bi_net;
 static struct btinfo_prodfamily *bi_pfam;
+static struct btinfo_model *bi_model;
 
-struct i2cdev {
-	const char *family;
-	const char *name;
-	int addr;
+struct i2c_dev {
+	const char	*name;
+	unsigned	addr;
+	/* only attach when one of these bits in the model flags is set */
+	uint32_t	model_mask;
 };
 
-static struct i2cdev rtcmodel[] = {
-    { "dlink",    "strtc",      0x68 },
-    { "iomega",   "dsrtc",      0x68 },
-    { "kurobox",  "rs5c372rtc", 0x32 },
-    { "kurot4",   "rs5c372rtc", 0x32 },
-    { "nhnas",    "pcf8563rtc", 0x51 },
-    { "qnap",     "s390rtc",    0x30 },
-    { "synology", "rs5c372rtc", 0x32 },
+#define MAXI2CDEVS	4
+struct model_i2c {
+	const char	*family;
+	struct i2c_dev	i2c_devs[MAXI2CDEVS];
+};
+
+static struct model_i2c model_i2c_list[] = {
+	{ "dlink",	{	{ "strtc",	0x68, 0 } } },
+	{ "iomega",	{	{ "dsrtc",	0x68, 0 } } },
+	{ "kurobox",	{	{ "rs5c372rtc", 0x32, 0 } } },
+	{ "kurot4",	{	{ "rs5c372rtc", 0x32, 0 } } },
+	{ "nhnas",	{	{ "pcf8563rtc", 0x51, 0 } } },
+	{ "qnap",	{	{ "s390rtc",    0x30, 0 } } },
+	{ "synology",	{	{ "rs5c372rtc", 0x32, 0 },
+				{ "lmtemp",	0x48, BI_MODEL_THERMAL } } },
 };
 
 static void add_i2c_child_devices(device_t, const char *);
@@ -85,6 +94,7 @@ cpu_configure(void)
 	bi_path = lookup_bootinfo(BTINFO_BOOTPATH);
 	bi_net = lookup_bootinfo(BTINFO_NET);
 	bi_pfam = lookup_bootinfo(BTINFO_PRODFAMILY);
+	bi_model = lookup_bootinfo(BTINFO_MODEL);
 
 	if (config_rootfound("mainbus", NULL) == NULL)
 		panic("configure: mainbus not configured");
@@ -167,27 +177,38 @@ device_register(device_t dev, void *aux)
 static void
 add_i2c_child_devices(device_t self, const char *family)
 {
-	struct i2cdev *rtc;
+	struct i2c_dev *model_i2c_devs;
 	prop_dictionary_t pd;
 	prop_array_t pa;
 	int i;
 
-	rtc = NULL;
-	for (i = 0; i < (int)(sizeof(rtcmodel)/sizeof(rtcmodel[0])); i++) {
-		if (strcmp(family, rtcmodel[i].family) == 0) {
-			rtc = &rtcmodel[i];
+	for (i = 0;
+	    i < (int)(sizeof(model_i2c_list) / sizeof(model_i2c_list[0]));
+	    i++) {
+		if (strcmp(family, model_i2c_list[i].family) == 0) {
+			model_i2c_devs = model_i2c_list[i].i2c_devs;
 			goto found;
 		}
 	}
 	return;
 
  found:
-	pd = prop_dictionary_create();
+	/* make an i2c-child-devices property list with for direct config. */
 	pa = prop_array_create();
-	prop_dictionary_set_cstring_nocopy(pd, "name", rtc->name);
-	prop_dictionary_set_uint32(pd, "addr", rtc->addr);
-	prop_array_add(pa, pd);
+
+	for (i = 0; i < MAXI2CDEVS && model_i2c_devs[i].name != NULL; i++) {
+		if (model_i2c_devs[i].model_mask != 0 &&
+		    !(bi_model->flags & model_i2c_devs[i].model_mask))
+			continue;
+		pd = prop_dictionary_create();
+		prop_dictionary_set_cstring_nocopy(pd, "name",
+		    model_i2c_devs[i].name);
+		prop_dictionary_set_uint32(pd, "addr",
+		    model_i2c_devs[i].addr);
+		prop_array_add(pa, pd);
+		prop_object_release(pd);
+	}
+
 	prop_dictionary_set(device_properties(self), "i2c-child-devices", pa);
-	prop_object_release(pd);
 	prop_object_release(pa);
 }

Index: src/sys/arch/sandpoint/sandpoint/machdep.c
diff -u src/sys/arch/sandpoint/sandpoint/machdep.c:1.64 src/sys/arch/sandpoint/sandpoint/machdep.c:1.65
--- src/sys/arch/sandpoint/sandpoint/machdep.c:1.64	Mon Sep  7 23:00:08 2015
+++ src/sys/arch/sandpoint/sandpoint/machdep.c	Wed Sep 30 14:18:54 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.64 2015/09/07 23:00:08 phx Exp $	*/
+/*	$NetBSD: machdep.c,v 1.65 2015/09/30 14:18:54 phx Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.64 2015/09/07 23:00:08 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.65 2015/09/30 14:18:54 phx Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_ddb.h"
@@ -231,15 +231,25 @@ mem_regions(struct mem_region **mem, str
 void
 cpu_startup(void)
 {
-	struct btinfo_prodfamily *bi_prod;
+	struct btinfo_prodfamily *bi_fam;
+	struct btinfo_model *bi_model;
+	char prod_name[32];
+	char *model;
 	void *baseaddr;
 	int msr;
 
 	/*
 	 * Do common startup.
 	 */
-	bi_prod = lookup_bootinfo(BTINFO_PRODFAMILY);
-	oea_startup(bi_prod != NULL ? bi_prod->name : NULL);
+	bi_fam = lookup_bootinfo(BTINFO_PRODFAMILY);
+	bi_model = lookup_bootinfo(BTINFO_MODEL);
+	if (bi_fam != NULL) {
+		snprintf(prod_name, sizeof(prod_name), "%s %s", bi_fam->name,
+		    bi_model != NULL ? bi_model->name : "");
+		model = prod_name;
+	} else
+		model = NULL;
+	oea_startup(model);
 
 	/*
 	 * Prepare EPIC and install external interrupt handler.

Reply via email to