diff options
Diffstat (limited to 'cpu/mpc83xx/cpu.c')
| -rw-r--r-- | cpu/mpc83xx/cpu.c | 118 | 
1 files changed, 68 insertions, 50 deletions
| diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c index 841fe8242..adf808301 100644 --- a/cpu/mpc83xx/cpu.c +++ b/cpu/mpc83xx/cpu.c @@ -33,8 +33,7 @@  #include <asm/processor.h>  #if defined(CONFIG_OF_FLAT_TREE)  #include <ft_build.h> -#endif -#if defined(CONFIG_OF_LIBFDT) +#elif defined(CONFIG_OF_LIBFDT)  #include <libfdt.h>  #include <libfdt_env.h>  #endif @@ -113,12 +112,14 @@ int checkcpu(void)  	case SPR_8360E_REV11:  	case SPR_8360E_REV12:  	case SPR_8360E_REV20: +	case SPR_8360E_REV21:  		puts("MPC8360E, ");  		break;  	case SPR_8360_REV10:  	case SPR_8360_REV11:  	case SPR_8360_REV12:  	case SPR_8360_REV20: +	case SPR_8360_REV21:  		puts("MPC8360, ");  		break;  	case SPR_8323E_REV10: @@ -150,7 +151,8 @@ int checkcpu(void)  		puts("MPC8313E, ");  		break;  	default: -		puts("Rev: Unknown revision number.\nWarning: Unsupported cpu revision!\n"); +		printf("Rev: Unknown revision number:%08x\n" +			"Warning: Unsupported cpu revision!\n",spridr);  		return 0;  	} @@ -329,154 +331,167 @@ void watchdog_reset (void)  /*   * "Setter" functions used to add/modify FDT entries.   */ -static int fdt_set_eth0(void *fdt, int nodeoffset, const char *name, bd_t *bd) +static int fdt_set_eth0(void *blob, int nodeoffset, const char *name, bd_t *bd)  {  	/*  	 * Fix it up if it exists, don't create it if it doesn't exist.  	 */ -	if (fdt_get_property(fdt, nodeoffset, name, 0)) { -		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enetaddr, 6); +	if (fdt_get_property(blob, nodeoffset, name, 0)) { +		return fdt_setprop(blob, nodeoffset, name, bd->bi_enetaddr, 6);  	} -	return -FDT_ERR_NOTFOUND; +	return 0;  }  #ifdef CONFIG_HAS_ETH1  /* second onboard ethernet port */ -static int fdt_set_eth1(void *fdt, int nodeoffset, const char *name, bd_t *bd) +static int fdt_set_eth1(void *blob, int nodeoffset, const char *name, bd_t *bd)  {  	/*  	 * Fix it up if it exists, don't create it if it doesn't exist.  	 */ -	if (fdt_get_property(fdt, nodeoffset, name, 0)) { -		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet1addr, 6); +	if (fdt_get_property(blob, nodeoffset, name, 0)) { +		return fdt_setprop(blob, nodeoffset, name, bd->bi_enet1addr, 6);  	} -	return -FDT_ERR_NOTFOUND; +	return 0;  }  #endif  #ifdef CONFIG_HAS_ETH2  /* third onboard ethernet port */ -static int fdt_set_eth2(void *fdt, int nodeoffset, const char *name, bd_t *bd) +static int fdt_set_eth2(void *blob, int nodeoffset, const char *name, bd_t *bd)  {  	/*  	 * Fix it up if it exists, don't create it if it doesn't exist.  	 */ -	if (fdt_get_property(fdt, nodeoffset, name, 0)) { -		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet2addr, 6); +	if (fdt_get_property(blob, nodeoffset, name, 0)) { +		return fdt_setprop(blob, nodeoffset, name, bd->bi_enet2addr, 6);  	} -	return -FDT_ERR_NOTFOUND; +	return 0;  }  #endif  #ifdef CONFIG_HAS_ETH3  /* fourth onboard ethernet port */ -static int fdt_set_eth3(void *fdt, int nodeoffset, const char *name, bd_t *bd) +static int fdt_set_eth3(void *blob, int nodeoffset, const char *name, bd_t *bd)  {  	/*  	 * Fix it up if it exists, don't create it if it doesn't exist.  	 */ -	if (fdt_get_property(fdt, nodeoffset, name, 0)) { -		return fdt_setprop(fdt, nodeoffset, name, bd->bi_enet3addr, 6); +	if (fdt_get_property(blob, nodeoffset, name, 0)) { +		return fdt_setprop(blob, nodeoffset, name, bd->bi_enet3addr, 6);  	} -	return -FDT_ERR_NOTFOUND; +	return 0;  }  #endif -static int fdt_set_busfreq(void *fdt, int nodeoffset, const char *name, bd_t *bd) +static int fdt_set_busfreq(void *blob, int nodeoffset, const char *name, bd_t *bd)  {  	u32  tmp;  	/*  	 * Create or update the property.  	 */  	tmp = cpu_to_be32(bd->bi_busfreq); -	return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); +	return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp)); +} + +static int fdt_set_tbfreq(void *blob, int nodeoffset, const char *name, bd_t *bd) +{ +	u32  tmp; +	/* +	 * Create or update the property. +	 */ +	tmp = cpu_to_be32(OF_TBCLK); +	return fdt_setprop(blob, nodeoffset, name, &tmp, sizeof(tmp));  } +  /* - * Fixups to the fdt.  If "create" is TRUE, the node is created - * unconditionally.  If "create" is FALSE, the node is updated - * only if it already exists. + * Fixups to the fdt.   */  static const struct {  	char *node;  	char *prop; -	int (*set_fn)(void *fdt, int nodeoffset, const char *name, bd_t *bd); +	int (*set_fn)(void *blob, int nodeoffset, const char *name, bd_t *bd);  } fixup_props[] = {  	{	"/cpus/" OF_CPU, -		 "bus-frequency", -		fdt_set_busfreq +		"timebase-frequency", +		fdt_set_tbfreq  	}, -	{	"/cpus/" OF_SOC, +	{	"/cpus/" OF_CPU,  		"bus-frequency",  		fdt_set_busfreq  	}, -	{	"/" OF_SOC "/serial@4500/", +	{	"/cpus/" OF_CPU, +		"clock-frequency", +		fdt_set_busfreq +	}, +	{	"/" OF_SOC "/serial@4500",  		"clock-frequency",  		fdt_set_busfreq  	}, -	{	"/" OF_SOC "/serial@4600/", +	{	"/" OF_SOC "/serial@4600",  		"clock-frequency",  		fdt_set_busfreq  	},  #ifdef CONFIG_TSEC1 -	{	"/" OF_SOC "/ethernet@24000, +	{	"/" OF_SOC "/ethernet@24000",  		"mac-address",  		fdt_set_eth0  	}, -	{	"/" OF_SOC "/ethernet@24000, +	{	"/" OF_SOC "/ethernet@24000",  		"local-mac-address",  		fdt_set_eth0  	},  #endif  #ifdef CONFIG_TSEC2 -	{	"/" OF_SOC "/ethernet@25000, +	{	"/" OF_SOC "/ethernet@25000",  		"mac-address",  		fdt_set_eth1  	}, -	{	"/" OF_SOC "/ethernet@25000, +	{	"/" OF_SOC "/ethernet@25000",  		"local-mac-address",  		fdt_set_eth1  	},  #endif  #ifdef CONFIG_UEC_ETH1  #if CFG_UEC1_UCC_NUM == 0  /* UCC1 */ -	{	"/" OF_QE "/ucc@2000/mac-address", +	{	"/" OF_QE "/ucc@2000",  		"mac-address",  		fdt_set_eth0  	}, -	{	"/" OF_QE "/ucc@2000/mac-address", +	{	"/" OF_QE "/ucc@2000",  		"local-mac-address",  		fdt_set_eth0  	},  #elif CFG_UEC1_UCC_NUM == 2  /* UCC3 */ -	{	"/" OF_QE "/ucc@2200/mac-address", +	{	"/" OF_QE "/ucc@2200",  		"mac-address",  		fdt_set_eth0  	}, -	{	"/" OF_QE "/ucc@2200/mac-address", +	{	"/" OF_QE "/ucc@2200",  		"local-mac-address",  		fdt_set_eth0  	},  #endif -#endif +#endif /* CONFIG_UEC_ETH1 */  #ifdef CONFIG_UEC_ETH2  #if CFG_UEC2_UCC_NUM == 1  /* UCC2 */ -	{	"/" OF_QE "/ucc@3000/mac-address", +	{	"/" OF_QE "/ucc@3000",  		"mac-address",  		fdt_set_eth1  	}, -	{	"/" OF_QE "/ucc@3000/mac-address", +	{	"/" OF_QE "/ucc@3000",  		"local-mac-address",  		fdt_set_eth1  	},  #elif CFG_UEC1_UCC_NUM == 3  /* UCC4 */ -	{	"/" OF_QE "/ucc@3200/mac-address", +	{	"/" OF_QE "/ucc@3200",  		"mac-address",  		fdt_set_eth1  	}, -	{	"/" OF_QE "/ucc@3200/mac-address", +	{	"/" OF_QE "/ucc@3200",  		"local-mac-address",  		fdt_set_eth1  	},  #endif -#endif +#endif /* CONFIG_UEC_ETH2 */  };  void @@ -487,20 +502,23 @@ ft_cpu_setup(void *blob, bd_t *bd)  	int  j;  	for (j = 0; j < (sizeof(fixup_props) / sizeof(fixup_props[0])); j++) { -		nodeoffset = fdt_path_offset(fdt, fixup_props[j].node); +		nodeoffset = fdt_find_node_by_path(blob, fixup_props[j].node);  		if (nodeoffset >= 0) { -			err = (*fixup_props[j].set_fn)(blob, nodeoffset, fixup_props[j].prop, bd); +			err = fixup_props[j].set_fn(blob, nodeoffset, +						    fixup_props[j].prop, bd);  			if (err < 0) -				printf("set_fn/libfdt: %s %s returned %s\n", +				debug("Problem setting %s = %s: %s\n",  					fixup_props[j].node,  					fixup_props[j].prop,  					fdt_strerror(err)); +		} else { +			debug("Couldn't find %s: %s\n", +				fixup_props[j].node, +				fdt_strerror(nodeoffset));  		}  	}  } -#endif - -#if defined(CONFIG_OF_FLAT_TREE) +#elif defined(CONFIG_OF_FLAT_TREE)  void  ft_cpu_setup(void *blob, bd_t *bd)  { |