diff options
Diffstat (limited to 'drivers/pinctrl/core.c')
-rw-r--r-- | drivers/pinctrl/core.c | 42 |
1 files changed, 11 insertions, 31 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 034b1ad38b32..160fb5aae591 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -34,12 +34,6 @@ | |||
34 | static DEFINE_MUTEX(pinctrldev_list_mutex); | 34 | static DEFINE_MUTEX(pinctrldev_list_mutex); |
35 | static LIST_HEAD(pinctrldev_list); | 35 | static LIST_HEAD(pinctrldev_list); |
36 | 36 | ||
37 | static void pinctrl_dev_release(struct device *dev) | ||
38 | { | ||
39 | struct pinctrl_dev *pctldev = dev_get_drvdata(dev); | ||
40 | kfree(pctldev); | ||
41 | } | ||
42 | |||
43 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) | 37 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) |
44 | { | 38 | { |
45 | /* We're not allowed to register devices without name */ | 39 | /* We're not allowed to register devices without name */ |
@@ -71,14 +65,14 @@ struct pinctrl_dev *get_pinctrl_dev_from_dev(struct device *dev, | |||
71 | 65 | ||
72 | mutex_lock(&pinctrldev_list_mutex); | 66 | mutex_lock(&pinctrldev_list_mutex); |
73 | list_for_each_entry(pctldev, &pinctrldev_list, node) { | 67 | list_for_each_entry(pctldev, &pinctrldev_list, node) { |
74 | if (dev && &pctldev->dev == dev) { | 68 | if (dev && pctldev->dev == dev) { |
75 | /* Matched on device pointer */ | 69 | /* Matched on device pointer */ |
76 | found = true; | 70 | found = true; |
77 | break; | 71 | break; |
78 | } | 72 | } |
79 | 73 | ||
80 | if (devname && | 74 | if (devname && |
81 | !strcmp(dev_name(&pctldev->dev), devname)) { | 75 | !strcmp(dev_name(pctldev->dev), devname)) { |
82 | /* Matched on device name */ | 76 | /* Matched on device name */ |
83 | found = true; | 77 | found = true; |
84 | break; | 78 | break; |
@@ -325,7 +319,7 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, | |||
325 | const char *gname = pctlops->get_group_name(pctldev, | 319 | const char *gname = pctlops->get_group_name(pctldev, |
326 | group_selector); | 320 | group_selector); |
327 | if (!strcmp(gname, pin_group)) { | 321 | if (!strcmp(gname, pin_group)) { |
328 | dev_dbg(&pctldev->dev, | 322 | dev_dbg(pctldev->dev, |
329 | "found group selector %u for %s\n", | 323 | "found group selector %u for %s\n", |
330 | group_selector, | 324 | group_selector, |
331 | pin_group); | 325 | pin_group); |
@@ -335,7 +329,7 @@ int pinctrl_get_group_selector(struct pinctrl_dev *pctldev, | |||
335 | group_selector++; | 329 | group_selector++; |
336 | } | 330 | } |
337 | 331 | ||
338 | dev_err(&pctldev->dev, "does not have pin group %s\n", | 332 | dev_err(pctldev->dev, "does not have pin group %s\n", |
339 | pin_group); | 333 | pin_group); |
340 | 334 | ||
341 | return -EINVAL; | 335 | return -EINVAL; |
@@ -508,11 +502,11 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev) | |||
508 | { | 502 | { |
509 | static struct dentry *device_root; | 503 | static struct dentry *device_root; |
510 | 504 | ||
511 | device_root = debugfs_create_dir(dev_name(&pctldev->dev), | 505 | device_root = debugfs_create_dir(dev_name(pctldev->dev), |
512 | debugfs_root); | 506 | debugfs_root); |
513 | if (IS_ERR(device_root) || !device_root) { | 507 | if (IS_ERR(device_root) || !device_root) { |
514 | pr_warn("failed to create debugfs directory for %s\n", | 508 | pr_warn("failed to create debugfs directory for %s\n", |
515 | dev_name(&pctldev->dev)); | 509 | dev_name(pctldev->dev)); |
516 | return; | 510 | return; |
517 | } | 511 | } |
518 | debugfs_create_file("pins", S_IFREG | S_IRUGO, | 512 | debugfs_create_file("pins", S_IFREG | S_IRUGO, |
@@ -560,7 +554,6 @@ static void pinctrl_init_debugfs(void) | |||
560 | struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | 554 | struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, |
561 | struct device *dev, void *driver_data) | 555 | struct device *dev, void *driver_data) |
562 | { | 556 | { |
563 | static atomic_t pinmux_no = ATOMIC_INIT(0); | ||
564 | struct pinctrl_dev *pctldev; | 557 | struct pinctrl_dev *pctldev; |
565 | int ret; | 558 | int ret; |
566 | 559 | ||
@@ -601,18 +594,7 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
601 | spin_lock_init(&pctldev->pin_desc_tree_lock); | 594 | spin_lock_init(&pctldev->pin_desc_tree_lock); |
602 | INIT_LIST_HEAD(&pctldev->gpio_ranges); | 595 | INIT_LIST_HEAD(&pctldev->gpio_ranges); |
603 | mutex_init(&pctldev->gpio_ranges_lock); | 596 | mutex_init(&pctldev->gpio_ranges_lock); |
604 | 597 | pctldev->dev = dev; | |
605 | /* Register device */ | ||
606 | pctldev->dev.parent = dev; | ||
607 | dev_set_name(&pctldev->dev, "pinctrl.%d", | ||
608 | atomic_inc_return(&pinmux_no) - 1); | ||
609 | pctldev->dev.release = pinctrl_dev_release; | ||
610 | ret = device_register(&pctldev->dev); | ||
611 | if (ret != 0) { | ||
612 | pr_err("error in device registration\n"); | ||
613 | goto out_reg_dev_err; | ||
614 | } | ||
615 | dev_set_drvdata(&pctldev->dev, pctldev); | ||
616 | 598 | ||
617 | /* Register all the pins */ | 599 | /* Register all the pins */ |
618 | pr_debug("try to register %d pins on %s...\n", | 600 | pr_debug("try to register %d pins on %s...\n", |
@@ -622,7 +604,7 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
622 | pr_err("error during pin registration\n"); | 604 | pr_err("error during pin registration\n"); |
623 | pinctrl_free_pindescs(pctldev, pctldesc->pins, | 605 | pinctrl_free_pindescs(pctldev, pctldesc->pins, |
624 | pctldesc->npins); | 606 | pctldesc->npins); |
625 | goto out_reg_pins_err; | 607 | goto out_err; |
626 | } | 608 | } |
627 | 609 | ||
628 | pinctrl_init_device_debugfs(pctldev); | 610 | pinctrl_init_device_debugfs(pctldev); |
@@ -632,10 +614,8 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, | |||
632 | pinmux_hog_maps(pctldev); | 614 | pinmux_hog_maps(pctldev); |
633 | return pctldev; | 615 | return pctldev; |
634 | 616 | ||
635 | out_reg_pins_err: | 617 | out_err: |
636 | device_del(&pctldev->dev); | 618 | kfree(pctldev); |
637 | out_reg_dev_err: | ||
638 | put_device(&pctldev->dev); | ||
639 | return NULL; | 619 | return NULL; |
640 | } | 620 | } |
641 | EXPORT_SYMBOL_GPL(pinctrl_register); | 621 | EXPORT_SYMBOL_GPL(pinctrl_register); |
@@ -659,7 +639,7 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev) | |||
659 | /* Destroy descriptor tree */ | 639 | /* Destroy descriptor tree */ |
660 | pinctrl_free_pindescs(pctldev, pctldev->desc->pins, | 640 | pinctrl_free_pindescs(pctldev, pctldev->desc->pins, |
661 | pctldev->desc->npins); | 641 | pctldev->desc->npins); |
662 | device_unregister(&pctldev->dev); | 642 | kfree(pctldev); |
663 | } | 643 | } |
664 | EXPORT_SYMBOL_GPL(pinctrl_unregister); | 644 | EXPORT_SYMBOL_GPL(pinctrl_unregister); |
665 | 645 | ||