# # 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 + l_idx + l_cell_name), full_name, prop_alias) if name: add_prop_aliases( node_path, lambda alias: '_'.join([str_to_label(alias)] + l_cell_prefix + name + l_cell_name), full_name, prop_alias) else: add_prop_aliases( node_path, lambda alias: '_'.join([str_to_label(alias)] + l_cell_prefix + name + l_cell_name), full_name, prop_alias, True) 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()