diff options
author | Dong Aisheng <dong.aisheng@linaro.org> | 2012-04-26 04:15:50 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2012-04-26 17:31:04 -0400 |
commit | 5b3aa5f7c6287b1a0698950a91e94546888e553b (patch) | |
tree | ba9835476e92287de257f5bcbf121f570c66e8b8 /drivers/pinctrl/core.c | |
parent | ad6e1107baa2e7fda55c2020c25127eab9c0122b (diff) |
pinctrl: add pinctrl_provide_dummies interface for platforms to use
Add a interface pinctrl_provide_dummies for platform to indicate
whether it needs use pinctrl dummy state.
ChangeLog v3->v4:
* remove dummy gpio support in pinctrl subsystem.
Let gpio driver decide whether it wants to use pinctrl gpio mux
function.
ChangeLog v2->v3:
* Also changed the missed pinctrl gpio APIs in v1.
ChangeLog v1->v2:
* Based on sascha's suggestion, drop using kconfig since it will hide
pinctrl errors on all other boards.
See: https://lkml.org/lkml/2012/4/18/282
It seemed both Linus and Stephen agreed with this way, so i'm ok
with it too.
* Add dummy gpio support.
pinctrl gpio in the same situation as state.
* Patch name changed.
Original is pinctrl: handle dummy state in core.
* Split removing old dt dummy interface into a separate patch
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/core.c')
-rw-r--r-- | drivers/pinctrl/core.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 138e72f74377..a6386b3a3c15 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c | |||
@@ -43,6 +43,8 @@ struct pinctrl_maps { | |||
43 | unsigned num_maps; | 43 | unsigned num_maps; |
44 | }; | 44 | }; |
45 | 45 | ||
46 | static bool pinctrl_dummy_state; | ||
47 | |||
46 | /* Mutex taken by all entry points */ | 48 | /* Mutex taken by all entry points */ |
47 | DEFINE_MUTEX(pinctrl_mutex); | 49 | DEFINE_MUTEX(pinctrl_mutex); |
48 | 50 | ||
@@ -61,6 +63,19 @@ static LIST_HEAD(pinctrl_maps); | |||
61 | _i_ < _maps_node_->num_maps; \ | 63 | _i_ < _maps_node_->num_maps; \ |
62 | i++, _map_ = &_maps_node_->maps[_i_]) | 64 | i++, _map_ = &_maps_node_->maps[_i_]) |
63 | 65 | ||
66 | /** | ||
67 | * pinctrl_provide_dummies() - indicate if pinctrl provides dummy state support | ||
68 | * | ||
69 | * Usually this function is called by platforms without pinctrl driver support | ||
70 | * but run with some shared drivers using pinctrl APIs. | ||
71 | * After calling this function, the pinctrl core will return successfully | ||
72 | * with creating a dummy state for the driver to keep going smoothly. | ||
73 | */ | ||
74 | void pinctrl_provide_dummies(void) | ||
75 | { | ||
76 | pinctrl_dummy_state = true; | ||
77 | } | ||
78 | |||
64 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) | 79 | const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev) |
65 | { | 80 | { |
66 | /* We're not allowed to register devices without name */ | 81 | /* We're not allowed to register devices without name */ |
@@ -719,8 +734,18 @@ static struct pinctrl_state *pinctrl_lookup_state_locked(struct pinctrl *p, | |||
719 | struct pinctrl_state *state; | 734 | struct pinctrl_state *state; |
720 | 735 | ||
721 | state = find_state(p, name); | 736 | state = find_state(p, name); |
722 | if (!state) | 737 | if (!state) { |
723 | return ERR_PTR(-ENODEV); | 738 | if (pinctrl_dummy_state) { |
739 | /* create dummy state */ | ||
740 | dev_dbg(p->dev, "using pinctrl dummy state (%s)\n", | ||
741 | name); | ||
742 | state = create_state(p, name); | ||
743 | if (IS_ERR(state)) | ||
744 | return state; | ||
745 | } else { | ||
746 | return ERR_PTR(-ENODEV); | ||
747 | } | ||
748 | } | ||
724 | 749 | ||
725 | return state; | 750 | return state; |
726 | } | 751 | } |