--- zzzz-none-000/linux-4.4.60/arch/mips/ath79/common.c 2017-04-08 07:53:53.000000000 +0000 +++ dragonfly-4020-701/linux-4.4.60/arch/mips/ath79/common.c 2018-11-08 13:36:17.000000000 +0000 @@ -22,6 +22,7 @@ #include "common.h" 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 +34,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,19 +48,19 @@ { 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); @@ -103,10 +105,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 +139,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 +156,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); +