From: Maxime Ripard <maxime.ripard@free-electrons.com> To: Mark Brown <broonie@kernel.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, linux-kernel@vger.kernel.org, Hans de Goede <hdegoede@redhat.com>, linux-spi@vger.kernel.org, Martin Sperl <kernel@martin.sperl.org>, Michal Suchanek <hramrach@gmail.com>, Maxime Ripard <maxime.ripard@free-electrons.com> Subject: [PATCH] spi: Force the registration of the spidev devices Date: Tue, 12 May 2015 22:33:24 +0200 [thread overview] Message-ID: <1431462804-30467-1-git-send-email-maxime.ripard@free-electrons.com> (raw) 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@free-electrons.com> --- 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
WARNING: multiple messages have this Message-ID (diff)
From: Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> To: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Cc: Greg Kroah-Hartman <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Hans de Goede <hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>, linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Martin Sperl <kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>, Michal Suchanek <hramrach-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Maxime Ripard <maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> Subject: [PATCH] spi: Force the registration of the spidev devices Date: Tue, 12 May 2015 22:33:24 +0200 [thread overview] Message-ID: <1431462804-30467-1-git-send-email-maxime.ripard@free-electrons.com> (raw) 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
next reply other threads:[~2015-05-12 20:35 UTC|newest] Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-05-12 20:33 Maxime Ripard [this message] 2015-05-12 20:33 ` [PATCH] spi: Force the registration of the spidev devices Maxime Ripard 2015-05-13 9:34 ` [PATCH] spi: Add option to bind spidev to all chipselects Michal Suchanek 2015-05-13 9:34 ` Michal Suchanek 2015-05-13 10:16 ` Maxime Ripard 2015-05-13 10:16 ` Maxime Ripard 2015-05-13 10:40 ` Michal Suchanek 2015-05-13 10:40 ` Michal Suchanek 2015-05-13 11:05 ` Mark Brown 2015-05-13 11:05 ` Mark Brown 2015-05-13 11:26 ` [PATCH] spi: Force the registration of the spidev devices Mark Brown 2015-05-13 11:26 ` Mark Brown 2015-05-13 12:35 ` Michal Suchanek 2015-05-13 12:35 ` Michal Suchanek 2015-05-13 12:51 ` Maxime Ripard 2015-05-13 12:51 ` Maxime Ripard 2015-05-13 14:36 ` Mark Brown 2015-05-13 14:36 ` Mark Brown 2015-05-13 15:31 ` Michal Suchanek 2015-05-13 15:31 ` Michal Suchanek 2015-05-13 17:43 ` Mark Brown 2015-05-13 17:43 ` Mark Brown 2015-05-13 19:09 ` Maxime Ripard 2015-05-13 19:10 ` Geert Uytterhoeven 2015-05-13 19:10 ` Geert Uytterhoeven 2015-05-13 19:41 ` Maxime Ripard 2015-05-13 19:41 ` Maxime Ripard 2015-05-13 15:37 ` Greg Kroah-Hartman 2015-05-13 15:37 ` Greg Kroah-Hartman 2015-05-13 15:52 ` Michal Suchanek 2015-05-13 15:52 ` Michal Suchanek 2015-05-13 17:13 ` Mark Brown 2015-05-13 17:13 ` Mark Brown 2015-05-13 17:20 ` Greg Kroah-Hartman 2015-05-13 17:20 ` Greg Kroah-Hartman 2015-05-13 17:39 ` Mark Brown 2015-05-13 17:39 ` Mark Brown 2015-05-13 18:16 ` Greg Kroah-Hartman 2015-05-13 18:16 ` Greg Kroah-Hartman 2015-05-13 18:32 ` Mark Brown 2015-05-13 18:36 ` Greg Kroah-Hartman 2015-05-13 18:36 ` Greg Kroah-Hartman 2015-05-13 18:51 ` Mark Brown 2015-05-13 18:51 ` Mark Brown 2015-05-13 19:17 ` Maxime Ripard 2015-05-13 19:17 ` Maxime Ripard 2015-05-13 17:50 ` Maxime Ripard 2015-05-13 17:50 ` Maxime Ripard 2015-05-13 18:12 ` Mark Brown 2015-05-13 18:17 ` Greg Kroah-Hartman 2015-05-13 18:17 ` Greg Kroah-Hartman 2015-05-13 19:23 ` Geert Uytterhoeven 2015-05-13 19:23 ` Geert Uytterhoeven 2015-05-13 19:26 ` Maxime Ripard 2015-05-13 19:26 ` Maxime Ripard 2015-05-13 22:33 ` Greg Kroah-Hartman 2015-05-13 22:33 ` Greg Kroah-Hartman 2015-05-14 14:34 ` Mark Brown 2015-05-14 14:34 ` Mark Brown 2015-05-15 8:09 ` Maxime Ripard 2015-07-15 6:27 ` Lucas De Marchi 2015-07-15 6:27 ` Lucas De Marchi -- strict thread matches above, loose matches on Subject: below -- 2014-04-28 17:22 Maxime Ripard 2014-04-28 17:22 ` Maxime Ripard 2014-04-29 18:37 ` Mark Brown 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-04-30 18:06 ` Maxime Ripard 2014-05-01 1:18 ` Mark Brown 2014-05-01 1:18 ` Mark Brown 2014-05-01 22:36 ` Maxime Ripard 2014-05-01 22:36 ` Maxime Ripard 2014-05-01 23:28 ` Geert Uytterhoeven 2014-05-02 16:55 ` Mark Brown 2014-05-02 16:55 ` Mark Brown 2014-05-05 4:17 ` Maxime Ripard 2014-05-05 7:10 ` Geert Uytterhoeven 2014-05-05 13:57 ` Alexandre Belloni 2014-05-05 13:57 ` Alexandre Belloni 2014-05-05 14:22 ` Geert Uytterhoeven 2014-05-05 14:22 ` Geert Uytterhoeven 2014-05-05 19:16 ` Mark Brown 2014-05-02 17:40 ` Mark Brown 2014-05-02 17:40 ` Mark Brown 2014-05-05 4:21 ` Maxime Ripard 2014-05-05 19:17 ` Mark Brown 2014-05-05 19:17 ` Mark Brown 2014-05-08 2:22 ` Maxime Ripard 2014-05-08 2:22 ` Maxime Ripard
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=1431462804-30467-1-git-send-email-maxime.ripard@free-electrons.com \ --to=maxime.ripard@free-electrons.com \ --cc=broonie@kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=hdegoede@redhat.com \ --cc=hramrach@gmail.com \ --cc=kernel@martin.sperl.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-spi@vger.kernel.org \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.