2 * SPI OF support routines
3 * Copyright (C) 2008 Secret Lab Technologies Ltd.
5 * Support routines for deriving SPI device attachments from the device
10 #include <linux/device.h>
11 #include <linux/spi/spi.h>
12 #include <linux/of_irq.h>
13 #include <linux/of_spi.h>
16 * of_register_spi_devices - Register child devices onto the SPI bus
17 * @master: Pointer to spi_master device
19 * Registers an spi_device for each child node of master node which has a 'reg'
22 void of_register_spi_devices(struct spi_master
*master
)
24 struct spi_device
*spi
;
25 struct device_node
*nc
;
30 if (!master
->dev
.of_node
)
33 for_each_child_of_node(master
->dev
.of_node
, nc
) {
34 /* Alloc an spi_device */
35 spi
= spi_alloc_device(master
);
37 dev_err(&master
->dev
, "spi_device alloc error for %s\n",
43 /* Select device driver */
44 if (of_modalias_node(nc
, spi
->modalias
,
45 sizeof(spi
->modalias
)) < 0) {
46 dev_err(&master
->dev
, "cannot find modalias for %s\n",
53 prop
= of_get_property(nc
, "reg", &len
);
54 if (!prop
|| len
< sizeof(*prop
)) {
55 dev_err(&master
->dev
, "%s has no 'reg' property\n",
60 spi
->chip_select
= be32_to_cpup(prop
);
62 /* Mode (clock phase/polarity/etc.) */
63 if (of_find_property(nc
, "spi-cpha", NULL
))
64 spi
->mode
|= SPI_CPHA
;
65 if (of_find_property(nc
, "spi-cpol", NULL
))
66 spi
->mode
|= SPI_CPOL
;
67 if (of_find_property(nc
, "spi-cs-high", NULL
))
68 spi
->mode
|= SPI_CS_HIGH
;
71 prop
= of_get_property(nc
, "spi-max-frequency", &len
);
72 if (!prop
|| len
< sizeof(*prop
)) {
73 dev_err(&master
->dev
, "%s has no 'spi-max-frequency' property\n",
78 spi
->max_speed_hz
= be32_to_cpup(prop
);
81 spi
->irq
= irq_of_parse_and_map(nc
, 0);
83 /* Store a pointer to the node in the device structure */
85 spi
->dev
.of_node
= nc
;
87 /* Register the new device */
88 request_module(spi
->modalias
);
89 rc
= spi_add_device(spi
);
91 dev_err(&master
->dev
, "spi_device register error %s\n",
98 EXPORT_SYMBOL(of_register_spi_devices
);