16568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah/* 26568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * OMAP1/OMAP7xx - specific DMA driver 36568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * 46568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Copyright (C) 2003 - 2008 Nokia Corporation 56568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Author: Juha Yrjölä <juha.yrjola@nokia.com> 66568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com> 76568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Graphics DMA and LCD DMA graphics tranformations 86568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * by Imre Deak <imre.deak@nokia.com> 96568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * OMAP2/3 support Copyright (C) 2004-2007 Texas Instruments, Inc. 106568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Some functions based on earlier dma-omap.c Copyright (C) 2001 RidgeRun, Inc. 116568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * 126568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ 136568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * Converted DMA library into platform driver 146568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * - G, Manjunath Kondaiah <manjugk@ti.com> 156568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * 166568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * This program is free software; you can redistribute it and/or modify 176568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * it under the terms of the GNU General Public License version 2 as 186568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah * published by the Free Software Foundation. 196568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah */ 206568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 216568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <linux/err.h> 226568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <linux/slab.h> 236568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <linux/module.h> 246568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <linux/init.h> 256568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <linux/device.h> 262e3ee9f45b3c25faa012abc9a62ab7aa515cd617Tony Lindgren#include <linux/io.h> 276568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 286568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <plat/dma.h> 296568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <plat/tc.h> 306568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#include <plat/irqs.h> 316568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 326568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah#define OMAP1_DMA_BASE (0xfffed800) 33f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah#define OMAP1_LOGICAL_DMA_CH_COUNT 17 34f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah#define OMAP1_DMA_STRIDE 0x40 35f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 36f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic u32 errata; 37f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic u32 enable_1510_mode; 38f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic u8 dma_stride; 39f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic enum omap_reg_offsets dma_common_ch_start, dma_common_ch_end; 40f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 41f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic u16 reg_map[] = { 42f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [GCR] = 0x400, 43f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [GSCR] = 0x404, 44f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [GRST1] = 0x408, 45f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [HW_ID] = 0x442, 46f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH2_ID] = 0x444, 47f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH0_ID] = 0x446, 48f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH1_ID] = 0x448, 49f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCHG_ID] = 0x44a, 50f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCHD_ID] = 0x44c, 51f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CAPS_0] = 0x44e, 52f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CAPS_1] = 0x452, 53f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CAPS_2] = 0x456, 54f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CAPS_3] = 0x458, 55f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CAPS_4] = 0x45a, 56f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH2_SR] = 0x460, 57f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH0_SR] = 0x480, 58f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCH1_SR] = 0x482, 59f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [PCHD_SR] = 0x4c0, 60f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 61f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Common Registers */ 62f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSDP] = 0x00, 63f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CCR] = 0x02, 64f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CICR] = 0x04, 65f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSR] = 0x06, 66f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CEN] = 0x10, 67f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CFN] = 0x12, 68f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSFI] = 0x14, 69f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSEI] = 0x16, 70f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CPC] = 0x18, /* 15xx only */ 71f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSAC] = 0x18, 72f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CDAC] = 0x1a, 73f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CDEI] = 0x1c, 74f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CDFI] = 0x1e, 75f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CLNK_CTRL] = 0x28, 76f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 77f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Channel specific register offsets */ 78f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CSSA] = 0x08, 79f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CDSA] = 0x0c, 80f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [COLOR] = 0x20, 81f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [CCR2] = 0x24, 82f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah [LCH_CTRL] = 0x2a, 83f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah}; 846568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 856568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiahstatic struct resource res[] __initdata = { 866568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [0] = { 876568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = OMAP1_DMA_BASE, 886568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .end = OMAP1_DMA_BASE + SZ_2K - 1, 896568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_MEM, 906568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 916568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [1] = { 926568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "0", 936568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH0_6, 946568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 956568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 966568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [2] = { 976568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "1", 986568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH1_7, 996568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1006568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1016568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [3] = { 1026568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "2", 1036568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH2_8, 1046568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1056568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1066568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [4] = { 1076568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "3", 1086568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH3, 1096568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1106568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1116568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [5] = { 1126568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "4", 1136568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH4, 1146568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1156568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1166568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [6] = { 1176568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "5", 1186568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_CH5, 1196568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1206568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 121f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Handled in lcd_dma.c */ 1226568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [7] = { 1236568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "6", 1246568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH6, 1256568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1266568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1276568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah /* irq's for omap16xx and omap7xx */ 1286568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [8] = { 1296568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "7", 1306568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH7, 1316568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1326568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1336568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [9] = { 1346568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "8", 1356568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH8, 1366568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1376568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1386568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [10] = { 1396568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "9", 1406568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH9, 1416568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1426568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1436568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [11] = { 1446568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "10", 1456568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH10, 1466568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1476568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1486568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [12] = { 1496568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "11", 1506568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH11, 1516568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1526568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1536568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [13] = { 1546568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "12", 1556568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH12, 1566568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1576568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1586568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [14] = { 1596568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "13", 1606568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH13, 1616568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1626568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1636568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [15] = { 1646568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "14", 1656568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH14, 1666568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1676568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1686568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [16] = { 1696568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "15", 1706568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_1610_DMA_CH15, 1716568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1726568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1736568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah [17] = { 1746568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .name = "16", 1756568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .start = INT_DMA_LCD, 1766568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah .flags = IORESOURCE_IRQ, 1776568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah }, 1786568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah}; 1796568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 180f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic void __iomem *dma_base; 181f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic inline void dma_write(u32 val, int reg, int lch) 182f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 183f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u8 stride; 184f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u32 offset; 185f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 186f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah stride = (reg >= dma_common_ch_start) ? dma_stride : 0; 187f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah offset = reg_map[reg] + (stride * lch); 188f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 189f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah __raw_writew(val, dma_base + offset); 190f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if ((reg > CLNK_CTRL && reg < CCEN) || 191f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah (reg > PCHD_ID && reg < CAPS_2)) { 192f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u32 offset2 = reg_map[reg] + 2 + (stride * lch); 193f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah __raw_writew(val >> 16, dma_base + offset2); 194f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 195f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 196f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 197f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic inline u32 dma_read(int reg, int lch) 198f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 199f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u8 stride; 200f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u32 offset, val; 201f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 202f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah stride = (reg >= dma_common_ch_start) ? dma_stride : 0; 203f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah offset = reg_map[reg] + (stride * lch); 204f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 205f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah val = __raw_readw(dma_base + offset); 206f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if ((reg > CLNK_CTRL && reg < CCEN) || 207f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah (reg > PCHD_ID && reg < CAPS_2)) { 208f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u16 upper; 209f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u32 offset2 = reg_map[reg] + 2 + (stride * lch); 210f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah upper = __raw_readw(dma_base + offset2); 211f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah val |= (upper << 16); 212f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 213f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah return val; 214f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 215f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 216f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic void omap1_clear_lch_regs(int lch) 217f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 218f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah int i = dma_common_ch_start; 219f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 220f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah for (; i <= dma_common_ch_end; i += 1) 221f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_write(0, i, lch); 222f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 223f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 224f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic void omap1_clear_dma(int lch) 225f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 226f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u32 l; 227f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 228f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah l = dma_read(CCR, lch); 229f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah l &= ~OMAP_DMA_CCR_EN; 230f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_write(l, CCR, lch); 231f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 232f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Clear pending interrupts */ 233f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah l = dma_read(CSR, lch); 234f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 235f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 236f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic void omap1_show_dma_caps(void) 237f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 238f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (enable_1510_mode) { 239f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah printk(KERN_INFO "DMA support for OMAP15xx initialized\n"); 240f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } else { 241f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah u16 w; 242f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah printk(KERN_INFO "OMAP DMA hardware version %d\n", 243f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_read(HW_ID, 0)); 244f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah printk(KERN_INFO "DMA capabilities: %08x:%08x:%04x:%04x:%04x\n", 245f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_read(CAPS_0, 0), dma_read(CAPS_1, 0), 246f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_read(CAPS_2, 0), dma_read(CAPS_3, 0), 247f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_read(CAPS_4, 0)); 248f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 249f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Disable OMAP 3.0/3.1 compatibility mode. */ 250f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah w = dma_read(GSCR, 0); 251f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah w |= 1 << 3; 252f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_write(w, GSCR, 0); 253f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 254f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah return; 255f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 256f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 257f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahstatic u32 configure_dma_errata(void) 258f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah{ 259f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 260f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* 261f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah * Erratum 3.2/3.3: sometimes 0 is returned if CSAC/CDAC is 262f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah * read before the DMA controller finished disabling the channel. 263f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah */ 264f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (!cpu_is_omap15xx()) 265f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah SET_DMA_ERRATA(DMA_ERRATA_3_3); 266f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 267f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah return errata; 268f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah} 269f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 2706568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiahstatic int __init omap1_system_dma_init(void) 2716568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah{ 2726568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah struct omap_system_dma_plat_info *p; 273f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah struct omap_dma_dev_attr *d; 2746568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah struct platform_device *pdev; 2756568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah int ret; 2766568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 2776568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah pdev = platform_device_alloc("omap_dma_system", 0); 2786568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah if (!pdev) { 2796568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah pr_err("%s: Unable to device alloc for dma\n", 2806568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah __func__); 2816568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah return -ENOMEM; 2826568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah } 2836568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 284f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_base = ioremap(res[0].start, resource_size(&res[0])); 285f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (!dma_base) { 286f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah pr_err("%s: Unable to ioremap\n", __func__); 28777f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawall ret = -ENODEV; 28877f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawall goto exit_device_put; 289f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 290f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 2916568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); 2926568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah if (ret) { 2936568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", 2946568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah __func__, pdev->name, pdev->id); 29577f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawall goto exit_device_put; 2966568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah } 2976568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 2986568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah p = kzalloc(sizeof(struct omap_system_dma_plat_info), GFP_KERNEL); 2996568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah if (!p) { 3006568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Unable to allocate 'p' for %s\n", 3016568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah __func__, pdev->name); 3026568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah ret = -ENOMEM; 30377f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawall goto exit_device_del; 3046568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah } 3056568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 306f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d = kzalloc(sizeof(struct omap_dma_dev_attr), GFP_KERNEL); 307f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (!d) { 308f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Unable to allocate 'd' for %s\n", 309f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah __func__, pdev->name); 310f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah ret = -ENOMEM; 311f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah goto exit_release_p; 312f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 313f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 314f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->lch_count = OMAP1_LOGICAL_DMA_CH_COUNT; 315f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 316f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah /* Valid attributes for omap1 plus processors */ 317f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (cpu_is_omap15xx()) 318f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps = ENABLE_1510_MODE; 319f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah enable_1510_mode = d->dev_caps & ENABLE_1510_MODE; 320f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 321f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= SRC_PORT; 322f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= DST_PORT; 323f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= SRC_INDEX; 324f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= DST_INDEX; 325f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= IS_BURST_ONLY4; 326f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= CLEAR_CSR_ON_READ; 327f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->dev_caps |= IS_WORD_16; 328f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 329f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 330f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->chan = kzalloc(sizeof(struct omap_dma_lch) * 331f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah (d->lch_count), GFP_KERNEL); 332f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (!d->chan) { 333f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Memory allocation failed" 334f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah "for d->chan!!!\n", __func__); 335f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah goto exit_release_d; 336f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 337f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 338f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (cpu_is_omap15xx()) 339f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->chan_count = 9; 340f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah else if (cpu_is_omap16xx() || cpu_is_omap7xx()) { 341f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah if (!(d->dev_caps & ENABLE_1510_MODE)) 342f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->chan_count = 16; 343f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah else 344f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah d->chan_count = 9; 345f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah } 346f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 347f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->dma_attr = d; 348f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 349f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->show_dma_caps = omap1_show_dma_caps; 350f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->clear_lch_regs = omap1_clear_lch_regs; 351f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->clear_dma = omap1_clear_dma; 352f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->dma_write = dma_write; 353f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->dma_read = dma_read; 354f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->disable_irq_lch = NULL; 355f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 356f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah p->errata = configure_dma_errata(); 357f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 3586568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah ret = platform_device_add_data(pdev, p, sizeof(*p)); 3596568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah if (ret) { 3606568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", 3616568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah __func__, pdev->name, pdev->id); 362f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah goto exit_release_chan; 3636568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah } 3646568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 3656568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah ret = platform_device_add(pdev); 3666568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah if (ret) { 3676568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah dev_err(&pdev->dev, "%s: Unable to add resources for %s%d\n", 3686568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah __func__, pdev->name, pdev->id); 369f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah goto exit_release_chan; 3706568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah } 3716568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 372f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_stride = OMAP1_DMA_STRIDE; 373f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_common_ch_start = CPC; 374f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah dma_common_ch_end = COLOR; 375f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah 3766568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah return ret; 3776568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 378f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahexit_release_chan: 379f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah kfree(d->chan); 380f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahexit_release_d: 381f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah kfree(d); 382f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiahexit_release_p: 383f31cc9622d75c1c6f041d786698daa425c0425c2G, Manjunath Kondaiah kfree(p); 3846568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiahexit_device_del: 3856568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah platform_device_del(pdev); 38677f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawallexit_device_put: 38777f7059a329fc8a514bbcc2f204aaa7c150e8046Julia Lawall platform_device_put(pdev); 3886568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah 3896568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah return ret; 3906568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiah} 3916568f7c43a72f9631910e26092ef3ecf67cc99ebG, Manjunath Kondaiaharch_initcall(omap1_system_dma_init); 392