|
@@ -29,6 +29,7 @@
|
|
|
#ifndef _SMC911X_H_
|
|
|
#define _SMC911X_H_
|
|
|
|
|
|
+#include <linux/smc911x.h>
|
|
|
/*
|
|
|
* Use the DMA feature on PXA chips
|
|
|
*/
|
|
@@ -42,6 +43,12 @@
|
|
|
#define SMC_USE_16BIT 0
|
|
|
#define SMC_USE_32BIT 1
|
|
|
#define SMC_IRQ_SENSE IRQF_TRIGGER_LOW
|
|
|
+#else
|
|
|
+/*
|
|
|
+ * Default configuration
|
|
|
+ */
|
|
|
+
|
|
|
+#define SMC_DYNAMIC_BUS_CONFIG
|
|
|
#endif
|
|
|
|
|
|
/* store this information for the driver.. */
|
|
@@ -92,12 +99,84 @@ struct smc911x_local {
|
|
|
struct device *dev;
|
|
|
#endif
|
|
|
void __iomem *base;
|
|
|
+#ifdef SMC_DYNAMIC_BUS_CONFIG
|
|
|
+ struct smc911x_platdata cfg;
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
/*
|
|
|
* Define the bus width specific IO macros
|
|
|
*/
|
|
|
|
|
|
+#ifdef SMC_DYNAMIC_BUS_CONFIG
|
|
|
+static inline unsigned int SMC_inl(struct smc911x_local *lp, int reg)
|
|
|
+{
|
|
|
+ void __iomem *ioaddr = lp->base + reg;
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_32BIT)
|
|
|
+ return readl(ioaddr);
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_16BIT)
|
|
|
+ return readw(ioaddr) | (readw(ioaddr + 2) << 16);
|
|
|
+
|
|
|
+ BUG();
|
|
|
+}
|
|
|
+
|
|
|
+static inline void SMC_outl(unsigned int value, struct smc911x_local *lp,
|
|
|
+ int reg)
|
|
|
+{
|
|
|
+ void __iomem *ioaddr = lp->base + reg;
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_32BIT) {
|
|
|
+ writel(value, ioaddr);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_16BIT) {
|
|
|
+ writew(value & 0xffff, ioaddr);
|
|
|
+ writew(value >> 16, ioaddr + 2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ BUG();
|
|
|
+}
|
|
|
+
|
|
|
+static inline void SMC_insl(struct smc911x_local *lp, int reg,
|
|
|
+ void *addr, unsigned int count)
|
|
|
+{
|
|
|
+ void __iomem *ioaddr = lp->base + reg;
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_32BIT) {
|
|
|
+ readsl(ioaddr, addr, count);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_16BIT) {
|
|
|
+ readsw(ioaddr, addr, count * 2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ BUG();
|
|
|
+}
|
|
|
+
|
|
|
+static inline void SMC_outsl(struct smc911x_local *lp, int reg,
|
|
|
+ void *addr, unsigned int count)
|
|
|
+{
|
|
|
+ void __iomem *ioaddr = lp->base + reg;
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_32BIT) {
|
|
|
+ writesl(ioaddr, addr, count);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lp->cfg.flags & SMC911X_USE_16BIT) {
|
|
|
+ writesw(ioaddr, addr, count * 2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ BUG();
|
|
|
+}
|
|
|
+#else
|
|
|
#if SMC_USE_16BIT
|
|
|
#define SMC_inl(lp, r) ((readw((lp)->base + (r)) & 0xFFFF) + (readw((lp)->base + (r) + 2) << 16))
|
|
|
#define SMC_outl(v, lp, r) \
|
|
@@ -115,6 +194,8 @@ struct smc911x_local {
|
|
|
#define SMC_outsl(lp, r, p, l) writesl((int*)((lp)->base + (r)), p, l)
|
|
|
|
|
|
#endif /* SMC_USE_16BIT */
|
|
|
+#endif /* SMC_DYNAMIC_BUS_CONFIG */
|
|
|
+
|
|
|
|
|
|
#ifdef SMC_USE_PXA_DMA
|
|
|
#define SMC_USE_DMA
|