Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: core: Use delayed work for hogs

Having the pin control framework call pin controller functions
before it's probe has finished is not nice as the pin controller
device driver does not yet have struct pinctrl_dev handle.

Let's fix this issue by adding deferred work for late init. This is
needed to be able to add pinctrl generic helper functions that expect
to know struct pinctrl_dev handle. Note that we now need to call
create_pinctrl() directly as we don't want to add the pin controller
to the list of controllers until the hogs are claimed. We also need
to pass the pinctrl_dev to the device tree parser functions as they
otherwise won't find the right controller at this point.

Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Tony Lindgren and committed by
Linus Walleij
99e4f675 a51c158b

+93 -39
+58 -32
drivers/pinctrl/core.c
··· 720 720 return state; 721 721 } 722 722 723 - static int add_setting(struct pinctrl *p, struct pinctrl_map const *map) 723 + static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev, 724 + struct pinctrl_map const *map) 724 725 { 725 726 struct pinctrl_state *state; 726 727 struct pinctrl_setting *setting; ··· 745 744 746 745 setting->type = map->type; 747 746 748 - setting->pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name); 747 + if (pctldev) 748 + setting->pctldev = pctldev; 749 + else 750 + setting->pctldev = 751 + get_pinctrl_dev_from_devname(map->ctrl_dev_name); 749 752 if (setting->pctldev == NULL) { 750 753 kfree(setting); 751 754 /* Do not defer probing of hogs (circular loop) */ ··· 805 800 806 801 static void pinctrl_free(struct pinctrl *p, bool inlist); 807 802 808 - static struct pinctrl *create_pinctrl(struct device *dev) 803 + static struct pinctrl *create_pinctrl(struct device *dev, 804 + struct pinctrl_dev *pctldev) 809 805 { 810 806 struct pinctrl *p; 811 807 const char *devname; ··· 829 823 INIT_LIST_HEAD(&p->states); 830 824 INIT_LIST_HEAD(&p->dt_maps); 831 825 832 - ret = pinctrl_dt_to_map(p); 826 + ret = pinctrl_dt_to_map(p, pctldev); 833 827 if (ret < 0) { 834 828 kfree(p); 835 829 return ERR_PTR(ret); ··· 844 838 if (strcmp(map->dev_name, devname)) 845 839 continue; 846 840 847 - ret = add_setting(p, map); 841 + ret = add_setting(p, pctldev, map); 848 842 /* 849 843 * At this point the adding of a setting may: 850 844 * ··· 905 899 return p; 906 900 } 907 901 908 - return create_pinctrl(dev); 902 + return create_pinctrl(dev, NULL); 909 903 } 910 904 EXPORT_SYMBOL_GPL(pinctrl_get); 911 905 ··· 1744 1738 } 1745 1739 1746 1740 /** 1741 + * pinctrl_late_init() - finish pin controller device registration 1742 + * @work: work struct 1743 + */ 1744 + static void pinctrl_late_init(struct work_struct *work) 1745 + { 1746 + struct pinctrl_dev *pctldev; 1747 + 1748 + pctldev = container_of(work, struct pinctrl_dev, late_init.work); 1749 + 1750 + pctldev->p = create_pinctrl(pctldev->dev, pctldev); 1751 + if (!IS_ERR(pctldev->p)) { 1752 + kref_get(&pctldev->p->users); 1753 + pctldev->hog_default = 1754 + pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); 1755 + if (IS_ERR(pctldev->hog_default)) { 1756 + dev_dbg(pctldev->dev, 1757 + "failed to lookup the default state\n"); 1758 + } else { 1759 + if (pinctrl_select_state(pctldev->p, 1760 + pctldev->hog_default)) 1761 + dev_err(pctldev->dev, 1762 + "failed to select default state\n"); 1763 + } 1764 + 1765 + pctldev->hog_sleep = 1766 + pinctrl_lookup_state(pctldev->p, 1767 + PINCTRL_STATE_SLEEP); 1768 + if (IS_ERR(pctldev->hog_sleep)) 1769 + dev_dbg(pctldev->dev, 1770 + "failed to lookup the sleep state\n"); 1771 + } 1772 + 1773 + mutex_lock(&pinctrldev_list_mutex); 1774 + list_add_tail(&pctldev->node, &pinctrldev_list); 1775 + mutex_unlock(&pinctrldev_list_mutex); 1776 + 1777 + pinctrl_init_device_debugfs(pctldev); 1778 + } 1779 + 1780 + /** 1747 1781 * pinctrl_register() - register a pin controller device 1748 1782 * @pctldesc: descriptor for this pin controller 1749 1783 * @dev: parent device for this pin controller ··· 1812 1766 pctldev->driver_data = driver_data; 1813 1767 INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); 1814 1768 INIT_LIST_HEAD(&pctldev->gpio_ranges); 1769 + INIT_DELAYED_WORK(&pctldev->late_init, pinctrl_late_init); 1815 1770 pctldev->dev = dev; 1816 1771 mutex_init(&pctldev->mutex); 1817 1772 ··· 1847 1800 goto out_err; 1848 1801 } 1849 1802 1850 - mutex_lock(&pinctrldev_list_mutex); 1851 - list_add_tail(&pctldev->node, &pinctrldev_list); 1852 - mutex_unlock(&pinctrldev_list_mutex); 1853 - 1854 - pctldev->p = pinctrl_get(pctldev->dev); 1855 - 1856 - if (!IS_ERR(pctldev->p)) { 1857 - pctldev->hog_default = 1858 - pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT); 1859 - if (IS_ERR(pctldev->hog_default)) { 1860 - dev_dbg(dev, "failed to lookup the default state\n"); 1861 - } else { 1862 - if (pinctrl_select_state(pctldev->p, 1863 - pctldev->hog_default)) 1864 - dev_err(dev, 1865 - "failed to select default state\n"); 1866 - } 1867 - 1868 - pctldev->hog_sleep = 1869 - pinctrl_lookup_state(pctldev->p, 1870 - PINCTRL_STATE_SLEEP); 1871 - if (IS_ERR(pctldev->hog_sleep)) 1872 - dev_dbg(dev, "failed to lookup the sleep state\n"); 1873 - } 1874 - 1875 - pinctrl_init_device_debugfs(pctldev); 1803 + if (pinctrl_dt_has_hogs(pctldev)) 1804 + schedule_delayed_work(&pctldev->late_init, 0); 1805 + else 1806 + pinctrl_late_init(&pctldev->late_init.work); 1876 1807 1877 1808 return pctldev; 1878 1809 ··· 1873 1848 if (pctldev == NULL) 1874 1849 return; 1875 1850 1851 + cancel_delayed_work_sync(&pctldev->late_init); 1876 1852 mutex_lock(&pctldev->mutex); 1877 1853 pinctrl_remove_device_debugfs(pctldev); 1878 1854 mutex_unlock(&pctldev->mutex);
+2
drivers/pinctrl/core.h
··· 33 33 * @p: result of pinctrl_get() for this device 34 34 * @hog_default: default state for pins hogged by this device 35 35 * @hog_sleep: sleep state for pins hogged by this device 36 + * @late_init: delayed work for pin controller to finish registration 36 37 * @mutex: mutex taken on each pin controller specific action 37 38 * @device_root: debugfs root for this device 38 39 */ ··· 48 47 struct pinctrl *p; 49 48 struct pinctrl_state *hog_default; 50 49 struct pinctrl_state *hog_sleep; 50 + struct delayed_work late_init; 51 51 struct mutex mutex; 52 52 #ifdef CONFIG_DEBUG_FS 53 53 struct dentry *device_root;
+23 -5
drivers/pinctrl/devicetree.c
··· 100 100 return get_pinctrl_dev_from_of_node(np); 101 101 } 102 102 103 - static int dt_to_map_one_config(struct pinctrl *p, const char *statename, 103 + static int dt_to_map_one_config(struct pinctrl *p, 104 + struct pinctrl_dev *pctldev, 105 + const char *statename, 104 106 struct device_node *np_config) 105 107 { 106 108 struct device_node *np_pctldev; 107 - struct pinctrl_dev *pctldev; 108 109 const struct pinctrl_ops *ops; 109 110 int ret; 110 111 struct pinctrl_map *map; ··· 122 121 /* OK let's just assume this will appear later then */ 123 122 return -EPROBE_DEFER; 124 123 } 125 - pctldev = get_pinctrl_dev_from_of_node(np_pctldev); 124 + if (!pctldev) 125 + pctldev = get_pinctrl_dev_from_of_node(np_pctldev); 126 126 if (pctldev) 127 127 break; 128 128 /* Do not defer probing of hogs (circular loop) */ ··· 168 166 return dt_remember_or_free_map(p, statename, NULL, map, 1); 169 167 } 170 168 171 - int pinctrl_dt_to_map(struct pinctrl *p) 169 + bool pinctrl_dt_has_hogs(struct pinctrl_dev *pctldev) 170 + { 171 + struct device_node *np; 172 + struct property *prop; 173 + int size; 174 + 175 + np = pctldev->dev->of_node; 176 + if (!np) 177 + return false; 178 + 179 + prop = of_find_property(np, "pinctrl-0", &size); 180 + 181 + return prop ? true : false; 182 + } 183 + 184 + int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev) 172 185 { 173 186 struct device_node *np = p->dev->of_node; 174 187 int state, ret; ··· 250 233 } 251 234 252 235 /* Parse the node */ 253 - ret = dt_to_map_one_config(p, statename, np_config); 236 + ret = dt_to_map_one_config(p, pctldev, statename, 237 + np_config); 254 238 of_node_put(np_config); 255 239 if (ret < 0) 256 240 goto err;
+10 -2
drivers/pinctrl/devicetree.h
··· 20 20 21 21 #ifdef CONFIG_OF 22 22 23 + bool pinctrl_dt_has_hogs(struct pinctrl_dev *pctldev); 24 + 23 25 void pinctrl_dt_free_maps(struct pinctrl *p); 24 - int pinctrl_dt_to_map(struct pinctrl *p); 26 + int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev); 25 27 26 28 int pinctrl_count_index_with_args(const struct device_node *np, 27 29 const char *list_name); ··· 34 32 35 33 #else 36 34 37 - static inline int pinctrl_dt_to_map(struct pinctrl *p) 35 + static inline bool pinctrl_dt_has_hogs(struct pinctrl_dev *pctldev) 36 + { 37 + return false; 38 + } 39 + 40 + static inline int pinctrl_dt_to_map(struct pinctrl *p, 41 + struct pinctrl_dev *pctldev) 38 42 { 39 43 return 0; 40 44 }