diff options
Diffstat (limited to 'drivers/pinctrl/core.c')
| -rw-r--r-- | drivers/pinctrl/core.c | 50 | 
1 files changed, 31 insertions, 19 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 569bdb3ef10..8fe15cf15ac 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -510,10 +510,12 @@ static struct dentry *debugfs_root;  static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)  { -	static struct dentry *device_root; +	struct dentry *device_root;  	device_root = debugfs_create_dir(dev_name(pctldev->dev),  					 debugfs_root); +	pctldev->device_root = device_root; +  	if (IS_ERR(device_root) || !device_root) {  		pr_warn("failed to create debugfs directory for %s\n",  			dev_name(pctldev->dev)); @@ -529,6 +531,11 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)  	pinconf_init_device_debugfs(device_root, pctldev);  } +static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) +{ +	debugfs_remove_recursive(pctldev->device_root); +} +  static void pinctrl_init_debugfs(void)  {  	debugfs_root = debugfs_create_dir("pinctrl", NULL); @@ -553,6 +560,10 @@ static void pinctrl_init_debugfs(void)  {  } +static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) +{ +} +  #endif  /** @@ -572,40 +583,40 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,  	if (pctldesc->name == NULL)  		return NULL; +	pctldev = kzalloc(sizeof(struct pinctrl_dev), GFP_KERNEL); +	if (pctldev == NULL) +		return NULL; + +	/* Initialize pin control device struct */ +	pctldev->owner = pctldesc->owner; +	pctldev->desc = pctldesc; +	pctldev->driver_data = driver_data; +	INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); +	spin_lock_init(&pctldev->pin_desc_tree_lock); +	INIT_LIST_HEAD(&pctldev->gpio_ranges); +	mutex_init(&pctldev->gpio_ranges_lock); +	pctldev->dev = dev; +  	/* If we're implementing pinmuxing, check the ops for sanity */  	if (pctldesc->pmxops) { -		ret = pinmux_check_ops(pctldesc->pmxops); +		ret = pinmux_check_ops(pctldev);  		if (ret) {  			pr_err("%s pinmux ops lacks necessary functions\n",  			       pctldesc->name); -			return NULL; +			goto out_err;  		}  	}  	/* If we're implementing pinconfig, check the ops for sanity */  	if (pctldesc->confops) { -		ret = pinconf_check_ops(pctldesc->confops); +		ret = pinconf_check_ops(pctldev);  		if (ret) {  			pr_err("%s pin config ops lacks necessary functions\n",  			       pctldesc->name); -			return NULL; +			goto out_err;  		}  	} -	pctldev = kzalloc(sizeof(struct pinctrl_dev), GFP_KERNEL); -	if (pctldev == NULL) -		return NULL; - -	/* Initialize pin control device struct */ -	pctldev->owner = pctldesc->owner; -	pctldev->desc = pctldesc; -	pctldev->driver_data = driver_data; -	INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL); -	spin_lock_init(&pctldev->pin_desc_tree_lock); -	INIT_LIST_HEAD(&pctldev->gpio_ranges); -	mutex_init(&pctldev->gpio_ranges_lock); -	pctldev->dev = dev; -  	/* Register all the pins */  	pr_debug("try to register %d pins on %s...\n",  		 pctldesc->npins, pctldesc->name); @@ -641,6 +652,7 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)  	if (pctldev == NULL)  		return; +	pinctrl_remove_device_debugfs(pctldev);  	pinmux_unhog_maps(pctldev);  	/* TODO: check that no pinmuxes are still active? */  	mutex_lock(&pinctrldev_list_mutex);  |