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