Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

smc911x: Add IRQ polarity configuration

Platforms like ARM Ltd's RealView require the IRQ polarity bit to be set
for the SMC9118 chip. This patch allows the dynamic configuration via
the smc911x_platdata structure.

This patch also changes the smc91x_platdata structure name to the
correct smc911x_platdata in the smc911x_drv_probe() function.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

authored by

Catalin Marinas and committed by
Jeff Garzik
319edafe bd2c4972

+9 -3
+8 -3
drivers/net/smc911x.c
··· 180 180 static void smc911x_reset(struct net_device *dev) 181 181 { 182 182 struct smc911x_local *lp = netdev_priv(dev); 183 - unsigned int reg, timeout=0, resets=1; 183 + unsigned int reg, timeout=0, resets=1, irq_cfg; 184 184 unsigned long flags; 185 185 186 186 DBG(SMC_DEBUG_FUNC, "%s: --> %s\n", dev->name, __func__); ··· 252 252 * Deassert IRQ for 1*10us for edge type interrupts 253 253 * and drive IRQ pin push-pull 254 254 */ 255 - SMC_SET_IRQ_CFG(lp, (1 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_); 255 + irq_cfg = (1 << 24) | INT_CFG_IRQ_EN_ | INT_CFG_IRQ_TYPE_; 256 + #ifdef SMC_DYNAMIC_BUS_CONFIG 257 + if (lp->cfg.irq_polarity) 258 + irq_cfg |= INT_CFG_IRQ_POL_; 259 + #endif 260 + SMC_SET_IRQ_CFG(lp, irq_cfg); 256 261 257 262 /* clear anything saved */ 258 263 if (lp->pending_tx_skb != NULL) { ··· 2059 2054 */ 2060 2055 static int smc911x_drv_probe(struct platform_device *pdev) 2061 2056 { 2062 - struct smc91x_platdata *pd = pdev->dev.platform_data; 2057 + struct smc911x_platdata *pd = pdev->dev.platform_data; 2063 2058 struct net_device *ndev; 2064 2059 struct resource *res; 2065 2060 struct smc911x_local *lp;
+1
include/linux/smc911x.h
··· 7 7 struct smc911x_platdata { 8 8 unsigned long flags; 9 9 unsigned long irq_flags; /* IRQF_... */ 10 + int irq_polarity; 10 11 }; 11 12 12 13 #endif /* __SMC911X_H__ */