diff --git a/sys/arch/sparc64/sparc64/autoconf.c b/sys/arch/sparc64/sparc64/autoconf.c index 9013b11805f4..8fa07fcd9fcd 100644 --- a/sys/arch/sparc64/sparc64/autoconf.c +++ b/sys/arch/sparc64/sparc64/autoconf.c @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.206 2015/12/13 11:51:37 jmcneill Exp $ */ +/* $NetBSD: autoconf.c,v 1.207 2015/12/16 08:01:19 jdc Exp $ */ /* * Copyright (c) 1996 @@ -48,7 +48,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.206 2015/12/13 11:51:37 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.207 2015/12/16 08:01:19 jdc Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -1142,6 +1142,58 @@ noether: prop_object_release(cfg); } + + /* + * Add V210/V240 environmental sensors that are not in + * the OFW tree. + */ + if (device_is_a(busdev, "pcfiic") && + (!strcmp(machine_model, "SUNW,Sun-Fire-V240") || + !strcmp(machine_model, "SUNW,Sun-Fire-V210"))) { + prop_dictionary_t props = device_properties(busdev); + prop_array_t cfg = NULL; + prop_dictionary_t sens; + prop_data_t data; + const char name_lm[] = "i2c-lm75"; + const char name_adm[] = "i2c-adm1026"; + + DPRINTF(ACDB_PROBE, ("\nAdding sensors for %s ", + machine_model)); + cfg = prop_dictionary_get(props, "i2c-child-devices"); + if (!cfg) { + cfg = prop_array_create(); + prop_dictionary_set(props, "i2c-child-devices", + cfg); + prop_dictionary_set_bool(props, + "i2c-indirect-config", false); + } + + /* ADM1026 at 0x2e */ + sens = prop_dictionary_create(); + prop_dictionary_set_uint32(sens, "addr", 0x2e); + prop_dictionary_set_uint64(sens, "cookie", 0); + prop_dictionary_set_cstring(sens, "name", + "hardware-monitor"); + data = prop_data_create_data(&name_adm[0], + sizeof(name_adm)); + prop_dictionary_set(sens, "compatible", data); + prop_object_release(data); + prop_array_add(cfg, sens); + prop_object_release(sens); + + /* LM75 at 0x4e */ + sens = prop_dictionary_create(); + prop_dictionary_set_uint32(sens, "addr", 0x4e); + prop_dictionary_set_uint64(sens, "cookie", 0); + prop_dictionary_set_cstring(sens, "name", + "temperature-sensor"); + data = prop_data_create_data(&name_lm[0], + sizeof(name_lm)); + prop_dictionary_set(sens, "compatible", data); + prop_object_release(data); + prop_array_add(cfg, sens); + prop_object_release(sens); + } } /* set properties for PCI framebuffers */ @@ -1205,6 +1257,27 @@ noether: instance = OF_open(name); #endif } + + /* Hardware specific device properties */ + if ((!strcmp(machine_model, "SUNW,Sun-Fire-V240") || + !strcmp(machine_model, "SUNW,Sun-Fire-V210"))) { + device_t busparent = device_parent(busdev); + prop_dictionary_t props = device_properties(dev); + + if (busparent != NULL && device_is_a(busparent, "pcfiic") && + device_is_a(dev, "adm1026hm") && props != NULL) { + prop_dictionary_set_uint8(props, "fan_div2", 0x55); + prop_dictionary_set_bool(props, "multi_read", true); + } + } + if (!strcmp(machine_model, "SUNW,Sun-Fire-V440")) { + device_t busparent = device_parent(busdev); + prop_dictionary_t props = device_properties(dev); + if (busparent != NULL && device_is_a(busparent, "pcfiic") && + device_is_a(dev, "adm1026hm") && props != NULL) { + prop_dictionary_set_bool(props, "multi_read", true); + } + } } /*