From: Gabor Juhos Date: Sat, 8 Jan 2011 11:28:32 +0000 (+0000) Subject: ar71xx: use spinlock in ar71xx_device_{start,stop} X-Git-Tag: reboot~17914 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=0de8689b7093ff40983f48a433efe93074741013;p=openwrt%2Fstaging%2Fchunkeey.git ar71xx: use spinlock in ar71xx_device_{start,stop} SVN-Revision: 24929 --- diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/ar71xx.c b/target/linux/ar71xx/files/arch/mips/ar71xx/ar71xx.c index 6c88985ccf..ed31274182 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/ar71xx.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/ar71xx.c @@ -13,10 +13,12 @@ #include #include #include +#include #include static DEFINE_MUTEX(ar71xx_flash_mutex); +static DEFINE_SPINLOCK(ar71xx_device_lock); void __iomem *ar71xx_ddr_base; EXPORT_SYMBOL_GPL(ar71xx_ddr_base); @@ -43,30 +45,30 @@ void ar71xx_device_stop(u32 mask) case AR71XX_SOC_AR7130: case AR71XX_SOC_AR7141: case AR71XX_SOC_AR7161: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE); ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t | mask); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR7240: case AR71XX_SOC_AR7241: case AR71XX_SOC_AR7242: mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240; - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE); t |= mask; t &= ~mask_inv; ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR9130: case AR71XX_SOC_AR9132: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE); ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t | mask); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; default: @@ -85,30 +87,30 @@ void ar71xx_device_start(u32 mask) case AR71XX_SOC_AR7130: case AR71XX_SOC_AR7141: case AR71XX_SOC_AR7161: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE); ar71xx_reset_wr(AR71XX_RESET_REG_RESET_MODULE, t & ~mask); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR7240: case AR71XX_SOC_AR7241: case AR71XX_SOC_AR7242: mask_inv = mask & RESET_MODULE_USB_OHCI_DLL_7240; - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE); t &= ~mask; t |= mask_inv; ar71xx_reset_wr(AR724X_RESET_REG_RESET_MODULE, t); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR9130: case AR71XX_SOC_AR9132: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE); ar71xx_reset_wr(AR91XX_RESET_REG_RESET_MODULE, t & ~mask); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; default: @@ -126,24 +128,24 @@ int ar71xx_device_stopped(u32 mask) case AR71XX_SOC_AR7130: case AR71XX_SOC_AR7141: case AR71XX_SOC_AR7161: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR71XX_RESET_REG_RESET_MODULE); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR7240: case AR71XX_SOC_AR7241: case AR71XX_SOC_AR7242: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR724X_RESET_REG_RESET_MODULE); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; case AR71XX_SOC_AR9130: case AR71XX_SOC_AR9132: - local_irq_save(flags); + spin_lock_irqsave(&ar71xx_device_lock, flags); t = ar71xx_reset_rr(AR91XX_RESET_REG_RESET_MODULE); - local_irq_restore(flags); + spin_unlock_irqrestore(&ar71xx_device_lock, flags); break; default: