162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/mach-ep93xx/dma.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Platform support code for the EP93xx dmaengine driver. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2011 Mika Westerberg 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * This work is based on the original dma-m2p implementation with 1062306a36Sopenharmony_ci * following copyrights: 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org> 1362306a36Sopenharmony_ci * Copyright (C) 2006 Applied Data Systems 1462306a36Sopenharmony_ci * Copyright (C) 2009 Ryan Mallon <rmallon@gmail.com> 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <linux/dmaengine.h> 1862306a36Sopenharmony_ci#include <linux/dma-mapping.h> 1962306a36Sopenharmony_ci#include <linux/init.h> 2062306a36Sopenharmony_ci#include <linux/interrupt.h> 2162306a36Sopenharmony_ci#include <linux/kernel.h> 2262306a36Sopenharmony_ci#include <linux/platform_device.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include <linux/platform_data/dma-ep93xx.h> 2562306a36Sopenharmony_ci#include "hardware.h" 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include "soc.h" 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define DMA_CHANNEL(_name, _base, _irq) \ 3062306a36Sopenharmony_ci { .name = (_name), .base = (_base), .irq = (_irq) } 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * DMA M2P channels. 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci * On the EP93xx chip the following peripherals my be allocated to the 10 3662306a36Sopenharmony_ci * Memory to Internal Peripheral (M2P) channels (5 transmit + 5 receive). 3762306a36Sopenharmony_ci * 3862306a36Sopenharmony_ci * I2S contains 3 Tx and 3 Rx DMA Channels 3962306a36Sopenharmony_ci * AAC contains 3 Tx and 3 Rx DMA Channels 4062306a36Sopenharmony_ci * UART1 contains 1 Tx and 1 Rx DMA Channels 4162306a36Sopenharmony_ci * UART2 contains 1 Tx and 1 Rx DMA Channels 4262306a36Sopenharmony_ci * UART3 contains 1 Tx and 1 Rx DMA Channels 4362306a36Sopenharmony_ci * IrDA contains 1 Tx and 1 Rx DMA Channels 4462306a36Sopenharmony_ci * 4562306a36Sopenharmony_ci * Registers are mapped statically in ep93xx_map_io(). 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_cistatic struct ep93xx_dma_chan_data ep93xx_dma_m2p_channels[] = { 4862306a36Sopenharmony_ci DMA_CHANNEL("m2p0", EP93XX_DMA_BASE + 0x0000, IRQ_EP93XX_DMAM2P0), 4962306a36Sopenharmony_ci DMA_CHANNEL("m2p1", EP93XX_DMA_BASE + 0x0040, IRQ_EP93XX_DMAM2P1), 5062306a36Sopenharmony_ci DMA_CHANNEL("m2p2", EP93XX_DMA_BASE + 0x0080, IRQ_EP93XX_DMAM2P2), 5162306a36Sopenharmony_ci DMA_CHANNEL("m2p3", EP93XX_DMA_BASE + 0x00c0, IRQ_EP93XX_DMAM2P3), 5262306a36Sopenharmony_ci DMA_CHANNEL("m2p4", EP93XX_DMA_BASE + 0x0240, IRQ_EP93XX_DMAM2P4), 5362306a36Sopenharmony_ci DMA_CHANNEL("m2p5", EP93XX_DMA_BASE + 0x0200, IRQ_EP93XX_DMAM2P5), 5462306a36Sopenharmony_ci DMA_CHANNEL("m2p6", EP93XX_DMA_BASE + 0x02c0, IRQ_EP93XX_DMAM2P6), 5562306a36Sopenharmony_ci DMA_CHANNEL("m2p7", EP93XX_DMA_BASE + 0x0280, IRQ_EP93XX_DMAM2P7), 5662306a36Sopenharmony_ci DMA_CHANNEL("m2p8", EP93XX_DMA_BASE + 0x0340, IRQ_EP93XX_DMAM2P8), 5762306a36Sopenharmony_ci DMA_CHANNEL("m2p9", EP93XX_DMA_BASE + 0x0300, IRQ_EP93XX_DMAM2P9), 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic struct ep93xx_dma_platform_data ep93xx_dma_m2p_data = { 6162306a36Sopenharmony_ci .channels = ep93xx_dma_m2p_channels, 6262306a36Sopenharmony_ci .num_channels = ARRAY_SIZE(ep93xx_dma_m2p_channels), 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic u64 ep93xx_dma_m2p_mask = DMA_BIT_MASK(32); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic struct platform_device ep93xx_dma_m2p_device = { 6862306a36Sopenharmony_ci .name = "ep93xx-dma-m2p", 6962306a36Sopenharmony_ci .id = -1, 7062306a36Sopenharmony_ci .dev = { 7162306a36Sopenharmony_ci .platform_data = &ep93xx_dma_m2p_data, 7262306a36Sopenharmony_ci .dma_mask = &ep93xx_dma_m2p_mask, 7362306a36Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 7462306a36Sopenharmony_ci }, 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* 7862306a36Sopenharmony_ci * DMA M2M channels. 7962306a36Sopenharmony_ci * 8062306a36Sopenharmony_ci * There are 2 M2M channels which support memcpy/memset and in addition simple 8162306a36Sopenharmony_ci * hardware requests from/to SSP and IDE. We do not implement an external 8262306a36Sopenharmony_ci * hardware requests. 8362306a36Sopenharmony_ci * 8462306a36Sopenharmony_ci * Registers are mapped statically in ep93xx_map_io(). 8562306a36Sopenharmony_ci */ 8662306a36Sopenharmony_cistatic struct ep93xx_dma_chan_data ep93xx_dma_m2m_channels[] = { 8762306a36Sopenharmony_ci DMA_CHANNEL("m2m0", EP93XX_DMA_BASE + 0x0100, IRQ_EP93XX_DMAM2M0), 8862306a36Sopenharmony_ci DMA_CHANNEL("m2m1", EP93XX_DMA_BASE + 0x0140, IRQ_EP93XX_DMAM2M1), 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic struct ep93xx_dma_platform_data ep93xx_dma_m2m_data = { 9262306a36Sopenharmony_ci .channels = ep93xx_dma_m2m_channels, 9362306a36Sopenharmony_ci .num_channels = ARRAY_SIZE(ep93xx_dma_m2m_channels), 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cistatic u64 ep93xx_dma_m2m_mask = DMA_BIT_MASK(32); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic struct platform_device ep93xx_dma_m2m_device = { 9962306a36Sopenharmony_ci .name = "ep93xx-dma-m2m", 10062306a36Sopenharmony_ci .id = -1, 10162306a36Sopenharmony_ci .dev = { 10262306a36Sopenharmony_ci .platform_data = &ep93xx_dma_m2m_data, 10362306a36Sopenharmony_ci .dma_mask = &ep93xx_dma_m2m_mask, 10462306a36Sopenharmony_ci .coherent_dma_mask = DMA_BIT_MASK(32), 10562306a36Sopenharmony_ci }, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic int __init ep93xx_dma_init(void) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci platform_device_register(&ep93xx_dma_m2p_device); 11162306a36Sopenharmony_ci platform_device_register(&ep93xx_dma_m2m_device); 11262306a36Sopenharmony_ci return 0; 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ciarch_initcall(ep93xx_dma_init); 115