Re: platform bus, usage?

From: John Lenz
Date: Sun Aug 22 2004 - 18:03:39 EST


On 08/22/04 15:45:58, Pierre Ossman wrote:
I'm in the process of writing a driver for a SD/MMC card reader. Since this is the first driver I'm writing I'm having some difficulties fitting it into the linux driver model. I've read all the documentation I can find to no avail.

The device is attached to the LPC bus and cannot be found using PNP. From what I can gather this driver should therefore be organised under the platform bus. I can't figure out how to do this though. I've created the device structure, with platform_bus_type at .bus. I've called device_register with the structure. Now how to I create a device object and attach this to the bus? With PCI I guess this handles itself using the PCI id:s.

At the moment I just let the driver play by itself. But that doesn't seem to be using the driver model properly.

Any pointers would be helpful. Documentation, functions, example drivers, anything.

First example that comes to mind is the pxafb framebuffer device. The framebuffer device_driver is implemented in drivers/video/pxafb.c. The actual devices are implemented in various files in arch/arm/mach-pxa, for example, take a look at arch/arm/mach-pxa/generic.c

It is a little confusing, becuase the driver just uses a normal device_driver structure, but for the actual device, you need to create and register a platform_device structure.

So the driver has something like this
static struct device_driver pxafb_driver = {
.name = "pxa2xx-fb",
.bus = &platform_bus_type,
.probe = pxafb_probe,
#ifdef CONFIG_PM
.suspend = pxafb_suspend,
.resume = pxafb_resume,
#endif
};

registered with a normal driver_register.

the actual device looks like
static struct platform_device pxafb_device = {
.name = "pxa2xx-fb",
.id = -1,
.dev = {
.platform_data = &pxa_fb_info,
.dma_mask = &fb_dma_mask,
.coherent_dma_mask = 0xffffffff,
},
.num_resources = ARRAY_SIZE(pxafb_resources),
.resource = pxafb_resources,
};
and it is registered with platform_add_devices.

Notice the two names are the same. Devices and drivers on the platform bus are matched by name. (see platform_match function in drivers/base/ platform.c)

Hope that helps,
John

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/