Commit 6446221c14ef3bf58754cf1948631128dbe62700
Committed by
Mark Brown
1 parent
1c459de1e6
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
ARM: pxa: ssp: add pxa_ssp_request_of()
Add a function to lookup ssp devices from device tree. This way, users can reference the ssp devices in order to register to them. Signed-off-by: Daniel Mack <zonque@gmail.com> Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Showing 2 changed files with 36 additions and 0 deletions Side-by-side Diff
arch/arm/plat-pxa/ssp.c
... | ... | @@ -62,6 +62,30 @@ |
62 | 62 | } |
63 | 63 | EXPORT_SYMBOL(pxa_ssp_request); |
64 | 64 | |
65 | +struct ssp_device *pxa_ssp_request_of(const struct device_node *of_node, | |
66 | + const char *label) | |
67 | +{ | |
68 | + struct ssp_device *ssp = NULL; | |
69 | + | |
70 | + mutex_lock(&ssp_lock); | |
71 | + | |
72 | + list_for_each_entry(ssp, &ssp_list, node) { | |
73 | + if (ssp->of_node == of_node && ssp->use_count == 0) { | |
74 | + ssp->use_count++; | |
75 | + ssp->label = label; | |
76 | + break; | |
77 | + } | |
78 | + } | |
79 | + | |
80 | + mutex_unlock(&ssp_lock); | |
81 | + | |
82 | + if (&ssp->node == &ssp_list) | |
83 | + return NULL; | |
84 | + | |
85 | + return ssp; | |
86 | +} | |
87 | +EXPORT_SYMBOL(pxa_ssp_request_of); | |
88 | + | |
65 | 89 | void pxa_ssp_free(struct ssp_device *ssp) |
66 | 90 | { |
67 | 91 | mutex_lock(&ssp_lock); |
... | ... | @@ -185,6 +209,7 @@ |
185 | 209 | } |
186 | 210 | |
187 | 211 | ssp->use_count = 0; |
212 | + ssp->of_node = dev->of_node; | |
188 | 213 | |
189 | 214 | mutex_lock(&ssp_lock); |
190 | 215 | list_add(&ssp->node, &ssp_list); |
include/linux/pxa2xx_ssp.h
... | ... | @@ -21,7 +21,9 @@ |
21 | 21 | |
22 | 22 | #include <linux/list.h> |
23 | 23 | #include <linux/io.h> |
24 | +#include <linux/of.h> | |
24 | 25 | |
26 | + | |
25 | 27 | /* |
26 | 28 | * SSP Serial Port Registers |
27 | 29 | * PXA250, PXA255, PXA26x and PXA27x SSP controllers are all slightly different. |
... | ... | @@ -190,6 +192,8 @@ |
190 | 192 | int irq; |
191 | 193 | int drcmr_rx; |
192 | 194 | int drcmr_tx; |
195 | + | |
196 | + struct device_node *of_node; | |
193 | 197 | }; |
194 | 198 | |
195 | 199 | /** |
196 | 200 | |
... | ... | @@ -218,8 +222,15 @@ |
218 | 222 | #ifdef CONFIG_ARCH_PXA |
219 | 223 | struct ssp_device *pxa_ssp_request(int port, const char *label); |
220 | 224 | void pxa_ssp_free(struct ssp_device *); |
225 | +struct ssp_device *pxa_ssp_request_of(const struct device_node *of_node, | |
226 | + const char *label); | |
221 | 227 | #else |
222 | 228 | static inline struct ssp_device *pxa_ssp_request(int port, const char *label) |
229 | +{ | |
230 | + return NULL; | |
231 | +} | |
232 | +static inline struct ssp_device *pxa_ssp_request_of(const struct device_node *n, | |
233 | + const char *name) | |
223 | 234 | { |
224 | 235 | return NULL; |
225 | 236 | } |