+ linux-mtd

On Tue, Oct 21, 2014 at 07:03:23PM +0100, Rob Ward wrote:
> From 9ddd010f1e2bf4fdfac5a7627c5de821a2dcd8f5 Mon Sep 17 00:00:00 2001
> From: Rob Ward <robert.ward...@googlemail.com>
> Date: Tue, 21 Oct 2014 17:46:53 +0100
> Subject: [PATCH] mtd: phram: Allow multiple phram devices on cmd line
> 
> Allow the phram module the ability to create multiple phram mtd
> devices via the kernel command line.
> 
> Currently the phram module only allows a single mtd device to be
> created via the kernel command line. This is due to the phram
> module having to store the values until it is initialised
> later. This storage is done using a single char[] meaning when
> the module_param_call is made the previous value is overidden.
> 
> This change modifies the phram system to use a char[][] allowing
> multiple devices to be created.
> 
> The array currently allows up to 64 devices to be created via the
> kernel command line.
> 
> If the array is full a message is printed to the console and the
> module_param_call returns.
> 
> To test, in all cases an area of memory needs to be reserved via
> the command line e.g. memmap=10M$114M
> 
> To test with phram build into the kernel on the command line add
> the following:
> 
> phram.phram=alpha,114Mi,1Mi phram.phram=beta,115Mi,1Mi
> 
> To test phram built as a module insmod with the following arguments:
> 
> phram=gamma,114Mi,1Mi phram=delta,115Mi,1Mi
> 
> In both cases two mtd devices should be created.
> 
> Signed-off-by: Rob Ward <robert.ward...@googlemail.com>
> ---
>  drivers/mtd/devices/phram.c | 41 ++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 36 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c
> index effd9a4..bd409be 100644
> --- a/drivers/mtd/devices/phram.c
> +++ b/drivers/mtd/devices/phram.c
> @@ -214,7 +214,7 @@ static int phram_init_called;
>   * size.
>   * Example: phram.phram=rootfs,0xa0000000,512Mi
>   */
> -static char phram_paramline[64 + 20 + 20];
> +static char phram_paramline[64][64 + 20 + 20];
>  #endif
>  
>  static int phram_setup(const char *val)
> @@ -271,6 +271,9 @@ static int phram_param_call(const char *val, struct 
> kernel_param *kp)
>  #ifdef MODULE
>       return phram_setup(val);
>  #else
> +     int paramline_it = 0;
> +     int arraysize = 0;
> +
>       /*
>        * If more parameters are later passed in via
>        * /sys/module/phram/parameters/phram
> @@ -290,9 +293,27 @@ static int phram_param_call(const char *val, struct 
> kernel_param *kp)
>        * phram_setup().
>        */
>  
> -     if (strlen(val) >= sizeof(phram_paramline))
> +     if (strlen(val) >= sizeof(phram_paramline[0]))
>               return -ENOSPC;
> -     strcpy(phram_paramline, val);
> +
> +     arraysize = sizeof(phram_paramline)/sizeof(phram_paramline[0]);
> +
> +     /*
> +      * Check if any space is left in the array. If no space
> +      * is left then print warning and return 0
> +      */
> +
> +     if (phram_paramline[arraysize - 1][0]) {
> +             pr_warn("exceeded limit via cmd_line - %s ignored", val);
> +             return 0;
> +     }
> +
> +     for (paramline_it = 0; paramline_it <= arraysize; paramline_it++) {
> +             if (!phram_paramline[paramline_it][0]) {
> +                     strcpy(phram_paramline[paramline_it], val);
> +                     break;
> +             }
> +     }
>  
>       return 0;
>  #endif
> @@ -307,8 +328,18 @@ static int __init init_phram(void)
>       int ret = 0;
>  
>  #ifndef MODULE
> -     if (phram_paramline[0])
> -             ret = phram_setup(phram_paramline);
> +     int arraysize = 0;
> +     int paramline_it = 0;
> +
> +     arraysize = sizeof(phram_paramline)/sizeof(phram_paramline[0]);
> +
> +     for (paramline_it = 0; paramline_it <= arraysize; paramline_it++) {
> +             if (phram_paramline[paramline_it][0]) {
> +                     ret = phram_setup(phram_paramline[paramline_it]);
> +                     if (ret)
> +                             break;
> +             }
> +     }
>       phram_init_called = 1;
>  #endif
>  
> -- 
> 2.0.2
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to