Subject: Re: [PATCH] fsl_soc: Factor fsl_get_sys_freq() out of the wdt and spi inits.

From: Anton Vorontsov <[email-masked]>
Date: Wed, 16 Apr 2008 01:32:22 +0400

On Tue, Apr 15, 2008 at 01:52:34PM -0500, Scott Wood wrote:
> Signed-off-by: Scott Wood <[email-masked]>
> ---
>  arch/powerpc/sysdev/fsl_soc.c |   70 ++++++++++++++++++----------------------
>  arch/powerpc/sysdev/fsl_soc.h |    1 +
>  2 files changed, 33 insertions(+), 38 deletions(-)
> 
> diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
> index 642e45e..b6d6bda 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;

Um.. can we finally decide on compatible for the soc nodes,
and add there compatible matching from the start?

> +
> +	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,
> diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/fsl_soc.h
> index 63e7db3..74c4a96 100644
> --- a/arch/powerpc/sysdev/fsl_soc.h
> +++ b/arch/powerpc/sysdev/fsl_soc.h
> @@ -7,6 +7,7 @@
>  extern phys_addr_t get_immrbase(void);
>  extern u32 get_brgfreq(void);
>  extern u32 get_baudrate(void);
> +extern u32 fsl_get_sys_freq(void);
>  
>  struct spi_board_info;

-- 
Anton Vorontsov
email: [email-masked]
irc://irc.freenode.net/bd2