consumer.h 4.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Consumer interface the pin control subsystem
 *
 * Copyright (C) 2012 ST-Ericsson SA
 * Written on behalf of Linaro for ST-Ericsson
 * Based on bits of regulator core, gpio core and clk core
 *
 * Author: Linus Walleij <linus.walleij@linaro.org>
 *
 * License terms: GNU General Public License (GPL) version 2
 */
#ifndef __LINUX_PINCTRL_CONSUMER_H
#define __LINUX_PINCTRL_CONSUMER_H

15
#include <linux/err.h>
16 17
#include <linux/list.h>
#include <linux/seq_file.h>
18
#include <linux/pinctrl/pinctrl-state.h>
19 20

/* This struct is private to the core and should be regarded as a cookie */
21
struct pinctrl;
22
struct pinctrl_state;
23
struct device;
24

25
#ifdef CONFIG_PINCTRL
26

27
/* External interface to pin control */
28 29 30 31
extern int pinctrl_request_gpio(unsigned gpio);
extern void pinctrl_free_gpio(unsigned gpio);
extern int pinctrl_gpio_direction_input(unsigned gpio);
extern int pinctrl_gpio_direction_output(unsigned gpio);
32 33

extern struct pinctrl * __must_check pinctrl_get(struct device *dev);
34
extern void pinctrl_put(struct pinctrl *p);
35 36 37 38
extern struct pinctrl_state * __must_check pinctrl_lookup_state(
							struct pinctrl *p,
							const char *name);
extern int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *s);
39

40 41 42
extern struct pinctrl * __must_check devm_pinctrl_get(struct device *dev);
extern void devm_pinctrl_put(struct pinctrl *p);

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#ifdef CONFIG_PM
extern int pinctrl_pm_select_default_state(struct device *dev);
extern int pinctrl_pm_select_sleep_state(struct device *dev);
extern int pinctrl_pm_select_idle_state(struct device *dev);
#else
static inline int pinctrl_pm_select_default_state(struct device *dev)
{
	return 0;
}
static inline int pinctrl_pm_select_sleep_state(struct device *dev)
{
	return 0;
}
static inline int pinctrl_pm_select_idle_state(struct device *dev)
{
	return 0;
}
#endif

62
#else /* !CONFIG_PINCTRL */
63

64
static inline int pinctrl_request_gpio(unsigned gpio)
65 66 67 68
{
	return 0;
}

69
static inline void pinctrl_free_gpio(unsigned gpio)
70 71 72
{
}

73
static inline int pinctrl_gpio_direction_input(unsigned gpio)
74 75 76 77
{
	return 0;
}

78
static inline int pinctrl_gpio_direction_output(unsigned gpio)
79 80 81 82
{
	return 0;
}

83
static inline struct pinctrl * __must_check pinctrl_get(struct device *dev)
84
{
85
	return NULL;
86 87
}

88
static inline void pinctrl_put(struct pinctrl *p)
89 90 91
{
}

92 93 94
static inline struct pinctrl_state * __must_check pinctrl_lookup_state(
							struct pinctrl *p,
							const char *name)
95
{
96
	return NULL;
97 98
}

99 100
static inline int pinctrl_select_state(struct pinctrl *p,
				       struct pinctrl_state *s)
101
{
102
	return 0;
103 104
}

105 106
static inline struct pinctrl * __must_check devm_pinctrl_get(struct device *dev)
{
107
	return NULL;
108 109 110 111 112 113
}

static inline void devm_pinctrl_put(struct pinctrl *p)
{
}

L
Linus Walleij 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
static inline int pinctrl_pm_select_default_state(struct device *dev)
{
	return 0;
}

static inline int pinctrl_pm_select_sleep_state(struct device *dev)
{
	return 0;
}

static inline int pinctrl_pm_select_idle_state(struct device *dev)
{
	return 0;
}

129
#endif /* CONFIG_PINCTRL */
130

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
static inline struct pinctrl * __must_check pinctrl_get_select(
					struct device *dev, const char *name)
{
	struct pinctrl *p;
	struct pinctrl_state *s;
	int ret;

	p = pinctrl_get(dev);
	if (IS_ERR(p))
		return p;

	s = pinctrl_lookup_state(p, name);
	if (IS_ERR(s)) {
		pinctrl_put(p);
		return ERR_PTR(PTR_ERR(s));
	}

	ret = pinctrl_select_state(p, s);
	if (ret < 0) {
		pinctrl_put(p);
		return ERR_PTR(ret);
	}

	return p;
}

static inline struct pinctrl * __must_check pinctrl_get_select_default(
					struct device *dev)
{
	return pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
}

static inline struct pinctrl * __must_check devm_pinctrl_get_select(
					struct device *dev, const char *name)
{
	struct pinctrl *p;
	struct pinctrl_state *s;
	int ret;

	p = devm_pinctrl_get(dev);
	if (IS_ERR(p))
		return p;

	s = pinctrl_lookup_state(p, name);
	if (IS_ERR(s)) {
		devm_pinctrl_put(p);
177
		return ERR_CAST(s);
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	}

	ret = pinctrl_select_state(p, s);
	if (ret < 0) {
		devm_pinctrl_put(p);
		return ERR_PTR(ret);
	}

	return p;
}

static inline struct pinctrl * __must_check devm_pinctrl_get_select_default(
					struct device *dev)
{
	return devm_pinctrl_get_select(dev, PINCTRL_STATE_DEFAULT);
193 194
}

195
#endif /* __LINUX_PINCTRL_CONSUMER_H */