[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