18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-omap1/mcbsp.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2008 Instituto Nokia de Tecnologia
68c2ecf20Sopenharmony_ci * Contact: Eduardo Valentin <eduardo.valentin@indt.org.br>
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Multichannel mode not supported.
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci#include <linux/ioport.h>
118c2ecf20Sopenharmony_ci#include <linux/module.h>
128c2ecf20Sopenharmony_ci#include <linux/init.h>
138c2ecf20Sopenharmony_ci#include <linux/clk.h>
148c2ecf20Sopenharmony_ci#include <linux/err.h>
158c2ecf20Sopenharmony_ci#include <linux/io.h>
168c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
178c2ecf20Sopenharmony_ci#include <linux/slab.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#include <linux/omap-dma.h>
208c2ecf20Sopenharmony_ci#include <mach/mux.h>
218c2ecf20Sopenharmony_ci#include "soc.h"
228c2ecf20Sopenharmony_ci#include <linux/platform_data/asoc-ti-mcbsp.h>
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#include <mach/irqs.h>
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#include "iomap.h"
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define DPS_RSTCT2_PER_EN	(1 << 0)
298c2ecf20Sopenharmony_ci#define DSP_RSTCT2_WD_PER_EN	(1 << 1)
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic int dsp_use;
328c2ecf20Sopenharmony_cistatic struct clk *api_clk;
338c2ecf20Sopenharmony_cistatic struct clk *dsp_clk;
348c2ecf20Sopenharmony_cistatic struct platform_device **omap_mcbsp_devices;
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic void omap1_mcbsp_request(unsigned int id)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	/*
398c2ecf20Sopenharmony_ci	 * On 1510, 1610 and 1710, McBSP1 and McBSP3
408c2ecf20Sopenharmony_ci	 * are DSP public peripherals.
418c2ecf20Sopenharmony_ci	 */
428c2ecf20Sopenharmony_ci	if (id == 0 || id == 2) {
438c2ecf20Sopenharmony_ci		if (dsp_use++ == 0) {
448c2ecf20Sopenharmony_ci			api_clk = clk_get(NULL, "api_ck");
458c2ecf20Sopenharmony_ci			dsp_clk = clk_get(NULL, "dsp_ck");
468c2ecf20Sopenharmony_ci			if (!IS_ERR(api_clk) && !IS_ERR(dsp_clk)) {
478c2ecf20Sopenharmony_ci				clk_enable(api_clk);
488c2ecf20Sopenharmony_ci				clk_enable(dsp_clk);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci				/*
518c2ecf20Sopenharmony_ci				 * DSP external peripheral reset
528c2ecf20Sopenharmony_ci				 * FIXME: This should be moved to dsp code
538c2ecf20Sopenharmony_ci				 */
548c2ecf20Sopenharmony_ci				__raw_writew(__raw_readw(DSP_RSTCT2) | DPS_RSTCT2_PER_EN |
558c2ecf20Sopenharmony_ci						DSP_RSTCT2_WD_PER_EN, DSP_RSTCT2);
568c2ecf20Sopenharmony_ci			}
578c2ecf20Sopenharmony_ci		}
588c2ecf20Sopenharmony_ci	}
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistatic void omap1_mcbsp_free(unsigned int id)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	if (id == 0 || id == 2) {
648c2ecf20Sopenharmony_ci		if (--dsp_use == 0) {
658c2ecf20Sopenharmony_ci			if (!IS_ERR(api_clk)) {
668c2ecf20Sopenharmony_ci				clk_disable(api_clk);
678c2ecf20Sopenharmony_ci				clk_put(api_clk);
688c2ecf20Sopenharmony_ci			}
698c2ecf20Sopenharmony_ci			if (!IS_ERR(dsp_clk)) {
708c2ecf20Sopenharmony_ci				clk_disable(dsp_clk);
718c2ecf20Sopenharmony_ci				clk_put(dsp_clk);
728c2ecf20Sopenharmony_ci			}
738c2ecf20Sopenharmony_ci		}
748c2ecf20Sopenharmony_ci	}
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistatic struct omap_mcbsp_ops omap1_mcbsp_ops = {
788c2ecf20Sopenharmony_ci	.request	= omap1_mcbsp_request,
798c2ecf20Sopenharmony_ci	.free		= omap1_mcbsp_free,
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP1_BASE	0xfffb1000
838c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP2_BASE	0xfffb1800
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci#define OMAP1510_MCBSP1_BASE	0xe1011800
868c2ecf20Sopenharmony_ci#define OMAP1510_MCBSP2_BASE	0xfffb1000
878c2ecf20Sopenharmony_ci#define OMAP1510_MCBSP3_BASE	0xe1017000
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci#define OMAP1610_MCBSP1_BASE	0xe1011800
908c2ecf20Sopenharmony_ci#define OMAP1610_MCBSP2_BASE	0xfffb1000
918c2ecf20Sopenharmony_ci#define OMAP1610_MCBSP3_BASE	0xe1017000
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
948c2ecf20Sopenharmony_cistruct resource omap7xx_mcbsp_res[][6] = {
958c2ecf20Sopenharmony_ci	{
968c2ecf20Sopenharmony_ci		{
978c2ecf20Sopenharmony_ci			.start = OMAP7XX_MCBSP1_BASE,
988c2ecf20Sopenharmony_ci			.end   = OMAP7XX_MCBSP1_BASE + SZ_256,
998c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
1008c2ecf20Sopenharmony_ci		},
1018c2ecf20Sopenharmony_ci		{
1028c2ecf20Sopenharmony_ci			.name  = "rx",
1038c2ecf20Sopenharmony_ci			.start = INT_7XX_McBSP1RX,
1048c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1058c2ecf20Sopenharmony_ci		},
1068c2ecf20Sopenharmony_ci		{
1078c2ecf20Sopenharmony_ci			.name  = "tx",
1088c2ecf20Sopenharmony_ci			.start = INT_7XX_McBSP1TX,
1098c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1108c2ecf20Sopenharmony_ci		},
1118c2ecf20Sopenharmony_ci		{
1128c2ecf20Sopenharmony_ci			.name  = "rx",
1138c2ecf20Sopenharmony_ci			.start = 9,
1148c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1158c2ecf20Sopenharmony_ci		},
1168c2ecf20Sopenharmony_ci		{
1178c2ecf20Sopenharmony_ci			.name  = "tx",
1188c2ecf20Sopenharmony_ci			.start = 8,
1198c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1208c2ecf20Sopenharmony_ci		},
1218c2ecf20Sopenharmony_ci	},
1228c2ecf20Sopenharmony_ci	{
1238c2ecf20Sopenharmony_ci		{
1248c2ecf20Sopenharmony_ci			.start = OMAP7XX_MCBSP2_BASE,
1258c2ecf20Sopenharmony_ci			.end   = OMAP7XX_MCBSP2_BASE + SZ_256,
1268c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
1278c2ecf20Sopenharmony_ci		},
1288c2ecf20Sopenharmony_ci		{
1298c2ecf20Sopenharmony_ci			.name  = "rx",
1308c2ecf20Sopenharmony_ci			.start = INT_7XX_McBSP2RX,
1318c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1328c2ecf20Sopenharmony_ci		},
1338c2ecf20Sopenharmony_ci		{
1348c2ecf20Sopenharmony_ci			.name  = "tx",
1358c2ecf20Sopenharmony_ci			.start = INT_7XX_McBSP2TX,
1368c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1378c2ecf20Sopenharmony_ci		},
1388c2ecf20Sopenharmony_ci		{
1398c2ecf20Sopenharmony_ci			.name  = "rx",
1408c2ecf20Sopenharmony_ci			.start = 11,
1418c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1428c2ecf20Sopenharmony_ci		},
1438c2ecf20Sopenharmony_ci		{
1448c2ecf20Sopenharmony_ci			.name  = "tx",
1458c2ecf20Sopenharmony_ci			.start = 10,
1468c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1478c2ecf20Sopenharmony_ci		},
1488c2ecf20Sopenharmony_ci	},
1498c2ecf20Sopenharmony_ci};
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci#define omap7xx_mcbsp_res_0		omap7xx_mcbsp_res[0]
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_cistatic struct omap_mcbsp_platform_data omap7xx_mcbsp_pdata[] = {
1548c2ecf20Sopenharmony_ci	{
1558c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
1568c2ecf20Sopenharmony_ci	},
1578c2ecf20Sopenharmony_ci	{
1588c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
1598c2ecf20Sopenharmony_ci	},
1608c2ecf20Sopenharmony_ci};
1618c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP_RES_SZ		ARRAY_SIZE(omap7xx_mcbsp_res[1])
1628c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP_COUNT		ARRAY_SIZE(omap7xx_mcbsp_res)
1638c2ecf20Sopenharmony_ci#else
1648c2ecf20Sopenharmony_ci#define omap7xx_mcbsp_res_0		NULL
1658c2ecf20Sopenharmony_ci#define omap7xx_mcbsp_pdata		NULL
1668c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP_RES_SZ		0
1678c2ecf20Sopenharmony_ci#define OMAP7XX_MCBSP_COUNT		0
1688c2ecf20Sopenharmony_ci#endif
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP15XX
1718c2ecf20Sopenharmony_cistruct resource omap15xx_mcbsp_res[][6] = {
1728c2ecf20Sopenharmony_ci	{
1738c2ecf20Sopenharmony_ci		{
1748c2ecf20Sopenharmony_ci			.start = OMAP1510_MCBSP1_BASE,
1758c2ecf20Sopenharmony_ci			.end   = OMAP1510_MCBSP1_BASE + SZ_256,
1768c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
1778c2ecf20Sopenharmony_ci		},
1788c2ecf20Sopenharmony_ci		{
1798c2ecf20Sopenharmony_ci			.name  = "rx",
1808c2ecf20Sopenharmony_ci			.start = INT_McBSP1RX,
1818c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1828c2ecf20Sopenharmony_ci		},
1838c2ecf20Sopenharmony_ci		{
1848c2ecf20Sopenharmony_ci			.name  = "tx",
1858c2ecf20Sopenharmony_ci			.start = INT_McBSP1TX,
1868c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
1878c2ecf20Sopenharmony_ci		},
1888c2ecf20Sopenharmony_ci		{
1898c2ecf20Sopenharmony_ci			.name  = "rx",
1908c2ecf20Sopenharmony_ci			.start = 9,
1918c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1928c2ecf20Sopenharmony_ci		},
1938c2ecf20Sopenharmony_ci		{
1948c2ecf20Sopenharmony_ci			.name  = "tx",
1958c2ecf20Sopenharmony_ci			.start = 8,
1968c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
1978c2ecf20Sopenharmony_ci		},
1988c2ecf20Sopenharmony_ci	},
1998c2ecf20Sopenharmony_ci	{
2008c2ecf20Sopenharmony_ci		{
2018c2ecf20Sopenharmony_ci			.start = OMAP1510_MCBSP2_BASE,
2028c2ecf20Sopenharmony_ci			.end   = OMAP1510_MCBSP2_BASE + SZ_256,
2038c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
2048c2ecf20Sopenharmony_ci		},
2058c2ecf20Sopenharmony_ci		{
2068c2ecf20Sopenharmony_ci			.name  = "rx",
2078c2ecf20Sopenharmony_ci			.start = INT_1510_SPI_RX,
2088c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2098c2ecf20Sopenharmony_ci		},
2108c2ecf20Sopenharmony_ci		{
2118c2ecf20Sopenharmony_ci			.name  = "tx",
2128c2ecf20Sopenharmony_ci			.start = INT_1510_SPI_TX,
2138c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2148c2ecf20Sopenharmony_ci		},
2158c2ecf20Sopenharmony_ci		{
2168c2ecf20Sopenharmony_ci			.name  = "rx",
2178c2ecf20Sopenharmony_ci			.start = 17,
2188c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
2198c2ecf20Sopenharmony_ci		},
2208c2ecf20Sopenharmony_ci		{
2218c2ecf20Sopenharmony_ci			.name  = "tx",
2228c2ecf20Sopenharmony_ci			.start = 16,
2238c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
2248c2ecf20Sopenharmony_ci		},
2258c2ecf20Sopenharmony_ci	},
2268c2ecf20Sopenharmony_ci	{
2278c2ecf20Sopenharmony_ci		{
2288c2ecf20Sopenharmony_ci			.start = OMAP1510_MCBSP3_BASE,
2298c2ecf20Sopenharmony_ci			.end   = OMAP1510_MCBSP3_BASE + SZ_256,
2308c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
2318c2ecf20Sopenharmony_ci		},
2328c2ecf20Sopenharmony_ci		{
2338c2ecf20Sopenharmony_ci			.name  = "rx",
2348c2ecf20Sopenharmony_ci			.start = INT_McBSP3RX,
2358c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2368c2ecf20Sopenharmony_ci		},
2378c2ecf20Sopenharmony_ci		{
2388c2ecf20Sopenharmony_ci			.name  = "tx",
2398c2ecf20Sopenharmony_ci			.start = INT_McBSP3TX,
2408c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2418c2ecf20Sopenharmony_ci		},
2428c2ecf20Sopenharmony_ci		{
2438c2ecf20Sopenharmony_ci			.name  = "rx",
2448c2ecf20Sopenharmony_ci			.start = 11,
2458c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
2468c2ecf20Sopenharmony_ci		},
2478c2ecf20Sopenharmony_ci		{
2488c2ecf20Sopenharmony_ci			.name  = "tx",
2498c2ecf20Sopenharmony_ci			.start = 10,
2508c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
2518c2ecf20Sopenharmony_ci		},
2528c2ecf20Sopenharmony_ci	},
2538c2ecf20Sopenharmony_ci};
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci#define omap15xx_mcbsp_res_0		omap15xx_mcbsp_res[0]
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_cistatic struct omap_mcbsp_platform_data omap15xx_mcbsp_pdata[] = {
2588c2ecf20Sopenharmony_ci	{
2598c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
2608c2ecf20Sopenharmony_ci	},
2618c2ecf20Sopenharmony_ci	{
2628c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
2638c2ecf20Sopenharmony_ci	},
2648c2ecf20Sopenharmony_ci	{
2658c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
2668c2ecf20Sopenharmony_ci	},
2678c2ecf20Sopenharmony_ci};
2688c2ecf20Sopenharmony_ci#define OMAP15XX_MCBSP_RES_SZ		ARRAY_SIZE(omap15xx_mcbsp_res[1])
2698c2ecf20Sopenharmony_ci#define OMAP15XX_MCBSP_COUNT		ARRAY_SIZE(omap15xx_mcbsp_res)
2708c2ecf20Sopenharmony_ci#else
2718c2ecf20Sopenharmony_ci#define omap15xx_mcbsp_res_0		NULL
2728c2ecf20Sopenharmony_ci#define omap15xx_mcbsp_pdata		NULL
2738c2ecf20Sopenharmony_ci#define OMAP15XX_MCBSP_RES_SZ		0
2748c2ecf20Sopenharmony_ci#define OMAP15XX_MCBSP_COUNT		0
2758c2ecf20Sopenharmony_ci#endif
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP16XX
2788c2ecf20Sopenharmony_cistruct resource omap16xx_mcbsp_res[][6] = {
2798c2ecf20Sopenharmony_ci	{
2808c2ecf20Sopenharmony_ci		{
2818c2ecf20Sopenharmony_ci			.start = OMAP1610_MCBSP1_BASE,
2828c2ecf20Sopenharmony_ci			.end   = OMAP1610_MCBSP1_BASE + SZ_256,
2838c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
2848c2ecf20Sopenharmony_ci		},
2858c2ecf20Sopenharmony_ci		{
2868c2ecf20Sopenharmony_ci			.name  = "rx",
2878c2ecf20Sopenharmony_ci			.start = INT_McBSP1RX,
2888c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2898c2ecf20Sopenharmony_ci		},
2908c2ecf20Sopenharmony_ci		{
2918c2ecf20Sopenharmony_ci			.name  = "tx",
2928c2ecf20Sopenharmony_ci			.start = INT_McBSP1TX,
2938c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
2948c2ecf20Sopenharmony_ci		},
2958c2ecf20Sopenharmony_ci		{
2968c2ecf20Sopenharmony_ci			.name  = "rx",
2978c2ecf20Sopenharmony_ci			.start = 9,
2988c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
2998c2ecf20Sopenharmony_ci		},
3008c2ecf20Sopenharmony_ci		{
3018c2ecf20Sopenharmony_ci			.name  = "tx",
3028c2ecf20Sopenharmony_ci			.start = 8,
3038c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
3048c2ecf20Sopenharmony_ci		},
3058c2ecf20Sopenharmony_ci	},
3068c2ecf20Sopenharmony_ci	{
3078c2ecf20Sopenharmony_ci		{
3088c2ecf20Sopenharmony_ci			.start = OMAP1610_MCBSP2_BASE,
3098c2ecf20Sopenharmony_ci			.end   = OMAP1610_MCBSP2_BASE + SZ_256,
3108c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
3118c2ecf20Sopenharmony_ci		},
3128c2ecf20Sopenharmony_ci		{
3138c2ecf20Sopenharmony_ci			.name  = "rx",
3148c2ecf20Sopenharmony_ci			.start = INT_1610_McBSP2_RX,
3158c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
3168c2ecf20Sopenharmony_ci		},
3178c2ecf20Sopenharmony_ci		{
3188c2ecf20Sopenharmony_ci			.name  = "tx",
3198c2ecf20Sopenharmony_ci			.start = INT_1610_McBSP2_TX,
3208c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
3218c2ecf20Sopenharmony_ci		},
3228c2ecf20Sopenharmony_ci		{
3238c2ecf20Sopenharmony_ci			.name  = "rx",
3248c2ecf20Sopenharmony_ci			.start = 17,
3258c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
3268c2ecf20Sopenharmony_ci		},
3278c2ecf20Sopenharmony_ci		{
3288c2ecf20Sopenharmony_ci			.name  = "tx",
3298c2ecf20Sopenharmony_ci			.start = 16,
3308c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
3318c2ecf20Sopenharmony_ci		},
3328c2ecf20Sopenharmony_ci	},
3338c2ecf20Sopenharmony_ci	{
3348c2ecf20Sopenharmony_ci		{
3358c2ecf20Sopenharmony_ci			.start = OMAP1610_MCBSP3_BASE,
3368c2ecf20Sopenharmony_ci			.end   = OMAP1610_MCBSP3_BASE + SZ_256,
3378c2ecf20Sopenharmony_ci			.flags = IORESOURCE_MEM,
3388c2ecf20Sopenharmony_ci		},
3398c2ecf20Sopenharmony_ci		{
3408c2ecf20Sopenharmony_ci			.name  = "rx",
3418c2ecf20Sopenharmony_ci			.start = INT_McBSP3RX,
3428c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
3438c2ecf20Sopenharmony_ci		},
3448c2ecf20Sopenharmony_ci		{
3458c2ecf20Sopenharmony_ci			.name  = "tx",
3468c2ecf20Sopenharmony_ci			.start = INT_McBSP3TX,
3478c2ecf20Sopenharmony_ci			.flags = IORESOURCE_IRQ,
3488c2ecf20Sopenharmony_ci		},
3498c2ecf20Sopenharmony_ci		{
3508c2ecf20Sopenharmony_ci			.name  = "rx",
3518c2ecf20Sopenharmony_ci			.start = 11,
3528c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
3538c2ecf20Sopenharmony_ci		},
3548c2ecf20Sopenharmony_ci		{
3558c2ecf20Sopenharmony_ci			.name  = "tx",
3568c2ecf20Sopenharmony_ci			.start = 10,
3578c2ecf20Sopenharmony_ci			.flags = IORESOURCE_DMA,
3588c2ecf20Sopenharmony_ci		},
3598c2ecf20Sopenharmony_ci	},
3608c2ecf20Sopenharmony_ci};
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci#define omap16xx_mcbsp_res_0		omap16xx_mcbsp_res[0]
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_cistatic struct omap_mcbsp_platform_data omap16xx_mcbsp_pdata[] = {
3658c2ecf20Sopenharmony_ci	{
3668c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
3678c2ecf20Sopenharmony_ci	},
3688c2ecf20Sopenharmony_ci	{
3698c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
3708c2ecf20Sopenharmony_ci	},
3718c2ecf20Sopenharmony_ci	{
3728c2ecf20Sopenharmony_ci		.ops		= &omap1_mcbsp_ops,
3738c2ecf20Sopenharmony_ci	},
3748c2ecf20Sopenharmony_ci};
3758c2ecf20Sopenharmony_ci#define OMAP16XX_MCBSP_RES_SZ		ARRAY_SIZE(omap16xx_mcbsp_res[1])
3768c2ecf20Sopenharmony_ci#define OMAP16XX_MCBSP_COUNT		ARRAY_SIZE(omap16xx_mcbsp_res)
3778c2ecf20Sopenharmony_ci#else
3788c2ecf20Sopenharmony_ci#define omap16xx_mcbsp_res_0		NULL
3798c2ecf20Sopenharmony_ci#define omap16xx_mcbsp_pdata		NULL
3808c2ecf20Sopenharmony_ci#define OMAP16XX_MCBSP_RES_SZ		0
3818c2ecf20Sopenharmony_ci#define OMAP16XX_MCBSP_COUNT		0
3828c2ecf20Sopenharmony_ci#endif
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_cistatic void omap_mcbsp_register_board_cfg(struct resource *res, int res_count,
3858c2ecf20Sopenharmony_ci			struct omap_mcbsp_platform_data *config, int size)
3868c2ecf20Sopenharmony_ci{
3878c2ecf20Sopenharmony_ci	int i;
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ci	omap_mcbsp_devices = kcalloc(size, sizeof(struct platform_device *),
3908c2ecf20Sopenharmony_ci				     GFP_KERNEL);
3918c2ecf20Sopenharmony_ci	if (!omap_mcbsp_devices) {
3928c2ecf20Sopenharmony_ci		printk(KERN_ERR "Could not register McBSP devices\n");
3938c2ecf20Sopenharmony_ci		return;
3948c2ecf20Sopenharmony_ci	}
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ci	for (i = 0; i < size; i++) {
3978c2ecf20Sopenharmony_ci		struct platform_device *new_mcbsp;
3988c2ecf20Sopenharmony_ci		int ret;
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci		new_mcbsp = platform_device_alloc("omap-mcbsp", i + 1);
4018c2ecf20Sopenharmony_ci		if (!new_mcbsp)
4028c2ecf20Sopenharmony_ci			continue;
4038c2ecf20Sopenharmony_ci		platform_device_add_resources(new_mcbsp, &res[i * res_count],
4048c2ecf20Sopenharmony_ci					res_count);
4058c2ecf20Sopenharmony_ci		config[i].reg_size = 2;
4068c2ecf20Sopenharmony_ci		config[i].reg_step = 2;
4078c2ecf20Sopenharmony_ci		new_mcbsp->dev.platform_data = &config[i];
4088c2ecf20Sopenharmony_ci		ret = platform_device_add(new_mcbsp);
4098c2ecf20Sopenharmony_ci		if (ret) {
4108c2ecf20Sopenharmony_ci			platform_device_put(new_mcbsp);
4118c2ecf20Sopenharmony_ci			continue;
4128c2ecf20Sopenharmony_ci		}
4138c2ecf20Sopenharmony_ci		omap_mcbsp_devices[i] = new_mcbsp;
4148c2ecf20Sopenharmony_ci	}
4158c2ecf20Sopenharmony_ci}
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_cistatic int __init omap1_mcbsp_init(void)
4188c2ecf20Sopenharmony_ci{
4198c2ecf20Sopenharmony_ci	if (!cpu_class_is_omap1())
4208c2ecf20Sopenharmony_ci		return -ENODEV;
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci	if (cpu_is_omap7xx())
4238c2ecf20Sopenharmony_ci		omap_mcbsp_register_board_cfg(omap7xx_mcbsp_res_0,
4248c2ecf20Sopenharmony_ci					OMAP7XX_MCBSP_RES_SZ,
4258c2ecf20Sopenharmony_ci					omap7xx_mcbsp_pdata,
4268c2ecf20Sopenharmony_ci					OMAP7XX_MCBSP_COUNT);
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci	if (cpu_is_omap15xx())
4298c2ecf20Sopenharmony_ci		omap_mcbsp_register_board_cfg(omap15xx_mcbsp_res_0,
4308c2ecf20Sopenharmony_ci					OMAP15XX_MCBSP_RES_SZ,
4318c2ecf20Sopenharmony_ci					omap15xx_mcbsp_pdata,
4328c2ecf20Sopenharmony_ci					OMAP15XX_MCBSP_COUNT);
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	if (cpu_is_omap16xx())
4358c2ecf20Sopenharmony_ci		omap_mcbsp_register_board_cfg(omap16xx_mcbsp_res_0,
4368c2ecf20Sopenharmony_ci					OMAP16XX_MCBSP_RES_SZ,
4378c2ecf20Sopenharmony_ci					omap16xx_mcbsp_pdata,
4388c2ecf20Sopenharmony_ci					OMAP16XX_MCBSP_COUNT);
4398c2ecf20Sopenharmony_ci
4408c2ecf20Sopenharmony_ci	return 0;
4418c2ecf20Sopenharmony_ci}
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_ciarch_initcall(omap1_mcbsp_init);
444