2016-08-26 20:19 GMT+08:00 Jun Nie <jun.nie@xxxxxxxxxx>: > Some pin functions may be controlled in 2nd level multiplex. > We need configure 1st level multiplex when request such > functions. Export pin_request functionality so that parent > can be configured automatically with calling it in > pinmux_ops->request(). > > Signed-off-by: Jun Nie <jun.nie@xxxxxxxxxx> > --- > drivers/pinctrl/core.c | 20 ++++++++++++++++++++ > drivers/pinctrl/pinmux.c | 3 ++- > drivers/pinctrl/pinmux.h | 9 +++++++++ > include/linux/pinctrl/pinctrl.h | 2 ++ > 4 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c > index fb38e20..0782a93 100644 > --- a/drivers/pinctrl/core.c > +++ b/drivers/pinctrl/core.c > @@ -688,6 +688,26 @@ int pinctrl_gpio_direction_output(unsigned gpio) > } > EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_output); > > +/** > + * pinctrl_request_pin() - request a single pin to be used > + * @offset: the pin number from pinctrl dev pin number space > + */ > +int pinctrl_request_pin(struct pinctrl_dev *pctldev, > + int offset, const char *owner) > +{ > + int ret; > + > + mutex_lock(&pctldev->mutex); > + > + ret = pin_request(pctldev, offset, owner, NULL); > + > + mutex_unlock(&pctldev->mutex); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(pinctrl_request_pin); > + > + > static struct pinctrl_state *find_state(struct pinctrl *p, > const char *name) > { > diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c > index ece7028..b18c1f0 100644 > --- a/drivers/pinctrl/pinmux.c > +++ b/drivers/pinctrl/pinmux.c > @@ -80,7 +80,7 @@ int pinmux_validate_map(struct pinctrl_map const *map, int i) > * @gpio_range: the range matching the GPIO pin if this is a request for a > * single GPIO pin > */ > -static int pin_request(struct pinctrl_dev *pctldev, > +int pin_request(struct pinctrl_dev *pctldev, > int pin, const char *owner, > struct pinctrl_gpio_range *gpio_range) > { > @@ -180,6 +180,7 @@ out: > > return status; > } > +EXPORT_SYMBOL(pin_request); > > /** > * pin_free() - release a single muxed in pin so something else can be muxed > diff --git a/drivers/pinctrl/pinmux.h b/drivers/pinctrl/pinmux.h > index d1a98b1c..6ff9baf 100644 > --- a/drivers/pinctrl/pinmux.h > +++ b/drivers/pinctrl/pinmux.h > @@ -30,6 +30,9 @@ int pinmux_map_to_setting(struct pinctrl_map const *map, > void pinmux_free_setting(struct pinctrl_setting const *setting); > int pinmux_enable_setting(struct pinctrl_setting const *setting); > void pinmux_disable_setting(struct pinctrl_setting const *setting); > +int pin_request(struct pinctrl_dev *pctldev, > + int pin, const char *owner, > + struct pinctrl_gpio_range *gpio_range); > > #else > > @@ -83,6 +86,12 @@ static inline void pinmux_disable_setting( > { > } > > +int pin_request(struct pinctrl_dev *pctldev, > + int pin, const char *owner, > + struct pinctrl_gpio_range *gpio_range) > +{ > +} > + > #endif > > #if defined(CONFIG_PINMUX) && defined(CONFIG_DEBUG_FS) > diff --git a/include/linux/pinctrl/pinctrl.h b/include/linux/pinctrl/pinctrl.h > index a42e57d..13bb7a1 100644 > --- a/include/linux/pinctrl/pinctrl.h > +++ b/include/linux/pinctrl/pinctrl.h > @@ -167,6 +167,8 @@ pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, > extern int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, > const char *pin_group, const unsigned **pins, > unsigned *num_pins); > +extern int pinctrl_request_pin(struct pinctrl_dev *pctldev, > + int offset, const char *owner); > > #ifdef CONFIG_OF > extern struct pinctrl_dev *of_pinctrl_get(struct device_node *np); > -- > 1.9.1 > Linus, Do you have any comments on these change and following ZX pinctrl driver? Thank you! Jun -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html