1 1.10 thorpej /* $NetBSD: em3027.c,v 1.10 2025/09/07 21:45:15 thorpej Exp $ */ 2 1.1 uwe /* 3 1.1 uwe * Copyright (c) 2018 Valery Ushakov 4 1.1 uwe * All rights reserved. 5 1.1 uwe * 6 1.1 uwe * Redistribution and use in source and binary forms, with or without 7 1.1 uwe * modification, are permitted provided that the following conditions 8 1.1 uwe * are met: 9 1.1 uwe * 1. Redistributions of source code must retain the above copyright 10 1.1 uwe * notice, this list of conditions and the following disclaimer. 11 1.1 uwe * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 uwe * notice, this list of conditions and the following disclaimer in the 13 1.1 uwe * documentation and/or other materials provided with the distribution. 14 1.1 uwe * 15 1.1 uwe * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 uwe * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 1.1 uwe * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 1.1 uwe * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 1.1 uwe * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 1.1 uwe * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 1.1 uwe * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 1.1 uwe * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 1.1 uwe * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 1.1 uwe * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 1.1 uwe */ 26 1.1 uwe 27 1.1 uwe /* 28 1.1 uwe * EM Microelectronic EM3027 RTC 29 1.1 uwe */ 30 1.1 uwe #include <sys/cdefs.h> 31 1.10 thorpej __KERNEL_RCSID(0, "$NetBSD: em3027.c,v 1.10 2025/09/07 21:45:15 thorpej Exp $"); 32 1.1 uwe 33 1.1 uwe #include <sys/param.h> 34 1.1 uwe #include <sys/systm.h> 35 1.1 uwe #include <sys/device.h> 36 1.1 uwe #include <sys/kernel.h> 37 1.1 uwe 38 1.1 uwe #include <dev/clock_subr.h> 39 1.1 uwe 40 1.1 uwe #include <dev/i2c/i2cvar.h> 41 1.1 uwe #include <dev/i2c/em3027reg.h> 42 1.1 uwe #include <dev/sysmon/sysmonvar.h> 43 1.1 uwe 44 1.1 uwe #if 0 45 1.1 uwe #define aprint_verbose_dev aprint_normal_dev 46 1.1 uwe #define aprint_debug_dev aprint_normal_dev 47 1.1 uwe #endif 48 1.1 uwe 49 1.1 uwe 50 1.1 uwe struct em3027rtc_softc { 51 1.1 uwe device_t sc_dev; 52 1.1 uwe 53 1.1 uwe i2c_tag_t sc_tag; 54 1.1 uwe i2c_addr_t sc_addr; 55 1.1 uwe 56 1.1 uwe bool sc_vlow; 57 1.1 uwe 58 1.1 uwe struct todr_chip_handle sc_todr; 59 1.1 uwe 60 1.1 uwe struct sysmon_envsys *sc_sme; 61 1.1 uwe envsys_data_t sc_sensor; 62 1.1 uwe }; 63 1.1 uwe 64 1.1 uwe 65 1.1 uwe #define EM3027_CONTROL_BASE EM3027_ONOFF 66 1.1 uwe #define EM3027_WATCH_BASE EM3027_WATCH_SEC 67 1.1 uwe 68 1.1 uwe struct em3027rtc_watch { 69 1.1 uwe uint8_t sec; 70 1.1 uwe uint8_t min; 71 1.1 uwe uint8_t hour; 72 1.1 uwe uint8_t day; 73 1.1 uwe uint8_t wday; 74 1.1 uwe uint8_t mon; 75 1.1 uwe uint8_t year; 76 1.1 uwe }; 77 1.1 uwe 78 1.1 uwe #define EM3027_WATCH_SIZE (EM3027_WATCH_YEAR - EM3027_WATCH_BASE + 1) 79 1.1 uwe __CTASSERT(sizeof(struct em3027rtc_watch) == EM3027_WATCH_SIZE); 80 1.1 uwe 81 1.1 uwe #define EM3027_BASE_YEAR 1980 82 1.1 uwe 83 1.1 uwe 84 1.1 uwe static int em3027rtc_match(device_t, cfdata_t, void *); 85 1.1 uwe static void em3027rtc_attach(device_t, device_t, void *); 86 1.1 uwe 87 1.1 uwe CFATTACH_DECL_NEW(em3027rtc, sizeof(struct em3027rtc_softc), 88 1.1 uwe em3027rtc_match, em3027rtc_attach, NULL, NULL); 89 1.1 uwe 90 1.1 uwe 91 1.1 uwe static bool em3027rtc_enable_thermometer(struct em3027rtc_softc *); 92 1.1 uwe static void em3027rtc_envsys_attach(struct em3027rtc_softc *); 93 1.1 uwe 94 1.1 uwe static int em3027rtc_gettime(struct todr_chip_handle *, struct clock_ymdhms *); 95 1.1 uwe static int em3027rtc_settime(struct todr_chip_handle *, struct clock_ymdhms *); 96 1.1 uwe 97 1.1 uwe static void em3027rtc_sme_refresh(struct sysmon_envsys *, envsys_data_t *); 98 1.1 uwe 99 1.1 uwe static int em3027rtc_iic_exec(struct em3027rtc_softc *, i2c_op_t, uint8_t, 100 1.1 uwe void *, size_t); 101 1.1 uwe 102 1.1 uwe static int em3027rtc_read(struct em3027rtc_softc *, uint8_t, void *, size_t); 103 1.1 uwe static int em3027rtc_write(struct em3027rtc_softc *, uint8_t, void *, size_t); 104 1.1 uwe 105 1.1 uwe static int em3027rtc_read_byte(struct em3027rtc_softc *, uint8_t, uint8_t *); 106 1.1 uwe static int em3027rtc_write_byte(struct em3027rtc_softc *, uint8_t, uint8_t); 107 1.1 uwe 108 1.4 thorpej static const struct device_compatible_entry compat_data[] = { 109 1.6 thorpej { .compat = "emmicro,em3027" }, 110 1.8 thorpej DEVICE_COMPAT_EOL 111 1.4 thorpej }; 112 1.1 uwe 113 1.1 uwe static int 114 1.1 uwe em3027rtc_match(device_t parent, cfdata_t cf, void *aux) 115 1.1 uwe { 116 1.1 uwe const struct i2c_attach_args *ia = aux; 117 1.1 uwe uint8_t reg; 118 1.1 uwe int error; 119 1.4 thorpej int match_result; 120 1.4 thorpej 121 1.4 thorpej if (iic_use_direct_match(ia, cf, compat_data, &match_result)) 122 1.4 thorpej return match_result; 123 1.1 uwe 124 1.1 uwe if (ia->ia_addr != EM3027_ADDR) 125 1.1 uwe return 0; 126 1.1 uwe 127 1.1 uwe /* check if the device is there */ 128 1.1 uwe error = iic_acquire_bus(ia->ia_tag, 0); 129 1.1 uwe if (error) 130 1.1 uwe return 0; 131 1.1 uwe 132 1.1 uwe error = iic_smbus_read_byte(ia->ia_tag, ia->ia_addr, 133 1.1 uwe EM3027_ONOFF, ®, 0); 134 1.1 uwe iic_release_bus(ia->ia_tag, 0); 135 1.1 uwe if (error) 136 1.1 uwe return 0; 137 1.1 uwe 138 1.2 thorpej return I2C_MATCH_ADDRESS_AND_PROBE; 139 1.1 uwe } 140 1.1 uwe 141 1.1 uwe 142 1.1 uwe static void 143 1.1 uwe em3027rtc_attach(device_t parent, device_t self, void *aux) 144 1.1 uwe { 145 1.1 uwe struct em3027rtc_softc *sc = device_private(self); 146 1.1 uwe const struct i2c_attach_args *ia = aux; 147 1.1 uwe struct ctl { 148 1.1 uwe uint8_t onoff; 149 1.1 uwe uint8_t irq_ctl; 150 1.1 uwe uint8_t irq_flags; 151 1.1 uwe uint8_t status; 152 1.1 uwe } ctl; 153 1.1 uwe int error; 154 1.1 uwe 155 1.1 uwe aprint_naive(": Real-time Clock and Temperature Sensor\n"); 156 1.1 uwe aprint_normal(": Real-time Clock and Temperature Sensor\n"); 157 1.1 uwe 158 1.1 uwe sc->sc_dev = self; 159 1.1 uwe 160 1.1 uwe sc->sc_tag = ia->ia_tag; 161 1.1 uwe sc->sc_addr = ia->ia_addr; 162 1.1 uwe 163 1.1 uwe 164 1.1 uwe /* 165 1.1 uwe * Control Page registers 166 1.1 uwe */ 167 1.1 uwe error = em3027rtc_read(sc, EM3027_CONTROL_BASE, &ctl, sizeof(ctl)); 168 1.1 uwe if (error) { 169 1.1 uwe aprint_error_dev(sc->sc_dev, 170 1.1 uwe "failed to read control page (error %d)\n", error); 171 1.1 uwe return; 172 1.1 uwe } 173 1.1 uwe 174 1.1 uwe 175 1.1 uwe /* Status */ 176 1.1 uwe aprint_debug_dev(sc->sc_dev, "status=0x%02x\n", ctl.status); 177 1.1 uwe 178 1.1 uwe /* Complain about low voltage but continue anyway */ 179 1.1 uwe if (ctl.status & EM3027_STATUS_VLOW2) { 180 1.1 uwe aprint_error_dev(sc->sc_dev, "voltage low (VLow2)\n"); 181 1.1 uwe sc->sc_vlow = true; 182 1.1 uwe } 183 1.1 uwe else if (ctl.status & EM3027_STATUS_VLOW1) { 184 1.1 uwe aprint_error_dev(sc->sc_dev, "voltage low (VLow1)\n"); 185 1.1 uwe sc->sc_vlow = true; 186 1.1 uwe } 187 1.1 uwe 188 1.1 uwe ctl.status = EM3027_STATUS_POWER_ON; 189 1.1 uwe 190 1.1 uwe 191 1.1 uwe /* On/Off */ 192 1.1 uwe aprint_debug_dev(sc->sc_dev, "on/off=0x%02x\n", ctl.onoff); 193 1.1 uwe 194 1.1 uwe if ((ctl.onoff & EM3027_ONOFF_SR) == 0) { 195 1.1 uwe aprint_verbose_dev(sc->sc_dev, "enabling self-recovery\n"); 196 1.1 uwe ctl.onoff |= EM3027_ONOFF_SR; 197 1.1 uwe } 198 1.1 uwe 199 1.1 uwe if ((ctl.onoff & EM3027_ONOFF_EEREF) == 0) { 200 1.1 uwe aprint_verbose_dev(sc->sc_dev, "enabling EEPROM self-refresh\n"); 201 1.1 uwe ctl.onoff |= EM3027_ONOFF_EEREF; 202 1.1 uwe } 203 1.1 uwe 204 1.1 uwe ctl.onoff &= ~EM3027_ONOFF_TR; 205 1.1 uwe 206 1.1 uwe if (ctl.onoff & EM3027_ONOFF_TI) { 207 1.1 uwe aprint_verbose_dev(sc->sc_dev, "disabling timer\n"); 208 1.1 uwe ctl.onoff &= ~EM3027_ONOFF_TI; 209 1.1 uwe } 210 1.1 uwe 211 1.1 uwe if ((ctl.onoff & EM3027_ONOFF_WA) == 0) { 212 1.1 uwe aprint_verbose_dev(sc->sc_dev, "enabling watch\n"); 213 1.1 uwe ctl.onoff |= EM3027_ONOFF_WA; 214 1.1 uwe } 215 1.1 uwe 216 1.1 uwe 217 1.1 uwe /* IRQ Control/Flags */ 218 1.1 uwe if (ctl.irq_ctl != 0) 219 1.1 uwe aprint_debug_dev(sc->sc_dev, 220 1.1 uwe "irq=0x%02x - disabling all\n", ctl.irq_ctl); 221 1.1 uwe ctl.irq_ctl = 0; 222 1.1 uwe ctl.irq_flags = 0; 223 1.1 uwe 224 1.1 uwe 225 1.1 uwe /* Write them back */ 226 1.1 uwe error = em3027rtc_write(sc, EM3027_CONTROL_BASE, &ctl, sizeof(ctl)); 227 1.1 uwe if (error) { 228 1.1 uwe aprint_error_dev(sc->sc_dev, 229 1.1 uwe "failed to write control page (error %d)\n", error); 230 1.1 uwe return; 231 1.1 uwe } 232 1.1 uwe 233 1.1 uwe 234 1.1 uwe /* 235 1.1 uwe * Attach RTC 236 1.1 uwe */ 237 1.10 thorpej sc->sc_todr.todr_dev = self; 238 1.1 uwe sc->sc_todr.todr_gettime_ymdhms = em3027rtc_gettime; 239 1.1 uwe sc->sc_todr.todr_settime_ymdhms = em3027rtc_settime; 240 1.1 uwe 241 1.1 uwe todr_attach(&sc->sc_todr); 242 1.1 uwe 243 1.1 uwe 244 1.1 uwe /* 245 1.1 uwe * Attach thermometer 246 1.1 uwe */ 247 1.1 uwe em3027rtc_envsys_attach(sc); 248 1.1 uwe } 249 1.1 uwe 250 1.1 uwe 251 1.1 uwe static bool 252 1.1 uwe em3027rtc_enable_thermometer(struct em3027rtc_softc *sc) 253 1.1 uwe { 254 1.1 uwe uint8_t eeprom_ctl; 255 1.1 uwe int error; 256 1.1 uwe 257 1.1 uwe error = em3027rtc_read_byte(sc, EM3027_EEPROM_CTL, &eeprom_ctl); 258 1.1 uwe if (error) { 259 1.1 uwe aprint_error_dev(sc->sc_dev, 260 1.1 uwe "failed to read eeprom control (error %d)\n", error); 261 1.1 uwe return false; 262 1.1 uwe } 263 1.1 uwe 264 1.1 uwe aprint_debug_dev(sc->sc_dev, "eeprom ctl=0x%02x\n", eeprom_ctl); 265 1.1 uwe if (eeprom_ctl & EM3027_EEPROM_THERM_ENABLE) 266 1.1 uwe return true; 267 1.1 uwe 268 1.1 uwe eeprom_ctl |= EM3027_EEPROM_THERM_ENABLE; 269 1.1 uwe error = em3027rtc_write_byte(sc, EM3027_EEPROM_CTL, eeprom_ctl); 270 1.1 uwe if (error) { 271 1.1 uwe aprint_error_dev(sc->sc_dev, 272 1.1 uwe "failed to write eeprom control (error %d)\n", error); 273 1.1 uwe return false; 274 1.1 uwe } 275 1.1 uwe 276 1.1 uwe return true; 277 1.1 uwe } 278 1.1 uwe 279 1.1 uwe 280 1.1 uwe static void 281 1.1 uwe em3027rtc_envsys_attach(struct em3027rtc_softc *sc) 282 1.1 uwe { 283 1.1 uwe int error; 284 1.1 uwe 285 1.1 uwe if (!em3027rtc_enable_thermometer(sc)) { 286 1.1 uwe aprint_error_dev(sc->sc_dev, "thermometer not enabled\n"); 287 1.1 uwe return; 288 1.1 uwe } 289 1.1 uwe 290 1.1 uwe sc->sc_sme = sysmon_envsys_create(); 291 1.1 uwe 292 1.1 uwe sc->sc_sme->sme_name = device_xname(sc->sc_dev); 293 1.1 uwe sc->sc_sme->sme_cookie = sc; 294 1.1 uwe sc->sc_sme->sme_refresh = em3027rtc_sme_refresh; 295 1.1 uwe 296 1.1 uwe sc->sc_sensor.units = ENVSYS_STEMP; 297 1.1 uwe sc->sc_sensor.state = ENVSYS_SINVALID; 298 1.1 uwe sc->sc_sensor.flags = 0; 299 1.1 uwe strlcpy(sc->sc_sensor.desc, "temperature", sizeof(sc->sc_sensor.desc)); 300 1.1 uwe 301 1.1 uwe error = sysmon_envsys_sensor_attach(sc->sc_sme, &sc->sc_sensor); 302 1.1 uwe if (error) { 303 1.1 uwe aprint_error_dev(sc->sc_dev, 304 1.1 uwe "unable to attach sensor (error %d)\n", error); 305 1.1 uwe goto out; 306 1.1 uwe } 307 1.5 uwe 308 1.1 uwe error = sysmon_envsys_register(sc->sc_sme); 309 1.1 uwe if (error) { 310 1.1 uwe aprint_error_dev(sc->sc_dev, 311 1.1 uwe "unable to register with sysmon (error %d)\n", error); 312 1.1 uwe goto out; 313 1.1 uwe } 314 1.1 uwe 315 1.1 uwe return; 316 1.1 uwe 317 1.1 uwe out: 318 1.1 uwe if (error) { 319 1.1 uwe sysmon_envsys_destroy(sc->sc_sme); 320 1.1 uwe sc->sc_sme = NULL; 321 1.1 uwe } 322 1.1 uwe } 323 1.1 uwe 324 1.1 uwe 325 1.1 uwe static int 326 1.1 uwe em3027rtc_iic_exec(struct em3027rtc_softc *sc, i2c_op_t op, uint8_t reg, 327 1.1 uwe void *buf, size_t len) 328 1.1 uwe { 329 1.3 thorpej const int flags = 0; 330 1.1 uwe int error; 331 1.1 uwe 332 1.1 uwe error = iic_acquire_bus(sc->sc_tag, flags); 333 1.1 uwe if (error) 334 1.1 uwe return error; 335 1.1 uwe 336 1.1 uwe error = iic_exec(sc->sc_tag, op, sc->sc_addr, 337 1.1 uwe ®, 1, 338 1.1 uwe (uint8_t *)buf, len, 339 1.1 uwe flags); 340 1.1 uwe 341 1.1 uwe /* XXX: horrible hack that seems to be needed on utilite */ 342 1.1 uwe if (reg == EM3027_WATCH_BASE) 343 1.1 uwe DELAY(1); 344 1.1 uwe 345 1.1 uwe iic_release_bus(sc->sc_tag, flags); 346 1.1 uwe return error; 347 1.1 uwe } 348 1.1 uwe 349 1.1 uwe 350 1.1 uwe static int 351 1.1 uwe em3027rtc_read(struct em3027rtc_softc *sc, uint8_t reg, void *buf, size_t len) 352 1.1 uwe { 353 1.1 uwe 354 1.1 uwe return em3027rtc_iic_exec(sc, I2C_OP_READ_WITH_STOP, reg, buf, len); 355 1.1 uwe } 356 1.1 uwe 357 1.1 uwe 358 1.1 uwe static int 359 1.1 uwe em3027rtc_read_byte(struct em3027rtc_softc *sc, uint8_t reg, uint8_t *valp) 360 1.1 uwe { 361 1.1 uwe 362 1.5 uwe return em3027rtc_read(sc, reg, valp, 1); 363 1.1 uwe } 364 1.1 uwe 365 1.1 uwe 366 1.1 uwe static int 367 1.1 uwe em3027rtc_write(struct em3027rtc_softc *sc, uint8_t reg, void *buf, size_t len) 368 1.1 uwe { 369 1.1 uwe 370 1.1 uwe return em3027rtc_iic_exec(sc, I2C_OP_WRITE_WITH_STOP, reg, buf, len); 371 1.1 uwe } 372 1.1 uwe 373 1.1 uwe 374 1.1 uwe static int 375 1.1 uwe em3027rtc_write_byte(struct em3027rtc_softc *sc, uint8_t reg, uint8_t val) 376 1.1 uwe { 377 1.1 uwe 378 1.1 uwe return em3027rtc_write(sc, reg, &val, 1); 379 1.1 uwe } 380 1.1 uwe 381 1.1 uwe 382 1.1 uwe static int 383 1.1 uwe em3027rtc_gettime(struct todr_chip_handle *todr, struct clock_ymdhms *dt) 384 1.1 uwe { 385 1.10 thorpej struct em3027rtc_softc *sc = device_private(todr->todr_dev); 386 1.1 uwe struct em3027rtc_watch w; 387 1.1 uwe int error; 388 1.1 uwe 389 1.1 uwe error = em3027rtc_read(sc, EM3027_WATCH_BASE, &w, sizeof(w)); 390 1.1 uwe if (error) { 391 1.1 uwe aprint_error_dev(sc->sc_dev, 392 1.1 uwe "failed to read watch (error %d)\n", error); 393 1.1 uwe return error; 394 1.1 uwe } 395 1.1 uwe 396 1.1 uwe dt->dt_sec = bcdtobin(w.sec); 397 1.1 uwe dt->dt_min = bcdtobin(w.min); 398 1.1 uwe 399 1.1 uwe if (w.hour & EM3027_WATCH_HOUR_S12) { 400 1.1 uwe const int pm = w.hour & EM3027_WATCH_HOUR_PM; 401 1.1 uwe int hr; 402 1.1 uwe 403 1.1 uwe w.hour &= ~(EM3027_WATCH_HOUR_S12 | EM3027_WATCH_HOUR_PM); 404 1.1 uwe hr = bcdtobin(w.hour); 405 1.1 uwe if (hr == 12) 406 1.1 uwe hr = pm ? 12 : 0; 407 1.1 uwe else if (pm) 408 1.1 uwe hr += 12; 409 1.1 uwe 410 1.1 uwe dt->dt_hour = hr; 411 1.1 uwe } 412 1.1 uwe else { 413 1.1 uwe dt->dt_hour = bcdtobin(w.hour); 414 1.1 uwe } 415 1.1 uwe 416 1.1 uwe dt->dt_day = bcdtobin(w.day); 417 1.1 uwe dt->dt_wday = bcdtobin(w.wday) - 1; 418 1.1 uwe dt->dt_mon = bcdtobin(w.mon); 419 1.1 uwe dt->dt_year = bcdtobin(w.year) + EM3027_BASE_YEAR; 420 1.1 uwe 421 1.1 uwe return 0; 422 1.1 uwe } 423 1.1 uwe 424 1.1 uwe 425 1.1 uwe static int 426 1.1 uwe em3027rtc_settime(struct todr_chip_handle *todr, struct clock_ymdhms *dt) 427 1.1 uwe { 428 1.10 thorpej struct em3027rtc_softc *sc = device_private(todr->todr_dev); 429 1.1 uwe struct em3027rtc_watch w; 430 1.1 uwe int error; 431 1.1 uwe 432 1.1 uwe w.sec = bintobcd(dt->dt_sec); 433 1.1 uwe w.min = bintobcd(dt->dt_min); 434 1.1 uwe w.hour = bintobcd(dt->dt_hour); 435 1.1 uwe w.day = bintobcd(dt->dt_day); 436 1.1 uwe w.wday = bintobcd(dt->dt_wday + 1); 437 1.1 uwe w.mon = bintobcd(dt->dt_mon); 438 1.1 uwe w.year = bintobcd(dt->dt_year - EM3027_BASE_YEAR); 439 1.1 uwe 440 1.1 uwe error = em3027rtc_write(sc, EM3027_WATCH_BASE, &w, sizeof(w)); 441 1.1 uwe return error; 442 1.1 uwe } 443 1.1 uwe 444 1.1 uwe 445 1.1 uwe static void 446 1.1 uwe em3027rtc_sme_refresh(struct sysmon_envsys *sme, envsys_data_t *edata) 447 1.1 uwe { 448 1.1 uwe struct em3027rtc_softc *sc = sme->sme_cookie; 449 1.1 uwe uint8_t status, t_raw; 450 1.1 uwe uint32_t t_uk; 451 1.1 uwe int error; 452 1.1 uwe 453 1.1 uwe edata->state = ENVSYS_SINVALID; 454 1.1 uwe 455 1.1 uwe error = em3027rtc_read_byte(sc, EM3027_STATUS, &status); 456 1.1 uwe if (error) { 457 1.1 uwe aprint_debug_dev(sc->sc_dev, 458 1.1 uwe "failed to read status (error %d)\n", error); 459 1.1 uwe return; 460 1.1 uwe } 461 1.1 uwe 462 1.1 uwe if (status & (EM3027_STATUS_VLOW2 | EM3027_STATUS_VLOW1)) { 463 1.1 uwe if (!sc->sc_vlow) { 464 1.1 uwe sc->sc_vlow = true; 465 1.1 uwe aprint_error_dev(sc->sc_dev, 466 1.1 uwe "voltage low, thermometer is disabled\n"); 467 1.1 uwe } 468 1.1 uwe return; 469 1.1 uwe } 470 1.1 uwe else 471 1.1 uwe sc->sc_vlow = false; 472 1.1 uwe 473 1.1 uwe error = em3027rtc_read_byte(sc, EM3027_TEMP, &t_raw); 474 1.1 uwe if (error) { 475 1.1 uwe aprint_debug_dev(sc->sc_dev, 476 1.1 uwe "failed to read temperature (error %d)\n", error); 477 1.1 uwe return; 478 1.1 uwe } 479 1.1 uwe 480 1.1 uwe 481 1.1 uwe /* convert to microkelvin */ 482 1.1 uwe t_uk = ((int)t_raw + EM3027_TEMP_BASE) * 1000000 + 273150000; 483 1.1 uwe 484 1.1 uwe edata->value_cur = t_uk; 485 1.1 uwe edata->state = ENVSYS_SVALID; 486 1.1 uwe } 487