* Re: platform bus, usage?
2004-08-22 20:45 platform bus, usage? Pierre Ossman
@ 2004-08-22 23:02 ` John Lenz
0 siblings, 0 replies; 2+ messages in thread
From: John Lenz @ 2004-08-22 23:02 UTC (permalink / raw)
To: Pierre Ossman; +Cc: linux-kernel
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
^ permalink raw reply [flat|nested] 2+ messages in thread