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