forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
spi: Add OF binding support for SPI busses
This patch adds support for populating an SPI bus based on data in the OF device tree. This is useful for powerpc platforms which use the device tree instead of discrete code for describing platform layout. Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
- Loading branch information
Showing
4 changed files
with
118 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* SPI OF support routines | ||
* Copyright (C) 2008 Secret Lab Technologies Ltd. | ||
* | ||
* Support routines for deriving SPI device attachments from the device | ||
* tree. | ||
*/ | ||
|
||
#include <linux/of.h> | ||
#include <linux/device.h> | ||
#include <linux/spi/spi.h> | ||
#include <linux/of_spi.h> | ||
|
||
/** | ||
* of_register_spi_devices - Register child devices onto the SPI bus | ||
* @master: Pointer to spi_master device | ||
* @np: parent node of SPI device nodes | ||
* | ||
* Registers an spi_device for each child node of 'np' which has a 'reg' | ||
* property. | ||
*/ | ||
void of_register_spi_devices(struct spi_master *master, struct device_node *np) | ||
{ | ||
struct spi_device *spi; | ||
struct device_node *nc; | ||
const u32 *prop; | ||
int rc; | ||
int len; | ||
|
||
for_each_child_of_node(np, nc) { | ||
/* Alloc an spi_device */ | ||
spi = spi_alloc_device(master); | ||
if (!spi) { | ||
dev_err(&master->dev, "spi_device alloc error for %s\n", | ||
nc->full_name); | ||
spi_dev_put(spi); | ||
continue; | ||
} | ||
|
||
/* Select device driver */ | ||
if (of_modalias_node(nc, spi->modalias, | ||
sizeof(spi->modalias)) < 0) { | ||
dev_err(&master->dev, "cannot find modalias for %s\n", | ||
nc->full_name); | ||
spi_dev_put(spi); | ||
continue; | ||
} | ||
|
||
/* Device address */ | ||
prop = of_get_property(nc, "reg", &len); | ||
if (!prop || len < sizeof(*prop)) { | ||
dev_err(&master->dev, "%s has no 'reg' property\n", | ||
nc->full_name); | ||
spi_dev_put(spi); | ||
continue; | ||
} | ||
spi->chip_select = *prop; | ||
|
||
/* Mode (clock phase/polarity/etc.) */ | ||
if (of_find_property(nc, "spi-cpha", NULL)) | ||
spi->mode |= SPI_CPHA; | ||
if (of_find_property(nc, "spi-cpol", NULL)) | ||
spi->mode |= SPI_CPOL; | ||
|
||
/* Device speed */ | ||
prop = of_get_property(nc, "spi-max-frequency", &len); | ||
if (!prop || len < sizeof(*prop)) { | ||
dev_err(&master->dev, "%s has no 'spi-max-frequency' property\n", | ||
nc->full_name); | ||
spi_dev_put(spi); | ||
continue; | ||
} | ||
spi->max_speed_hz = *prop; | ||
|
||
/* IRQ */ | ||
spi->irq = irq_of_parse_and_map(nc, 0); | ||
|
||
/* Store a pointer to the node in the device structure */ | ||
of_node_get(nc); | ||
spi->dev.archdata.of_node = nc; | ||
|
||
/* Register the new device */ | ||
request_module(spi->modalias); | ||
rc = spi_add_device(spi); | ||
if (rc) { | ||
dev_err(&master->dev, "spi_device register error %s\n", | ||
nc->full_name); | ||
spi_dev_put(spi); | ||
} | ||
|
||
} | ||
} | ||
EXPORT_SYMBOL(of_register_spi_devices); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* OpenFirmware SPI support routines | ||
* Copyright (C) 2008 Secret Lab Technologies Ltd. | ||
* | ||
* Support routines for deriving SPI device attachments from the device | ||
* tree. | ||
*/ | ||
|
||
#ifndef __LINUX_OF_SPI_H | ||
#define __LINUX_OF_SPI_H | ||
|
||
#include <linux/of.h> | ||
#include <linux/spi/spi.h> | ||
|
||
extern void of_register_spi_devices(struct spi_master *master, | ||
struct device_node *np); | ||
|
||
#endif /* __LINUX_OF_SPI */ |