linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] spi: Force the registration of the spidev devices
@ 2014-04-28 17:22 Maxime Ripard
       [not found] ` <1398705774-12361-1-git-send-email-maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  0 siblings, 1 reply; 50+ messages in thread
From: Maxime Ripard @ 2014-04-28 17:22 UTC (permalink / raw)
  To: Mark Brown
  Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Alexandre Belloni,
	Maxime Ripard

spidev device registration has always been a controversial subject since the
move to DT.

Obviously, a spidev node has nothing to do in the DT, and the position so far
has been to add the compatible of the devices to drive through spidev to the
list of the compatibles spidev can handle.

While this is nicer than the DT solution because of its accurate hardware
representation, it's still not perfect because you might not have access to the
DT, or you might be driving a completely generic device (such as a
microcontroller) that might be used for something else in a different
context/board.

Solve this by registering automatically spidev devices for all the unused chip
selects when a master registers itself against the spi core.

This also adds an i2cdev-like feeling, where you get all the spidev devices all
the time, without any modification.

Signed-off-by: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/spi/spi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 4eb9bf02996c..e832a5e20e8d 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1402,6 +1402,52 @@ static void acpi_register_spi_devices(struct spi_master *master)
 static inline void acpi_register_spi_devices(struct spi_master *master) {}
 #endif /* CONFIG_ACPI */
 
+#ifdef CONFIG_SPI_SPIDEV
+static void spidev_register_devices(struct spi_master *master)
+{
+	struct spi_device *spi;
+	int i, status;
+
+	for (i = 0; i < master->num_chipselect; i++) {
+		spi = spi_alloc_device(master);
+		if (!spi) {
+			dev_err(&master->dev, "Couldn't allocate spidev device\n");
+			continue;
+		}
+
+		spi->chip_select = i;
+		strlcpy(spi->modalias, "spidev", sizeof(spi->modalias));
+
+		/*
+		 * This is far from perfect since an addition might be
+		 * done between here and the call to spi_add_device,
+		 * but we can't hold the lock and call spi_add_device
+		 * either, as it would trigger a deadlock.
+		 *
+		 * If such a race occurs, spi_add_device will still
+		 * catch it though, as it also checks for devices
+		 * being registered several times on the same chip
+		 * select.
+		*/
+		status = bus_for_each_dev(&spi_bus_type, NULL, spi,
+					  spi_dev_check);
+		if (status) {
+			dev_dbg(&master->dev, "Chipselect already in use.. Skipping.");
+			spi_dev_put(spi);
+			continue;
+		}
+
+		if (spi_add_device(spi)) {
+			dev_err(&master->dev, "Couldn't add spidev device\n");
+			spi_dev_put(spi);
+		}
+	}
+
+}
+#else
+static inline void spidev_register_devices(struct spi_master *master) {}
+#endif /* CONFIG_SPI_SPIDEV */
+
 static void spi_master_release(struct device *dev)
 {
 	struct spi_master *master;
@@ -1591,6 +1637,7 @@ int spi_register_master(struct spi_master *master)
 	/* Register devices from the device tree and ACPI */
 	of_register_spi_devices(master);
 	acpi_register_spi_devices(master);
+	spidev_register_devices(master);
 done:
 	return status;
 }
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 50+ messages in thread
* [PATCH] spi: Force the registration of the spidev devices
@ 2015-05-12 20:33 Maxime Ripard
       [not found] ` <1431462804-30467-1-git-send-email-maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
  0 siblings, 1 reply; 50+ messages in thread
From: Maxime Ripard @ 2015-05-12 20:33 UTC (permalink / raw)
  To: Mark Brown
  Cc: Greg Kroah-Hartman, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	Hans de Goede, linux-spi-u79uwXL29TY76Z2rM5mHXA, Martin Sperl,
	Michal Suchanek, Maxime Ripard

spidev device registration has always been a controversial subject since the
move to DT.

Obviously, a spidev node has nothing to do in the DT, and the position so far
has been to add the compatible of the devices to drive through spidev to the
list of the compatibles spidev can handle.

While this is nicer than the DT solution because of its accurate hardware
representation, it's still not perfect because you might not have access to the
DT, or you might be driving a completely generic device (such as a
microcontroller) that might be used for something else in a different
context/board.

Solve this by registering automatically spidev devices for all the unused chip
selects when a master registers itself against the spi core.

This also adds an i2cdev-like feeling, where you get all the spidev devices all
the time, without any modification.

Signed-off-by: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
---
 drivers/spi/spi.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index d5d7d2235163..e6ca46e1e0fc 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1384,6 +1384,52 @@ static void acpi_register_spi_devices(struct spi_master *master)
 static inline void acpi_register_spi_devices(struct spi_master *master) {}
 #endif /* CONFIG_ACPI */
 
+#ifdef CONFIG_SPI_SPIDEV
+static void spidev_register_devices(struct spi_master *master)
+{
+	struct spi_device *spi;
+	int i, status;
+
+	for (i = 0; i < master->num_chipselect; i++) {
+		spi = spi_alloc_device(master);
+		if (!spi) {
+			dev_err(&master->dev, "Couldn't allocate spidev device\n");
+			continue;
+		}
+
+		spi->chip_select = i;
+		strlcpy(spi->modalias, "spidev", sizeof(spi->modalias));
+
+		/*
+		 * This is far from perfect since an addition might be
+		 * done between here and the call to spi_add_device,
+		 * but we can't hold the lock and call spi_add_device
+		 * either, as it would trigger a deadlock.
+		 *
+		 * If such a race occurs, spi_add_device will still
+		 * catch it though, as it also checks for devices
+		 * being registered several times on the same chip
+		 * select.
+		*/
+		status = bus_for_each_dev(&spi_bus_type, NULL, spi,
+					  spi_dev_check);
+		if (status) {
+			dev_dbg(&master->dev, "Chipselect already in use.. Skipping.");
+			spi_dev_put(spi);
+			continue;
+		}
+
+		if (spi_add_device(spi)) {
+			dev_err(&master->dev, "Couldn't add spidev device\n");
+			spi_dev_put(spi);
+		}
+	}
+
+}
+#else
+static inline void spidev_register_devices(struct spi_master *master) {}
+#endif /* CONFIG_SPI_SPIDEV */
+
 static void spi_master_release(struct device *dev)
 {
 	struct spi_master *master;
@@ -1575,6 +1621,7 @@ int spi_register_master(struct spi_master *master)
 	/* Register devices from the device tree and ACPI */
 	of_register_spi_devices(master);
 	acpi_register_spi_devices(master);
+	spidev_register_devices(master);
 done:
 	return status;
 }
-- 
2.4.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 50+ messages in thread

end of thread, other threads:[~2015-07-15  6:27 UTC | newest]

Thread overview: 50+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-28 17:22 [PATCH] spi: Force the registration of the spidev devices Maxime Ripard
     [not found] ` <1398705774-12361-1-git-send-email-maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2014-04-29 18:37   ` Mark Brown
     [not found]     ` <20140429183758.GH15125-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2014-04-29 21:31       ` Martin Sperl
     [not found]         ` <24BF05CB-35FF-42E8-BE5C-A5E4E3D0C52A-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
2014-04-30 18:14           ` Maxime Ripard
2014-04-30 20:00             ` Martin Sperl
     [not found]               ` <DA3907EB-0C1B-42FB-B288-9E33F6E24E3E-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
2014-04-30 22:19                 ` Maxime Ripard
2014-05-01  1:21                 ` Mark Brown
2014-04-30 18:06       ` Maxime Ripard
2014-05-01  1:18         ` Mark Brown
     [not found]           ` <20140501011811.GF3245-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2014-05-01 22:36             ` Maxime Ripard
2014-05-01 23:28               ` Geert Uytterhoeven
     [not found]                 ` <CAMuHMdUWa1_n94sDvv=L_goc+SOnD9CAKi5DzifrY7GWYRdQmw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-02 16:55                   ` Mark Brown
2014-05-05  4:17                 ` Maxime Ripard
2014-05-05  7:10                   ` Geert Uytterhoeven
     [not found]                     ` <CAMuHMdWZ1rvC+tkT=CbfMwZtppyJ_KpzT7JrLd5k5P2oxzA+8g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-05-05 13:57                       ` Alexandre Belloni
     [not found]                         ` <20140505135701.GA21940-m++hUPXGwpdeoWH0uzbU5w@public.gmane.org>
2014-05-05 14:22                           ` Geert Uytterhoeven
2014-05-05 19:16                     ` Mark Brown
2014-05-02 17:40               ` Mark Brown
2014-05-05  4:21                 ` Maxime Ripard
2014-05-05 19:17                   ` Mark Brown
     [not found]                     ` <20140505191723.GK22111-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2014-05-08  2:22                       ` Maxime Ripard
  -- strict thread matches above, loose matches on Subject: below --
2015-05-12 20:33 Maxime Ripard
     [not found] ` <1431462804-30467-1-git-send-email-maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2015-05-13 11:26   ` Mark Brown
     [not found]     ` <20150513112604.GI3066-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 12:35       ` Michal Suchanek
2015-05-13 12:51       ` Maxime Ripard
2015-05-13 14:36         ` Mark Brown
     [not found]           ` <20150513143610.GT2761-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 15:31             ` Michal Suchanek
     [not found]               ` <CAOMqctTd7xG6mwX9AojTH4uaGDY06xOgDFUP437VDiE0rp0sXA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 17:43                 ` Mark Brown
2015-05-13 19:09           ` Maxime Ripard
2015-05-13 19:10         ` Geert Uytterhoeven
     [not found]           ` <CAMuHMdWJ730G_a6=vQgs4gV837am5KKd7zEhU2FaHw2cpv=aRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-13 19:41             ` Maxime Ripard
2015-05-13 15:37       ` Greg Kroah-Hartman
     [not found]         ` <20150513153740.GC11677-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-05-13 15:52           ` Michal Suchanek
2015-05-13 17:13           ` Mark Brown
     [not found]             ` <20150513171300.GD2761-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 17:20               ` Greg Kroah-Hartman
     [not found]                 ` <20150513172028.GA18303-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-05-13 17:39                   ` Mark Brown
     [not found]                     ` <20150513173922.GF2761-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 18:16                       ` Greg Kroah-Hartman
2015-05-13 18:32                         ` Mark Brown
     [not found]                           ` <20150513183211.GK2761-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 18:36                             ` Greg Kroah-Hartman
     [not found]                               ` <20150513183653.GA879-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-05-13 18:51                                 ` Mark Brown
     [not found]                                   ` <20150513185149.GL2761-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-05-13 19:17                                     ` Maxime Ripard
2015-05-13 17:50           ` Maxime Ripard
2015-05-13 18:12             ` Mark Brown
2015-05-13 18:17             ` Greg Kroah-Hartman
     [not found]               ` <20150513181736.GC16811-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-05-13 19:23                 ` Geert Uytterhoeven
2015-05-13 19:26                 ` Maxime Ripard
2015-05-13 22:33                   ` Greg Kroah-Hartman
     [not found]                     ` <20150513223331.GA26748-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-05-14 14:34                       ` Mark Brown
2015-07-15  6:27                       ` Lucas De Marchi
2015-05-15  8:09                     ` Maxime Ripard

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).