• Stephen Warren's avatar
    of: Allow busses with #size-cells=0 · 5d61b165
    Stephen Warren authored
    It's quite legitimate for a DT node to specify #size-cells=0. One example
    is a node that's used to collect a number of non-memory-mapped devices.
    In that scenario, there may be multiple child nodes with the same name
    (type) thus necessitating the use of unit addresses in node names, and
    reg properties:
    
    / {
    	regulators {
    		compatible = "simple-bus";
    		#address-cells = <1>;
    		#size-cells = <0>;
    
    		regulator@0 {
    			compatible = "regulator-fixed";
    			reg = <0>;
    			...
    		};
    
    		regulator@1 {
    			compatible = "regulator-fixed";
    			reg = <1>;
    			...
    		};
    
    		...
    	};
    };
    
    However, #size-cells=0 prevents translation of reg property values into
    the parent node's address space. In turn, this triggers the kernel to
    emit error messages during boot, such as:
    
        prom_parse: Bad cell count for /regulators/regulator@0
    
    To prevent printing these error messages for legitimate DT content, a
    number of changes are made:
    
    1) of_get_address()/of_get_pci_address() are modified only to validate
       the value of #address-cells, and not #size-cells.
    
    2) of_can_translate_address() is added to indicate whether address
       translation is possible.
    
    3) of_device_make_bus_id() is modified to name devices based on the
       translated address only where possible, and otherwise fall back to
       using the (first cell of the) raw untranslated address.
    
    4) of_device_alloc() is modified to create memory resources for a device
       only if the address can be translated into the CPU's address space.
    Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
    Signed-off-by: default avatarRob Herring <rob.herring@calxeda.com>
    5d61b165
address.c 15.5 KB