@@ -43,6 +43,7 @@
#define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
#define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
+#define DA850_PRU_CAN_TRX_PIN GPIO_TO_PIN(2, 0)
#define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6)
@@ -188,6 +189,32 @@ static struct platform_device *da850_evm_devices[] __initdata = {
&da850_evm_norflash_device,
};
+static int __init da850_evm_setup_pru_can(void)
+{
+ int ret;
+
+ if (!machine_is_davinci_da850_evm())
+ return 0;
+
+ ret = davinci_cfg_reg_list(da850_pru_can_pins);
+ if (ret)
+ pr_warning("da850_evm_init: da850_pru_can_pins mux setup"
+ "failed:%d\n", ret);
+
+ ret = gpio_request(DA850_PRU_CAN_TRX_PIN, "pru_can_en");
+ if (ret)
+ pr_warning("Cannot open GPIO %d\n", DA850_PRU_CAN_TRX_PIN);
+
+ /* value = 0 to enable the can transceiver */
+ gpio_direction_output(DA850_PRU_CAN_TRX_PIN, 0);
+ ret = da8xx_register_pru_can();
+ if (ret)
+ pr_warning("da850_evm_init: pru can registration failed:"
+ "%d\n", ret);
+ return ret;
+}
+device_initcall(da850_evm_setup_pru_can);
+
#define DA8XX_AEMIF_CE2CFG_OFFSET 0x10
#define DA8XX_AEMIF_ASIZE_16BIT 0x1
@@ -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,
@@ -373,6 +380,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),
@@ -390,12 +398,15 @@ static struct clk_lookup da850_clks[] = {
CLK(NULL, NULL, NULL),
};
-/*
- * 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
/* UART0 function */
@@ -514,7 +525,7 @@ static const struct mux_config da850_pins[] = {
MUX_CFG(DA850, EMA_A_5, 12, 8, 15, 1, false)
MUX_CFG(DA850, EMA_A_6, 12, 4, 15, 1, false)
MUX_CFG(DA850, EMA_A_7, 12, 0, 15, 1, false)
- MUX_CFG(DA850, EMA_A_8, 11, 28, 15, 1, false)
+ MUX_CFG(DA850, EMA_A_8, 11, 28, 15, 1, false)
MUX_CFG(DA850, EMA_A_9, 11, 24, 15, 1, false)
MUX_CFG(DA850, EMA_A_10, 11, 20, 15, 1, false)
MUX_CFG(DA850, EMA_A_11, 11, 16, 15, 1, false)
@@ -542,7 +553,12 @@ static const struct mux_config da850_pins[] = {
MUX_CFG(DA850, EMA_CLK, 6, 0, 15, 1, false)
MUX_CFG(DA850, EMA_WAIT_1, 6, 24, 15, 1, false)
MUX_CFG(DA850, NEMA_CS_2, 7, 0, 15, 1, false)
+ /* PRU functions for soft can */
+ MUX_CFG(DA850, PRU0_R31_0, 7, 28, 15, 0, false)
+ MUX_CFG(DA850, PRU1_R30_15, 12, 0, 15, 4, false)
+ MUX_CFG(DA850, PRU1_R31_18, 11, 20, 15, 0, false)
/* GPIO function */
+ MUX_CFG(DA850, GPIO2_0, 6, 28, 15, 8, false)
MUX_CFG(DA850, GPIO2_6, 6, 4, 15, 8, false)
MUX_CFG(DA850, GPIO2_8, 5, 28, 15, 8, false)
MUX_CFG(DA850, GPIO2_15, 5, 0, 15, 8, false)
@@ -557,6 +573,12 @@ const short da850_uart0_pins[] __initdata = {
-1
};
+const short da850_pru_can_pins[] __initdata = {
+ DA850_GPIO2_0, DA850_PRU0_R31_0, DA850_PRU1_R30_15,
+ DA850_PRU1_R31_18,
+ -1
+};
+
const short da850_uart1_pins[] __initdata = {
DA850_UART1_RXD, DA850_UART1_TXD,
-1
@@ -14,6 +14,7 @@
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/serial_8250.h>
+#include <linux/can/platform/ti_omapl_pru_can.h>
#include <mach/cputype.h>
#include <mach/common.h>
@@ -85,6 +86,42 @@ struct platform_device da8xx_serial_device = {
},
};
+/* Info specific to OMAPL138 */
+#define OMAPL138_PRU_MEM_BASE 0x01C30000
+#define OMAPL138_INT_PRU_CAN IRQ_DA8XX_EVTOUT0
+static struct resource omapl138_pru_can_resources[] = {
+ {
+ .start = OMAPL138_PRU_MEM_BASE,
+ .end = OMAPL138_PRU_MEM_BASE + 0xFFFF,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .start = OMAPL138_INT_PRU_CAN,
+ .end = OMAPL138_INT_PRU_CAN,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static struct platform_device omapl138_pru_can_device = {
+ .name = "davinci_pru_can",
+ .id = 1,
+ .num_resources = ARRAY_SIZE(omapl138_pru_can_resources),
+ .resource = omapl138_pru_can_resources,
+};
+
+/* Info specific to CAN conroller */
+#define OMAPL138_PRU_CAN_VERSION 1
+
+static struct ti_pru_can_platform_data ti_pru_can_pdata = {
+ .version = OMAPL138_PRU_CAN_VERSION,
+};
+
+int __init da8xx_register_pru_can(void)
+{
+ omapl138_pru_can_device.dev.platform_data = &ti_pru_can_pdata;
+ return platform_device_register(&omapl138_pru_can_device);
+}
+
static const s8 da8xx_queue_tc_mapping[][2] = {
/* {event queue no, TC no} */
{0, 0},
@@ -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_can(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_can_pins[];
extern const short da850_mcasp_pins[];
extern const short da850_lcdcntl_pins[];
extern const short da850_mmcsd0_pins[];
@@ -906,8 +906,13 @@ enum davinci_da850_index {
DA850_EMA_CLK,
DA850_EMA_WAIT_1,
DA850_NEMA_CS_2,
+ /* PRU I/O */
+ DA850_PRU0_R31_0,
+ DA850_PRU1_R30_15,
+ DA850_PRU1_R31_18,
/* GPIO function */
+ DA850_GPIO2_0,
DA850_GPIO2_6,
DA850_GPIO2_8,
DA850_GPIO2_15,
new file mode 100644
@@ -0,0 +1,29 @@
+/*
+ * TI OMAPL PRU CAN Emulation device driver
+ *
+ * This driver supports TI's PRU CAN 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_can_platform_data - PRU CAN platform data
+ *
+ * @version: version for future use
+ *
+ * Platform data structure to get all platform specific settings.
+ */
+
+struct ti_pru_can_platform_data {
+ u32 version;
+};