diff options
| author | Scott Wood <scottwood@freescale.com> | 2008-04-15 13:52:34 -0500 | 
|---|---|---|
| committer | Kumar Gala <galak@kernel.crashing.org> | 2008-04-17 01:01:40 -0500 | 
| commit | 3866409541b1ae87a2e42ee7f483843f1af56917 (patch) | |
| tree | ff1a3f4a8f4d9540a8791db22d5b04bc5b7b1482 /arch/powerpc/sysdev/fsl_soc.c | |
| parent | 9c432797d30ffd10d5510854a0f762dc42903898 (diff) | |
| download | olio-linux-3.10-3866409541b1ae87a2e42ee7f483843f1af56917.tar.xz olio-linux-3.10-3866409541b1ae87a2e42ee7f483843f1af56917.zip  | |
[POWERPC] fsl_soc: Factor fsl_get_sys_freq() out of the wdt and spi inits.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/sysdev/fsl_soc.c')
| -rw-r--r-- | arch/powerpc/sysdev/fsl_soc.c | 70 | 
1 files changed, 32 insertions, 38 deletions
diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c index 642e45e1f16..b6d6bdae95f 100644 --- a/arch/powerpc/sysdev/fsl_soc.c +++ b/arch/powerpc/sysdev/fsl_soc.c @@ -75,6 +75,33 @@ phys_addr_t get_immrbase(void)  EXPORT_SYMBOL(get_immrbase); +static u32 sysfreq = -1; + +u32 fsl_get_sys_freq(void) +{ +	struct device_node *soc; +	const u32 *prop; +	int size; + +	if (sysfreq != -1) +		return sysfreq; + +	soc = of_find_node_by_type(NULL, "soc"); +	if (!soc) +		return -1; + +	prop = of_get_property(soc, "clock-frequency", &size); +	if (!prop || size != sizeof(*prop) || *prop == 0) +		prop = of_get_property(soc, "bus-frequency", &size); + +	if (prop && size == sizeof(*prop)) +		sysfreq = *prop; + +	of_node_put(soc); +	return sysfreq; +} +EXPORT_SYMBOL(fsl_get_sys_freq); +  #if defined(CONFIG_CPM2) || defined(CONFIG_QUICC_ENGINE) || defined(CONFIG_8xx)  static u32 brgfreq = -1; @@ -516,9 +543,9 @@ arch_initcall(fsl_i2c_of_init);  static int __init mpc83xx_wdt_init(void)  {  	struct resource r; -	struct device_node *soc, *np; +	struct device_node *np;  	struct platform_device *dev; -	const unsigned int *freq; +	u32 freq = fsl_get_sys_freq();  	int ret;  	np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt"); @@ -528,19 +555,6 @@ static int __init mpc83xx_wdt_init(void)  		goto nodev;  	} -	soc = of_find_node_by_type(NULL, "soc"); - -	if (!soc) { -		ret = -ENODEV; -		goto nosoc; -	} - -	freq = of_get_property(soc, "bus-frequency", NULL); -	if (!freq) { -		ret = -ENODEV; -		goto err; -	} -  	memset(&r, 0, sizeof(r));  	ret = of_address_to_resource(np, 0, &r); @@ -553,20 +567,16 @@ static int __init mpc83xx_wdt_init(void)  		goto err;  	} -	ret = platform_device_add_data(dev, freq, sizeof(int)); +	ret = platform_device_add_data(dev, &freq, sizeof(freq));  	if (ret)  		goto unreg; -	of_node_put(soc);  	of_node_put(np); -  	return 0;  unreg:  	platform_device_unregister(dev);  err: -	of_node_put(soc); -nosoc:  	of_node_put(np);  nodev:  	return ret; @@ -830,25 +840,9 @@ int __init fsl_spi_init(struct spi_board_info *board_infos,  	sysclk = get_brgfreq();  #endif  	if (sysclk == -1) { -		struct device_node *np; -		const u32 *freq; -		int size; - -		np = of_find_node_by_type(NULL, "soc"); -		if (!np) +		sysclk = fsl_get_sys_freq(); +		if (sysclk == -1)  			return -ENODEV; - -		freq = of_get_property(np, "clock-frequency", &size); -		if (!freq || size != sizeof(*freq) || *freq == 0) { -			freq = of_get_property(np, "bus-frequency", &size); -			if (!freq || size != sizeof(*freq) || *freq == 0) { -				of_node_put(np); -				return -ENODEV; -			} -		} - -		sysclk = *freq; -		of_node_put(np);  	}  	ret = of_fsl_spi_probe(NULL, "fsl,spi", sysclk, board_infos,  |