xref: /openbmc/linux/drivers/bcma/core.c (revision 044e68c0)
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