aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/core.c')
-rw-r--r--drivers/pinctrl/core.c42
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 @@
34static DEFINE_MUTEX(pinctrldev_list_mutex); 34static DEFINE_MUTEX(pinctrldev_list_mutex);
35static LIST_HEAD(pinctrldev_list); 35static LIST_HEAD(pinctrldev_list);
36 36
37static void pinctrl_dev_release(struct device *dev)
38{
39 struct pinctrl_dev *pctldev = dev_get_drvdata(dev);
40 kfree(pctldev);
41}
42
43const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) 37const 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)
560struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, 554struct 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
635out_reg_pins_err: 617out_err:
636 device_del(&pctldev->dev); 618 kfree(pctldev);
637out_reg_dev_err:
638 put_device(&pctldev->dev);
639 return NULL; 619 return NULL;
640} 620}
641EXPORT_SYMBOL_GPL(pinctrl_register); 621EXPORT_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}
664EXPORT_SYMBOL_GPL(pinctrl_unregister); 644EXPORT_SYMBOL_GPL(pinctrl_unregister);
665 645