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" 98369ae33SRafał Miłecki #include <linux/bcma/bcma.h> 108369ae33SRafał Miłecki 118369ae33SRafał Miłecki bool bcma_core_is_enabled(struct bcma_device *core) 128369ae33SRafał Miłecki { 138369ae33SRafał Miłecki if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) 148369ae33SRafał Miłecki != BCMA_IOCTL_CLK) 158369ae33SRafał Miłecki return false; 168369ae33SRafał Miłecki if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) 178369ae33SRafał Miłecki return false; 188369ae33SRafał Miłecki return true; 198369ae33SRafał Miłecki } 208369ae33SRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_is_enabled); 218369ae33SRafał Miłecki 22e3ae0cacSArend van Spriel void bcma_core_disable(struct bcma_device *core, u32 flags) 238369ae33SRafał Miłecki { 248369ae33SRafał Miłecki if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) 258369ae33SRafał Miłecki return; 268369ae33SRafał Miłecki 278369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, flags); 288369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 298369ae33SRafał Miłecki udelay(10); 308369ae33SRafał Miłecki 318369ae33SRafał Miłecki bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET); 328369ae33SRafał Miłecki udelay(1); 338369ae33SRafał Miłecki } 34e3ae0cacSArend van Spriel EXPORT_SYMBOL_GPL(bcma_core_disable); 358369ae33SRafał Miłecki 368369ae33SRafał Miłecki int bcma_core_enable(struct bcma_device *core, u32 flags) 378369ae33SRafał Miłecki { 388369ae33SRafał Miłecki bcma_core_disable(core, flags); 398369ae33SRafał Miłecki 408369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags)); 418369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 428369ae33SRafał Miłecki 438369ae33SRafał Miłecki bcma_awrite32(core, BCMA_RESET_CTL, 0); 448369ae33SRafał Miłecki udelay(1); 458369ae33SRafał Miłecki 468369ae33SRafał Miłecki bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags)); 478369ae33SRafał Miłecki bcma_aread32(core, BCMA_IOCTL); 488369ae33SRafał Miłecki udelay(1); 498369ae33SRafał Miłecki 508369ae33SRafał Miłecki return 0; 518369ae33SRafał Miłecki } 528369ae33SRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_enable); 537424dd0dSRafał Miłecki 547424dd0dSRafał Miłecki void bcma_core_set_clockmode(struct bcma_device *core, 557424dd0dSRafał Miłecki enum bcma_clkmode clkmode) 567424dd0dSRafał Miłecki { 577424dd0dSRafał Miłecki u16 i; 587424dd0dSRafał Miłecki 597424dd0dSRafał Miłecki WARN_ON(core->id.id != BCMA_CORE_CHIPCOMMON && 607424dd0dSRafał Miłecki core->id.id != BCMA_CORE_PCIE && 617424dd0dSRafał Miłecki core->id.id != BCMA_CORE_80211); 627424dd0dSRafał Miłecki 637424dd0dSRafał Miłecki switch (clkmode) { 647424dd0dSRafał Miłecki case BCMA_CLKMODE_FAST: 657424dd0dSRafał Miłecki bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); 667424dd0dSRafał Miłecki udelay(64); 677424dd0dSRafał Miłecki for (i = 0; i < 1500; i++) { 687424dd0dSRafał Miłecki if (bcma_read32(core, BCMA_CLKCTLST) & 697424dd0dSRafał Miłecki BCMA_CLKCTLST_HAVEHT) { 707424dd0dSRafał Miłecki i = 0; 717424dd0dSRafał Miłecki break; 727424dd0dSRafał Miłecki } 737424dd0dSRafał Miłecki udelay(10); 747424dd0dSRafał Miłecki } 757424dd0dSRafał Miłecki if (i) 767424dd0dSRafał Miłecki pr_err("HT force timeout\n"); 777424dd0dSRafał Miłecki break; 787424dd0dSRafał Miłecki case BCMA_CLKMODE_DYNAMIC: 797424dd0dSRafał Miłecki pr_warn("Dynamic clockmode not supported yet!\n"); 807424dd0dSRafał Miłecki break; 817424dd0dSRafał Miłecki } 827424dd0dSRafał Miłecki } 837424dd0dSRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_set_clockmode); 846f53912fSRafał Miłecki 856f53912fSRafał Miłecki void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status, bool on) 866f53912fSRafał Miłecki { 876f53912fSRafał Miłecki u16 i; 886f53912fSRafał Miłecki 896f53912fSRafał Miłecki WARN_ON(req & ~BCMA_CLKCTLST_EXTRESREQ); 906f53912fSRafał Miłecki WARN_ON(status & ~BCMA_CLKCTLST_EXTRESST); 916f53912fSRafał Miłecki 926f53912fSRafał Miłecki if (on) { 936f53912fSRafał Miłecki bcma_set32(core, BCMA_CLKCTLST, req); 946f53912fSRafał Miłecki for (i = 0; i < 10000; i++) { 956f53912fSRafał Miłecki if ((bcma_read32(core, BCMA_CLKCTLST) & status) == 966f53912fSRafał Miłecki status) { 976f53912fSRafał Miłecki i = 0; 986f53912fSRafał Miłecki break; 996f53912fSRafał Miłecki } 1006f53912fSRafał Miłecki udelay(10); 1016f53912fSRafał Miłecki } 1026f53912fSRafał Miłecki if (i) 1036f53912fSRafał Miłecki pr_err("PLL enable timeout\n"); 1046f53912fSRafał Miłecki } else { 1056f53912fSRafał Miłecki pr_warn("Disabling PLL not supported yet!\n"); 1066f53912fSRafał Miłecki } 1076f53912fSRafał Miłecki } 1086f53912fSRafał Miłecki EXPORT_SYMBOL_GPL(bcma_core_pll_ctl); 109