From patchwork Mon Nov 29 11:06:27 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Subhasish Ghosh X-Patchwork-Id: 363612 Received: from bear.ext.ti.com (bear.ext.ti.com [192.94.94.41]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oATAsbxH028632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 29 Nov 2010 10:55:04 GMT Received: from dlep33.itg.ti.com ([157.170.170.112]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id oATAsac4028551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 29 Nov 2010 04:54:36 -0600 Received: from linux.omap.com (localhost [127.0.0.1]) by dlep33.itg.ti.com (8.13.7/8.13.7) with ESMTP id oATAsZib027798 for ; Mon, 29 Nov 2010 04:54:35 -0600 (CST) Received: from linux.omap.com (localhost [127.0.0.1]) by linux.omap.com (Postfix) with ESMTP id A177380680 for ; Mon, 29 Nov 2010 04:54:29 -0600 (CST) X-Original-To: davinci-linux-open-source@linux.davincidsp.com Delivered-To: davinci-linux-open-source@linux.davincidsp.com Received: from dflp52.itg.ti.com (dflp52.itg.ti.com [128.247.22.96]) by linux.omap.com (Postfix) with ESMTP id C28FA80626 for ; Mon, 29 Nov 2010 04:54:23 -0600 (CST) Received: from neches.ext.ti.com (localhost [127.0.0.1]) by dflp52.itg.ti.com (8.13.7/8.13.7) with ESMTP id oATAsNoG025720 for ; Mon, 29 Nov 2010 04:54:23 -0600 (CST) Received: from psmtp.com (na3sys009amx224.postini.com [74.125.149.64]) by neches.ext.ti.com (8.13.7/8.13.7) with SMTP id oATAsNDm027319 for ; Mon, 29 Nov 2010 04:54:23 -0600 Received: from source ([209.85.212.193]) by na3sys009amx224.postini.com ([74.125.148.10]) with SMTP; Mon, 29 Nov 2010 10:54:23 GMT Received: by pxi4 with SMTP id 4so681775pxi.4 for ; Mon, 29 Nov 2010 02:54:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=6zS80oz6YfU8OezbAe2SnR/k45vhFEjMDe/EPLyCJyc=; b=Mza8JJwt0+j9zXZ0OESfosIsj2KksEPDtZ8YKiX3c7Nb7MfSHlAhWYIMW++Nvjs0nL atGahyHgty+Je3qh3YhydVa8+mbMizxe4b/2vqBRHfoyAx6TiDLGgNQJ8+sQ5BAc4FzV 25d1xKNuytf49Z1pLy83B3GjdkxZJohnzA6LI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=L5nPLRpr8h1IjclPjCPW5NZBtoXmdQOKf13sg1Md1z5A4oKpVjUt3kA9DfOjIfIgWl DvU69OVL83nBTMS3n2GceEA7QNESmSjJUl6UahYBnmC/xt74xiJzeanmt3uJO80F4VJI tJPWWTR9I4stF3V9ztJ0JD2j/gGtBiI6Xs2to= Received: by 10.142.222.18 with SMTP id u18mr2652895wfg.367.1291028061972; Mon, 29 Nov 2010 02:54:21 -0800 (PST) Received: from localhost ([122.167.113.84]) by mx.google.com with ESMTPS id q13sm7311588wfc.17.2010.11.29.02.54.19 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 29 Nov 2010 02:54:21 -0800 (PST) From: Subhasish Ghosh To: davinci-linux-open-source@linux.davincidsp.com Subject: [RFC: PATCH 1/1] da850_evm: Support for TI's PRU SoftUART Emulation Date: Mon, 29 Nov 2010 16:36:27 +0530 Message-Id: <1291028787-26042-1-git-send-email-subhasish@mistralsolutions.com> X-Mailer: git-send-email 1.7.2.3 X-pstn-neptune: 0/0/0.00/0 X-pstn-levels: (S:25.88957/99.90000 CV:99.9000 FC:95.5390 LC:95.5390 R:95.9108 P:95.9108 M:97.0282 C:98.6951 ) X-pstn-settings: 2 (0.5000:0.0750) s cv GT3 gt2 gt1 r p m c X-pstn-addresses: from [db-null] Cc: Subhasish Ghosh X-BeenThere: davinci-linux-open-source@linux.davincidsp.com X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: davinci-linux-open-source-bounces+patchwork-davinci=patchwork.kernel.org@linux.davincidsp.com Errors-To: davinci-linux-open-source-bounces+patchwork-davinci=patchwork.kernel.org@linux.davincidsp.com X-Greylist: Sender succeeded STARTTLS authentication, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 29 Nov 2010 10:55:04 +0000 (UTC) diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index f89b0b7..4ee09ed 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c @@ -736,6 +736,26 @@ static struct edma_rsv_info *da850_edma_rsv[2] = { &da850_edma_cc1_rsv, }; +static int __init da850_evm_setup_pru_suart(void) +{ + int ret; + + if (!machine_is_davinci_da850_evm()) + return 0; + + ret = davinci_cfg_reg_list(da850_pru_suart_pins); + if (ret) + pr_warning("da850_evm_init: da850_pru_suart_pins" + "mux setup failed: %d\n", ret); + ret = da8xx_register_pru_suart(); + if (ret) + pr_warning("da850_evm_init: pru suart registration" + "failed: %d\n", ret); + return ret; +} + +device_initcall(da850_evm_setup_pru_suart); + static __init void da850_evm_init(void) { int ret; diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 63916b9..a5eeb4f 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -238,6 +238,13 @@ static struct clk tptc2_clk = { .flags = ALWAYS_ENABLED, }; +static struct clk pru_clk = { + .name = "pru_ck", + .parent = &pll0_sysclk2, + .lpsc = DA8XX_LPSC0_DMAX, + .flags = ALWAYS_ENABLED, +}; + static struct clk uart0_clk = { .name = "uart0", .parent = &pll0_sysclk2, @@ -318,6 +325,14 @@ static struct clk mcasp_clk = { .flags = DA850_CLK_ASYNC3, }; +static struct clk mcasp_pru_clk = { + .name = "mcasp_pru", + .parent = &pll0_sysclk2, + .lpsc = DA8XX_LPSC1_McASP0, + .gpsc = 1, + .flags = DA850_CLK_ASYNC3, +}; + static struct clk lcdc_clk = { .name = "lcdc", .parent = &pll0_sysclk2, @@ -373,6 +388,7 @@ static struct clk_lookup da850_clks[] = { CLK(NULL, "tpcc1", &tpcc1_clk), CLK(NULL, "tptc2", &tptc2_clk), CLK(NULL, "uart0", &uart0_clk), + CLK(NULL, "pru_ck", &pru_clk), CLK(NULL, "uart1", &uart1_clk), CLK(NULL, "uart2", &uart2_clk), CLK(NULL, "aintc", &aintc_clk), @@ -382,6 +398,7 @@ static struct clk_lookup da850_clks[] = { CLK(NULL, "arm", &arm_clk), CLK(NULL, "rmii", &rmii_clk), CLK("davinci_emac.1", NULL, &emac_clk), + CLK(NULL, "mcasp_pru", &mcasp_pru_clk), CLK("davinci-mcasp.0", NULL, &mcasp_clk), CLK("da8xx_lcdc.0", NULL, &lcdc_clk), CLK("davinci_mmc.0", NULL, &mmcsd0_clk), @@ -392,9 +409,13 @@ static struct clk_lookup da850_clks[] = { /* * Device specific mux setup - * - * soc description mux mode mode mux dbg - * reg offset mask mode + * soc -> DA850 + * desc -> Pin name, which evaluates to soc##_##desc. + * muxreg -> Pin Multiplexing Control n (PINMUXn) Register number. + * mode_offset -> Bit offset in the register PINMUXn. + * mode_mask -> Number of bits for Pin Multiplexing Control n. + * mux_mode -> Multiplexing mode to set. + * dbg -> debug on/off */ static const struct mux_config da850_pins[] = { #ifdef CONFIG_DAVINCI_MUX @@ -557,6 +578,14 @@ const short da850_uart0_pins[] __initdata = { -1 }; +const short da850_pru_suart_pins[] __initdata = { + DA850_AHCLKX, DA850_ACLKX, DA850_AFSX, + DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, + DA850_AXR_13, DA850_AXR_9, DA850_AXR_7, + DA850_AXR_14, DA850_AXR_10, DA850_AXR_8, + -1 +}; + const short da850_uart1_pins[] __initdata = { DA850_UART1_RXD, DA850_UART1_TXD, -1 diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c index 9eec630..3ae9c3e 100644 --- a/arch/arm/mach-davinci/devices-da8xx.c +++ b/arch/arm/mach-davinci/devices-da8xx.c @@ -14,7 +14,7 @@ #include #include #include - +#include #include #include #include @@ -85,7 +85,107 @@ struct platform_device da8xx_serial_device = { }, }; -static const s8 da8xx_queue_tc_mapping[][2] = { + +#define OMAPL138_PRU_MEM_BASE 0x01C30000 + +#define OMAPL138_INT_PRU_SUART_1 IRQ_DA8XX_EVTOUT0 +#define OMAPL138_INT_PRU_SUART_2 IRQ_DA8XX_EVTOUT1 +#define OMAPL138_INT_PRU_SUART_3 IRQ_DA8XX_EVTOUT2 +#define OMAPL138_INT_PRU_SUART_4 IRQ_DA8XX_EVTOUT3 +#define OMAPL138_INT_PRU_SUART_5 IRQ_DA8XX_EVTOUT4 +#define OMAPL138_INT_PRU_SUART_6 IRQ_DA8XX_EVTOUT5 +#define OMAPL138_INT_PRU_SUART_7 IRQ_DA8XX_EVTOUT6 +#define OMAPL138_INT_PRU_SUART_8 IRQ_DA8XX_EVTOUT7 + +static struct resource omapl138_pru_suart_resources[] = { + { + .name = "omapl_pru_suart", + .start = OMAPL138_PRU_MEM_BASE, + .end = OMAPL138_PRU_MEM_BASE + 0xFFFF, + .flags = IORESOURCE_MEM, + }, + { + .start = DAVINCI_DA8XX_MCASP0_REG_BASE, + .end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1, + .flags = IORESOURCE_MEM, + }, + { + .start = DA8XX_PSC0_BASE, + .end = DA8XX_PSC0_BASE + (SZ_1K * 3) - 1, + .flags = IORESOURCE_MEM, + }, + { + .start = DA8XX_PSC1_BASE, + .end = DA8XX_PSC1_BASE + (SZ_1K * 3) - 1, + .flags = IORESOURCE_MEM, + }, + { + .start = DA8XX_SHARED_RAM_BASE, + .end = DA8XX_SHARED_RAM_BASE + (SZ_1K * 8) - 1, + .flags = IORESOURCE_MEM, + }, + { + .start = OMAPL138_INT_PRU_SUART_1, + .end = OMAPL138_INT_PRU_SUART_1, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_2, + .end = OMAPL138_INT_PRU_SUART_2, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_3, + .end = OMAPL138_INT_PRU_SUART_3, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_4, + .end = OMAPL138_INT_PRU_SUART_4, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_5, + .end = OMAPL138_INT_PRU_SUART_5, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_6, + .end = OMAPL138_INT_PRU_SUART_6, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_7, + .end = OMAPL138_INT_PRU_SUART_7, + .flags = IORESOURCE_IRQ, + }, + { + .start = OMAPL138_INT_PRU_SUART_8, + .end = OMAPL138_INT_PRU_SUART_8, + .flags = IORESOURCE_IRQ, + }, +}; + +struct platform_device omapl_pru_suart_device = { + .name = "davinci_pru_suart", + .id = 1, + .num_resources = ARRAY_SIZE(omapl138_pru_suart_resources), + .resource = omapl138_pru_suart_resources, +}; + +#define OMAPL138_PRU_SUART_VERSION 1 + +static struct ti_pru_suart_platform_data ti_pru_suart_pdata = { + .version = OMAPL138_PRU_SUART_VERSION, +}; + +int __init da8xx_register_pru_suart(void) +{ + omapl_pru_suart_device.dev.platform_data = &ti_pru_suart_pdata; + return platform_device_register(&omapl_pru_suart_device); +} + +static const s8 da8xx_queue_tc_mapping[][2] = { /* {event queue no, TC no} */ {0, 0}, {1, 1}, diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h index 4247b3f..be9dc25 100644 --- a/arch/arm/mach-davinci/include/mach/da8xx.h +++ b/arch/arm/mach-davinci/include/mach/da8xx.h @@ -74,6 +74,7 @@ int da8xx_register_watchdog(void); int da8xx_register_usb20(unsigned mA, unsigned potpgt); int da8xx_register_usb11(struct da8xx_ohci_root_hub *pdata); int da8xx_register_emac(void); +int da8xx_register_pru_suart(void); int da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata); int da8xx_register_mmcsd0(struct davinci_mmc_config *config); int da850_register_mmcsd1(struct davinci_mmc_config *config); @@ -122,6 +123,7 @@ extern const short da850_uart2_pins[]; extern const short da850_i2c0_pins[]; extern const short da850_i2c1_pins[]; extern const short da850_cpgmac_pins[]; +extern const short da850_pru_suart_pins[]; extern const short da850_mcasp_pins[]; extern const short da850_lcdcntl_pins[]; extern const short da850_mmcsd0_pins[]; diff --git a/arch/arm/mach-davinci/include/mach/memory.h b/arch/arm/mach-davinci/include/mach/memory.h index 22eb97c..bf490b1 100644 --- a/arch/arm/mach-davinci/include/mach/memory.h +++ b/arch/arm/mach-davinci/include/mach/memory.h @@ -22,6 +22,7 @@ **************************************************************************/ #define DAVINCI_DDR_BASE 0x80000000 #define DA8XX_DDR_BASE 0xc0000000 +#define DA8XX_SHARED_RAM_BASE 0x80000000 #if defined(CONFIG_ARCH_DAVINCI_DA8XX) && defined(CONFIG_ARCH_DAVINCI_DMx) #error Cannot enable DaVinci and DA8XX platforms concurrently diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 212eb4c..b831ebc 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -199,6 +199,9 @@ /* TI OMAP-UART */ #define PORT_OMAP 96 +/* omapl pru uart emulation */ +#define OMAPL_PRU_SUART 97 + #ifdef __KERNEL__ #include diff --git a/include/linux/ti_omapl_pru_suart.h b/include/linux/ti_omapl_pru_suart.h new file mode 100644 index 0000000..9179f2c --- /dev/null +++ b/include/linux/ti_omapl_pru_suart.h @@ -0,0 +1,38 @@ +/* + * linux/include/linux/ti_omapl_pru_suart.h + */ +#ifndef _LINUX_SUART_OMAPL_PRU_H +#define _LINUX_SUART_OMAPL_PRU_H + +#include +#include + +/* + * TI OMAPL PRU SUART Emulation device driver + * + * This driver supports TI's PRU SUART Emulation and the + * + * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed as is WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* + * struct ti_pru_suart_platform_data - SUART Platform Data + * + * @version: version for future use + * + * Platform data structure to get all platform specific settings. + */ + +struct ti_pru_suart_platform_data { + u32 version; +}; +#endif