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/