From 7a4491817bc1a0b816722e937cdba81f41980a01 Mon Sep 17 00:00:00 2001 From: Nicolas Ferre Date: Tue, 8 Nov 2011 17:27:20 +0100 Subject: [PATCH 107/107] ARM: at91: add smd device definition This patch adds SMD definition and DMA interface in device file. The EK board contains a SmartDAA so we register the SMD interface from that board file. Signed-off-by: Nicolas Ferre --- arch/arm/mach-at91/at91sam9x5_devices.c | 54 +++++++++++++++++++++++++++++++ arch/arm/mach-at91/board-sam9x5ek.c | 3 ++ arch/arm/mach-at91/include/mach/board.h | 3 ++ 3 files changed, 60 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-at91/at91sam9x5_devices.c b/arch/arm/mach-at91/at91sam9x5_devices.c index 4cafa1c..cee42dc 100644 --- a/arch/arm/mach-at91/at91sam9x5_devices.c +++ b/arch/arm/mach-at91/at91sam9x5_devices.c @@ -1469,6 +1469,60 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) void __init at91_add_device_ssc(unsigned id, unsigned pins) {} #endif +/* -------------------------------------------------------------------- + * SMD + * -------------------------------------------------------------------- */ + +static u64 smd_dmamask = DMA_BIT_MASK(32); +static struct at_dma_slave smd_dmadata; + +static struct resource smd_resources[] = { + [0] = { + .start = AT91SAM9X5_SMD_BASE, + .end = AT91SAM9X5_SMD_BASE + SZ_512 - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { + .start = AT91SAM9X5_ID_SMD, + .end = AT91SAM9X5_ID_SMD, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device at91sam9x5_smd_device = { + .name = "atmel_smd", + .id = -1, + .dev = { + .dma_mask = &smd_dmamask, + .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &smd_dmadata, + }, + .resource = smd_resources, + .num_resources = ARRAY_SIZE(smd_resources), +}; + +void __init at91_add_device_smd(void) +{ +#if defined(CONFIG_AT_HDMAC) || defined(CONFIG_AT_HDMAC_MODULE) + struct at_dma_slave *atslave; + + atslave = kzalloc(sizeof(struct at_dma_slave), GFP_KERNEL); + + /* DMA slave channel configuration */ + atslave->reg_width = AT_DMA_SLAVE_WIDTH_32BIT; + atslave->cfg = ATC_FIFOCFG_HALFFIFO + | ATC_SRC_H2SEL_HW + | ATC_DST_H2SEL_HW; + atslave->ctrla = ATC_SCSIZE_4 | ATC_DCSIZE_4; + atslave->cfg |= ATC_SRC_PER(AT_DMA_ID_SMD_RX) + | ATC_DST_PER(AT_DMA_ID_SMD_TX); + atslave->dma_dev = &at_hdmac1_device.dev; + + smd_dmadata = *atslave; +#endif + + platform_device_register(&at91sam9x5_smd_device); +} /* -------------------------------------------------------------------- * UART diff --git a/arch/arm/mach-at91/board-sam9x5ek.c b/arch/arm/mach-at91/board-sam9x5ek.c index ea49a23..8c06040 100644 --- a/arch/arm/mach-at91/board-sam9x5ek.c +++ b/arch/arm/mach-at91/board-sam9x5ek.c @@ -455,6 +455,9 @@ static void __init ek_board_init(void) /* SSC (for WM8731) */ at91_add_device_ssc(AT91SAM9X5_ID_SSC, ATMEL_SSC_TX | ATMEL_SSC_RX); + /* SMD */ + at91_add_device_smd(); + if (ek_is_revA()) printk(KERN_CRIT "AT91: EK rev A\n"); else diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index cf8d780..04dcec1 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h @@ -211,6 +211,9 @@ extern void __init at91_add_device_can(int id, struct at91_can_data *data); extern void __init at91_add_device_can(struct at91_can_data *data); #endif + /* SMD */ +extern void __init at91_add_device_smd(void); + /* LEDs */ extern void __init at91_init_leds(u8 cpu_led, u8 timer_led); extern void __init at91_gpio_leds(struct gpio_led *leds, int nr); -- 1.7.5.4