--- zzzz-none-000/linux-4.4.60/arch/mips/ath79/common.c 2017-04-08 07:53:53.000000000 +0000 +++ scorpion-1750e-727/linux-4.4.60/arch/mips/ath79/common.c 2021-02-04 17:41:59.000000000 +0000 @@ -21,7 +21,20 @@ #include #include "common.h" +/* == AVM/JTR JZ-57519 Move WMAC_GLUE_CAUSE_REG into sticky reg for debugging == */ +#if defined(CONFIG_SOC_AR934X) || defined(CONFIG_SOC_QCA953X) +#include + +#define ATH79_RESET_STICKY_REG ((void *) KSEG1ADDR(ATH_RESET_BASE + ATH_RESET)) +#if defined(CONFIG_SOC_AR934X) +#define WMAC_GLUE_SYNC_CAUSE_REG ((void *) KSEG1ADDR(0x18104010)) +#elif defined(CONFIG_SOC_QCA953X) +#define WMAC_GLUE_SYNC_CAUSE_REG ((void *) KSEG1ADDR(0x18104028)) +#endif +#endif /* defined(CONFIG_SOC_AR934X) || defined(CONFIG_SOC_QCA953X) */ + static DEFINE_SPINLOCK(ath79_device_reset_lock); +static DEFINE_MUTEX(ath79_flash_mutex); u32 ath79_cpu_freq; EXPORT_SYMBOL_GPL(ath79_cpu_freq); @@ -33,6 +46,7 @@ EXPORT_SYMBOL_GPL(ath79_ddr_freq); enum ath79_soc_type ath79_soc; +EXPORT_SYMBOL_GPL(ath79_soc); unsigned int ath79_soc_rev; void __iomem *ath79_pll_base; @@ -46,24 +60,39 @@ { ath79_ddr_base = ioremap_nocache(AR71XX_DDR_CTRL_BASE, AR71XX_DDR_CTRL_SIZE); - if (soc_is_ar71xx() || soc_is_ar934x()) { - ath79_ddr_wb_flush_base = ath79_ddr_base + 0x9c; - ath79_ddr_pci_win_base = ath79_ddr_base + 0x7c; - } else { + if (soc_is_ar913x() || soc_is_ar724x() || soc_is_ar933x()) { ath79_ddr_wb_flush_base = ath79_ddr_base + 0x7c; ath79_ddr_pci_win_base = 0; + } else { + ath79_ddr_wb_flush_base = ath79_ddr_base + 0x9c; + ath79_ddr_pci_win_base = ath79_ddr_base + 0x7c; } } EXPORT_SYMBOL_GPL(ath79_ddr_ctrl_init); void ath79_ddr_wb_flush(u32 reg) { - void __iomem *flush_reg = ath79_ddr_wb_flush_base + reg; + void __iomem *flush_reg = ath79_ddr_wb_flush_base + (4 * reg); /* Flush the DDR write buffer. */ __raw_writel(0x1, flush_reg); +#if defined(CONFIG_SOC_AR934X) || defined(CONFIG_SOC_QCA953X) + /* Save WMAC Glue Cause Reg in Sticky Reg if suspected hang */ +{ + unsigned int cnt = 0; + unsigned int tmp = 0; + + while (__raw_readl(flush_reg) & 0x1) { + if (cnt++ > 1024) { + tmp = __raw_readl(WMAC_GLUE_SYNC_CAUSE_REG); + __raw_writel(tmp, ATH79_RESET_STICKY_REG); + } + } +} +#else while (__raw_readl(flush_reg) & 0x1) ; +#endif /* It must be run twice. */ __raw_writel(0x1, flush_reg); @@ -103,10 +132,16 @@ reg = AR933X_RESET_REG_RESET_MODULE; else if (soc_is_ar934x()) reg = AR934X_RESET_REG_RESET_MODULE; + else if (soc_is_qca953x()) + reg = QCA953X_RESET_REG_RESET_MODULE; else if (soc_is_qca955x()) reg = QCA955X_RESET_REG_RESET_MODULE; + else if (soc_is_qca956x() || soc_is_tp9343()) + reg = QCA956X_RESET_REG_RESET_MODULE; + else if (soc_is_qcn550x()) + reg = QCN550X_RESET_REG_RESET_MODULE; else - BUG(); + panic("Reset register not defined for this SOC"); spin_lock_irqsave(&ath79_device_reset_lock, flags); t = ath79_reset_rr(reg); @@ -131,10 +166,16 @@ reg = AR933X_RESET_REG_RESET_MODULE; else if (soc_is_ar934x()) reg = AR934X_RESET_REG_RESET_MODULE; + else if (soc_is_qca953x()) + reg = QCA953X_RESET_REG_RESET_MODULE; else if (soc_is_qca955x()) reg = QCA955X_RESET_REG_RESET_MODULE; + else if (soc_is_qca956x() || soc_is_tp9343()) + reg = QCA956X_RESET_REG_RESET_MODULE; + else if (soc_is_qcn550x()) + reg = QCN550X_RESET_REG_RESET_MODULE; else - BUG(); + panic("Reset register not defined for this SOC"); spin_lock_irqsave(&ath79_device_reset_lock, flags); t = ath79_reset_rr(reg); @@ -142,3 +183,46 @@ spin_unlock_irqrestore(&ath79_device_reset_lock, flags); } EXPORT_SYMBOL_GPL(ath79_device_reset_clear); + +u32 ath79_device_reset_get(u32 mask) +{ + unsigned long flags; + u32 reg; + u32 ret; + + if (soc_is_ar71xx()) + reg = AR71XX_RESET_REG_RESET_MODULE; + else if (soc_is_ar724x()) + reg = AR724X_RESET_REG_RESET_MODULE; + else if (soc_is_ar913x()) + reg = AR913X_RESET_REG_RESET_MODULE; + else if (soc_is_ar933x()) + reg = AR933X_RESET_REG_RESET_MODULE; + else if (soc_is_ar934x()) + reg = AR934X_RESET_REG_RESET_MODULE; + else if (soc_is_qca956x() || soc_is_tp9343()) + reg = QCA956X_RESET_REG_RESET_MODULE; + else if (soc_is_qcn550x()) + reg = QCN550X_RESET_REG_RESET_MODULE; + else + BUG(); + + spin_lock_irqsave(&ath79_device_reset_lock, flags); + ret = ath79_reset_rr(reg); + spin_unlock_irqrestore(&ath79_device_reset_lock, flags); + return ret; +} +EXPORT_SYMBOL_GPL(ath79_device_reset_get); + +void ath79_flash_acquire(void) +{ + mutex_lock(&ath79_flash_mutex); +} +EXPORT_SYMBOL_GPL(ath79_flash_acquire); + +void ath79_flash_release(void) +{ + mutex_unlock(&ath79_flash_mutex); +} +EXPORT_SYMBOL_GPL(ath79_flash_release); +