/* * Blackfin core register bit & address definitions * * Copyright 2005-2008 Analog Devices Inc. * * Licensed under the Clear BSD license or GPL-2 (or later). */ #ifndef _DEF_LPBLACKFIN_H #define _DEF_LPBLACKFIN_H #include #define MK_BMSK_(x) (1<> __ffs(mask)) #ifndef __ASSEMBLY__ #include #if ANOMALY_05000198 # define NOP_PAD_ANOMALY_05000198 "nop;" #else # define NOP_PAD_ANOMALY_05000198 #endif #define _bfin_readX(addr, size, asm_size, asm_ext) ({ \ u32 __v; \ __asm__ __volatile__( \ NOP_PAD_ANOMALY_05000198 \ "%0 = " #asm_size "[%1]" #asm_ext ";" \ : "=d" (__v) \ : "a" (addr) \ ); \ __v; }) #define _bfin_writeX(addr, val, size, asm_size) \ __asm__ __volatile__( \ NOP_PAD_ANOMALY_05000198 \ #asm_size "[%0] = %1;" \ : \ : "a" (addr), "d" ((u##size)(val)) \ : "memory" \ ) #define bfin_read8(addr) _bfin_readX(addr, 8, b, (z)) #define bfin_read16(addr) _bfin_readX(addr, 16, w, (z)) #define bfin_read32(addr) _bfin_readX(addr, 32, , ) #define bfin_write8(addr, val) _bfin_writeX(addr, val, 8, b) #define bfin_write16(addr, val) _bfin_writeX(addr, val, 16, w) #define bfin_write32(addr, val) _bfin_writeX(addr, val, 32, ) #define bfin_read(addr) \ ({ \ sizeof(*(addr)) == 1 ? bfin_read8(addr) : \ sizeof(*(addr)) == 2 ? bfin_read16(addr) : \ sizeof(*(addr)) == 4 ? bfin_read32(addr) : \ ({ BUG(); 0; }); \ }) #define bfin_write(addr, val) \ do { \ switch (sizeof(*(addr))) { \ case 1: bfin_write8(addr, val); break; \ case 2: bfin_write16(addr, val); break; \ case 4: bfin_write32(addr, val); break; \ default: BUG(); \ } \ } while (0) #define bfin_write_or(addr, bits) \ do { \ typeof(addr) __addr = (addr); \ bfin_write(__addr, bfin_read(__addr) | (bits)); \ } while (0) #define bfin_write_and(addr, bits) \ do { \