diff options
-rw-r--r-- | arch/ia64/hp/sim/simserial.c | 94 |
1 files changed, 27 insertions, 67 deletions
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index c65c49d31e7f..64ab004b4763 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c | |||
@@ -49,44 +49,7 @@ | |||
49 | static char *serial_name = "SimSerial driver"; | 49 | static char *serial_name = "SimSerial driver"; |
50 | static char *serial_version = "0.6"; | 50 | static char *serial_version = "0.6"; |
51 | 51 | ||
52 | /* | 52 | static struct serial_state rs_table[NR_PORTS]; |
53 | * This has been extracted from asm/serial.h. We need one eventually but | ||
54 | * I don't know exactly what we're going to put in it so just fake one | ||
55 | * for now. | ||
56 | */ | ||
57 | #define BASE_BAUD ( 1843200 / 16 ) | ||
58 | |||
59 | #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) | ||
60 | |||
61 | /* | ||
62 | * Most of the values here are meaningless to this particular driver. | ||
63 | * However some values must be preserved for the code (leveraged from serial.c | ||
64 | * to work correctly). | ||
65 | * port must not be 0 | ||
66 | * type must not be UNKNOWN | ||
67 | * So I picked arbitrary (guess from where?) values instead | ||
68 | */ | ||
69 | static struct serial_state rs_table[NR_PORTS]={ | ||
70 | /* UART CLK PORT IRQ FLAGS */ | ||
71 | { BASE_BAUD, 0x3F8, 0, STD_COM_FLAGS, PORT_16550 } /* ttyS0 */ | ||
72 | }; | ||
73 | |||
74 | /* | ||
75 | * Just for the fun of it ! | ||
76 | */ | ||
77 | static struct serial_uart_config uart_config[] = { | ||
78 | { "unknown", 1, 0 }, | ||
79 | { "8250", 1, 0 }, | ||
80 | { "16450", 1, 0 }, | ||
81 | { "16550", 1, 0 }, | ||
82 | { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, | ||
83 | { "cirrus", 1, 0 }, | ||
84 | { "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, | ||
85 | { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | | ||
86 | UART_STARTECH }, | ||
87 | { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO}, | ||
88 | { NULL, 0} | ||
89 | }; | ||
90 | 53 | ||
91 | struct tty_driver *hp_simserial_driver; | 54 | struct tty_driver *hp_simserial_driver; |
92 | 55 | ||
@@ -592,11 +555,6 @@ static int startup(struct tty_struct *tty, struct serial_state *state) | |||
592 | goto errout; | 555 | goto errout; |
593 | } | 556 | } |
594 | 557 | ||
595 | if (!state->port || !state->type) { | ||
596 | set_bit(TTY_IO_ERROR, &tty->flags); | ||
597 | free_page(page); | ||
598 | goto errout; | ||
599 | } | ||
600 | if (state->xmit.buf) | 558 | if (state->xmit.buf) |
601 | free_page(page); | 559 | free_page(page); |
602 | else | 560 | else |
@@ -725,9 +683,8 @@ static int rs_open(struct tty_struct *tty, struct file * filp) | |||
725 | 683 | ||
726 | static inline void line_info(struct seq_file *m, struct serial_state *state) | 684 | static inline void line_info(struct seq_file *m, struct serial_state *state) |
727 | { | 685 | { |
728 | seq_printf(m, "%d: uart:%s port:%lX irq:%d\n", | 686 | seq_printf(m, "%d: uart:16550 port:3F8 irq:%d\n", |
729 | state->line, uart_config[state->type].name, | 687 | state->line, state->irq); |
730 | state->port, state->irq); | ||
731 | } | 688 | } |
732 | 689 | ||
733 | static int rs_proc_show(struct seq_file *m, void *v) | 690 | static int rs_proc_show(struct seq_file *m, void *v) |
@@ -796,11 +753,10 @@ static const struct tty_operations hp_ops = { | |||
796 | /* | 753 | /* |
797 | * The serial driver boot-time initialization code! | 754 | * The serial driver boot-time initialization code! |
798 | */ | 755 | */ |
799 | static int __init | 756 | static int __init simrs_init(void) |
800 | simrs_init (void) | ||
801 | { | 757 | { |
802 | int i, rc; | 758 | struct serial_state *state; |
803 | struct serial_state *state; | 759 | int retval; |
804 | 760 | ||
805 | if (!ia64_platform_is("hpsim")) | 761 | if (!ia64_platform_is("hpsim")) |
806 | return -ENODEV; | 762 | return -ENODEV; |
@@ -828,29 +784,33 @@ simrs_init (void) | |||
828 | /* | 784 | /* |
829 | * Let's have a little bit of fun ! | 785 | * Let's have a little bit of fun ! |
830 | */ | 786 | */ |
831 | for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { | 787 | state = rs_table; |
832 | tty_port_init(&state->tport); | 788 | tty_port_init(&state->tport); |
833 | state->tport.close_delay = 0; /* XXX really 0? */ | 789 | state->tport.close_delay = 0; /* XXX really 0? */ |
790 | |||
791 | retval = hpsim_get_irq(KEYBOARD_INTR); | ||
792 | if (retval < 0) { | ||
793 | printk(KERN_ERR "%s: out of interrupt vectors!\n", | ||
794 | __func__); | ||
795 | goto err_free_tty; | ||
796 | } | ||
834 | 797 | ||
835 | if (state->type == PORT_UNKNOWN) continue; | 798 | state->irq = retval; |
836 | 799 | ||
837 | if (!state->irq) { | 800 | /* the port is imaginary */ |
838 | if ((rc = hpsim_get_irq(KEYBOARD_INTR)) < 0) | 801 | printk(KERN_INFO "ttyS%d at 0x03f8 (irq = %d) is a 16550\n", |
839 | panic("%s: out of interrupt vectors!\n", | 802 | state->line, state->irq); |
840 | __func__); | ||
841 | state->irq = rc; | ||
842 | } | ||
843 | 803 | ||
844 | printk(KERN_INFO "ttyS%d at 0x%04lx (irq = %d) is a %s\n", | 804 | retval = tty_register_driver(hp_simserial_driver); |
845 | state->line, | 805 | if (retval) { |
846 | state->port, state->irq, | 806 | printk(KERN_ERR "Couldn't register simserial driver\n"); |
847 | uart_config[state->type].name); | 807 | goto err_free_tty; |
848 | } | 808 | } |
849 | 809 | ||
850 | if (tty_register_driver(hp_simserial_driver)) | ||
851 | panic("Couldn't register simserial driver\n"); | ||
852 | |||
853 | return 0; | 810 | return 0; |
811 | err_free_tty: | ||
812 | put_tty_driver(hp_simserial_driver); | ||
813 | return retval; | ||
854 | } | 814 | } |
855 | 815 | ||
856 | #ifndef MODULE | 816 | #ifndef MODULE |