|  | /* | 
|  | * Copyright 2010 Tilera Corporation. All Rights Reserved. | 
|  | * | 
|  | *   This program is free software; you can redistribute it and/or | 
|  | *   modify it under the terms of the GNU General Public License | 
|  | *   as published by the Free Software Foundation, version 2. | 
|  | * | 
|  | *   This program is distributed in the hope that it will be useful, but | 
|  | *   WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | 
|  | *   NON INFRINGEMENT.  See the GNU General Public License for | 
|  | *   more details. | 
|  | */ | 
|  |  | 
|  | #include <linux/cpumask.h> | 
|  | #include <linux/ctype.h> | 
|  | #include <linux/errno.h> | 
|  | #include <linux/smp.h> | 
|  |  | 
|  | /* | 
|  | * Allow cropping out bits beyond the end of the array. | 
|  | * Move to "lib" directory if more clients want to use this routine. | 
|  | */ | 
|  | int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits) | 
|  | { | 
|  | unsigned a, b; | 
|  |  | 
|  | bitmap_zero(maskp, nmaskbits); | 
|  | do { | 
|  | if (!isdigit(*bp)) | 
|  | return -EINVAL; | 
|  | a = simple_strtoul(bp, (char **)&bp, 10); | 
|  | b = a; | 
|  | if (*bp == '-') { | 
|  | bp++; | 
|  | if (!isdigit(*bp)) | 
|  | return -EINVAL; | 
|  | b = simple_strtoul(bp, (char **)&bp, 10); | 
|  | } | 
|  | if (!(a <= b)) | 
|  | return -EINVAL; | 
|  | if (b >= nmaskbits) | 
|  | b = nmaskbits-1; | 
|  | while (a <= b) { | 
|  | set_bit(a, maskp); | 
|  | a++; | 
|  | } | 
|  | if (*bp == ',') | 
|  | bp++; | 
|  | } while (*bp != '\0' && *bp != '\n'); | 
|  | return 0; | 
|  | } |