Subject: Re: Generic MMC-over-SPI binding?

From: Arnd Bergmann <[email-masked]>
Date: Tue, 8 Jan 2008 18:27:13 +0100

On Tuesday 08 January 2008, Simon Richter wrote:
> in an embedded system similar to the lite5200 board, there is an MMC 
> card socket connected to one of the PSCs. Ideally, I'd like to express 
> this fact via the device tree and have the kernel bind the mmc-spi 
> driver to the SPI interface, but I cannot find any place where to insert 
> this code that I feel comfortable with.
> ...
> Any ideas?
> 

One way you could do it would be to have an spi_board_info in the
way that mpc832x_spi_init does it, but that would not make use of the
device tree.

What would probably be a better way is to call spi_new_device()
from the mpc52xx_psc_spi driver, with an spi_board_info you generate
on the fly for each child of the spi controller.

The important part where this connects to the mmc-spi driver is that
you need to set spi_board_info->modalias to "mmc-spi", if the
device node can be identified as an mmc card.
We'd have to define a list of valid identifications of SPI devices
in the device tree, and teach the SPI drivers how they relate to
linux device drivers like mmc-spi.

Since that part of the code would be used by all device tree based
SPI master drivers, it should be in a separate module, which can
consist of a single exported function, like (paraphrased):

void spi_of_scan_master(struct spi_master *master)
{
	struct device_node *child;
	of_dev_for_each_child(master->dev->node, child) {
		struct spi_board_info *info;
		info = kzalloc(sizeof (*info), GFP_KERNEL);
		if (of_device_is_compatible(child, "spi,mmc"))
			strcpy(info->modalias, "mmc-spi");
		else if (of_device_is_compatible(child, "spi,foo"))
			strcpy(info->modalias, "foo");
		else
			strcpy(info->modalias, "");

		info->irq = irq_of_parse_and_map(child);
		
		spi_new_device(master, child);
	}
}

Then you call that function after registering the master, from
mpc52xx_psc_spi_of_probe.

	Arnd <><