Lines Matching +full:adc +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
45 #include <dev/iicbus/iicbus.h>
46 #include <dev/iicbus/iiconf.h>
48 #include <dev/ofw/openfirm.h>
49 #include <dev/ofw/ofw_bus.h>
52 /* CPU A/B sensors, temp and adc: AD7417. */
64 device_t dev; member
88 static int ad7417_write(device_t dev, uint32_t addr, uint8_t reg,
90 static int ad7417_read_1(device_t dev, uint32_t addr, uint8_t reg,
92 static int ad7417_read_2(device_t dev, uint32_t addr, uint8_t reg,
94 static int ad7417_write_read(device_t dev, uint32_t addr,
121 static MALLOC_DEFINE(M_AD7417, "ad7417", "Supply-Monitor AD7417");
125 ad7417_write(device_t dev, uint32_t addr, uint8_t reg, uint8_t *buff, int len) in ad7417_write() argument
140 if (iicbus_transfer(dev, msg, nitems(msg)) == 0) in ad7417_write()
144 device_printf(dev, "iicbus write failed\n"); in ad7417_write()
145 return (-1); in ad7417_write()
152 ad7417_read_1(device_t dev, uint32_t addr, uint8_t reg, uint8_t *data) in ad7417_read_1() argument
164 err = iicbus_transfer(dev, msg, nitems(msg)); in ad7417_read_1()
172 device_printf(dev, "iicbus read failed\n"); in ad7417_read_1()
173 return (-1); in ad7417_read_1()
180 ad7417_read_2(device_t dev, uint32_t addr, uint8_t reg, uint16_t *data) in ad7417_read_2() argument
192 err = iicbus_transfer(dev, msg, nitems(msg)); in ad7417_read_2()
200 device_printf(dev, "iicbus read failed\n"); in ad7417_read_2()
201 return (-1); in ad7417_read_2()
208 ad7417_write_read(device_t dev, uint32_t addr, struct write_data out, in ad7417_write_read() argument
217 { addr, IIC_M_WR | IIC_M_NOSTOP, 1, &in->reg }, in ad7417_write_read()
227 err = iicbus_transfer(dev, msg, nitems(msg)); in ad7417_write_read()
231 in->val = *((uint16_t*)buf); in ad7417_write_read()
235 device_printf(dev, "iicbus write/read failed\n"); in ad7417_write_read()
236 return (-1); in ad7417_write_read()
243 ad7417_init_adc(device_t dev, uint32_t addr) in ad7417_init_adc() argument
249 sc = device_get_softc(dev); in ad7417_init_adc()
255 err = ad7417_write(dev, addr, AD7417_CONFIG2, &buf, sizeof(buf)); in ad7417_init_adc()
259 err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, sizeof(buf)); in ad7417_init_adc()
260 err = ad7417_read_1(dev, addr, AD7417_CONFIG, &buf); in ad7417_init_adc()
266 err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, sizeof(buf)); in ad7417_init_adc()
268 return (-1); in ad7417_init_adc()
270 sc->init_done = 1; in ad7417_init_adc()
276 ad7417_probe(device_t dev) in ad7417_probe() argument
281 name = ofw_bus_get_name(dev); in ad7417_probe()
282 compatible = ofw_bus_get_compat(dev); in ad7417_probe()
287 if (strcmp(name, "supply-monitor") != 0 || in ad7417_probe()
291 sc = device_get_softc(dev); in ad7417_probe()
292 sc->sc_dev = dev; in ad7417_probe()
293 sc->sc_addr = iicbus_get_addr(dev); in ad7417_probe()
295 device_set_desc(dev, "Supply-Monitor AD7417"); in ad7417_probe()
302 * and we have allocated memory for sc->sc_sensors, we fill in the properties.
305 ad7417_fill_sensor_prop(device_t dev) in ad7417_fill_sensor_prop() argument
314 sc = device_get_softc(dev); in ad7417_fill_sensor_prop()
316 child = ofw_bus_get_node(dev); in ad7417_fill_sensor_prop()
319 prop_len = OF_getprop(child, "hwsensor-location", location, in ad7417_fill_sensor_prop()
322 if (sc->sc_sensors != NULL) in ad7417_fill_sensor_prop()
323 strcpy(sc->sc_sensors[i].therm.name, location + len); in ad7417_fill_sensor_prop()
328 if (sc->sc_sensors == NULL) in ad7417_fill_sensor_prop()
335 prop_len = OF_getprop(child, "hwsensor-type", type, sizeof(type)); in ad7417_fill_sensor_prop()
338 sc->sc_sensors[i].type = ADC7417_TEMP_SENSOR; in ad7417_fill_sensor_prop()
340 sc->sc_sensors[i].type = ADC7417_ADC_SENSOR; in ad7417_fill_sensor_prop()
347 prop_len = OF_getprop(child, "hwsensor-id", id, sizeof(id)); in ad7417_fill_sensor_prop()
349 sc->sc_sensors[j].id = id[j]; in ad7417_fill_sensor_prop()
352 prop_len = OF_getprop(child, "hwsensor-zone", id, sizeof(id)); in ad7417_fill_sensor_prop()
354 sc->sc_sensors[j].therm.zone = id[j]; in ad7417_fill_sensor_prop()
357 child nodes of the hwsensor-location node. Check for and in ad7417_fill_sensor_prop()
365 strcpy(sc->sc_sensors[i].therm.name, location); in ad7417_fill_sensor_prop()
371 sc->sc_sensors[j].dev = dev; in ad7417_fill_sensor_prop()
373 /* HACK: Apple wired a random diode to the ADC line */ in ad7417_fill_sensor_prop()
374 if ((strstr(sc->sc_sensors[j].therm.name, "DIODE TEMP") in ad7417_fill_sensor_prop()
376 || (strstr(sc->sc_sensors[j].therm.name, "AD1") != NULL)) { in ad7417_fill_sensor_prop()
377 sc->sc_sensors[j].type = ADC7417_TEMP_SENSOR; in ad7417_fill_sensor_prop()
378 sc->sc_sensors[j].therm.read = in ad7417_fill_sensor_prop()
381 sc->sc_sensors[j].therm.read = in ad7417_fill_sensor_prop()
385 if (sc->sc_sensors[j].type != ADC7417_TEMP_SENSOR) in ad7417_fill_sensor_prop()
389 sc->sc_sensors[j].therm.target_temp = 500 + ZERO_C_TO_K; in ad7417_fill_sensor_prop()
390 sc->sc_sensors[j].therm.max_temp = 900 + ZERO_C_TO_K; in ad7417_fill_sensor_prop()
392 pmac_thermal_sensor_register(&sc->sc_sensors[j].therm); in ad7417_fill_sensor_prop()
399 ad7417_attach(device_t dev) in ad7417_attach() argument
408 sc = device_get_softc(dev); in ad7417_attach()
410 sc->sc_nsensors = 0; in ad7417_attach()
413 sc->sc_nsensors = ad7417_fill_sensor_prop(dev); in ad7417_attach()
415 device_printf(dev, "%d sensors detected.\n", sc->sc_nsensors); in ad7417_attach()
417 if (sc->sc_nsensors == 0) in ad7417_attach()
418 device_printf(dev, "WARNING: No AD7417 sensors detected!\n"); in ad7417_attach()
420 sc->sc_sensors = malloc (sc->sc_nsensors * sizeof(struct ad7417_sensor), in ad7417_attach()
423 ctx = device_get_sysctl_ctx(dev); in ad7417_attach()
425 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "sensor", in ad7417_attach()
429 sc->sc_nsensors = ad7417_fill_sensor_prop(dev); in ad7417_attach()
432 for (i = 0; i < sc->sc_nsensors; i++) { in ad7417_attach()
433 for (j = 0; j < strlen(sc->sc_sensors[i].therm.name); j++) { in ad7417_attach()
435 tolower(sc->sc_sensors[i].therm.name[j]); in ad7417_attach()
445 if (sc->sc_sensors[i].type == ADC7417_TEMP_SENSOR) { in ad7417_attach()
453 dev, i, ad7417_sensor_sysctl, in ad7417_attach()
454 sc->sc_sensors[i].type == ADC7417_TEMP_SENSOR ? in ad7417_attach()
456 sc->sc_sensors[i].type == ADC7417_TEMP_SENSOR ? in ad7417_attach()
461 device_printf(dev, "Sensors\n"); in ad7417_attach()
462 for (i = 0; i < sc->sc_nsensors; i++) { in ad7417_attach()
463 device_printf(dev, "Location: %s ID: %d type: %d\n", in ad7417_attach()
464 sc->sc_sensors[i].therm.name, in ad7417_attach()
465 sc->sc_sensors[i].id, in ad7417_attach()
466 sc->sc_sensors[i].type); in ad7417_attach()
474 ad7417_get_temp(device_t dev, uint32_t addr, int *temp) in ad7417_get_temp() argument
480 err = ad7417_read_2(dev, addr, AD7417_TEMP, buf); in ad7417_get_temp()
483 return (-1); in ad7417_get_temp()
487 /* The ADC is 10 bit, the resolution is 0.25 C. in ad7417_get_temp()
495 ad7417_get_adc(device_t dev, uint32_t addr, unsigned int *value, in ad7417_get_adc() argument
508 err = ad7417_read_1(dev, addr, AD7417_CONFIG, &config.val); in ad7417_get_adc()
512 err = ad7417_write_read(dev, addr, config, &data); in ad7417_get_adc()
514 return (-1); in ad7417_get_adc()
540 return (-1); in ad7417_diode_read()
542 if (strstr(sens->therm.name, "CPU B") != NULL) { in ad7417_diode_read()
563 sc = device_get_softc(sens->dev); in ad7417_adc_read()
565 switch (sens->id) { in ad7417_adc_read()
586 if (ad7417_get_adc(sc->sc_dev, sc->sc_addr, &temp, chan) < 0) in ad7417_adc_read()
587 return (-1); in ad7417_adc_read()
599 sc = device_get_softc(sens->dev); in ad7417_sensor_read()
601 /* Init the ADC if not already done.*/ in ad7417_sensor_read()
602 if (!sc->init_done) in ad7417_sensor_read()
603 if (ad7417_init_adc(sc->sc_dev, sc->sc_addr) < 0) in ad7417_sensor_read()
604 return (-1); in ad7417_sensor_read()
606 if (sens->type == ADC7417_TEMP_SENSOR) { in ad7417_sensor_read()
607 if (ad7417_get_temp(sc->sc_dev, sc->sc_addr, &temp) < 0) in ad7417_sensor_read()
608 return (-1); in ad7417_sensor_read()
619 device_t dev; in ad7417_sensor_sysctl() local
625 dev = arg1; in ad7417_sensor_sysctl()
626 sc = device_get_softc(dev); in ad7417_sensor_sysctl()
627 sens = &sc->sc_sensors[arg2]; in ad7417_sensor_sysctl()
629 value = sens->therm.read(&sens->therm); in ad7417_sensor_sysctl()