/* Copyright (c) 2013 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. */ /* common.h - Common includes for Chrome EC */ #ifndef __CROS_EC_COMMON_H #define __CROS_EC_COMMON_H #include /* * Macros to concatenate 2 - 4 tokens together to form a single token. * Multiple levels of nesting are required to convince the preprocessor to * expand currently-defined tokens before concatenation. * * For example, if you have * #define FOO 1 * #define BAR1 42 * Then * #define BAZ CONCAT2(BAR, FOO) * Will evaluate to BAR1, which then evaluates to 42. */ #define CONCAT_STAGE_1(w, x, y, z) w ## x ## y ## z #define CONCAT2(w, x) CONCAT_STAGE_1(w, x, , ) #define CONCAT3(w, x, y) CONCAT_STAGE_1(w, x, y, ) #define CONCAT4(w, x, y, z) CONCAT_STAGE_1(w, x, y, z) /* * Macros to turn the argument into a string constant. * * Compared to directly using the preprocessor # operator, this 2-stage macro * is safe with regards to using nested macros and defined arguments. */ #define STRINGIFY0(name) #name #define STRINGIFY(name) STRINGIFY0(name) /* Macros to access registers */ #define REG32(addr) (*(volatile uint32_t *)(addr)) #define REG16(addr) (*(volatile uint16_t *)(addr)) #define REG8(addr) (*(volatile uint8_t *)(addr)) /* * Define __aligned(n) and __packed if someone hasn't beat us to it. Linux * kernel style checking prefers these over __attribute__((packed)) and * __attribute__((aligned(n))). */ #ifndef __aligned #define __aligned(n) __attribute__((aligned(n))) #endif #ifndef __packed #define __packed __attribute__((packed)) #endif /* There isn't really a better place for this */ #define C_TO_K(temp_c) ((temp_c) + 273) #define K_TO_C(temp_c) ((temp_c) - 273) #define CELSIUS_TO_DECI_KELVIN(temp_c) ((temp_c) * 10 + 2731) #define DECI_KELVIN_TO_CELSIUS(temp_dk) ((temp_dk - 2731) / 10) /* Include top-level configuration file */ #include "config.h" /* Canonical list of module IDs */ #include "module_id.h" /* List of common error codes that can be returned */ enum ec_error_list { /* Success - no error */ EC_SUCCESS = 0, /* Unknown error */ EC_ERROR_UNKNOWN = 1, /* Function not implemented yet */ EC_ERROR_UNIMPLEMENTED = 2, /* Overflow error; too much input provided. */ EC_ERROR_OVERFLOW = 3, /* Timeout */ EC_ERROR_TIMEOUT = 4, /* Invalid argument */ EC_ERROR_INVAL = 5, /* Already in use, or not ready yet */ EC_ERROR_BUSY = 6, /* Access denied */ EC_ERROR_ACCESS_DENIED = 7, /* Failed because component does not have power */ EC_ERROR_NOT_POWERED = 8, /* Failed because component is not calibrated */ EC_ERROR_NOT_CALIBRATED = 9, /* Invalid console command param (PARAMn means parameter n is bad) */ EC_ERROR_PARAM1 = 11, EC_ERROR_PARAM2 = 12, EC_ERROR_PARAM3 = 13, EC_ERROR_PARAM4 = 14, EC_ERROR_PARAM5 = 15, EC_ERROR_PARAM6 = 16, EC_ERROR_PARAM7 = 17, EC_ERROR_PARAM8 = 18, EC_ERROR_PARAM9 = 19, EC_ERROR_PARAM_COUNT = 20, /* Wrong number of params */ /* Module-internal error codes may use this range. */ EC_ERROR_INTERNAL_FIRST = 0x10000, EC_ERROR_INTERNAL_LAST = 0x1FFFF }; /* * Define test_mockable and test_mockable_static for mocking * functions. */ #ifdef TEST_BUILD #define test_mockable __attribute__((weak)) #define test_mockable_static __attribute__((weak)) #define test_export_static #else #define test_mockable #define test_mockable_static static #define test_export_static static #endif /* * accessor allowing to override some read only data accesses. * used to workaround a buggy toolchain (cf http://crosbug.com/p/24378) */ #ifndef RO #define RO(var) var #endif #endif /* __CROS_EC_COMMON_H */