diff options
Diffstat (limited to 'drivers/gpio/gpio-mockup.c')
-rw-r--r-- | drivers/gpio/gpio-mockup.c | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c index d66b7a768ecd..8269cffc2967 100644 --- a/drivers/gpio/gpio-mockup.c +++ b/drivers/gpio/gpio-mockup.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/irq_sim.h> | 18 | #include <linux/irq_sim.h> |
19 | #include <linux/debugfs.h> | 19 | #include <linux/debugfs.h> |
20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
21 | #include <linux/property.h> | ||
21 | 22 | ||
22 | #include "gpiolib.h" | 23 | #include "gpiolib.h" |
23 | 24 | ||
@@ -28,6 +29,8 @@ | |||
28 | * of GPIO lines. | 29 | * of GPIO lines. |
29 | */ | 30 | */ |
30 | #define GPIO_MOCKUP_MAX_RANGES (GPIO_MOCKUP_MAX_GC * 2) | 31 | #define GPIO_MOCKUP_MAX_RANGES (GPIO_MOCKUP_MAX_GC * 2) |
32 | /* Maximum of three properties + the sentinel. */ | ||
33 | #define GPIO_MOCKUP_MAX_PROP 4 | ||
31 | 34 | ||
32 | #define gpio_mockup_err(...) pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__) | 35 | #define gpio_mockup_err(...) pr_err(GPIO_MOCKUP_NAME ": " __VA_ARGS__) |
33 | 36 | ||
@@ -59,13 +62,6 @@ struct gpio_mockup_dbgfs_private { | |||
59 | int offset; | 62 | int offset; |
60 | }; | 63 | }; |
61 | 64 | ||
62 | struct gpio_mockup_platform_data { | ||
63 | int base; | ||
64 | int ngpio; | ||
65 | int index; | ||
66 | bool named_lines; | ||
67 | }; | ||
68 | |||
69 | static int gpio_mockup_ranges[GPIO_MOCKUP_MAX_RANGES]; | 65 | static int gpio_mockup_ranges[GPIO_MOCKUP_MAX_RANGES]; |
70 | static int gpio_mockup_num_ranges; | 66 | static int gpio_mockup_num_ranges; |
71 | module_param_array(gpio_mockup_ranges, int, &gpio_mockup_num_ranges, 0400); | 67 | module_param_array(gpio_mockup_ranges, int, &gpio_mockup_num_ranges, 0400); |
@@ -255,26 +251,37 @@ static int gpio_mockup_name_lines(struct device *dev, | |||
255 | 251 | ||
256 | static int gpio_mockup_probe(struct platform_device *pdev) | 252 | static int gpio_mockup_probe(struct platform_device *pdev) |
257 | { | 253 | { |
258 | struct gpio_mockup_platform_data *pdata; | ||
259 | struct gpio_mockup_chip *chip; | 254 | struct gpio_mockup_chip *chip; |
260 | struct gpio_chip *gc; | 255 | struct gpio_chip *gc; |
261 | int rv, base, ngpio; | ||
262 | struct device *dev; | 256 | struct device *dev; |
263 | char *name; | 257 | const char *name; |
258 | int rv, base; | ||
259 | u16 ngpio; | ||
264 | 260 | ||
265 | dev = &pdev->dev; | 261 | dev = &pdev->dev; |
266 | pdata = dev_get_platdata(dev); | 262 | |
267 | base = pdata->base; | 263 | rv = device_property_read_u32(dev, "gpio-base", &base); |
268 | ngpio = pdata->ngpio; | 264 | if (rv) |
265 | base = -1; | ||
266 | |||
267 | rv = device_property_read_u16(dev, "nr-gpios", &ngpio); | ||
268 | if (rv) | ||
269 | return rv; | ||
270 | |||
271 | rv = device_property_read_string(dev, "chip-name", &name); | ||
272 | if (rv) | ||
273 | name = NULL; | ||
269 | 274 | ||
270 | chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); | 275 | chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); |
271 | if (!chip) | 276 | if (!chip) |
272 | return -ENOMEM; | 277 | return -ENOMEM; |
273 | 278 | ||
274 | name = devm_kasprintf(dev, GFP_KERNEL, "%s-%c", | 279 | if (!name) { |
275 | pdev->name, pdata->index); | 280 | name = devm_kasprintf(dev, GFP_KERNEL, |
276 | if (!name) | 281 | "%s-%c", pdev->name, pdev->id + 'A'); |
277 | return -ENOMEM; | 282 | if (!name) |
283 | return -ENOMEM; | ||
284 | } | ||
278 | 285 | ||
279 | gc = &chip->gc; | 286 | gc = &chip->gc; |
280 | gc->base = base; | 287 | gc->base = base; |
@@ -295,7 +302,7 @@ static int gpio_mockup_probe(struct platform_device *pdev) | |||
295 | if (!chip->lines) | 302 | if (!chip->lines) |
296 | return -ENOMEM; | 303 | return -ENOMEM; |
297 | 304 | ||
298 | if (pdata->named_lines) { | 305 | if (device_property_read_bool(dev, "named-gpio-lines")) { |
299 | rv = gpio_mockup_name_lines(dev, chip); | 306 | rv = gpio_mockup_name_lines(dev, chip); |
300 | if (rv) | 307 | if (rv) |
301 | return rv; | 308 | return rv; |
@@ -339,9 +346,11 @@ static void gpio_mockup_unregister_pdevs(void) | |||
339 | 346 | ||
340 | static int __init gpio_mockup_init(void) | 347 | static int __init gpio_mockup_init(void) |
341 | { | 348 | { |
342 | int i, num_chips, err = 0, index = 'A'; | 349 | struct property_entry properties[GPIO_MOCKUP_MAX_PROP]; |
343 | struct gpio_mockup_platform_data pdata; | 350 | int i, prop, num_chips, err = 0, base; |
351 | struct platform_device_info pdevinfo; | ||
344 | struct platform_device *pdev; | 352 | struct platform_device *pdev; |
353 | u16 ngpio; | ||
345 | 354 | ||
346 | if ((gpio_mockup_num_ranges < 2) || | 355 | if ((gpio_mockup_num_ranges < 2) || |
347 | (gpio_mockup_num_ranges % 2) || | 356 | (gpio_mockup_num_ranges % 2) || |
@@ -371,17 +380,28 @@ static int __init gpio_mockup_init(void) | |||
371 | } | 380 | } |
372 | 381 | ||
373 | for (i = 0; i < num_chips; i++) { | 382 | for (i = 0; i < num_chips; i++) { |
374 | pdata.index = index++; | 383 | memset(properties, 0, sizeof(properties)); |
375 | pdata.base = gpio_mockup_range_base(i); | 384 | memset(&pdevinfo, 0, sizeof(pdevinfo)); |
376 | pdata.ngpio = pdata.base < 0 | 385 | prop = 0; |
377 | ? gpio_mockup_range_ngpio(i) | 386 | |
378 | : gpio_mockup_range_ngpio(i) - pdata.base; | 387 | base = gpio_mockup_range_base(i); |
379 | pdata.named_lines = gpio_mockup_named_lines; | 388 | if (base >= 0) |
380 | 389 | properties[prop++] = PROPERTY_ENTRY_U32("gpio-base", | |
381 | pdev = platform_device_register_resndata(NULL, | 390 | base); |
382 | GPIO_MOCKUP_NAME, | 391 | |
383 | i, NULL, 0, &pdata, | 392 | ngpio = base < 0 ? gpio_mockup_range_ngpio(i) |
384 | sizeof(pdata)); | 393 | : gpio_mockup_range_ngpio(i) - base; |
394 | properties[prop++] = PROPERTY_ENTRY_U16("nr-gpios", ngpio); | ||
395 | |||
396 | if (gpio_mockup_named_lines) | ||
397 | properties[prop++] = PROPERTY_ENTRY_BOOL( | ||
398 | "named-gpio-lines"); | ||
399 | |||
400 | pdevinfo.name = GPIO_MOCKUP_NAME; | ||
401 | pdevinfo.id = i; | ||
402 | pdevinfo.properties = properties; | ||
403 | |||
404 | pdev = platform_device_register_full(&pdevinfo); | ||
385 | if (IS_ERR(pdev)) { | 405 | if (IS_ERR(pdev)) { |
386 | gpio_mockup_err("error registering device"); | 406 | gpio_mockup_err("error registering device"); |
387 | platform_driver_unregister(&gpio_mockup_driver); | 407 | platform_driver_unregister(&gpio_mockup_driver); |