diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-02-28 12:42:14 +0000 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-02-28 12:42:21 +0000 |
commit | fb0b82b32ce17564bc64cede50bf4a3204eecc60 (patch) | |
tree | 00b5e466074c6fb373d64c493b3341186024acc7 /drivers/net/can/cc770/cc770_isa.c | |
parent | a173fc693b25216c5c834978f4fafd731fd4ff94 (diff) | |
parent | 43de6a7dda6e9a7345e218e688f2092f991126f0 (diff) |
Merge branch 'board-specific' of git://github.com/hzhuang1/linux into next/boards
* 'board-specific' of git://github.com/hzhuang1/linux: (5 commits)
ARM: pxa: add dummy clock for pxa25x and pxa27x
ARM: mmp: append irq name of gpio device
pxa/hx4700: Fix PXA_GPIO_IRQ_BASE/IRQ_NUM values
pxa/hx4700: Add ASIC3 LED support
pxa/hx4700: Correct StrataFlash block size discovery
(update to v3.3-rc5)
Diffstat (limited to 'drivers/net/can/cc770/cc770_isa.c')
-rw-r--r-- | drivers/net/can/cc770/cc770_isa.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/net/can/cc770/cc770_isa.c b/drivers/net/can/cc770/cc770_isa.c index 4be5fe2c40a..9f3a25ccd66 100644 --- a/drivers/net/can/cc770/cc770_isa.c +++ b/drivers/net/can/cc770/cc770_isa.c @@ -110,6 +110,11 @@ MODULE_PARM_DESC(bcr, "Bus configuration register (default=0x40 [CBY])"); #define CC770_IOSIZE 0x20 #define CC770_IOSIZE_INDIRECT 0x02 +/* Spinlock for cc770_isa_port_write_reg_indirect + * and cc770_isa_port_read_reg_indirect + */ +static DEFINE_SPINLOCK(cc770_isa_port_lock); + static struct platform_device *cc770_isa_devs[MAXDEV]; static u8 cc770_isa_mem_read_reg(const struct cc770_priv *priv, int reg) @@ -138,18 +143,27 @@ static u8 cc770_isa_port_read_reg_indirect(const struct cc770_priv *priv, int reg) { unsigned long base = (unsigned long)priv->reg_base; + unsigned long flags; + u8 val; + spin_lock_irqsave(&cc770_isa_port_lock, flags); outb(reg, base); - return inb(base + 1); + val = inb(base + 1); + spin_unlock_irqrestore(&cc770_isa_port_lock, flags); + + return val; } static void cc770_isa_port_write_reg_indirect(const struct cc770_priv *priv, int reg, u8 val) { unsigned long base = (unsigned long)priv->reg_base; + unsigned long flags; + spin_lock_irqsave(&cc770_isa_port_lock, flags); outb(reg, base); outb(val, base + 1); + spin_unlock_irqrestore(&cc770_isa_port_lock, flags); } static int __devinit cc770_isa_probe(struct platform_device *pdev) |