/* Copyright 2017 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* ADT7481 temperature sensor module for Chrome EC */ #ifndef __CROS_EC_ADT7481_H #define __CROS_EC_ADT7481_H #define ADT7481_I2C_ADDR_FLAGS 0x4B #define ADT7481_IDX_LOCAL 0 #define ADT7481_IDX_REMOTE1 1 #define ADT7481_IDX_REMOTE2 2 /* Chip-specific registers */ #define ADT7481_LOCAL 0x00 #define ADT7481_REMOTE1 0x01 #define ADT7481_STATUS1_R 0x02 #define ADT7481_CONFIGURATION1_R 0x03 #define ADT7481_CONVERSION_RATE_R 0x04 #define ADT7481_LOCAL_HIGH_LIMIT_R 0x05 #define ADT7481_LOCAL_LOW_LIMIT_R 0x06 #define ADT7481_REMOTE1_HIGH_LIMIT_R 0x07 #define ADT7481_REMOTE1_LOW_LIMIT_R 0x08 #define ADT7481_CONFIGURATION1_W 0x09 #define ADT7481_CONVERSION_RATE_W 0x0a #define ADT7481_LOCAL_HIGH_LIMIT_W 0x0b #define ADT7481_LOCAL_LOW_LIMIT_W 0x0c #define ADT7481_REMOTE1_HIGH_LIMIT_W 0x0d #define ADT7481_REMOTE1_LOW_LIMIT_W 0x0e #define ADT7481_ONESHOT_W 0x0f #define ADT7481_REMOTE1_EXTD_R 0x10 #define ADT7481_REMOTE1_OFFSET 0x11 #define ADT7481_REMOTE1_OFFSET_EXTD 0x12 #define ADT7481_REMOTE1_HIGH_LIMIT_EXTD 0x13 #define ADT7481_REMOTE1_LOW_LIMIT_EXTD 0x14 #define ADT7481_REMOTE1_THERM_LIMIT 0x19 #define ADT7481_LOCAL_THERM_LIMIT 0x20 #define ADT7481_THERM_HYSTERESIS 0x21 #define ADT7481_CONSECUTIVE_ALERT 0x22 #define ADT7481_STATUS2_R 0x23 #define ADT7481_CONFIGURATION2 0x24 #define ADT7481_REMOTE2 0x30 #define ADT7481_REMOTE2_HIGH_LIMIT 0x31 #define ADT7481_REMOTE2_LOW_LIMIT 0x32 #define ADT7481_REMOTE2_EXTD_R 0x33 #define ADT7481_REMOTE2_OFFSET 0x34 #define ADT7481_REMOTE2_OFFSET_EXTD 0x35 #define ADT7481_REMOTE2_HIGH_LIMIT_EXTD 0x36 #define ADT7481_REMOTE2_LOW_LIMIT_EXTD 0x37 #define ADT7481_REMOTE2_THERM_LIMIT 0x39 #define ADT7481_DEVICE_ID 0x3d #define ADT7481_MANUFACTURER_ID 0x3e /* Config1 register bits */ #define ADT7481_CONFIG1_REMOTE1_ALERT_MASK BIT(0) #define ADT7481_CONFIG1_REMOTE2_ALERT_MASK BIT(1) #define ADT7481_CONFIG1_TEMP_RANGE BIT(2) #define ADT7481_CONFIG1_SEL_REMOTE2 BIT(3) /* ADT7481_CONFIG1_MODE bit is use to enable THERM mode */ #define ADT7481_CONFIG1_MODE BIT(5) #define ADT7481_CONFIG1_RUN_L BIT(6) /* mask all alerts on ALERT# pin */ #define ADT7481_CONFIG1_ALERT_MASK_L BIT(7) /* Config2 register bits */ #define ADT7481_CONFIG2_LOCK BIT(7) /* Conversion Rate/Channel Select Register */ #define ADT7481_CONV_RATE_MASK (0x0f) #define ADT7481_CONV_RATE_16S (0x00) #define ADT7481_CONV_RATE_8S (0x01) #define ADT7481_CONV_RATE_4S (0x02) #define ADT7481_CONV_RATE_2S (0x03) #define ADT7481_CONV_RATE_1S (0x04) #define ADT7481_CONV_RATE_500MS (0x05) #define ADT7481_CONV_RATE_250MS (0x06) #define ADT7481_CONV_RATE_125MS (0x07) #define ADT7481_CONV_RATE_62500US (0x08) #define ADT7481_CONV_RATE_31250US (0x09) #define ADT7481_CONV_RATE_15500US (0x0a) /* continuous mode 73 ms averaging */ #define ADT7481_CONV_RATE_73MS_AVE (0x0b) #define ADT7481_CONV_CHAN_SELECT_MASK (0x30) #define ADT7481_CONV_CHAN_SEL_ROUND_ROBIN (0 << 4) #define ADT7481_CONV_CHAN_SEL_LOCAL BIT(4) #define ADT7481_CONV_CHAN_SEL_REMOTE1 (2 << 4) #define ADT7481_CONV_CHAN_SEL_REMOTE2 (3 << 4) #define ADT7481_CONV_AVERAGING_L BIT(7) /* Status1 register bits */ #define ADT7481_STATUS1_LOCAL_THERM_ALARM BIT(0) #define ADT7481_STATUS1_REMOTE1_THERM_ALARM BIT(1) #define ADT7481_STATUS1_REMOTE1_OPEN BIT(2) #define ADT7481_STATUS1_REMOTE1_LOW_ALARM BIT(3) #define ADT7481_STATUS1_REMOTE1_HIGH_ALARM BIT(4) #define ADT7481_STATUS1_LOCAL_LOW_ALARM BIT(5) #define ADT7481_STATUS1_LOCAL_HIGH_ALARM BIT(6) #define ADT7481_STATUS1_BUSY BIT(7) /* Status2 register bits */ #define ADT7481_STATUS2_ALERT BIT(0) #define ADT7481_STATUS2_REMOTE2_THERM_ALARM BIT(1) #define ADT7481_STATUS2_REMOTE2_OPEN BIT(2) #define ADT7481_STATUS2_REMOTE2_LOW_ALARM BIT(3) #define ADT7481_STATUS2_REMOTE2_HIGH_ALARM BIT(4) /* Consecutive Alert register */ #define ADT7481_CONSEC_MASK (0xf) #define ADT7481_CONSEC_1 (0x0) #define ADT7481_CONSEC_2 (0x2) #define ADT7481_CONSEC_3 (0x6) #define ADT7481_CONSEC_4 (0xe) #define ADT7481_CONSEC_EN_SCL_TIMEOUT BIT(5) #define ADT7481_CONSEC_EN_SDA_TIMEOUT BIT(6) #define ADT7481_CONSEC_MASK_LOCAL_ALERT BIT(7) /* Limits */ #define ADT7481_HYSTERESIS_HIGH_LIMIT 255 #define ADT7481_HYSTERESIS_LOW_LIMIT 0 enum adt7481_power_state { ADT7481_POWER_OFF = 0, ADT7481_POWER_ON, ADT7481_POWER_COUNT }; enum adt7481_channel_id { ADT7481_CHANNEL_LOCAL, ADT7481_CHANNEL_REMOTE1, ADT7481_CHANNEL_REMOTE2, ADT7481_CHANNEL_COUNT }; /** * Get the last polled value of a sensor. * * @param idx Index to read. Idx indicates whether to read die * temperature or external temperature. * @param temp_ptr Destination for temperature in K. * * @return EC_SUCCESS if successful, non-zero if error. */ int adt7481_get_val(int idx, int *temp_ptr); /** * Power control function of ADT7481 temperature sensor. * * @param power_on ADT7481_POWER_ON: turn ADT7481 sensor on. * ADT7481_POWER_OFF: shut ADT7481 sensor down. * * @return EC_SUCCESS if successful, non-zero if error. */ int adt7481_set_power(enum adt7481_power_state power_on); /* * Set ADT7481 ALERT#/THERM2# pin to THERM mode, and give a limit * for a specific channel. * * @param channel specific a channel * * @param limit_c High limit temperature, default: 85C * * @param hysteresis Hysteresis temperature, default: 10C * All channels share the same hysteresis * * In THERM mode, ALERT# pin will trigger(Low) by itself when any * channel's temperature is greater( >= )than channel's limit_c, * and release(High) by itself when channel's temperature is lower * than (limit_c - hysteresis) */ int adt7481_set_therm_limit(int channel, int limit_c, int hysteresis); #endif /* __CROS_EC_ADT7481_H */