18369ae33SRafał Miłecki /* 28369ae33SRafał Miłecki * Broadcom specific AMBA 38369ae33SRafał Miłecki * Core ops 48369ae33SRafał Miłecki * 58369ae33SRafał Miłecki * Licensed under the GNU/GPL. See COPYING for details. 68369ae33SRafał Miłecki */ 78369ae33SRafał Miłecki 88369ae33SRafał Miłecki #include "bcma_private.h" 944a8e377SPaul Gortmaker #include <linux/export.h> 108369ae33SRafał Miłecki #include <linux/bcma/bcma.h> 118369ae33SRafał Miłecki 128369ae33SRafał Miłecki bool bcma_core_is_enabled(struct bcma_device *core) 138369ae33SRafał Miłecki { 148369ae33SRafał Miłecki if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) 158369ae33SRafał Miłecki != BCMA_IOCTL_CLK) 168369ae33SRafał Miłecki return false; 178369ae33SRafał Miłecki if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) 188369ae33SRafał Miłecki return false; 198369ae33SRafał Miłecki return true; 208369ae33SRafał Miłecki } 218369ae33SRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_is_enabled); 228369ae33SRafał Miłecki 23e3ae0cacSArend van Spriel void bcma_core_disable(struct bcma_device *core, u32 flags) 248369ae33SRafał Miłecki { 258369ae33SRafał Miłecki if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) 268369ae33SRafał Miłecki return; 278369ae33SRafał Miłecki 288369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, flags); 298369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 308369ae33SRafał Miłecki udelay(10); 318369ae33SRafał Miłecki 328369ae33SRafał Miłecki bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET); 33044e68c0SNathan Hintz bcma_aread32(core, BCMA_RESET_CTL); 348369ae33SRafał Miłecki udelay(1); 358369ae33SRafał Miłecki } 36e3ae0cacSArend van Spriel EXPORT_SYMBOL_GPL(bcma_core_disable); 378369ae33SRafał Miłecki 388369ae33SRafał Miłecki int bcma_core_enable(struct bcma_device *core, u32 flags) 398369ae33SRafał Miłecki { 408369ae33SRafał Miłecki bcma_core_disable(core, flags); 418369ae33SRafał Miłecki 428369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags)); 438369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 448369ae33SRafał Miłecki 458369ae33SRafał Miłecki bcma_awrite32(core, BCMA_RESET_CTL, 0); 468369ae33SRafał Miłecki udelay(1); 478369ae33SRafał Miłecki 488369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags)); 498369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 508369ae33SRafał Miłecki udelay(1); 518369ae33SRafał Miłecki 528369ae33SRafał Miłecki return 0; 538369ae33SRafał Miłecki } 548369ae33SRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_enable); 557424dd0dSRafał Miłecki 567424dd0dSRafał Miłecki void bcma_core_set_clockmode(struct bcma_device *core, 577424dd0dSRafał Miłecki enum bcma_clkmode clkmode) 587424dd0dSRafał Miłecki { 597424dd0dSRafał Miłecki u16 i; 607424dd0dSRafał Miłecki 617424dd0dSRafał Miłecki WARN_ON(core->id.id != BCMA_CORE_CHIPCOMMON && 627424dd0dSRafał Miłecki core->id.id != BCMA_CORE_PCIE && 637424dd0dSRafał Miłecki core->id.id != BCMA_CORE_80211); 647424dd0dSRafał Miłecki 657424dd0dSRafał Miłecki switch (clkmode) { 667424dd0dSRafał Miłecki case BCMA_CLKMODE_FAST: 677424dd0dSRafał Miłecki bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); 687424dd0dSRafał Miłecki udelay(64); 697424dd0dSRafał Miłecki for (i = 0; i < 1500; i++) { 707424dd0dSRafał Miłecki if (bcma_read32(core, BCMA_CLKCTLST) & 717424dd0dSRafał Miłecki BCMA_CLKCTLST_HAVEHT) { 727424dd0dSRafał Miłecki i = 0; 737424dd0dSRafał Miłecki break; 747424dd0dSRafał Miłecki } 757424dd0dSRafał Miłecki udelay(10); 767424dd0dSRafał Miłecki } 777424dd0dSRafał Miłecki if (i) 787424dd0dSRafał Miłecki pr_err("HT force timeout\n"); 797424dd0dSRafał Miłecki break; 807424dd0dSRafał Miłecki case BCMA_CLKMODE_DYNAMIC: 810b2948eeSHauke Mehrtens bcma_set32(core, BCMA_CLKCTLST, ~BCMA_CLKCTLST_FORCEHT); 827424dd0dSRafał Miłecki break; 837424dd0dSRafał Miłecki } 847424dd0dSRafał Miłecki } 857424dd0dSRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_set_clockmode); 866f53912fSRafał Miłecki 876f53912fSRafał Miłecki void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status, bool on) 886f53912fSRafał Miłecki { 896f53912fSRafał Miłecki u16 i; 906f53912fSRafał Miłecki 916f53912fSRafał Miłecki WARN_ON(req & ~BCMA_CLKCTLST_EXTRESREQ); 926f53912fSRafał Miłecki WARN_ON(status & ~BCMA_CLKCTLST_EXTRESST); 936f53912fSRafał Miłecki 946f53912fSRafał Miłecki if (on) { 956f53912fSRafał Miłecki bcma_set32(core, BCMA_CLKCTLST, req); 966f53912fSRafał Miłecki for (i = 0; i < 10000; i++) { 976f53912fSRafał Miłecki if ((bcma_read32(core, BCMA_CLKCTLST) & status) == 986f53912fSRafał Miłecki status) { 996f53912fSRafał Miłecki i = 0; 1006f53912fSRafał Miłecki break; 1016f53912fSRafał Miłecki } 1026f53912fSRafał Miłecki udelay(10); 1036f53912fSRafał Miłecki } 1046f53912fSRafał Miłecki if (i) 1056f53912fSRafał Miłecki pr_err("PLL enable timeout\n"); 1066f53912fSRafał Miłecki } else { 1076f53912fSRafał Miłecki pr_warn("Disabling PLL not supported yet!\n"); 1086f53912fSRafał Miłecki } 1096f53912fSRafał Miłecki } 1106f53912fSRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_pll_ctl); 11105aec233SRafał Miłecki 11205aec233SRafał Miłecki u32 bcma_core_dma_translation(struct bcma_device *core) 11305aec233SRafał Miłecki { 11405aec233SRafał Miłecki switch (core->bus->hosttype) { 115ecd177c2SHauke Mehrtens case BCMA_HOSTTYPE_SOC: 116ecd177c2SHauke Mehrtens return 0; 11705aec233SRafał Miłecki case BCMA_HOSTTYPE_PCI: 11805aec233SRafał Miłecki if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64) 11905aec233SRafał Miłecki return BCMA_DMA_TRANSLATION_DMA64_CMT; 12005aec233SRafał Miłecki else 12105aec233SRafał Miłecki return BCMA_DMA_TRANSLATION_DMA32_CMT; 12205aec233SRafał Miłecki default: 12305aec233SRafał Miłecki pr_err("DMA translation unknown for host %d\n", 12405aec233SRafał Miłecki core->bus->hosttype); 12505aec233SRafał Miłecki } 12605aec233SRafał Miłecki return BCMA_DMA_TRANSLATION_NONE; 12705aec233SRafał Miłecki } 12805aec233SRafał Miłecki EXPORT_SYMBOL(bcma_core_dma_translation); 129