# # Copyright (c) 2018 Bobby Noelte # # SPDX-License-Identifier: Apache-2.0 # from copy import deepcopy from extract.globals import * from extract.directive import DTDirective ## # @brief Manage reg directive. # class DTReg(DTDirective): ## # @brief Extract reg directive info # # @param node_path Path to node owning the # reg definition. # @param names (unused) # @param def_label Define label string of node owning the # compatible definition. # def extract(self, node_path, names, def_label, div): binding = get_binding(node_path) reg = reduced[node_path]['props']['reg'] if type(reg) is not list: reg = [ reg, ] (nr_address_cells, nr_size_cells) = get_addr_size_cells(node_path) if 'parent' in binding: bus = binding['parent']['bus'] if bus == 'spi': cs_gpios = None try: cs_gpios = deepcopy(find_parent_prop(node_path, 'cs-gpios')) except: pass if cs_gpios: extract_controller(node_path, "cs-gpios", cs_gpios, reg[0], def_label, "cs-gpio", True, True) extract_controller(node_path, "cs-gpios", cs_gpios, reg[0], def_label, "cs-gpios", True) extract_cells(node_path, "cs-gpios", cs_gpios, None, reg[0], def_label, "cs-gpio", True, True) extract_cells(node_path, "cs-gpios", cs_gpios, None, reg[0], def_label, "cs-gpios", True) # generate defines l_base = [def_label] l_addr = [str_to_label("BASE_ADDRESS")] l_size = ["SIZE"] index = 0 props = list(reg) while props: prop_def = {} prop_alias = {} addr = 0 size = 0 # Check is defined should be indexed (_0, _1) if index == 0 and len(props) <= (nr_address_cells + nr_size_cells): # 1 element (len 2) or no element (len 0) in props l_idx = [] else: l_idx = [str(index)] try: name = [names.pop(0).upper()] except: name = [] for x in range(nr_address_cells): addr += props.pop(0) << (32 * (nr_address_cells - x - 1)) for x in range(nr_size_cells): size += props.pop(0) << (32 * (nr_size_cells - x - 1)) addr += translate_addr(addr, node_path, nr_address_cells, nr_size_cells) l_addr_fqn = '_'.join(l_base + l_addr + l_idx) l_size_fqn = '_'.join(l_base + l_size + l_idx) if nr_address_cells: prop_def[l_addr_fqn] = hex(addr) add_compat_alias(node_path, '_'.join(l_addr + l_idx), l_addr_fqn, prop_alias) if nr_size_cells: prop_def[l_size_fqn] = int(size / div) add_compat_alias(node_path, '_'.join(l_size + l_idx), l_size_fqn, prop_alias) if len(name): if nr_address_cells: prop_alias['_'.join(l_base + name + l_addr)] = l_addr_fqn add_compat_alias(node_path, '_'.join(name + l_addr), l_addr_fqn, prop_alias) if nr_size_cells: prop_alias['_'.join(l_base + name + l_size)] = l_size_fqn add_compat_alias(node_path, '_'.join(name + l_size), l_size_fqn, prop_alias) # generate defs for node aliases if node_path in aliases: add_prop_aliases( node_path, lambda alias: '_'.join([str_to_label(alias)] + l_addr + l_idx), l_addr_fqn, prop_alias) if nr_size_cells: add_prop_aliases( node_path, lambda alias: '_'.join([str_to_label(alias)] + l_size + l_idx), l_size_fqn, prop_alias) insert_defs(node_path, prop_def, prop_alias) # increment index for definition creation index += 1 ## # @brief Management information for registers. reg = DTReg()