[PATCH] powerpc/512x: add function for CS parameter configuration
Timur Tabi
timur at tabi.org
Sat Feb 2 15:31:51 EST 2013
On Fri, Feb 1, 2013 at 7:28 AM, Anatolij Gustschin <agust at denx.de> wrote:
> Add ability to configure CS parameters for devices that need
> different CS parameters setup after their configuration. I.e.
> an FPGA device on LP bus can require different CS parameters
> for its bus interface after loading firmware into it. A driver
> can easily reconfigure the LPC CS parameters using this function.
Could you define "CS" somewhere?
> +struct mpc512x_lpc {
> + u32 cs_cfg[8]; /* CS config */
> + u32 cs_ctrl; /* CS Control Register */
> + u32 cs_status; /* CS Status Register */
> + u32 burst_ctrl; /* CS Burst Control Register */
> + u32 deadcycle_ctrl; /* CS Deadcycle Control Register */
> + u32 holdcycle_ctrl; /* CS Holdcycle Control Register */
> + u32 alt; /* Address Latch Timing Register */
> +};
These should be __be32.
> +
> +int mpc512x_cs_config(int cs, u32 val);
> +
> #endif /* __ASM_POWERPC_MPC5121_H__ */
> diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c
> index c344438..112b4f6 100644
> --- a/arch/powerpc/platforms/512x/mpc512x_shared.c
> +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c
> @@ -436,3 +436,33 @@ void __init mpc512x_init(void)
> mpc512x_restart_init();
> mpc512x_psc_fifo_init();
> }
> +
> +/**
> + * mpc512x_cs_config - Setup chip select configuration
> + * @cs: chip select number
> + * @val: chip select configuration value
> + *
> + * Perform chip select configuration for devices on LocalPlus Bus.
> + * Intended to dynamically reconfigure the chip select parameters
> + * for configurable devices on the bus.
> + */
> +int mpc512x_cs_config(int cs, u32 val)
> +{
> + static struct mpc512x_lpc __iomem *lpc;
> + struct device_node *np;
> +
> + if (cs < 0 || cs > 7)
> + return -EINVAL;
If you make cs an unsigned int, you won't need to test for < 0.
> +
> + if (!lpc) {
> + np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-lpc");
> + lpc = of_iomap(np, 0);
> + of_node_put(np);
> + if (!lpc)
> + return -ENOMEM;
> + }
> +
> + out_be32(&lpc->cs_cfg[cs], val);
You forgot the iounmap() if lpc == NULL.
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(mpc512x_cs_config);
EXPORT_SYMBOL, please, to match the rest of the Freescale platforms.
--
Timur Tabi
Linux kernel developer at Freescale
More information about the Linuxppc-dev
mailing list