[PATCH 1/3] powerpc/85xx: p1022ds: disable the NOR flash node if video is enabled

Kumar Gala kumar.gala at freescale.com
Thu Nov 24 16:12:21 EST 2011


On Nov 18, 2011, at 11:49 AM, Timur Tabi wrote:

> The Freescale P1022 has a unique pin muxing "feature" where the DIU video
> controller's video signals are muxed with 24 of the local bus address signals.
> When the DIU is enabled, the bulk of the local bus is disabled, preventing
> access to memory-mapped devices like NOR flash and the pixis FPGA.
> 
> Therefore, if the DIU is going to be enabled, then memory-mapped devices on
> the localbus, like NOR flash, need to be disabled.
> 
> Signed-off-by: Timur Tabi <timur at freescale.com>
> ---
> arch/powerpc/platforms/85xx/p1022_ds.c |   70 ++++++++++++++++++++++++++++++++
> 1 files changed, 70 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c
> index fda1571..e0280e2 100644
> --- a/arch/powerpc/platforms/85xx/p1022_ds.c
> +++ b/arch/powerpc/platforms/85xx/p1022_ds.c
> @@ -270,6 +270,54 @@ void __init p1022_ds_pic_init(void)
> void __init mpc85xx_smp_init(void);
> #endif
> 
> +#if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE)
> +
> +/*
> + * Disables a node in the device tree.
> + *
> + * This function is called before kmalloc() is available, and it's only called
> + * once, so we instead of allocating the new property object via the bootmem
> + * allocator, we just create a static local variable.
> + */
> +static void __init disable_one_node(struct device_node *np)
> +{
> +	struct property *old;
> +	static struct property new = {
> +		.name = "status",
> +		.value = "disabled",
> +		.length = sizeof("disabled"),
> +	};
> +
> +	old = of_find_property(np, new.name, NULL);
> +	if (old)
> +		prom_update_property(np, &new, old);
> +	else
> +		prom_add_property(np, &new);
> +}
> +
> +/* TRUE if there is a "video=fslfb" command-line parameter. */
> +static bool fslfb;
> +
> +/*
> + * Search for a "video=fslfb" command-line parameter, and set 'fslfb' to
> + * true if we find it.
> + *
> + * We need to use early_param() instead of __setup() because the normal
> + * __setup() gets called to late.  However, early_param() gets called very
> + * early, before the device tree is unflattened, so all we can do now is set a
> + * global variable.  Later on, p1022_ds_setup_arch() will use that variable
> + * to determine if we need to update the device tree.
> + */
> +static int __init early_video_setup(char *options)
> +{
> +	fslfb = (strncmp(options, "fslfb:", 6) == 0);
> +
> +	return 0;
> +}
> +early_param("video", early_video_setup);
> +
> +#endif
> +
> /*
>  * Setup the architecture
>  */
> @@ -307,6 +355,28 @@ static void __init p1022_ds_setup_arch(void)
> 	diu_ops.set_monitor_port	= p1022ds_set_monitor_port;
> 	diu_ops.set_pixel_clock		= p1022ds_set_pixel_clock;
> 	diu_ops.valid_monitor_port	= p1022ds_valid_monitor_port;
> +
> +	/*
> +	 * Delete the NOR flash node if there is video=fslfb... command-line
> +	 * parameter.  When the DIU is active, NOR flash is unavailable, so we
> +	 * have to delete the node before the MTD driver loads.
> +	 */

Fix comment, you aren't deleting the node, your marked it disabled.

> +	if (fslfb) {
> +		struct device_node *np =
> +			of_find_compatible_node(NULL, NULL, "fsl,p1022-elbc");
> +
> +		if (np) {
> +			np = of_find_compatible_node(np, NULL, "cfi-flash");
> +			if (np) {
> +				pr_info("p1022ds: disabling %s node",
> +					np->full_name);
> +				disable_one_node(np);
> +				of_node_put(np);
> +			}
> +		}
> +
> +	}
> +
> #endif
> 
> #ifdef CONFIG_SMP
> -- 
> 1.7.3.4
> 
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev




More information about the Linuxppc-dev mailing list