Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Broadcom specific AMBA
  3 * Core ops
  4 *
  5 * Licensed under the GNU/GPL. See COPYING for details.
  6 */
  7
  8#include "bcma_private.h"
 
  9#include <linux/bcma/bcma.h>
 10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 11bool bcma_core_is_enabled(struct bcma_device *core)
 12{
 13	if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC))
 14	    != BCMA_IOCTL_CLK)
 15		return false;
 16	if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
 17		return false;
 18	return true;
 19}
 20EXPORT_SYMBOL_GPL(bcma_core_is_enabled);
 21
 22void bcma_core_disable(struct bcma_device *core, u32 flags)
 23{
 24	if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
 25		return;
 26
 27	bcma_awrite32(core, BCMA_IOCTL, flags);
 28	bcma_aread32(core, BCMA_IOCTL);
 29	udelay(10);
 30
 31	bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET);
 
 32	udelay(1);
 
 
 
 
 33}
 34EXPORT_SYMBOL_GPL(bcma_core_disable);
 35
 36int bcma_core_enable(struct bcma_device *core, u32 flags)
 37{
 38	bcma_core_disable(core, flags);
 39
 40	bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
 41	bcma_aread32(core, BCMA_IOCTL);
 42
 43	bcma_awrite32(core, BCMA_RESET_CTL, 0);
 
 44	udelay(1);
 45
 46	bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
 47	bcma_aread32(core, BCMA_IOCTL);
 48	udelay(1);
 49
 50	return 0;
 51}
 52EXPORT_SYMBOL_GPL(bcma_core_enable);
 53
 54void bcma_core_set_clockmode(struct bcma_device *core,
 55			     enum bcma_clkmode clkmode)
 56{
 57	u16 i;
 58
 59	WARN_ON(core->id.id != BCMA_CORE_CHIPCOMMON &&
 60		core->id.id != BCMA_CORE_PCIE &&
 61		core->id.id != BCMA_CORE_80211);
 62
 63	switch (clkmode) {
 64	case BCMA_CLKMODE_FAST:
 65		bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
 66		udelay(64);
 67		for (i = 0; i < 1500; i++) {
 68			if (bcma_read32(core, BCMA_CLKCTLST) &
 69			    BCMA_CLKCTLST_HAVEHT) {
 70				i = 0;
 71				break;
 72			}
 73			udelay(10);
 74		}
 75		if (i)
 76			pr_err("HT force timeout\n");
 77		break;
 78	case BCMA_CLKMODE_DYNAMIC:
 79		pr_warn("Dynamic clockmode not supported yet!\n");
 80		break;
 81	}
 82}
 83EXPORT_SYMBOL_GPL(bcma_core_set_clockmode);
 84
 85void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status, bool on)
 86{
 87	u16 i;
 88
 89	WARN_ON(req & ~BCMA_CLKCTLST_EXTRESREQ);
 90	WARN_ON(status & ~BCMA_CLKCTLST_EXTRESST);
 91
 92	if (on) {
 93		bcma_set32(core, BCMA_CLKCTLST, req);
 94		for (i = 0; i < 10000; i++) {
 95			if ((bcma_read32(core, BCMA_CLKCTLST) & status) ==
 96			    status) {
 97				i = 0;
 98				break;
 99			}
100			udelay(10);
101		}
102		if (i)
103			pr_err("PLL enable timeout\n");
104	} else {
105		pr_warn("Disabling PLL not supported yet!\n");
 
 
 
 
 
 
106	}
107}
108EXPORT_SYMBOL_GPL(bcma_core_pll_ctl);
109
110u32 bcma_core_dma_translation(struct bcma_device *core)
111{
112	switch (core->bus->hosttype) {
 
 
113	case BCMA_HOSTTYPE_PCI:
114		if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64)
115			return BCMA_DMA_TRANSLATION_DMA64_CMT;
116		else
117			return BCMA_DMA_TRANSLATION_DMA32_CMT;
118	default:
119		pr_err("DMA translation unknown for host %d\n",
120		       core->bus->hosttype);
121	}
122	return BCMA_DMA_TRANSLATION_NONE;
123}
124EXPORT_SYMBOL(bcma_core_dma_translation);
v4.10.11
  1/*
  2 * Broadcom specific AMBA
  3 * Core ops
  4 *
  5 * Licensed under the GNU/GPL. See COPYING for details.
  6 */
  7
  8#include "bcma_private.h"
  9#include <linux/export.h>
 10#include <linux/bcma/bcma.h>
 11
 12static bool bcma_core_wait_value(struct bcma_device *core, u16 reg, u32 mask,
 13				 u32 value, int timeout)
 14{
 15	unsigned long deadline = jiffies + timeout;
 16	u32 val;
 17
 18	do {
 19		val = bcma_aread32(core, reg);
 20		if ((val & mask) == value)
 21			return true;
 22		cpu_relax();
 23		udelay(10);
 24	} while (!time_after_eq(jiffies, deadline));
 25
 26	bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg);
 27
 28	return false;
 29}
 30
 31bool bcma_core_is_enabled(struct bcma_device *core)
 32{
 33	if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC))
 34	    != BCMA_IOCTL_CLK)
 35		return false;
 36	if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
 37		return false;
 38	return true;
 39}
 40EXPORT_SYMBOL_GPL(bcma_core_is_enabled);
 41
 42void bcma_core_disable(struct bcma_device *core, u32 flags)
 43{
 44	if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
 45		return;
 46
 47	bcma_core_wait_value(core, BCMA_RESET_ST, ~0, 0, 300);
 
 
 48
 49	bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET);
 50	bcma_aread32(core, BCMA_RESET_CTL);
 51	udelay(1);
 52
 53	bcma_awrite32(core, BCMA_IOCTL, flags);
 54	bcma_aread32(core, BCMA_IOCTL);
 55	udelay(10);
 56}
 57EXPORT_SYMBOL_GPL(bcma_core_disable);
 58
 59int bcma_core_enable(struct bcma_device *core, u32 flags)
 60{
 61	bcma_core_disable(core, flags);
 62
 63	bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
 64	bcma_aread32(core, BCMA_IOCTL);
 65
 66	bcma_awrite32(core, BCMA_RESET_CTL, 0);
 67	bcma_aread32(core, BCMA_RESET_CTL);
 68	udelay(1);
 69
 70	bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
 71	bcma_aread32(core, BCMA_IOCTL);
 72	udelay(1);
 73
 74	return 0;
 75}
 76EXPORT_SYMBOL_GPL(bcma_core_enable);
 77
 78void bcma_core_set_clockmode(struct bcma_device *core,
 79			     enum bcma_clkmode clkmode)
 80{
 81	u16 i;
 82
 83	WARN_ON(core->id.id != BCMA_CORE_CHIPCOMMON &&
 84		core->id.id != BCMA_CORE_PCIE &&
 85		core->id.id != BCMA_CORE_80211);
 86
 87	switch (clkmode) {
 88	case BCMA_CLKMODE_FAST:
 89		bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
 90		usleep_range(64, 300);
 91		for (i = 0; i < 1500; i++) {
 92			if (bcma_read32(core, BCMA_CLKCTLST) &
 93			    BCMA_CLKCTLST_HAVEHT) {
 94				i = 0;
 95				break;
 96			}
 97			udelay(10);
 98		}
 99		if (i)
100			bcma_err(core->bus, "HT force timeout\n");
101		break;
102	case BCMA_CLKMODE_DYNAMIC:
103		bcma_set32(core, BCMA_CLKCTLST, ~BCMA_CLKCTLST_FORCEHT);
104		break;
105	}
106}
107EXPORT_SYMBOL_GPL(bcma_core_set_clockmode);
108
109void bcma_core_pll_ctl(struct bcma_device *core, u32 req, u32 status, bool on)
110{
111	u16 i;
112
113	WARN_ON(req & ~BCMA_CLKCTLST_EXTRESREQ);
114	WARN_ON(status & ~BCMA_CLKCTLST_EXTRESST);
115
116	if (on) {
117		bcma_set32(core, BCMA_CLKCTLST, req);
118		for (i = 0; i < 10000; i++) {
119			if ((bcma_read32(core, BCMA_CLKCTLST) & status) ==
120			    status) {
121				i = 0;
122				break;
123			}
124			udelay(10);
125		}
126		if (i)
127			bcma_err(core->bus, "PLL enable timeout\n");
128	} else {
129		/*
130		 * Mask the PLL but don't wait for it to be disabled. PLL may be
131		 * shared between cores and will be still up if there is another
132		 * core using it.
133		 */
134		bcma_mask32(core, BCMA_CLKCTLST, ~req);
135		bcma_read32(core, BCMA_CLKCTLST);
136	}
137}
138EXPORT_SYMBOL_GPL(bcma_core_pll_ctl);
139
140u32 bcma_core_dma_translation(struct bcma_device *core)
141{
142	switch (core->bus->hosttype) {
143	case BCMA_HOSTTYPE_SOC:
144		return 0;
145	case BCMA_HOSTTYPE_PCI:
146		if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64)
147			return BCMA_DMA_TRANSLATION_DMA64_CMT;
148		else
149			return BCMA_DMA_TRANSLATION_DMA32_CMT;
150	default:
151		bcma_err(core->bus, "DMA translation unknown for host %d\n",
152			 core->bus->hosttype);
153	}
154	return BCMA_DMA_TRANSLATION_NONE;
155}
156EXPORT_SYMBOL(bcma_core_dma_translation);