I recently hit a WARN_ON when adding a spidev device to a device tree, the warning is:

buggy DT: spidev listed directly in DT

and it was introduced by this patch. This is quite unfortunate but easy to work around, though I would argue that it’s counter to the point of the spidev driver to begin with: after all we’re describing hardware that we’re talking to from user space and there’s no need to describe it in the device tree, this just creates extra work.

Solution 1: the proper way

To avoid this warning you will need to add your device to the spidev_dt_ids table in drivers/spi/spidev.c and then use that device string (and not literally spidev in your device tree compatible). For example you could add a device named foocorp,modem to the end of that table:

--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -695,6 +695,7 @@
 static const struct of_device_id spidev_dt_ids[] = {
	{ .compatible = "rohm,dh2228fv" },
	{ .compatible = "lineartechnology,ltc2488" },
+	{ .compatible = "foocorp,modem" },
 MODULE_DEVICE_TABLE(of, spidev_dt_ids);

And then your device tree entry would contain a node with the corresponding compatible string:

compatible = "foocorp,modem";

When the spidev module is probed, things should match up and you will see a corresponding character device as before.

Problems with this

This has some obvious problems including:

  • We now have to patch the kernel to add a string to some code for no apparent reason other than “correctness” of the device tree.
  • This patch is probably not going upstream because it’s unlikely that anyone else has this hardware (though in some cases it may go upstream).
  • Maintaining this patch is not going to be pleasant: you’re adding an entry to a table and rebasing will take some work once people add more things to that table.

Solution 2: quick and dirty

You can forgo patching the driver and simply claim one of the already included devices from the table. It’s not going to make any difference: spidev will match that string and move on. So for example I don’t have a “rohm,dh2228fv” on my board so I could have:

comptabile = "rohm,dh2228fv"; /* actually my foocorp modem */

And things will work fine and I won’t see the nasty WARN_ON anymore.

A nicer future change would be to move this spidev_dt_ids table out to the device tree itself and avoid this altogether but no one has done that yet (at least as of the 4.8 kernel). A cursory glance through arm/boot/dts shows many users of spidev that will now be seeing the WARN_ON message.