mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
dmaengine: sh: Add Support SuperH DMA Engine driver
This supported all DMA channels, and it was tested in SH7722, SH7780, SH7785 and SH7763. This can not use with SH DMA API. Signed-off-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> Reviewed-by: Matt Fleming <matt@console-pimps.org> Acked-by: Maciej Sosnowski <maciej.sosnowski@intel.com> Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
committed by
Dan Williams
parent
9134d02bc0
commit
d8902adcc1
@@ -1,12 +1,9 @@
|
||||
menu "DMA support"
|
||||
|
||||
config SH_DMA_API
|
||||
bool
|
||||
|
||||
config SH_DMA
|
||||
bool "SuperH on-chip DMA controller (DMAC) support"
|
||||
depends on CPU_SH3 || CPU_SH4
|
||||
select SH_DMA_API
|
||||
default n
|
||||
|
||||
config SH_DMA_IRQ_MULTI
|
||||
@@ -19,6 +16,15 @@ config SH_DMA_IRQ_MULTI
|
||||
CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785 || \
|
||||
CPU_SUBTYPE_SH7760
|
||||
|
||||
config SH_DMA_API
|
||||
depends on SH_DMA
|
||||
bool "SuperH DMA API support"
|
||||
default n
|
||||
help
|
||||
SH_DMA_API always enabled DMA API of used SuperH.
|
||||
If you want to use DMA ENGINE, you must not enable this.
|
||||
Please enable DMA_ENGINE and SH_DMAE.
|
||||
|
||||
config NR_ONCHIP_DMA_CHANNELS
|
||||
int
|
||||
depends on SH_DMA
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
# Makefile for the SuperH DMA specific kernel interface routines under Linux.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_SH_DMA_API) += dma-api.o dma-sysfs.o
|
||||
obj-$(CONFIG_SH_DMA) += dma-sh.o
|
||||
obj-$(CONFIG_SH_DMA_API) += dma-sh.o dma-api.o dma-sysfs.o
|
||||
obj-$(CONFIG_PVR2_DMA) += dma-pvr2.o
|
||||
obj-$(CONFIG_G2_DMA) += dma-g2.o
|
||||
obj-$(CONFIG_SH_DMABRG) += dmabrg.o
|
||||
|
||||
@@ -115,4 +115,17 @@ static u32 dma_base_addr[] __maybe_unused = {
|
||||
#define CHCR 0x0C
|
||||
#define DMAOR 0x40
|
||||
|
||||
/*
|
||||
* for dma engine
|
||||
*
|
||||
* SuperH DMA mode
|
||||
*/
|
||||
#define SHDMA_MIX_IRQ (1 << 1)
|
||||
#define SHDMA_DMAOR1 (1 << 2)
|
||||
#define SHDMA_DMAE1 (1 << 3)
|
||||
|
||||
struct sh_dmae_pdata {
|
||||
unsigned int mode;
|
||||
};
|
||||
|
||||
#endif /* __DMA_SH_H */
|
||||
|
||||
@@ -101,6 +101,14 @@ config TXX9_DMAC
|
||||
Support the TXx9 SoC internal DMA controller. This can be
|
||||
integrated in chips such as the Toshiba TX4927/38/39.
|
||||
|
||||
config SH_DMAE
|
||||
tristate "Renesas SuperH DMAC support"
|
||||
depends on SUPERH && SH_DMA
|
||||
depends on !SH_DMA_API
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Enable support for the Renesas SuperH DMA controllers.
|
||||
|
||||
config DMA_ENGINE
|
||||
bool
|
||||
|
||||
|
||||
@@ -9,3 +9,4 @@ obj-$(CONFIG_DW_DMAC) += dw_dmac.o
|
||||
obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
|
||||
obj-$(CONFIG_MX3_IPU) += ipu/
|
||||
obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o
|
||||
obj-$(CONFIG_SH_DMAE) += shdma.o
|
||||
|
||||
786
drivers/dma/shdma.c
Normal file
786
drivers/dma/shdma.c
Normal file
File diff suppressed because it is too large
Load Diff
64
drivers/dma/shdma.h
Normal file
64
drivers/dma/shdma.h
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Renesas SuperH DMA Engine support
|
||||
*
|
||||
* Copyright (C) 2009 Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
|
||||
* Copyright (C) 2009 Renesas Solutions, Inc. All rights reserved.
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
#ifndef __DMA_SHDMA_H
|
||||
#define __DMA_SHDMA_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmapool.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
#define SH_DMA_TCR_MAX 0x00FFFFFF /* 16MB */
|
||||
|
||||
struct sh_dmae_regs {
|
||||
u32 sar; /* SAR / source address */
|
||||
u32 dar; /* DAR / destination address */
|
||||
u32 tcr; /* TCR / transfer count */
|
||||
};
|
||||
|
||||
struct sh_desc {
|
||||
struct list_head tx_list;
|
||||
struct sh_dmae_regs hw;
|
||||
struct list_head node;
|
||||
struct dma_async_tx_descriptor async_tx;
|
||||
int mark;
|
||||
};
|
||||
|
||||
struct sh_dmae_chan {
|
||||
dma_cookie_t completed_cookie; /* The maximum cookie completed */
|
||||
spinlock_t desc_lock; /* Descriptor operation lock */
|
||||
struct list_head ld_queue; /* Link descriptors queue */
|
||||
struct list_head ld_free; /* Link descriptors free */
|
||||
struct dma_chan common; /* DMA common channel */
|
||||
struct device *dev; /* Channel device */
|
||||
struct tasklet_struct tasklet; /* Tasklet */
|
||||
int descs_allocated; /* desc count */
|
||||
int id; /* Raw id of this channel */
|
||||
char dev_id[16]; /* unique name per DMAC of channel */
|
||||
|
||||
/* Set chcr */
|
||||
int (*set_chcr)(struct sh_dmae_chan *sh_chan, u32 regs);
|
||||
/* Set DMA resource */
|
||||
int (*set_dmars)(struct sh_dmae_chan *sh_chan, u16 res);
|
||||
};
|
||||
|
||||
struct sh_dmae_device {
|
||||
struct dma_device common;
|
||||
struct sh_dmae_chan *chan[MAX_DMA_CHANNELS];
|
||||
struct sh_dmae_pdata pdata;
|
||||
};
|
||||
|
||||
#define to_sh_chan(chan) container_of(chan, struct sh_dmae_chan, common)
|
||||
#define to_sh_desc(lh) container_of(lh, struct sh_desc, node)
|
||||
#define tx_to_sh_desc(tx) container_of(tx, struct sh_desc, async_tx)
|
||||
|
||||
#endif /* __DMA_SHDMA_H */
|
||||
Reference in New Issue
Block a user