Commit 6446221c14ef3bf58754cf1948631128dbe62700

Authored by Daniel Mack
Committed by Mark Brown
1 parent 1c459de1e6

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 }