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