linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: grant.likely@secretlab.ca, linus.walleij@linaro.org,
	w.sang@pengutronix.de, rafael.j.wysocki@intel.com
Cc: linux-kernel@vger.kernel.org, lenb@kernel.org,
	broonie@opensource.wolfsonmicro.com, khali@linux-fr.org,
	ben-linux@fluff.org, bhelgaas@google.com,
	mathias.nyman@linux.intel.com, linux-acpi@vger.kernel.org,
	Mika Westerberg <mika.westerberg@linux.intel.com>
Subject: [PATCH v3 2/3] spi / ACPI: add ACPI enumeration support
Date: Tue, 20 Nov 2012 12:29:43 +0200	[thread overview]
Message-ID: <1353407384-26880-3-git-send-email-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <1353407384-26880-1-git-send-email-mika.westerberg@linux.intel.com>

ACPI 5 introduced SPISerialBus resource that allows us to enumerate and
configure the SPI slave devices behind the SPI controller. This patch adds
support for this to the SPI core.

In addition we bind ACPI nodes to SPI devices. This makes it possible for
the slave drivers to get the ACPI handle for further configuration.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
 drivers/spi/spi.c |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 114 insertions(+), 1 deletion(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 84c2861..3ae5351 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -35,6 +35,8 @@
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/kthread.h>
+#include <linux/ioport.h>
+#include <linux/acpi.h>
 
 static void spidev_release(struct device *dev)
 {
@@ -93,6 +95,10 @@ static int spi_match_device(struct device *dev, struct device_driver *drv)
 	if (of_driver_match_device(dev, drv))
 		return 1;
 
+	/* Then try ACPI */
+	if (acpi_driver_match_device(dev, drv))
+		return 1;
+
 	if (sdrv->id_table)
 		return !!spi_match_id(sdrv->id_table, spi);
 
@@ -888,6 +894,112 @@ static void of_register_spi_devices(struct spi_master *master)
 static void of_register_spi_devices(struct spi_master *master) { }
 #endif
 
+#ifdef CONFIG_ACPI
+static int acpi_spi_add_resource(struct acpi_resource *ares, void *data)
+{
+	struct acpi_resource_spi_serialbus *sb;
+	struct spi_device *spi = data;
+	struct resource r;
+
+	switch (ares->type) {
+	case ACPI_RESOURCE_TYPE_IRQ:
+	case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+		/* Only use the first interrupt resource and skip the rest */
+		memset(&r, 0, sizeof(r));
+		if (spi->irq < 0 && acpi_dev_resource_interrupt(ares, 0, &r))
+			spi->irq = r.start;
+		return 1;
+
+	case ACPI_RESOURCE_TYPE_SERIAL_BUS:
+		sb = &ares->data.spi_serial_bus;
+		if (sb->type == ACPI_RESOURCE_SERIAL_TYPE_SPI) {
+			spi->chip_select = sb->device_selection;
+			spi->max_speed_hz = sb->connection_speed;
+
+			if (sb->clock_phase == ACPI_SPI_SECOND_PHASE)
+				spi->mode |= SPI_CPHA;
+			if (sb->clock_polarity == ACPI_SPI_START_HIGH)
+				spi->mode |= SPI_CPOL;
+			if (sb->device_polarity == ACPI_SPI_ACTIVE_HIGH)
+				spi->mode |= SPI_CS_HIGH;
+
+			return 1;
+		}
+		return 0;
+	}
+
+	return 0;
+}
+
+static acpi_status acpi_spi_add_device(acpi_handle handle, u32 level,
+				       void *data, void **return_value)
+{
+	struct spi_master *master = data;
+	struct list_head resource_list;
+	struct acpi_device *adev;
+	struct spi_device *spi;
+	int ret;
+
+	if (acpi_bus_get_device(handle, &adev))
+		return AE_OK;
+	if (acpi_bus_get_status(adev) || !adev->status.present)
+		return AE_OK;
+
+	spi = spi_alloc_device(master);
+	if (!spi) {
+		dev_err(&master->dev, "failed to allocate SPI device for %s\n",
+			dev_name(&adev->dev));
+		return AE_NO_MEMORY;
+	}
+
+	ACPI_HANDLE_SET(&spi->dev, handle);
+	spi->irq = -1;
+
+	INIT_LIST_HEAD(&resource_list);
+	ret = acpi_dev_get_resources(adev, &resource_list,
+				     acpi_spi_add_resource, spi);
+	if (ret < 0)
+		goto fail_put_dev;
+
+	acpi_dev_free_resource_list(&resource_list);
+
+	if (!spi->max_speed_hz)
+		goto fail_put_dev;
+
+	strlcpy(spi->modalias, dev_name(&adev->dev), sizeof(spi->modalias));
+	if (spi_add_device(spi)) {
+		dev_err(&master->dev, "failed to add SPI device %s from ACPI\n",
+			dev_name(&adev->dev));
+		goto fail_put_dev;
+	}
+
+	return AE_OK;
+
+fail_put_dev:
+	spi_dev_put(spi);
+
+	return AE_OK;
+}
+
+static void acpi_register_spi_devices(struct spi_master *master)
+{
+	acpi_status status;
+	acpi_handle handle;
+
+	handle = ACPI_HANDLE(&master->dev);
+	if (!handle)
+		return;
+
+	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
+				     acpi_spi_add_device, NULL,
+				     master, NULL);
+	if (ACPI_FAILURE(status))
+		dev_warn(&master->dev, "failed to enumerate SPI slaves\n");
+}
+#else
+static inline void acpi_register_spi_devices(struct spi_master *master) {}
+#endif /* CONFIG_ACPI */
+
 static void spi_master_release(struct device *dev)
 {
 	struct spi_master *master;
@@ -1023,8 +1135,9 @@ int spi_register_master(struct spi_master *master)
 		spi_match_master_to_boardinfo(master, &bi->board_info);
 	mutex_unlock(&board_lock);
 
-	/* Register devices from the device tree */
+	/* Register devices from the device tree and ACPI */
 	of_register_spi_devices(master);
+	acpi_register_spi_devices(master);
 done:
 	return status;
 }
-- 
1.7.10.4


  parent reply	other threads:[~2012-11-20 10:27 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-15 11:03 [PATCH v2 0/3] ACPI 5 support for GPIO, SPI and I2C Mika Westerberg
2012-11-15 11:03 ` [PATCH v2 1/3] gpio / ACPI: add ACPI support Mika Westerberg
2012-11-16  1:34   ` Rafael J. Wysocki
2012-11-16  6:54     ` Mika Westerberg
2012-11-16  8:05       ` Mika Westerberg
2012-11-16  8:12         ` Mika Westerberg
2012-11-16 10:02           ` Rafael J. Wysocki
2012-11-16 12:49             ` Mika Westerberg
2012-11-16 10:03   ` Rafael J. Wysocki
2012-11-15 11:03 ` [PATCH v2 2/3] spi / ACPI: add ACPI enumeration support Mika Westerberg
2012-11-16 10:06   ` Rafael J. Wysocki
2012-11-17 10:11   ` Rafael J. Wysocki
2012-11-17 10:18     ` Mika Westerberg
2012-11-15 11:03 ` [PATCH v2 3/3] i2c " Mika Westerberg
2012-11-16 10:09   ` Rafael J. Wysocki
2012-11-16 13:03     ` Jean Delvare
2012-11-16 13:21       ` Rafael J. Wysocki
2012-11-16 13:42         ` Jean Delvare
2012-11-16 14:17           ` Mika Westerberg
2012-11-16 15:23             ` Mika Westerberg
2012-11-16 16:47               ` Jean Delvare
2012-11-16 17:28                 ` [PATCH v2 3/3 UPDATED] " Mika Westerberg
2012-11-16 18:12                   ` Jean Delvare
2012-11-17  6:46                   ` Bjorn Helgaas
2012-11-17  8:03                     ` Mika Westerberg
2012-11-17  9:55                       ` Mika Westerberg
2012-11-19 22:49                         ` Bjorn Helgaas
2012-11-19 23:15                           ` Rafael J. Wysocki
2012-11-19 23:28                           ` Rafael J. Wysocki
2012-11-20  7:07                           ` Mika Westerberg
2012-11-17 11:24                       ` Rafael J. Wysocki
2012-11-18 15:55                         ` Mika Westerberg
2012-11-18 21:10                           ` [PATCH 0/2] ACPI: Simplify "glueing" to physical nodes (was: Re: [PATCH v2 3/3 UPDATED] i2c / ACPI: add ACPI enumeration support) Rafael J. Wysocki
2012-11-18 21:12                             ` [PATCH 1/2] ACPI: Allow ACPI handles of devices to be initialized in advance Rafael J. Wysocki
2012-11-19  9:42                               ` Mika Westerberg
2012-11-19 12:33                                 ` [Update][PATCH " Rafael J. Wysocki
2012-11-18 21:13                             ` [PATCH 2/2] ACPI / platform: Initialize ACPI handles of platform devices " Rafael J. Wysocki
2012-11-19 16:23                               ` Greg Kroah-Hartman
2012-11-19 17:32                                 ` Rafael J. Wysocki
2012-11-19 17:45                                   ` Rafael J. Wysocki
2012-11-19 20:44                                     ` Rafael J. Wysocki
2012-11-19 21:05                                       ` Mika Westerberg
2012-11-19 21:56                                         ` Rafael J. Wysocki
2012-11-19 22:32                                       ` Greg Kroah-Hartman
2012-11-19 22:44                                         ` Rafael J. Wysocki
2012-11-19 18:25                                   ` Rafael J. Wysocki
2012-11-19 22:31                                   ` Greg Kroah-Hartman
2012-11-19 22:45                                     ` Rafael J. Wysocki
2012-11-20  0:55                             ` [Update][PATCH 0/3] ACPI: Simplify "glueing" to physical nodes Rafael J. Wysocki
2012-11-20  0:57                               ` [Update][PATCH 1/3] ACPI: Allow ACPI handles of devices to be initialized in advance Rafael J. Wysocki
2012-11-20  0:59                               ` [Update][PATCH 2/3] ACPI / driver core: Introduce struct acpi_dev_node and related macros Rafael J. Wysocki
2012-11-20  9:10                                 ` Mika Westerberg
2012-11-20  9:34                                   ` [Update 2][PATCH " Rafael J. Wysocki
2012-11-20 12:57                                     ` Mika Westerberg
2012-11-20 18:08                                     ` Greg Kroah-Hartman
2012-11-20  1:01                               ` [Update][PATCH 3/3] ACPI / platform: Initialize ACPI handles of platform devices in advance Rafael J. Wysocki
2012-11-20 18:08                                 ` Greg Kroah-Hartman
2012-11-20  9:11                               ` [Update][PATCH 0/3] ACPI: Simplify "glueing" to physical nodes Mika Westerberg
2012-11-20  9:31                                 ` Rafael J. Wysocki
2012-11-20 18:09                               ` Greg Kroah-Hartman
2012-11-20 21:40                                 ` Rafael J. Wysocki
2012-11-16 20:02             ` [PATCH v2 3/3] i2c / ACPI: add ACPI enumeration support Rafael J. Wysocki
2012-11-16 20:09               ` Mika Westerberg
2012-11-16 20:18                 ` Rafael J. Wysocki
2012-11-20 10:29 ` [PATCH v3 0/3] ACPI 5 support for GPIO, SPI and I2C Mika Westerberg
2012-11-20 10:29   ` [PATCH v3 1/3] gpio / ACPI: add ACPI support Mika Westerberg
2012-11-20 12:46     ` Rafael J. Wysocki
2012-11-20 10:29   ` Mika Westerberg [this message]
2012-11-20 13:05     ` [PATCH v3 2/3] spi / ACPI: add ACPI enumeration support Rafael J. Wysocki
2012-11-20 13:15       ` Mika Westerberg
2012-11-20 13:24         ` Rafael J. Wysocki
2012-11-20 10:29   ` [PATCH v3 3/3] i2c " Mika Westerberg
2012-11-20 13:06     ` Rafael J. Wysocki
2012-11-20 13:57       ` Mika Westerberg
2012-11-20 18:13   ` [PATCH v4 0/3] ACPI 5 support for GPIO, SPI and I2C Mika Westerberg
2012-11-20 18:13     ` [PATCH v4 1/3] gpio / ACPI: add ACPI support Mika Westerberg
2012-11-30 11:20       ` Grant Likely
2012-11-30 11:27         ` Rafael J. Wysocki
2012-11-20 18:13     ` [PATCH v4 2/3] spi / ACPI: add ACPI enumeration support Mika Westerberg
2012-11-30 11:24       ` Grant Likely
2012-11-30 11:36         ` Rafael J. Wysocki
2012-11-20 18:13     ` [PATCH v4 3/3] i2c " Mika Westerberg
2012-11-21 21:31     ` [PATCH v4 0/3] ACPI 5 support for GPIO, SPI and I2C Rafael J. Wysocki
2012-11-21 21:54       ` Jean Delvare
2012-11-23 11:39         ` Rafael J. Wysocki
2012-11-22  1:36       ` Mark Brown
2012-11-22  9:43       ` Linus Walleij
2012-11-22 10:03         ` Rafael J. Wysocki
2012-11-28 12:36           ` Mika Westerberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1353407384-26880-3-git-send-email-mika.westerberg@linux.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=ben-linux@fluff.org \
    --cc=bhelgaas@google.com \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=grant.likely@secretlab.ca \
    --cc=khali@linux-fr.org \
    --cc=lenb@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=w.sang@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).