aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/smc91x.h44
1 files changed, 28 insertions, 16 deletions
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h
index e1be1af51201..c88f164aa710 100644
--- a/drivers/net/smc91x.h
+++ b/drivers/net/smc91x.h
@@ -242,15 +242,17 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
242#define RPC_LSA_DEFAULT RPC_LED_TX_RX 242#define RPC_LSA_DEFAULT RPC_LED_TX_RX
243#define RPC_LSB_DEFAULT RPC_LED_100_10 243#define RPC_LSB_DEFAULT RPC_LED_100_10
244 244
245#elif defined(CONFIG_MACH_LPD7A400) || defined(CONFIG_MACH_LPD7A404) 245#elif defined(CONFIG_MACH_LPD79520) \
246 || defined(CONFIG_MACH_LPD7A400) \
247 || defined(CONFIG_MACH_LPD7A404)
246 248
247/* The LPD7A40X_IOBARRIER is necessary to overcome a mismatch between 249/* The LPD7X_IOBARRIER is necessary to overcome a mismatch between the
248 * the way that the CPU handles chip selects and the way that the SMC 250 * way that the CPU handles chip selects and the way that the SMC chip
249 * chip expects the chip select to operate. Refer to 251 * expects the chip select to operate. Refer to
250 * Documentation/arm/Sharp-LH/IOBarrier for details. The read from 252 * Documentation/arm/Sharp-LH/IOBarrier for details. The read from
251 * IOBARRIER is a byte as a least-common denominator of possible 253 * IOBARRIER is a byte, in order that we read the least-common
252 * regions to use as the barrier. It would be wasteful to read 32 254 * denominator. It would be wasteful to read 32 bits from an 8-bit
253 * bits from a byte oriented region. 255 * accessible region.
254 * 256 *
255 * There is no explicit protection against interrupts intervening 257 * There is no explicit protection against interrupts intervening
256 * between the writew and the IOBARRIER. In SMC ISR there is a 258 * between the writew and the IOBARRIER. In SMC ISR there is a
@@ -269,25 +271,35 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
269#define SMC_CAN_USE_16BIT 1 271#define SMC_CAN_USE_16BIT 1
270#define SMC_CAN_USE_32BIT 0 272#define SMC_CAN_USE_32BIT 0
271#define SMC_NOWAIT 0 273#define SMC_NOWAIT 0
272#define LPD7A40X_IOBARRIER readb (IOBARRIER_VIRT) 274#define LPD7X_IOBARRIER readb (IOBARRIER_VIRT)
273 275
274#define SMC_inw(a,r) readw ((void*) ((a) + (r))) 276#define SMC_inw(a,r)\
275#define SMC_insw(a,r,p,l) readsw ((void*) ((a) + (r)), p, l) 277 ({ unsigned short v = readw ((void*) ((a) + (r))); LPD7X_IOBARRIER; v; })
276#define SMC_outw(v,a,r) ({ writew ((v), (a) + (r)); LPD7A40X_IOBARRIER; }) 278#define SMC_outw(v,a,r) ({ writew ((v), (a) + (r)); LPD7X_IOBARRIER; })
277 279
278#define SMC_outsw LPD7A40X_SMC_outsw 280#define SMC_insw LPD7_SMC_insw
281static inline void LPD7_SMC_insw (unsigned char* a, int r,
282 unsigned char* p, int l)
283{
284 unsigned short* ps = (unsigned short*) p;
285 while (l-- > 0) {
286 *ps++ = readw (a + r);
287 LPD7X_IOBARRIER;
288 }
289}
279 290
280static inline void LPD7A40X_SMC_outsw(unsigned long a, int r, 291#define SMC_outsw LPD7_SMC_outsw
281 unsigned char* p, int l) 292static inline void LPD7_SMC_outsw (unsigned char* a, int r,
293 unsigned char* p, int l)
282{ 294{
283 unsigned short* ps = (unsigned short*) p; 295 unsigned short* ps = (unsigned short*) p;
284 while (l-- > 0) { 296 while (l-- > 0) {
285 writew (*ps++, a + r); 297 writew (*ps++, a + r);
286 LPD7A40X_IOBARRIER; 298 LPD7X_IOBARRIER;
287 } 299 }
288} 300}
289 301
290#define SMC_INTERRUPT_PREAMBLE LPD7A40X_IOBARRIER 302#define SMC_INTERRUPT_PREAMBLE LPD7X_IOBARRIER
291 303
292#define RPC_LSA_DEFAULT RPC_LED_TX_RX 304#define RPC_LSA_DEFAULT RPC_LED_TX_RX
293#define RPC_LSB_DEFAULT RPC_LED_100_10 305#define RPC_LSB_DEFAULT RPC_LED_100_10