mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
5019f0b134
The register and irq definitions in mach/*.h for spear3xx and spear6xx are now mostly obsolete, after the platforms have been converted to device tree based probing and the data is now part of the device tree files. The misc_regs.h contents are moved into clock.c because that is the only user, aside from the DMA_CHN_CFG that should eventually get handled differently. Some of the contents of mach/spear.h still remain, because they are used to set up the static map table, timer, uart and auxdata tables, but almost everything got removed. We might remove everything but the map table as the DT conversion completes, but that is not a priority. I've also made sure to make both copies of spear.h more or less identical so we can eventually combine them. The spear3?0.h files were only used by the spear3?0.c files, so I merged the contents in there and removed the bits that were unused. This is something that should still be looked at. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Viresh Kumar <viresh.kumar@st.com>
81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
/*
|
|
* arch/arm/plat-spear/pl080.c
|
|
*
|
|
* DMAC pl080 definitions for SPEAr platform
|
|
*
|
|
* Copyright (C) 2012 ST Microelectronics
|
|
* Viresh Kumar <viresh.kumar@st.com>
|
|
*
|
|
* This file is licensed under the terms of the GNU General Public
|
|
* License version 2. This program is licensed "as is" without any
|
|
* warranty of any kind, whether express or implied.
|
|
*/
|
|
|
|
#include <linux/amba/pl08x.h>
|
|
#include <linux/amba/bus.h>
|
|
#include <linux/bug.h>
|
|
#include <linux/err.h>
|
|
#include <linux/io.h>
|
|
#include <linux/spinlock_types.h>
|
|
#include <mach/spear.h>
|
|
#include <mach/misc_regs.h>
|
|
|
|
static spinlock_t lock = __SPIN_LOCK_UNLOCKED(x);
|
|
|
|
struct {
|
|
unsigned char busy;
|
|
unsigned char val;
|
|
} signals[16] = {{0, 0}, };
|
|
|
|
int pl080_get_signal(struct pl08x_dma_chan *ch)
|
|
{
|
|
const struct pl08x_channel_data *cd = ch->cd;
|
|
unsigned int signal = cd->min_signal, val;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&lock, flags);
|
|
|
|
/* Return if signal is already acquired by somebody else */
|
|
if (signals[signal].busy &&
|
|
(signals[signal].val != cd->muxval)) {
|
|
spin_unlock_irqrestore(&lock, flags);
|
|
return -EBUSY;
|
|
}
|
|
|
|
/* If acquiring for the first time, configure it */
|
|
if (!signals[signal].busy) {
|
|
val = readl(DMA_CHN_CFG);
|
|
|
|
/*
|
|
* Each request line has two bits in DMA_CHN_CFG register. To
|
|
* goto the bits of current request line, do left shift of
|
|
* value by 2 * signal number.
|
|
*/
|
|
val &= ~(0x3 << (signal * 2));
|
|
val |= cd->muxval << (signal * 2);
|
|
writel(val, DMA_CHN_CFG);
|
|
}
|
|
|
|
signals[signal].busy++;
|
|
signals[signal].val = cd->muxval;
|
|
spin_unlock_irqrestore(&lock, flags);
|
|
|
|
return signal;
|
|
}
|
|
|
|
void pl080_put_signal(struct pl08x_dma_chan *ch)
|
|
{
|
|
const struct pl08x_channel_data *cd = ch->cd;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&lock, flags);
|
|
|
|
/* if signal is not used */
|
|
if (!signals[cd->min_signal].busy)
|
|
BUG();
|
|
|
|
signals[cd->min_signal].busy--;
|
|
|
|
spin_unlock_irqrestore(&lock, flags);
|
|
}
|