On 6/16/08, Timur Tabi timur@freescale.com wrote:
Jon Smirl wrote:
The drivers are creating their own platform devices. Constructing them in the driver builds in the assumption that if the driver is loaded, then the devices are present. But that's not right in my case, I have four fabric drivers built in and I only want one of them active.
You have two choices:
- Load all drivers. In each driver's __init section, let it determine whether
it should load or not. If not, it can fail silently. Off the top of my head, I don't remember how to do that.
- Use the Kernel Module Loader to dynamically load the module you want. I
don't know how this works either.
The devices are being created in the wrong place. So instead of my proposal of reading the platform name out of the device tree and loading the driver from fsl_ssi, in Timur's case the fabric device should be created in arch/powerpc/platforms/86xx/mpc8610_hpcd.c. PowerPC is already capable of making the codec device from the device tree.
True, but I chose to keep it in sound/soc/fsl so that I wouldn't have to push 3 drivers to alsa-devel and one driver to linuxppc-dev.
The driver stays in sound/soc/fsl. It's only the creation of the device that moves. You just need to add this to arch/powerpc/platforms/86xx/mpc8610_hpcd.c and remove it from mpc8610_hpcd.c. Adding this to arch/powerpc/platforms/86xx/mpc8610_hpcd.c will have no effect if the mpc8610_hpcd.c driver is not to be found.
You've complicated it by creating two fabric devices but I believe your code could be changed to only make one.
static struct platform_device alsa_fabric = { .name = "MPC8610HPCD", .id = -1, };
static struct platform_device *devices[] = { &alsa_fabric, };
platform_add_devices(&devices[0], ARRAY_SIZE(devices));
I'd rename the driver to something less generic. .name = "MPC8610HPCD-fabric",
-- Timur Tabi Linux kernel developer at Freescale