[PATCH v5 04/12] spi: add ti-ssp spi master driver
Grant Likely
grant.likely at secretlab.ca
Tue Nov 16 02:47:04 EST 2010
On Tue, Nov 16, 2010 at 12:22 AM, Grant Likely
<grant.likely at secretlab.ca> wrote:
> On Mon, Nov 15, 2010 at 02:12:06PM -0500, Cyril Chemparathy wrote:
>> This patch adds an SPI master implementation that operates on top of an
>> underlying TI-SSP port.
>>
>> Signed-off-by: Cyril Chemparathy <cyril at ti.com>
> [...]
>> +static int __init ti_ssp_spi_init(void)
>> +{
>> + return platform_driver_register(&ti_ssp_spi_driver);
>> +}
>> +subsys_initcall(ti_ssp_spi_init);
>
> After discussions about device init dependencies at plumbers, and
> since this is the first SPI device driver I've reviewed since that
> dicussion, this driver gets to be the first to implement the proposed
> policy. :-)
>
> Change this to module_initcall(). Many spi and i2c drivers use
> module or subsys_initcall to try and influence driver probe order so
> that certain regulator chips get registered before the devices that
> try to use them. This approach is insane.
>
> Instead, it is now incumbent on the board support code to ensure that
> any device that depends on another device (including i2c or spi
> regulators) will defer registration until the prerequisite devices are
> bound to drivers.
>
> I don't *think* this change will affect anything in this particular
> patch series, but if it does then let me know and I'll help you work out
> how to fix it using a bus notifier.
Oh, wait, spoke too soon. You do add a regulator in this series, so
this change will require a fixup. The solution is to register an
bus_notifier to the spi bus type before you start registering devices.
It also requires deferring the musb_hdrc.1 and tps6116x registrations
until the bus_notifier callback gets called with an indication that
the regulator is bound. It will look something like this:
static int tnetv107x_spi_notifier_call(struct notifier_block *nb,
unsigned long event, void *__dev)
{
struct device *dev = __dev;
if ((event == BUS_NOTIFY_BOUND_DRIVER) && (dev == (the-regulator))) {
register-the-remaining-devices();
return NOTIFY_STOP;
};
return NOTIFY_DONE;
}
static struct notifier_block tnetv107x_spi_nb = {
.notifier_call = tnetv107x_spi_notifier_call,
};
and then in the device registration code, before registering the
regulator:
bus_register_notifier(&spi_bus_type, &tnetv107x_spi_nb);
Let me know if you have any trouble.
g.
More information about the linux-arm-kernel
mailing list