This patch does away with device name based conditional definition of set_sleep_mode for almost all tiny and mega devices. This has already been done for xmega devices in commit rev 2455. Since all SLEEP_MODE defines have now been moved to header files, I've removed those as well.
I tested the patch by diff'ing the disassembly of a set_sleep_mode (SLEEP_MODE_IDLE) call for all supported devices before and after the change. The only differences are 1. atmega325p and atmega3250p now have set_sleep_mode defined. 2. atmega16hvb, atmega16hvbrevb, atmega32hvb and atmega32hvbrevb now (correctly) mask all three SM bits. The only device specific checks left are for ATmega{161,162,8515} - the SM bits are spread across more than one register for these. I'll see if there's a way to get rid of those checks as well - perhaps by adding/checking for specific defines. Committed as rev #2457. Regards Senthil ChangeLog 2014-11-18 Senthil Kumar Selvaraj <senthil_kumar.selva...@atmel.com> * include/avr/sleep.h (set_sleep_mode): Remove SLEEP_MODE defines for tiny and mega devices as well. Branch on presence of SM<n> instead of device name. Index: include/avr/sleep.h =================================================================== --- include/avr/sleep.h (revision 2455) +++ include/avr/sleep.h (working copy) @@ -159,13 +159,10 @@ #endif -/* Define set_sleep_mode() and sleep mode values per device. */ +/* Special casing these three devices - they are the + only ones that need to write to more than one register. */ #if defined(__AVR_ATmega161__) - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_PWR_DOWN 1 - #define SLEEP_MODE_PWR_SAVE 2 - #define set_sleep_mode(mode) \ do { \ MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_PWR_DOWN || (mode) == SLEEP_MODE_PWR_SAVE ? _BV(SM1) : 0)); \ @@ -176,13 +173,6 @@ #elif defined(__AVR_ATmega162__) \ || defined(__AVR_ATmega8515__) - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_PWR_DOWN 1 - #define SLEEP_MODE_PWR_SAVE 2 - #define SLEEP_MODE_ADC 3 - #define SLEEP_MODE_STANDBY 4 - #define SLEEP_MODE_EXT_STANDBY 5 - #define set_sleep_mode(mode) \ do { \ MCUCR = ((MCUCR & ~_BV(SM1)) | ((mode) == SLEEP_MODE_IDLE ? 0 : _BV(SM1))); \ @@ -190,265 +180,7 @@ EMCUCR = ((EMCUCR & ~_BV(SM0)) | ((mode) == SLEEP_MODE_PWR_SAVE || (mode) == SLEEP_MODE_EXT_STANDBY ? _BV(SM0) : 0)); \ } while(0) -#elif defined(__AVR_AT90S2313__) \ -|| defined(__AVR_AT90S2323__) \ -|| defined(__AVR_AT90S2333__) \ -|| defined(__AVR_AT90S2343__) \ -|| defined(__AVR_AT43USB320__) \ -|| defined(__AVR_AT43USB355__) \ -|| defined(__AVR_AT90S4414__) \ -|| defined(__AVR_AT90S4433__) \ -|| defined(__AVR_AT90S8515__) \ -|| defined(__AVR_ATtiny22__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_PWR_DOWN _BV(SM) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~_BV(SM)) | (mode)); \ - } while(0) - -#elif defined(__AVR_ATtiny167__) \ -|| defined(__AVR_ATtiny87__) \ -|| defined(__AVR_ATtiny828__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ - } while(0) - -#elif defined(__AVR_AT90S4434__) \ -|| defined(__AVR_ATA5505__) \ -|| defined(__AVR_ATA5272__) \ -|| defined(__AVR_AT76C711__) \ -|| defined(__AVR_AT90S8535__) \ -|| defined(__AVR_ATmega103__) \ -|| defined(__AVR_ATmega161__) \ -|| defined(__AVR_ATmega163__) \ -|| defined(__AVR_ATmega16HVB__) \ -|| defined(__AVR_ATmega16HVBREVB__) \ -|| defined(__AVR_ATmega32HVB__) \ -|| defined(__AVR_ATmega32HVBREVB__) \ -|| defined(__AVR_ATtiny13__) \ -|| defined(__AVR_ATtiny13A__) \ -|| defined(__AVR_ATtiny15__) \ -|| defined(__AVR_ATtiny24__) \ -|| defined(__AVR_ATtiny24A__) \ -|| defined(__AVR_ATtiny44__) \ -|| defined(__AVR_ATtiny44A__) \ -|| defined(__AVR_ATtiny84__) \ -|| defined(__AVR_ATtiny84A__) \ -|| defined(__AVR_ATtiny25__) \ -|| defined(__AVR_ATtiny45__) \ -|| defined(__AVR_ATtiny48__) \ -|| defined(__AVR_ATtiny85__) \ -|| defined(__AVR_ATtiny88__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1)) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ - } while(0) - -#elif defined(__AVR_ATtiny2313__) \ -|| defined(__AVR_ATtiny2313A__) \ -|| defined(__AVR_ATtiny4313__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_PWR_DOWN (_BV(SM0) | _BV(SM1)) - #define SLEEP_MODE_STANDBY _BV(SM1) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ - } while(0) - -#elif defined(__AVR_AT94K__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1)) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ - } while(0) - -#elif defined(__AVR_ATtiny26__) \ -|| defined(__AVR_ATtiny261__) \ -|| defined(__AVR_ATtiny261A__) \ -|| defined(__AVR_ATtiny461__) \ -|| defined(__AVR_ATtiny461A__) \ -|| defined(__AVR_ATtiny861__) \ -|| defined(__AVR_ATtiny861A__) \ -|| defined(__AVR_ATtiny43U__) \ -|| defined(__AVR_ATtiny1634__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_STANDBY (_BV(SM0) | _BV(SM1)) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ - } while(0) - -#elif defined(__AVR_AT90PWM216__) \ -|| defined(__AVR_AT90PWM316__) \ -|| defined(__AVR_AT90PWM161__) \ -|| defined(__AVR_AT90PWM81__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2)) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ - } while(0) - -#elif defined(__AVR_AT90CAN128__) \ -|| defined(__AVR_AT90CAN32__) \ -|| defined(__AVR_AT90CAN64__) \ -|| defined(__AVR_AT90PWM1__) \ -|| defined(__AVR_AT90PWM2__) \ -|| defined(__AVR_AT90PWM2B__) \ -|| defined(__AVR_AT90PWM3__) \ -|| defined(__AVR_AT90PWM3B__) \ -|| defined(__AVR_AT90USB162__) \ -|| defined(__AVR_AT90USB82__) \ -|| defined(__AVR_AT90USB1286__) \ -|| defined(__AVR_AT90USB1287__) \ -|| defined(__AVR_AT90USB646__) \ -|| defined(__AVR_AT90USB647__) \ -|| defined(__AVR_ATmega128__) \ -|| defined(__AVR_ATmega128A__) \ -|| defined(__AVR_ATmega1280__) \ -|| defined(__AVR_ATmega1281__) \ -|| defined(__AVR_ATmega1284__) \ -|| defined(__AVR_ATmega1284P__) \ -|| defined(__AVR_ATmega128RFA1__) \ -|| defined(__AVR_ATmega1284RFR2__) \ -|| defined(__AVR_ATmega128RFR2__) \ -|| defined(__AVR_ATmega16__) \ -|| defined(__AVR_ATmega16A__) \ -|| defined(__AVR_ATmega162__) \ -|| defined(__AVR_ATmega164A__) \ -|| defined(__AVR_ATmega164P__) \ -|| defined(__AVR_ATmega164PA__) \ -|| defined(__AVR_ATmega165__) \ -|| defined(__AVR_ATmega165A__) \ -|| defined(__AVR_ATmega165P__) \ -|| defined(__AVR_ATmega165PA__) \ -|| defined(__AVR_ATmega168__) \ -|| defined(__AVR_ATmega168A__) \ -|| defined(__AVR_ATmega168P__) \ -|| defined(__AVR_ATmega168PA__) \ -|| defined(__AVR_ATmega169__) \ -|| defined(__AVR_ATmega169A__) \ -|| defined(__AVR_ATmega169P__) \ -|| defined(__AVR_ATmega169PA__) \ -|| defined(__AVR_ATmega16HVA__) \ -|| defined(__AVR_ATmega16HVA2__) \ -|| defined(__AVR_ATmega16M1__) \ -|| defined(__AVR_ATmega16U2__) \ -|| defined(__AVR_ATmega16U4__) \ -|| defined(__AVR_ATmega2560__) \ -|| defined(__AVR_ATmega2561__) \ -|| defined(__AVR_ATmega2564RFR2__) \ -|| defined(__AVR_ATmega256RFR2__) \ -|| defined(__AVR_ATmega32__) \ -|| defined(__AVR_ATmega32A__) \ -|| defined(__AVR_ATmega323__) \ -|| defined(__AVR_ATmega324A__) \ -|| defined(__AVR_ATmega324P__) \ -|| defined(__AVR_ATmega324PA__) \ -|| defined(__AVR_ATmega325__) \ -|| defined(__AVR_ATmega325A__) \ -|| defined(__AVR_ATmega325PA__) \ -|| defined(__AVR_ATmega3250__) \ -|| defined(__AVR_ATmega3250A__) \ -|| defined(__AVR_ATmega3250PA__) \ -|| defined(__AVR_ATmega328__) \ -|| defined(__AVR_ATmega328P__) \ -|| defined(__AVR_ATmega329__) \ -|| defined(__AVR_ATmega329A__) \ -|| defined(__AVR_ATmega329P__) \ -|| defined(__AVR_ATmega329PA__) \ -|| defined(__AVR_ATmega3290__) \ -|| defined(__AVR_ATmega3290A__) \ -|| defined(__AVR_ATmega3290P__) \ -|| defined(__AVR_ATmega3290PA__) \ -|| defined(__AVR_ATmega32C1__) \ -|| defined(__AVR_ATmega32M1__) \ -|| defined(__AVR_ATmega32U2__) \ -|| defined(__AVR_ATmega32U4__) \ -|| defined(__AVR_ATmega32U6__) \ -|| defined(__AVR_ATmega406__) \ -|| defined(__AVR_ATmega48__) \ -|| defined(__AVR_ATmega48A__) \ -|| defined(__AVR_ATmega48PA__) \ -|| defined(__AVR_ATmega48P__) \ -|| defined(__AVR_ATmega64__) \ -|| defined(__AVR_ATmega64A__) \ -|| defined(__AVR_ATmega640__) \ -|| defined(__AVR_ATmega644__) \ -|| defined(__AVR_ATmega644A__) \ -|| defined(__AVR_ATmega644P__) \ -|| defined(__AVR_ATmega644PA__) \ -|| defined(__AVR_ATmega645__) \ -|| defined(__AVR_ATmega645A__) \ -|| defined(__AVR_ATmega645P__) \ -|| defined(__AVR_ATmega6450__) \ -|| defined(__AVR_ATmega6450A__) \ -|| defined(__AVR_ATmega6450P__) \ -|| defined(__AVR_ATmega649__) \ -|| defined(__AVR_ATmega649A__) \ -|| defined(__AVR_ATmega6490__) \ -|| defined(__AVR_ATmega6490A__) \ -|| defined(__AVR_ATmega6490P__) \ -|| defined(__AVR_ATmega649P__) \ -|| defined(__AVR_ATmega64C1__) \ -|| defined(__AVR_ATmega64HVE__) \ -|| defined(__AVR_ATmega64M1__) \ -|| defined(__AVR_ATmega644RFR2__) \ -|| defined(__AVR_ATmega64RFR2__) \ -|| defined(__AVR_ATmega8__) \ -|| defined(__AVR_ATmega8A__) \ -|| defined(__AVR_ATmega8515__) \ -|| defined(__AVR_ATmega8535__) \ -|| defined(__AVR_ATmega88__) \ -|| defined(__AVR_ATmega88A__) \ -|| defined(__AVR_ATmega88P__) \ -|| defined(__AVR_ATmega88PA__) \ -|| defined(__AVR_ATmega8HVA__) \ -|| defined(__AVR_ATmega8U2__) - - - #define SLEEP_MODE_IDLE (0) - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1)) - #define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2)) - #define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2)) - - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ - } while(0) - +/* All xmegas work the same way */ #elif defined(__AVR_XMEGA__) #define set_sleep_mode(mode) \ @@ -456,67 +188,35 @@ _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(SLEEP_SMODE2_bm | SLEEP_SMODE1_bm | SLEEP_SMODE0_bm)) | (mode)); \ } while(0) -#elif defined(__AVR_AT90SCR100__) +/* For everything else, check for presence of SM<n> and define set_sleep_mode accordingly. */ +#else +#if defined(SM2) - #define SLEEP_MODE_IDLE (0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1)) - #define SLEEP_MODE_STANDBY (_BV(SM1) | _BV(SM2)) - #define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2)) - #define set_sleep_mode(mode) \ do { \ _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ } while(0) -#elif defined(__AVR_ATA6285__) \ -|| defined(__AVR_ATA6286__) \ -|| defined(__AVR_ATA6289__) +#elif defined(SM1) - #define SLEEP_MODE_IDLE (0) - #define SLEEP_MODE_SENSOR_NOISE_REDUCTION (_BV(SM0)) - #define SLEEP_MODE_PWR_DOWN (_BV(SM1)) - #define set_sleep_mode(mode) \ do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ + _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1))) | (mode)); \ } while(0) -#elif defined (__AVR_ATA5790__) \ -|| defined (__AVR_ATA5795__) +#elif defined(SM) - #define SLEEP_MODE_IDLE (0) - #define SLEEP_MODE_EXT_PWR_SAVE (_BV(SM0)) - #define SLEEP_MODE_PWR_DOWN (_BV(SM1)) - #define SLEEP_MODE_PWR_SAVE (_BV(SM1) | _BV(SM0)) - #define set_sleep_mode(mode) \ do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ + _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~_BV(SM)) | (mode)); \ } while(0) -#elif defined(__AVR_ATtiny4__) \ -|| defined(__AVR_ATtiny5__) \ -|| defined(__AVR_ATtiny9__) \ -|| defined(__AVR_ATtiny10__) \ -|| defined(__AVR_ATtiny20__) \ -|| defined(__AVR_ATtiny40__) - - #define SLEEP_MODE_IDLE 0 - #define SLEEP_MODE_ADC _BV(SM0) - #define SLEEP_MODE_PWR_DOWN _BV(SM1) - #define SLEEP_MODE_STANDBY _BV(SM2) - - #define set_sleep_mode(mode) \ - do { \ - _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG & ~(_BV(SM0) | _BV(SM1) | _BV(SM2))) | (mode)); \ - } while(0) - #else #error "No SLEEP mode defined for this device." -#endif +#endif /* if defined(SM2) */ +#endif /* #if defined(__AVR_ATmega161__) */ _______________________________________________ AVR-libc-dev mailing list AVR-libc-dev@nongnu.org https://lists.nongnu.org/mailman/listinfo/avr-libc-dev