summaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-mockup.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-mockup.c')
-rw-r--r--drivers/gpio/gpio-mockup.c82
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
62struct gpio_mockup_platform_data {
63 int base;
64 int ngpio;
65 int index;
66 bool named_lines;
67};
68
69static int gpio_mockup_ranges[GPIO_MOCKUP_MAX_RANGES]; 65static int gpio_mockup_ranges[GPIO_MOCKUP_MAX_RANGES];
70static int gpio_mockup_num_ranges; 66static int gpio_mockup_num_ranges;
71module_param_array(gpio_mockup_ranges, int, &gpio_mockup_num_ranges, 0400); 67module_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
256static int gpio_mockup_probe(struct platform_device *pdev) 252static 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
340static int __init gpio_mockup_init(void) 347static 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);