Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.32-rc4 95 lines 2.4 kB view raw
1/* 2 * SPI OF support routines 3 * Copyright (C) 2008 Secret Lab Technologies Ltd. 4 * 5 * Support routines for deriving SPI device attachments from the device 6 * tree. 7 */ 8 9#include <linux/of.h> 10#include <linux/device.h> 11#include <linux/spi/spi.h> 12#include <linux/of_spi.h> 13 14/** 15 * of_register_spi_devices - Register child devices onto the SPI bus 16 * @master: Pointer to spi_master device 17 * @np: parent node of SPI device nodes 18 * 19 * Registers an spi_device for each child node of 'np' which has a 'reg' 20 * property. 21 */ 22void of_register_spi_devices(struct spi_master *master, struct device_node *np) 23{ 24 struct spi_device *spi; 25 struct device_node *nc; 26 const u32 *prop; 27 int rc; 28 int len; 29 30 for_each_child_of_node(np, nc) { 31 /* Alloc an spi_device */ 32 spi = spi_alloc_device(master); 33 if (!spi) { 34 dev_err(&master->dev, "spi_device alloc error for %s\n", 35 nc->full_name); 36 spi_dev_put(spi); 37 continue; 38 } 39 40 /* Select device driver */ 41 if (of_modalias_node(nc, spi->modalias, 42 sizeof(spi->modalias)) < 0) { 43 dev_err(&master->dev, "cannot find modalias for %s\n", 44 nc->full_name); 45 spi_dev_put(spi); 46 continue; 47 } 48 49 /* Device address */ 50 prop = of_get_property(nc, "reg", &len); 51 if (!prop || len < sizeof(*prop)) { 52 dev_err(&master->dev, "%s has no 'reg' property\n", 53 nc->full_name); 54 spi_dev_put(spi); 55 continue; 56 } 57 spi->chip_select = *prop; 58 59 /* Mode (clock phase/polarity/etc.) */ 60 if (of_find_property(nc, "spi-cpha", NULL)) 61 spi->mode |= SPI_CPHA; 62 if (of_find_property(nc, "spi-cpol", NULL)) 63 spi->mode |= SPI_CPOL; 64 if (of_find_property(nc, "spi-cs-high", NULL)) 65 spi->mode |= SPI_CS_HIGH; 66 67 /* Device speed */ 68 prop = of_get_property(nc, "spi-max-frequency", &len); 69 if (!prop || len < sizeof(*prop)) { 70 dev_err(&master->dev, "%s has no 'spi-max-frequency' property\n", 71 nc->full_name); 72 spi_dev_put(spi); 73 continue; 74 } 75 spi->max_speed_hz = *prop; 76 77 /* IRQ */ 78 spi->irq = irq_of_parse_and_map(nc, 0); 79 80 /* Store a pointer to the node in the device structure */ 81 of_node_get(nc); 82 spi->dev.archdata.of_node = nc; 83 84 /* Register the new device */ 85 request_module(spi->modalias); 86 rc = spi_add_device(spi); 87 if (rc) { 88 dev_err(&master->dev, "spi_device register error %s\n", 89 nc->full_name); 90 spi_dev_put(spi); 91 } 92 93 } 94} 95EXPORT_SYMBOL(of_register_spi_devices);