Module Name:    src
Committed By:   macallan
Date:           Thu Feb 25 20:49:08 UTC 2021

Modified Files:
        src/sys/arch/macppc/dev: smu.c

Log Message:
deal with node name inconsistencies between PowerMac10,x and 8,x
Now we find fans and iic devices on iMac G5


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/macppc/dev/smu.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/macppc/dev/smu.c
diff -u src/sys/arch/macppc/dev/smu.c:1.9 src/sys/arch/macppc/dev/smu.c:1.10
--- src/sys/arch/macppc/dev/smu.c:1.9	Sat Jul  4 11:55:18 2020
+++ src/sys/arch/macppc/dev/smu.c	Thu Feb 25 20:49:08 2021
@@ -289,51 +289,56 @@ smu_setup_fans(struct smu_softc *sc)
 	struct sysctlnode *sysctl_fans, *sysctl_fan, *sysctl_node;
 	char type[32], sysctl_fan_name[32];
 	int node, i, j;
+	const char *fans[] = { "fans", "rpm-fans", 0 };
+	int n = 0;
+	
+	while (fans[n][0] != 0) {
+		node = of_getnode_byname(sc->sc_node, fans[n]);
+		for (node = OF_child(node);
+		    (node != 0) && (sc->sc_num_fans < SMU_MAX_FANS);
+		    node = OF_peer(node)) {
+			fan = &sc->sc_fans[sc->sc_num_fans];
+			fan->sc = sc;
+
+			memset(fan->location, 0, sizeof(fan->location));
+			OF_getprop(node, "location", fan->location,
+			    sizeof(fan->location));
+
+			if (OF_getprop(node, "reg", &fan->reg,
+			        sizeof(fan->reg)) <= 0)
+				continue;
+
+			if (OF_getprop(node, "zone", &fan->zone	,
+			        sizeof(fan->zone)) <= 0)
+				continue;
+
+			memset(type, 0, sizeof(type));
+			OF_getprop(node, "device_type", type, sizeof(type));
+			if (strcmp(type, "fan-rpm-control") == 0)
+				fan->rpm_ctl = 1;
+			else
+				fan->rpm_ctl = 0;
+
+			if (OF_getprop(node, "min-value", &fan->min_rpm,
+			    sizeof(fan->min_rpm)) <= 0)
+				fan->min_rpm = 0;
+
+			if (OF_getprop(node, "max-value", &fan->max_rpm,
+			    sizeof(fan->max_rpm)) <= 0)
+				fan->max_rpm = 0xffff;
+
+			if (OF_getprop(node, "unmanage-value", &fan->default_rpm,
+			    sizeof(fan->default_rpm)) <= 0)
+				fan->default_rpm = fan->max_rpm;
+
+			DPRINTF("fan: location %s reg %x zone %d rpm_ctl %d "
+			    "min_rpm %d max_rpm %d default_rpm %d\n",
+			    fan->location, fan->reg, fan->zone, fan->rpm_ctl,
+			    fan->min_rpm, fan->max_rpm, fan->default_rpm);
 
-	node = of_getnode_byname(sc->sc_node, "fans");
-	for (node = OF_child(node);
-	    (node != 0) && (sc->sc_num_fans < SMU_MAX_FANS);
-	    node = OF_peer(node)) {
-		fan = &sc->sc_fans[sc->sc_num_fans];
-		fan->sc = sc;
-
-		memset(fan->location, 0, sizeof(fan->location));
-		OF_getprop(node, "location", fan->location,
-		    sizeof(fan->location));
-
-		if (OF_getprop(node, "reg", &fan->reg,
-		        sizeof(fan->reg)) <= 0)
-			continue;
-
-		if (OF_getprop(node, "zone", &fan->zone,
-		        sizeof(fan->zone)) <= 0)
-			continue;
-
-		memset(type, 0, sizeof(type));
-		OF_getprop(node, "device_type", type, sizeof(type));
-		if (strcmp(type, "fan-rpm-control") == 0)
-			fan->rpm_ctl = 1;
-		else
-			fan->rpm_ctl = 0;
-
-		if (OF_getprop(node, "min-value", &fan->min_rpm,
-		    sizeof(fan->min_rpm)) <= 0)
-			fan->min_rpm = 0;
-
-		if (OF_getprop(node, "max-value", &fan->max_rpm,
-		    sizeof(fan->max_rpm)) <= 0)
-			fan->max_rpm = 0xffff;
-
-		if (OF_getprop(node, "unmanage-value", &fan->default_rpm,
-		    sizeof(fan->default_rpm)) <= 0)
-			fan->default_rpm = fan->max_rpm;
-
-		DPRINTF("fan: location %s reg %x zone %d rpm_ctl %d "
-		    "min_rpm %d max_rpm %d default_rpm %d\n",
-		    fan->location, fan->reg, fan->zone, fan->rpm_ctl,
-		    fan->min_rpm, fan->max_rpm, fan->default_rpm);
-
-		sc->sc_num_fans++;
+			sc->sc_num_fans++;
+		}
+		n++;
 	}
 
 	for (i = 0; i < sc->sc_num_fans; i++) {
@@ -433,12 +438,14 @@ smu_setup_iicbus(struct smu_softc *sc)
 	char name[32];
 
 	node = of_getnode_byname(sc->sc_node, "smu-i2c-control");
+	if (node == 0) node = sc->sc_node;
 	for (node = OF_child(node);
 	    (node != 0) && (sc->sc_num_iicbus < SMU_MAX_IICBUS);
 	    node = OF_peer(node)) {
 		memset(name, 0, sizeof(name));
 		OF_getprop(node, "name", name, sizeof(name));
-		if (strcmp(name, "i2c-bus") != 0)
+		if ((strcmp(name, "i2c-bus") != 0) &&
+		    (strcmp(name, "i2c") != 0))
 			continue;
 
 		iicbus = &sc->sc_iicbus[sc->sc_num_iicbus];
@@ -862,7 +869,8 @@ smu_setup_zones(struct smu_softc *sc)
 	z->nfans = 0;
 	for (i = 0; i < SMU_MAX_FANS; i++) {
 		f = &sc->sc_fans[i];
-		if (strstr(f->location, "CPU") != NULL) {
+		if ((strstr(f->location, "CPU") != NULL) || 
+		    (strstr(f->location, "System") != NULL)) {
 			z->fans[z->nfans] = i;
 			z->nfans++;
 		}
@@ -878,7 +886,8 @@ smu_setup_zones(struct smu_softc *sc)
 	z->nfans = 0;
 	for (i = 0; i < SMU_MAX_FANS; i++) {
 		f = &sc->sc_fans[i];
-		if (strstr(f->location, "DRIVE") != NULL) {
+		if ((strstr(f->location, "DRIVE") != NULL) ||
+		    (strstr(f->location, "Drive") != NULL)) {
 			z->fans[z->nfans] = i;
 			z->nfans++;
 		}
@@ -959,7 +968,7 @@ smu_adjust(void *cookie)
 	while (!sc->sc_dying) {
 		for (i = 0; i < SMU_ZONES; i++)
 			smu_adjust_zone(sc, i);
-		kpause("fanctrl", true, mstohz(30000), NULL);
+		kpause("fanctrl", true, mstohz(3000), NULL);
 	}
 	kthread_exit(0);
 }
@@ -968,10 +977,7 @@ static bool is_cpu_sensor(const envsys_d
 {
 	if (edata->units != ENVSYS_STEMP)
 		return false;
-	if ((strstr(edata->desc, "CPU") != NULL) &&
-	    (strstr(edata->desc, "DIODE") != NULL))
-		return TRUE;
-	if (strstr(edata->desc, "TUNNEL") != NULL)
+	if (strstr(edata->desc, "CPU") != NULL)
 		return TRUE;
 	return false;
 }
@@ -980,7 +986,9 @@ static bool is_drive_sensor(const envsys
 {
 	if (edata->units != ENVSYS_STEMP)
 		return false;
-	if (strstr(edata->desc, "DRIVE BAY") != NULL)
+	if (strstr(edata->desc, "DRIVE") != NULL)
+		return TRUE;
+	if (strstr(edata->desc, "drive") != NULL)
 		return TRUE;
 	return false;
 }
@@ -993,6 +1001,10 @@ static bool is_slots_sensor(const envsys
 		return TRUE;
 	if (strstr(edata->desc, "INLET") != NULL)
 		return TRUE;
+	if (strstr(edata->desc, "DIODE") != NULL)
+		return TRUE;
+	if (strstr(edata->desc, "TUNNEL") != NULL)
+		return TRUE;
 	return false;
 }
 

Reply via email to