spi: spi-dw: Add support DT support
diff mbox

Message ID 534E9312.5030107@gmail.com
State New, archived
Headers show

Commit Message

Dinh Nguyen April 16, 2014, 2:26 p.m. UTC
Hi Baruch Siach,

On 04/15/2014 10:43 PM, Baruch Siach wrote:
> Hi Dinh Nguyen,
>
> On Tue, Apr 15, 2014 at 09:05:17PM -0500, Dinh Nguyen wrote:
>> I saw from this spi-dw thread that you have a patch to enable DT on the
>> spi-dw driver?
>>
>> http://marc.info/?l=linux-spi&m=138862906031338&w=2
>>
>> Would you care to post the DT patch? I can test the MMIO driver on the
>> SOCFPGA platform.
>
> I posted the latest version of this series to the list, archived at
> http://thread.gmane.org/gmane.linux.kernel.spi.devel/16141 . I can send them
> to you again directly if this is more convenient to you.
>
> Thanks for testing.

Thanks for sharing. I think we have a similar patch downstream and has 
been working fine up to 3.14. For 3.14, we had to add apply this in 
order for the driver to probe properly:


really_probe().

WARNING: CPU: 0 PID: 1 at drivers/base/dd.c:272 
driver_probe_device+0x194/0x218)
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.14.0-00586-gee68b9b-dirty #2
[<80016328>] (unwind_backtrace) from [<80012a54>] (show_stack+0x20/0x24)
[<80012a54>] (show_stack) from [<804ed934>] (dump_stack+0x78/0x94)
[<804ed934>] (dump_stack) from [<8002302c>] 
(warn_slowpath_common+0x78/0x9c)
[<8002302c>] (warn_slowpath_common) from [<8002307c>] 
(warn_slowpath_null+0x2c/)
[<8002307c>] (warn_slowpath_null) from [<80301b48>] 
(driver_probe_device+0x194/)
[<80301b48>] (driver_probe_device) from [<80301cbc>] 
(__device_attach+0x50/0x54)
[<80301cbc>] (__device_attach) from [<802ffec4>] 
(bus_for_each_drv+0x54/0x9c)
[<802ffec4>] (bus_for_each_drv) from [<80301974>] (device_attach+0x84/0x90)
[<80301974>] (device_attach) from [<80300f64>] (bus_probe_device+0x94/0xb8)
[<80300f64>] (bus_probe_device) from [<802ff14c>] (device_add+0x3f8/0x4fc)
[<802ff14c>] (device_add) from [<80342088>] (spi_add_device+0x94/0x13c)
[<80342088>] (spi_add_device) from [<80342b6c>] 
(spi_register_master+0x56c/0x6d)
[<80342b6c>] (spi_register_master) from [<80342d10>] 
(devm_spi_register_master+)
[<80342d10>] (devm_spi_register_master) from [<80346c58>] 
(dw_spi_add_host+0x21)
[<80346c58>] (dw_spi_add_host) from [<803473d8>] 
(dw_spi_mmio_probe+0x180/0x214)
[<803473d8>] (dw_spi_mmio_probe) from [<80303224>] 
(platform_drv_probe+0x28/0x5)
[<80303224>] (platform_drv_probe) from [<80301a38>] 
(driver_probe_device+0x84/0)
[<80301a38>] (driver_probe_device) from [<80301c68>] 
(__driver_attach+0x9c/0xa0)
[<80301c68>] (__driver_attach) from [<802fff70>] 
(bus_for_each_dev+0x64/0x98)
[<802fff70>] (bus_for_each_dev) from [<80301594>] (driver_attach+0x2c/0x30)
[<80301594>] (driver_attach) from [<80301174>] (bus_add_driver+0xe8/0x1e4)
[<80301174>] (bus_add_driver) from [<8030239c>] 
(driver_register+0x88/0x104)
[<8030239c>] (driver_register) from [<80303134>] 
(__platform_driver_register+0x)
[<80303134>] (__platform_driver_register) from [<806fd110>] 
(dw_spi_mmio_driver)
[<806fd110>] (dw_spi_mmio_driver_init) from [<80008900>] 
(do_one_initcall+0xfc/)
[<80008900>] (do_one_initcall) from [<806d4cac>] 
(kernel_init_freeable+0x178/0x)
[<806d4cac>] (kernel_init_freeable) from [<804e99cc>] 
(kernel_init+0x18/0xfc)
[<804e99cc>] (kernel_init) from [<8000eb58>] (ret_from_fork+0x14/0x20)
---[ end trace 5f30c55d17fdf7a0 ]---


Our DTS entry for SPI looks like this:

spi0: spi@fff00000 {
	compatible = "snps,dw-spi-mmio";
	#address-cells = <1>;
	#size-cells = <0>;
	reg = <0xfff00000 0x1000>;
	interrupts = <0 154 4>;
	num-chipselect = <4>;
  	bus-num = <0>;
	tx-dma-channel = <&pdma 16>;
	rx-dma-channel = <&pdma 17>;
	clocks = <&per_base_clk>;

	spidev@0 {
		compatible = "spidev";
		reg = <0>;      /* chip select */
   		spi-max-frequency = <100000000>;
		enable-dma = <1>;
  	};
};

I think the driver is not happy with our spidev child node here, because 
if I take out the spidev node, then everything is fine. Except I don't 
have a user-space method to test the SPI.

I'm not as familiar with this subsystem, so will take more time to 
debug. Do you any anything obviously wrong?

Thanks,
Dinh
>
> baruch
>
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c
index bf98d63..29a1f4c 100644
--- a/drivers/spi/spi-dw.c
+++ b/drivers/spi/spi-dw.c
@@ -809,6 +809,7 @@  int dw_spi_add_host(struct device *dev, struct 
dw_spi *dws)
         master->cleanup = dw_spi_cleanup;
         master->setup = dw_spi_setup;
         master->transfer = dw_spi_transfer;
+       master->dev.of_node = dev->of_node;

But even this, we're triggering a WARN_ON() in drivers/base/dd.c,