| # |
| # Copyright (c) 2018 Bobby Noelte |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| |
| from extract.globals import * |
| from extract.directive import DTDirective |
| |
| ## |
| # @brief Manage interrupts directives. |
| # |
| class DTInterrupts(DTDirective): |
| ## |
| # @brief Extract interrupts |
| # |
| # @param node_path Path to node owning the |
| # interrupts definition. |
| # @param prop compatible property name |
| # @param names (unused) |
| # @param def_label Define label string of node owning the |
| # compatible definition. |
| # |
| def extract(self, node_path, prop, names, def_label): |
| vals = reduced[node_path]['props'][prop] |
| if not isinstance(vals, list): |
| vals = [vals] |
| |
| irq_parent = parent_irq_node(node_path) |
| if not irq_parent: |
| err(node_path + " has no interrupt-parent") |
| |
| l_base = [def_label] |
| index = 0 |
| |
| while vals: |
| prop_def = {} |
| prop_alias = {} |
| l_idx = [str(index)] |
| |
| if names: |
| name = [str_to_label(names.pop(0))] |
| else: |
| name = [] |
| |
| cell_yaml = get_binding(irq_parent) |
| l_cell_prefix = ['IRQ'] |
| |
| for i in range(reduced[irq_parent]['props']['#interrupt-cells']): |
| l_cell_name = [cell_yaml['#cells'][i].upper()] |
| if l_cell_name == l_cell_prefix: |
| l_cell_name = [] |
| |
| full_name = '_'.join(l_base + l_cell_prefix + l_idx + l_cell_name) |
| prop_def[full_name] = vals.pop(0) |
| add_compat_alias(node_path, |
| '_'.join(l_cell_prefix + l_idx + l_cell_name), |
| full_name, prop_alias) |
| |
| if name: |
| alias_list = l_base + l_cell_prefix + name + l_cell_name |
| prop_alias['_'.join(alias_list)] = full_name |
| add_compat_alias(node_path, |
| '_'.join(l_cell_prefix + name + l_cell_name), |
| full_name, prop_alias) |
| |
| if node_path in aliases: |
| add_prop_aliases( |
| node_path, |
| lambda alias: |
| '_'.join([str_to_label(alias)] + |
| l_cell_prefix + name + l_cell_name), |
| full_name, |
| prop_alias) |
| |
| index += 1 |
| insert_defs(node_path, prop_def, prop_alias) |
| |
| |
| def parent_irq_node(node_path): |
| while node_path: |
| if 'interrupt-parent' in reduced[node_path]['props']: |
| return phandles[reduced[node_path]['props']['interrupt-parent']] |
| |
| node_path = get_parent_path(node_path) |
| |
| return None |
| |
| |
| ## |
| # @brief Management information for interrupts. |
| interrupts = DTInterrupts() |