}
 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);
        }
 
        ssp->use_count = 0;
+       ssp->of_node = dev->of_node;
 
        mutex_lock(&ssp_lock);
        list_add(&ssp->node, &ssp_list);
 
 
 #include <linux/list.h>
 #include <linux/io.h>
+#include <linux/of.h>
+
 
 /*
  * SSP Serial Port Registers
        int             irq;
        int             drcmr_rx;
        int             drcmr_tx;
+
+       struct device_node      *of_node;
 };
 
 /**
 #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