Commit c194588d authored by Haavard Skinnemoen's avatar Haavard Skinnemoen Committed by Linus Torvalds

[PATCH] AVR32: Allow renumbering of serial devices

Allow the board to remap actual USART peripheral devices to serial
devices by calling at32_map_usart(hw_id, serial_line). This ensures
that even though ATSTK1002 uses USART1 as the first serial port, it
will still have a ttyS0 device.

This also adds a board-specific early setup hook and moves the
at32_setup_serial_console() call there from the platform code.
Signed-off-by: default avatarHaavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent acca9b83
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/arch/board.h> #include <asm/arch/board.h>
#include <asm/arch/init.h>
struct eth_platform_data __initdata eth0_data = { struct eth_platform_data __initdata eth0_data = {
.valid = 1, .valid = 1,
...@@ -20,13 +21,22 @@ struct eth_platform_data __initdata eth0_data = { ...@@ -20,13 +21,22 @@ struct eth_platform_data __initdata eth0_data = {
extern struct lcdc_platform_data atstk1000_fb0_data; extern struct lcdc_platform_data atstk1000_fb0_data;
void __init setup_board(void)
{
at32_map_usart(1, 0); /* /dev/ttyS0 */
at32_map_usart(2, 1); /* /dev/ttyS1 */
at32_map_usart(3, 2); /* /dev/ttyS2 */
at32_setup_serial_console(0);
}
static int __init atstk1002_init(void) static int __init atstk1002_init(void)
{ {
at32_add_system_devices(); at32_add_system_devices();
at32_add_device_usart(1); /* /dev/ttyS0 */ at32_add_device_usart(0);
at32_add_device_usart(2); /* /dev/ttyS1 */ at32_add_device_usart(1);
at32_add_device_usart(3); /* /dev/ttyS2 */ at32_add_device_usart(2);
at32_add_device_eth(0, &eth0_data); at32_add_device_eth(0, &eth0_data);
at32_add_device_spi(0); at32_add_device_spi(0);
......
...@@ -292,6 +292,7 @@ void __init setup_arch (char **cmdline_p) ...@@ -292,6 +292,7 @@ void __init setup_arch (char **cmdline_p)
setup_processor(); setup_processor();
setup_platform(); setup_platform();
setup_board();
cpu_clk = clk_get(NULL, "cpu"); cpu_clk = clk_get(NULL, "cpu");
if (IS_ERR(cpu_clk)) { if (IS_ERR(cpu_clk)) {
......
...@@ -48,9 +48,6 @@ void __init setup_platform(void) ...@@ -48,9 +48,6 @@ void __init setup_platform(void)
at32_sm_init(); at32_sm_init();
at32_clock_init(); at32_clock_init();
at32_portmux_init(); at32_portmux_init();
/* FIXME: This doesn't belong here */
at32_setup_serial_console(1);
} }
static int __init pdc_probe(struct platform_device *pdev) static int __init pdc_probe(struct platform_device *pdev)
......
...@@ -591,11 +591,13 @@ static inline void configure_usart3_pins(void) ...@@ -591,11 +591,13 @@ static inline void configure_usart3_pins(void)
portmux_set_func(PIOB, 17, FUNC_B); /* TXD */ portmux_set_func(PIOB, 17, FUNC_B); /* TXD */
} }
static struct platform_device *setup_usart(unsigned int id) static struct platform_device *at32_usarts[4];
void __init at32_map_usart(unsigned int hw_id, unsigned int line)
{ {
struct platform_device *pdev; struct platform_device *pdev;
switch (id) { switch (hw_id) {
case 0: case 0:
pdev = &atmel_usart0_device; pdev = &atmel_usart0_device;
configure_usart0_pins(); configure_usart0_pins();
...@@ -613,7 +615,7 @@ static struct platform_device *setup_usart(unsigned int id) ...@@ -613,7 +615,7 @@ static struct platform_device *setup_usart(unsigned int id)
configure_usart3_pins(); configure_usart3_pins();
break; break;
default: default:
return NULL; return;
} }
if (PXSEG(pdev->resource[0].start) == P4SEG) { if (PXSEG(pdev->resource[0].start) == P4SEG) {
...@@ -622,25 +624,21 @@ static struct platform_device *setup_usart(unsigned int id) ...@@ -622,25 +624,21 @@ static struct platform_device *setup_usart(unsigned int id)
data->regs = (void __iomem *)pdev->resource[0].start; data->regs = (void __iomem *)pdev->resource[0].start;
} }
return pdev; pdev->id = line;
at32_usarts[line] = pdev;
} }
struct platform_device *__init at32_add_device_usart(unsigned int id) struct platform_device *__init at32_add_device_usart(unsigned int id)
{ {
struct platform_device *pdev; platform_device_register(at32_usarts[id]);
return at32_usarts[id];
pdev = setup_usart(id);
if (pdev)
platform_device_register(pdev);
return pdev;
} }
struct platform_device *atmel_default_console_device; struct platform_device *atmel_default_console_device;
void __init at32_setup_serial_console(unsigned int usart_id) void __init at32_setup_serial_console(unsigned int usart_id)
{ {
atmel_default_console_device = setup_usart(usart_id); atmel_default_console_device = at32_usarts[usart_id];
} }
/* -------------------------------------------------------------------- /* --------------------------------------------------------------------
......
...@@ -17,6 +17,7 @@ struct atmel_uart_data { ...@@ -17,6 +17,7 @@ struct atmel_uart_data {
short use_dma_rx; /* use receive DMA? */ short use_dma_rx; /* use receive DMA? */
void __iomem *regs; /* virtual base address, if any */ void __iomem *regs; /* virtual base address, if any */
}; };
void at32_map_usart(unsigned int hw_id, unsigned int line);
struct platform_device *at32_add_device_usart(unsigned int id); struct platform_device *at32_add_device_usart(unsigned int id);
struct eth_platform_data { struct eth_platform_data {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define __ASM_AVR32_AT32AP_INIT_H__ #define __ASM_AVR32_AT32AP_INIT_H__
void setup_platform(void); void setup_platform(void);
void setup_board(void);
/* Called by setup_platform */ /* Called by setup_platform */
void at32_clock_init(void); void at32_clock_init(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment