@ -16,7 +16,6 @@
# include <clk.h>
# include <dm.h>
# include <errno.h>
# include <fdtdec.h>
# include <malloc.h>
# include <pci.h>
# include <power-domain.h>
@ -25,6 +24,7 @@
# include <asm/io.h>
# include <asm/gpio.h>
# include <linux/ioport.h>
# include <linux/list.h>
# ifndef CONFIG_TEGRA186
@ -220,9 +220,9 @@ struct tegra_pcie_soc {
struct tegra_pcie {
struct pci_controller hose ;
struct fdt_ resource pads ;
struct fdt_ resource afi ;
struct fdt_ resource cs ;
struct resource pads ;
struct resource afi ;
struct resource cs ;
struct list_head ports ;
unsigned long xbar ;
@ -364,13 +364,12 @@ static int pci_tegra_write_config(struct udevice *bus, pci_dev_t bdf,
return 0 ;
}
static int tegra_pcie_port_parse_dt ( const void * fdt , int node ,
struct tegra_pcie_port * port )
static int tegra_pcie_port_parse_dt ( ofnode node , struct tegra_pcie_port * port )
{
const u32 * addr ;
int len ;
addr = fdt_getprop ( fdt , node , " assigned-addresses " , & len ) ;
addr = ofnode_get_property ( node , " assigned-addresses " , & len ) ;
if ( ! addr ) {
error ( " property \" assigned-addresses \" not found " ) ;
return - FDT_ERR_NOTFOUND ;
@ -382,7 +381,7 @@ static int tegra_pcie_port_parse_dt(const void *fdt, int node,
return 0 ;
}
static int tegra_pcie_get_xbar_config ( const void * fdt , int node , u32 lanes ,
static int tegra_pcie_get_xbar_config ( ofnode node , u32 lanes ,
enum tegra_pci_id id , unsigned long * xbar )
{
switch ( id ) {
@ -456,14 +455,12 @@ static int tegra_pcie_get_xbar_config(const void *fdt, int node, u32 lanes,
return - FDT_ERR_NOTFOUND ;
}
static int tegra_pcie_parse_port_info ( const void * fdt , int node ,
unsigned int * index ,
unsigned int * lanes )
static int tegra_pcie_parse_port_info ( ofnode node , uint * index , uint * lanes )
{
struct fdt_pci_addr addr ;
int err ;
err = fdtdec_get_int ( fdt , node , " nvidia,num-lanes " , 0 ) ;
err = ofnode_read_u32_default ( node , " nvidia,num-lanes " , - 1 ) ;
if ( err < 0 ) {
error ( " failed to parse \" nvidia,num-lanes \" property " ) ;
return err ;
@ -471,7 +468,7 @@ static int tegra_pcie_parse_port_info(const void *fdt, int node,
* lanes = err ;
err = fdtdec_get_pci_addr ( fdt , node , 0 , " reg " , & addr ) ;
err = ofnode_read_pci_addr ( node , 0 , " reg " , & addr ) ;
if ( err < 0 ) {
error ( " failed to parse \" reg \" property " ) ;
return err ;
@ -487,28 +484,26 @@ int __weak tegra_pcie_board_init(void)
return 0 ;
}
static int tegra_pcie_parse_dt ( const void * fdt , int node , enum tegra_pci_id id ,
static int tegra_pcie_parse_dt ( struct udevice * dev , enum tegra_pci_id id ,
struct tegra_pcie * pcie )
{
int err , subnode ;
ofnode subnode ;
u32 lanes = 0 ;
int err ;
err = fdt_get_named_resource ( fdt , node , " reg " , " reg-names " , " pads " ,
& pcie - > pads ) ;
err = dev_read_resource ( dev , 0 , & pcie - > pads ) ;
if ( err < 0 ) {
error ( " resource \" pads \" not found " ) ;
return err ;
}
err = fdt_get_named_resource ( fdt , node , " reg " , " reg-names " , " afi " ,
& pcie - > afi ) ;
err = dev_read_resource ( dev , 1 , & pcie - > afi ) ;
if ( err < 0 ) {
error ( " resource \" afi \" not found " ) ;
return err ;
}
err = fdt_get_named_resource ( fdt , node , " reg " , " reg-names " , " cs " ,
& pcie - > cs ) ;
err = dev_read_resource ( dev , 2 , & pcie - > cs ) ;
if ( err < 0 ) {
error ( " resource \" cs \" not found " ) ;
return err ;
@ -531,12 +526,11 @@ static int tegra_pcie_parse_dt(const void *fdt, int node, enum tegra_pci_id id,
}
# endif
fdt _for_each_subnode( subnode , fdt , no de) {
dev _for_each_subnode( subnode , dev ) {
unsigned int index = 0 , num_lanes = 0 ;
struct tegra_pcie_port * port ;
err = tegra_pcie_parse_port_info ( fdt , subnode , & index ,
& num_lanes ) ;
err = tegra_pcie_parse_port_info ( subnode , & index , & num_lanes ) ;
if ( err < 0 ) {
error ( " failed to obtain root port info " ) ;
continue ;
@ -544,7 +538,7 @@ static int tegra_pcie_parse_dt(const void *fdt, int node, enum tegra_pci_id id,
lanes | = num_lanes < < ( index < < 3 ) ;
if ( ! fdtdec_get_is_enabled ( fdt , subnode ) )
if ( ! ofnode_is_available ( subnode ) )
continue ;
port = malloc ( sizeof ( * port ) ) ;
@ -555,7 +549,7 @@ static int tegra_pcie_parse_dt(const void *fdt, int node, enum tegra_pci_id id,
port - > num_lanes = num_lanes ;
port - > index = index ;
err = tegra_pcie_port_parse_dt ( fdt , subnode , port ) ;
err = tegra_pcie_port_parse_dt ( subnode , port ) ;
if ( err < 0 ) {
free ( port ) ;
continue ;
@ -565,7 +559,8 @@ static int tegra_pcie_parse_dt(const void *fdt, int node, enum tegra_pci_id id,
port - > pcie = pcie ;
}
err = tegra_pcie_get_xbar_config ( fdt , node , lanes , id , & pcie - > xbar ) ;
err = tegra_pcie_get_xbar_config ( dev_ofnode ( dev ) , lanes , id ,
& pcie - > xbar ) ;
if ( err < 0 ) {
error ( " invalid lane configuration " ) ;
return err ;
@ -815,7 +810,7 @@ static int tegra_pcie_setup_translations(struct udevice *bus)
/* BAR 0: type 1 extended configuration space */
fpci = 0xfe100000 ;
size = fdt_ resource_size( & pcie - > cs ) ;
size = resource_size ( & pcie - > cs ) ;
axi = pcie - > cs . start ;
afi_writel ( pcie , axi , AFI_AXI_BAR0_START ) ;
@ -1099,7 +1094,7 @@ static int pci_tegra_ofdata_to_platdata(struct udevice *dev)
INIT_LIST_HEAD ( & pcie - > ports ) ;
if ( tegra_pcie_parse_dt ( gd - > fdt_blob , dev_of_offset ( dev ) , id , pcie ) )
if ( tegra_pcie_parse_dt ( dev , id , pcie ) )
return - EINVAL ;
return 0 ;