summaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-mockup.c
diff options
context:
space:
mode:
authorBartosz Golaszewski <brgl@bgdev.pl>2018-09-25 07:29:46 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-10-03 03:53:16 -0400
commit3ea47b447da0b8e93735612f2b0d128dba4d7524 (patch)
treef56b115dcfa4201299990050bc8a5304da764585 /drivers/gpio/gpio-mockup.c
parent90fd227029a25b452fd39dec6d557212d03d79b1 (diff)
gpio: mockup: use device properties instead of platform_data
Some users want to introduce device tree support to the mockup driver. Let's make it easier by switching to using generic device properties. The driver stays compatible with previous use cases and after this conversion there'll be no need to change the way probing of mockup GPIO chips works. Tested with libgpiod test suite. Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
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);