lm75.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * lm75.h - Part of lm_sensors, Linux kernel modules for hardware monitoring
  4. * Copyright (c) 2003 Mark M. Hoffman <mhoffman@lightlink.com>
  5. */
  6. /*
  7. * This file contains common code for encoding/decoding LM75 type
  8. * temperature readings, which are emulated by many of the chips
  9. * we support. As the user is unlikely to load more than one driver
  10. * which contains this code, we don't worry about the wasted space.
  11. */
  12. #include <linux/minmax.h>
  13. #include <linux/types.h>
  14. /* straight from the datasheet */
  15. #define LM75_TEMP_MIN (-55000)
  16. #define LM75_TEMP_MAX 125000
  17. #define LM75_SHUTDOWN 0x01
  18. /*
  19. * TEMP: 0.001C/bit (-55C to +125C)
  20. * REG: (0.5C/bit, two's complement) << 7
  21. */
  22. static inline u16 LM75_TEMP_TO_REG(long temp)
  23. {
  24. int ntemp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX);
  25. ntemp += (ntemp < 0 ? -250 : 250);
  26. return (u16)((ntemp / 500) << 7);
  27. }
  28. static inline int LM75_TEMP_FROM_REG(u16 reg)
  29. {
  30. /*
  31. * use integer division instead of equivalent right shift to
  32. * guarantee arithmetic shift and preserve the sign
  33. */
  34. return ((s16)reg / 128) * 500;
  35. }