ppc405 + MCP23S17

WANG YiFei yifei_wang at hotmail.com
Thu Oct 14 02:03:38 EST 2010


Hi TieJun,

I saw you name in \arch\powerpc\boot\cuboot-kilauea.c,
I think I found right person for help, since our board
is based on Kilauea evaluation board, and currently I
used 40x/kilauea_defconfig to config kernel. Also I used
Kilauea.dts as starting point to modify as shown in my
previous email.
As you know, Kilauea board doesn't have any spi devices
on spi bus, however, our board has an mcp23s17 on it. So
far, I didn't add/change kernel/driver code. Looking at
mcp23s08.c's probe() routine:

static int mcp23s08_probe(struct spi_device *spi)
{
	struct mcp23s08_platform_data	*pdata;
	unsigned			addr;
	unsigned			chips = 0;
	struct mcp23s08_driver_data	*data;
	int				status;
	unsigned			base;

	pdata = spi->dev.platform_data;
	if (!pdata || !gpio_is_valid(pdata->base)) {
		dev_dbg(&spi->dev, "invalid or missing platform data\n");
		return -EINVAL;
	}
......

Obviously, if I don't pass any platform_data to mcp23s08 device,
it will always fail. That means this mcp23s08 driver always needs
a platform_data to associate with, I don't know if this is the correct
behavior. Anyway, so my question is: is my modified dts files(as in
previous email) correct? what info else do I need to add in to support
platform_data in dts file? Or if this dts is correct, then where is the
right place(which .c file) to set/pass platform_data to?


Regards,
YiFei


-----Original Message-----
From: tiejun.chen [mailto:tiejun.chen at windriver.com] 
Sent: Wednesday, 13 October, 2010 3:50 PM
To: WANG YiFei
Cc: linuxppc-dev at ozlabs.org
Subject: Re: ppc405 + MCP23S17

WANG YiFei wrote:
> Hi TieJun,
> 
> Thanks a lot for your reply.
> So far, I can get ppc405 spi to initialize, however
> failed at MCP23S17's probe() routine, I checked the
> code, it's due to un-initialized platform data. Here
> is my part of dts:
> 
> 	spi at ef600600 {
> 		device_type = "spi";
> 		compatible = "ibm,ppc4xx-spi", "ibm,spi";
> 		reg = <0xef600600 0x7>;
> 		interrupt-parent = <0x2>;
> 		interrupts = <0x8 0x4>;
> 		#address-cells = <0x1>;
> 		#size-cells = <0x0>;
> 		gpios = <0>;    	/* cs */
> 		
> 		spi_gpio at 0 {
> 			compatible = "mcp,mcp23s08";
> 			spi-max-frequency = <1000000>;
> 			reg = <0>;
> 		};
> 	};
> 
> I don't know how to provide platform data from dts although
> I understand the concept from code. Do I only need to modify
> dts OR I need to write some code to supply platform data? Do
> you have any URL or sample code to show passing of platform
> data?

Often you SPI bus driver should call spi_register_master() to register your SPI
master controller. Then please go to the following path:
======
spi_register_master()
	|
	+ scan_boardinfo()
		|
		+ spi_new_device()
			^
			Here refer to the function,
------
struct spi_device *spi_new_device(struct spi_master *master,
                                  struct spi_board_info *chip)
{
	struct spi_device       *proxy;
	......
	proxy->dev.platform_data = (void *) chip->platform_data;
	......
	status = spi_add_device(proxy);
	......

And as I previously comment 'spi->dev.platform_data' would be passed to your
platform_data resided in your probe hook within your spi device driver.

So firstly you should register call spi_register_board_info() to register one
given spi_board_info by parsing your device nodes from your dts.

I think you can refer to the file, arch/powerpc/platforms/83xx/mpc832x_rdb.c.

> 
> Anyway, thanks a lot for guiding me.

You're welcome :)

Tiejun

> YiFei
> 
> -----Original Message-----
> From: tiejun.chen [mailto:tiejun.chen at windriver.com] 
> Sent: Wednesday, October 13, 2010 11:09 AM
> To: WANG YiFei
> Cc: linuxppc-dev at ozlabs.org
> Subject: Re: ppc405 + MCP23S17
> 
> WANG YiFei wrote:
>> Hi,
>>
>>  
>>
>> I'm a newbie for linux device driver development.
>>
>> We have a custom ppc405 board which has MCP23S17
>>
>> (16-Bit I/O Expander with SPI Interface) on it.
>>
>> I noticed that current kernel has MCP23S08 driver
>>
>> support, I'd like to know:
>>
>> 1. if passing platform data to MCP23S08 driver, can it make
>>
>>    MCP23S17 work?
>>
> 
> These chips should be same vendor product so I think 16-bit mcp23s17 may be
> compatible to 8-bit modes. But you have to check the data sheet to confirm this
> and track how to configure that as 8-bit mode. After that it's possible to run
> mcp23s17 with mcp23s08.c.
> 
>> 2. Generally, I'd like to know how to pass platform data to
>>
>>    a particular device driver. In my mind, platform data should
>>
>>    not be in driver code, right? However, I don't know where is
> 
> Firstly you should define this on your dts. Then parse that to register
> corresponding of_platform_device or platform_device when you setup your target
> on <your target>.c.
> 
> When spi_register_driver prober successfully, you can get the platform_data from
> associated spi device.
> 
>>    the suitable place to pass platform data to driver.
>>
>> 3. How to describe this in dts file?
>>
> 
> You can get more from the file, Documentation/powerpc/dts-bindings/spi-bus.txt.
> Or refer to those existed spi nodes on other platform dts.
> 
> Tiejun
> 
>>  
>>
>> Thanks in advance,
>>
>> YiFei
>>
>>
>>
>>



More information about the Linuxppc-dev mailing list