Rev 1896 | Rev 1911 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1896 | Rev 1909 | ||
|---|---|---|---|
| Line 66... | Line 66... | ||
| 66 | ofw_tree_property_t *prop; |
66 | ofw_tree_property_t *prop; |
| 67 | const char *name; |
67 | const char *name; |
| 68 | 68 | ||
| 69 | name = ofw_tree_node_name(node); |
69 | name = ofw_tree_node_name(node); |
| 70 | 70 | ||
| - | 71 | /* |
|
| - | 72 | * Determine keyboard serial controller type. |
|
| - | 73 | */ |
|
| 71 | if (strcmp(name, "zs") == 0) |
74 | if (strcmp(name, "zs") == 0) |
| 72 | kbd_type = KBD_Z8530; |
75 | kbd_type = KBD_Z8530; |
| 73 | else if (strcmp(name, "su") == 0) |
76 | else if (strcmp(name, "su") == 0) |
| 74 | kbd_type = KBD_NS16550; |
77 | kbd_type = KBD_NS16550; |
| 75 | 78 | ||
| 76 | if (kbd_type == KBD_UNKNOWN) { |
79 | if (kbd_type == KBD_UNKNOWN) { |
| 77 | printf("Unknown keyboard device.\n"); |
80 | printf("Unknown keyboard device.\n"); |
| 78 | return; |
81 | return; |
| 79 | } |
82 | } |
| 80 | 83 | ||
| - | 84 | /* |
|
| - | 85 | * Read 'interrupts' property. |
|
| - | 86 | */ |
|
| - | 87 | uint32_t interrupts; |
|
| - | 88 | prop = ofw_tree_getprop(node, "interrupts"); |
|
| - | 89 | if (!prop || !prop->value) |
|
| - | 90 | panic("Can't find \"interrupts\" property.\n"); |
|
| - | 91 | interrupts = *((uint32_t *) prop->value); |
|
| - | 92 | ||
| - | 93 | /* |
|
| - | 94 | * Read 'reg' property. |
|
| - | 95 | */ |
|
| 81 | prop = ofw_tree_getprop(node, "reg"); |
96 | prop = ofw_tree_getprop(node, "reg"); |
| 82 | if (!prop) |
97 | if (!prop || !prop->value) |
| 83 | panic("Can't find \"reg\" property.\n"); |
98 | panic("Can't find \"reg\" property.\n"); |
| 84 | 99 | ||
| 85 | uintptr_t pa; |
100 | uintptr_t pa; |
| 86 | size_t size; |
101 | size_t size; |
| - | 102 | int ino; |
|
| 87 | 103 | ||
| 88 | switch (kbd_type) { |
104 | switch (kbd_type) { |
| 89 | case KBD_Z8530: |
105 | case KBD_Z8530: |
| 90 | size = ((ofw_fhc_reg_t *) prop->value)->size; |
106 | size = ((ofw_fhc_reg_t *) prop->value)->size; |
| 91 | if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) { |
107 | if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) { |
| 92 | printf("Failed to determine keyboard address.\n"); |
108 | printf("Failed to determine keyboard address.\n"); |
| 93 | return; |
109 | return; |
| 94 | } |
110 | } |
| - | 111 | if (!ofw_fhc_map_interrupts(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &ino)) { |
|
| - | 112 | printf("Failed to determine keyboard interrupts.\n"); |
|
| - | 113 | return; |
|
| - | 114 | } |
|
| 95 | break; |
115 | break; |
| 96 | case KBD_NS16550: |
116 | case KBD_NS16550: |
| 97 | size = ((ofw_ebus_reg_t *) prop->value)->size; |
117 | size = ((ofw_ebus_reg_t *) prop->value)->size; |
| 98 | if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { |
118 | if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { |
| 99 | printf("Failed to determine keyboard address.\n"); |
119 | printf("Failed to determine keyboard address.\n"); |
| 100 | return; |
120 | return; |
| 101 | } |
121 | } |
| - | 122 | if (!ofw_ebus_map_interrupts(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &ino)) { |
|
| - | 123 | printf("Failed to determine keyboard interrupts.\n"); |
|
| - | 124 | return; |
|
| - | 125 | } |
|
| 102 | break; |
126 | break; |
| 103 | default: |
127 | default: |
| 104 | panic("Unexpected type.\n"); |
128 | panic("Unexpected type.\n"); |
| 105 | } |
129 | } |
| 106 | 130 | ||