diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2010-12-08 10:15:16 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2010-12-08 10:15:16 +0000 |
commit | 0d2ad7a81691bc3993e56b3f2f4b2884ae2ace66 (patch) | |
tree | 7b95c34b0fd29589e94ef14741c083f16f718b0e /target/linux/ramips | |
parent | 7b878dde4b4610a7cb2460df600a76717e7544a1 (diff) | |
download | upstream-0d2ad7a81691bc3993e56b3f2f4b2884ae2ace66.tar.gz upstream-0d2ad7a81691bc3993e56b3f2f4b2884ae2ace66.tar.bz2 upstream-0d2ad7a81691bc3993e56b3f2f4b2884ae2ace66.zip |
ramips: ramips_esw: introduce rt305x_esw_rmw{,_raw} function
SVN-Revision: 24336
Diffstat (limited to 'target/linux/ramips')
-rw-r--r-- | target/linux/ramips/files/drivers/net/ramips_esw.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/target/linux/ramips/files/drivers/net/ramips_esw.c b/target/linux/ramips/files/drivers/net/ramips_esw.c index f82d662ac3..a27ed2d6a8 100644 --- a/target/linux/ramips/files/drivers/net/ramips_esw.c +++ b/target/linux/ramips/files/drivers/net/ramips_esw.c @@ -31,6 +31,7 @@ struct rt305x_esw { void __iomem *base; struct rt305x_esw_platform_data *pdata; + spinlock_t reg_rw_lock; }; static inline void @@ -45,6 +46,27 @@ rt305x_esw_rr(struct rt305x_esw *esw, unsigned reg) return __raw_readl(esw->base + reg); } +static inline void +rt305x_esw_rmw_raw(struct rt305x_esw *esw, unsigned reg, unsigned long mask, + unsigned long val) +{ + unsigned long t; + + t = __raw_readl(esw->base + reg) & ~mask; + __raw_writel(t | val, esw->base + reg); +} + +static void +rt305x_esw_rmw(struct rt305x_esw *esw, unsigned reg, unsigned long mask, + unsigned long val) +{ + unsigned long flags; + + spin_lock_irqsave(&esw->reg_rw_lock, flags); + rt305x_esw_rmw_raw(esw, reg, mask, val); + spin_unlock_irqrestore(&esw->reg_rw_lock, flags); +} + static u32 rt305x_mii_write(struct rt305x_esw *esw, u32 phy_addr, u32 phy_register, u32 write_data) @@ -170,6 +192,7 @@ rt305x_esw_probe(struct platform_device *pdev) platform_set_drvdata(pdev, esw); esw->pdata = pdata; + spin_lock_init(&esw->reg_rw_lock); rt305x_esw_hw_init(esw); return 0; |