Skip to content

Commit

Permalink
ARM: pxa: ssp: add pxa_ssp_request_of()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Mack authored and Mark Brown committed Aug 14, 2013
1 parent 1c459de commit 6446221
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
25 changes: 25 additions & 0 deletions arch/arm/plat-pxa/ssp.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,30 @@ struct ssp_device *pxa_ssp_request(int port, const char *label)
}
EXPORT_SYMBOL(pxa_ssp_request);

struct ssp_device *pxa_ssp_request_of(const struct device_node *of_node,
const char *label)
{
struct ssp_device *ssp = NULL;

mutex_lock(&ssp_lock);

list_for_each_entry(ssp, &ssp_list, node) {
if (ssp->of_node == of_node && ssp->use_count == 0) {
ssp->use_count++;
ssp->label = label;
break;
}
}

mutex_unlock(&ssp_lock);

if (&ssp->node == &ssp_list)
return NULL;

return ssp;
}
EXPORT_SYMBOL(pxa_ssp_request_of);

void pxa_ssp_free(struct ssp_device *ssp)
{
mutex_lock(&ssp_lock);
Expand Down Expand Up @@ -185,6 +209,7 @@ static int pxa_ssp_probe(struct platform_device *pdev)
}

ssp->use_count = 0;
ssp->of_node = dev->of_node;

mutex_lock(&ssp_lock);
list_add(&ssp->node, &ssp_list);
Expand Down
11 changes: 11 additions & 0 deletions include/linux/pxa2xx_ssp.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#include <linux/list.h>
#include <linux/io.h>
#include <linux/of.h>


/*
* SSP Serial Port Registers
Expand Down Expand Up @@ -190,6 +192,8 @@ struct ssp_device {
int irq;
int drcmr_rx;
int drcmr_tx;

struct device_node *of_node;
};

/**
Expand Down Expand Up @@ -218,11 +222,18 @@ static inline u32 pxa_ssp_read_reg(struct ssp_device *dev, u32 reg)
#ifdef CONFIG_ARCH_PXA
struct ssp_device *pxa_ssp_request(int port, const char *label);
void pxa_ssp_free(struct ssp_device *);
struct ssp_device *pxa_ssp_request_of(const struct device_node *of_node,
const char *label);
#else
static inline struct ssp_device *pxa_ssp_request(int port, const char *label)
{
return NULL;
}
static inline struct ssp_device *pxa_ssp_request_of(const struct device_node *n,
const char *name)
{
return NULL;
}
static inline void pxa_ssp_free(struct ssp_device *ssp) {}
#endif

Expand Down

0 comments on commit 6446221

Please sign in to comment.