Rev 3934 | Rev 3941 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3934 | Rev 3938 | ||
---|---|---|---|
Line 102... | Line 102... | ||
102 | */ |
102 | */ |
103 | bool |
103 | bool |
104 | ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) |
104 | ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) |
105 | { |
105 | { |
106 | ns16550_instance_t *instance; |
106 | ns16550_instance_t *instance; |
107 | irq_t *irq; |
- | |
108 | 107 | ||
109 | chardev_initialize("ns16550_kbd", &kbrd, &ops); |
108 | chardev_initialize("ns16550_kbd", &kbrd, &ops); |
110 | stdin = &kbrd; |
109 | stdin = &kbrd; |
111 | 110 | ||
112 | instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); |
111 | instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); |
113 | if (!instance) |
112 | if (!instance) |
114 | return false; |
113 | return false; |
115 | 114 | ||
116 | irq = malloc(sizeof(irq_t), FRAME_ATOMIC); |
- | |
117 | if (!irq) { |
- | |
118 | free(instance); |
- | |
119 | return false; |
- | |
120 | } |
- | |
121 | - | ||
122 | instance->devno = devno; |
115 | instance->devno = devno; |
123 | instance->ns16550 = dev; |
116 | instance->ns16550 = dev; |
124 | instance->irq = irq; |
- | |
125 | 117 | ||
126 | irq_initialize(irq); |
118 | irq_initialize(&instance->irq); |
127 | irq->devno = devno; |
119 | instance->irq.devno = devno; |
128 | irq->inr = inr; |
120 | instance->irq.inr = inr; |
129 | irq->claim = ns16550_claim; |
121 | instance->irq.claim = ns16550_claim; |
130 | irq->handler = ns16550_irq_handler; |
122 | instance->irq.handler = ns16550_irq_handler; |
131 | irq->instance = instance; |
123 | instance->irq.instance = instance; |
132 | irq->cir = cir; |
124 | instance->irq.cir = cir; |
133 | irq->cir_arg = cir_arg; |
125 | instance->irq.cir_arg = cir_arg; |
134 | irq_register(irq); |
126 | irq_register(&instance->irq); |
135 | 127 | ||
136 | ns16550_irq = irq; /* TODO: remove me soon */ |
128 | ns16550_irq = &instance->irq; /* TODO: remove me soon */ |
137 | 129 | ||
138 | while ((pio_read_8(&dev->lsr) & LSR_DATA_READY)) |
130 | while ((pio_read_8(&dev->lsr) & LSR_DATA_READY)) |
139 | (void) pio_read_8(&dev->rbr); |
131 | (void) pio_read_8(&dev->rbr); |
140 | 132 | ||
141 | sysinfo_set_item_val("kbd", NULL, true); |
133 | sysinfo_set_item_val("kbd", NULL, true); |
142 | sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); |
134 | sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); |
143 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
135 | sysinfo_set_item_val("kbd.devno", NULL, devno); |