[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: Haavard Skinnemoen <hskinnemoen@atmel.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
acca9b83ac
commit
c194588dba
|
@ -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 = {
|
||||||
|
|
||||||
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, ð0_data);
|
at32_add_device_eth(0, ð0_data);
|
||||||
at32_add_device_spi(0);
|
at32_add_device_spi(0);
|
||||||
|
|
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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 {
|
||||||
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 @@
|
||||||
#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);
|
||||||
|
|
Loading…
Reference in New Issue