2010/8/16 Patrick Pannuto <ppannuto@xxxxxxxxxxxxxx>: > On 08/13/2010 03:05 PM, Grant Likely wrote: >> On Tue, Aug 10, 2010 at 5:49 PM, Patrick Pannuto [...] >>> + * @bus: partially complete bus type to register >>> + * >>> + * This init will fill in any ommitted fields in @bus, however, it >>> + * also allocates memory and replaces the pm field in @bus, since >>> + * pm is const, but some of its pointers may need this one-time >>> + * initialziation overwrite. >>> + * >>> + * @bus's registered this way should be released with >>> + * pseudo_platform_bus_unregister >>> + */ >>> +int pseudo_platform_bus_register(struct bus_type *bus) >>> +{ >>> + int error; >>> + struct dev_pm_ops* heap_pm; >>> + heap_pm = kmalloc(sizeof (*heap_pm), GFP_KERNEL); >>> + >>> + if (!heap_pm) >>> + return -ENOMEM; >>> + >>> + if (!bus->dev_attrs) >>> + bus->dev_attrs = platform_bus_type.dev_attrs; >>> + if (!bus->match) >>> + bus->match = platform_bus_type.match; >>> + if (!bus->uevent) >>> + bus->uevent = platform_bus_type.uevent; >>> + if (!bus->pm) >>> + memcpy(heap_pm, &platform_bus_type.pm, sizeof(*heap_pm)); >>> + else { >>> + heap_pm->prepare = (bus->pm->prepare) ? >>> + bus->pm->prepare : platform_pm_prepare; >>> + heap_pm->complete = (bus->pm->complete) ? >>> + bus->pm->complete : platform_pm_complete; [and so on ...] >>> + heap_pm->runtime_idle = (bus->pm->runtime_idle) ? >>> + bus->pm->runtime_idle : platform_pm_runtime_idle; >>> + } >>> + bus->pm = heap_pm; >>> + >>> + error = bus_register(bus); >>> + if (error) >>> + kfree(bus->pm); >>> + >>> + return error; >>> +} >>> +EXPORT_SYMBOL_GPL(pseudo_platform_bus_register); >> >> Ick, this is a nasty list of conditional statements. :-) Instead it >> could have an unconditional initialize function which sets it up just >> like the platform bus without registering. Then allow the >> foo_bus_type initialization code override the ones it cares about, and >> then register directly. >> > No, this won't work. (Unless, every pseudo_bus_type author did this same > kludge to work around const - better to do once IMHO) Actually you can do: const struct dev_pm_ops test = { DEFAULT_PLATFORM_PM_OPS, .prepare = my_func, ... }; where: #define DEFAULT_PLATFORM_PM_OPS \ .prepare = platform_pm_prepare, \ .complete = platform_pm_complete, \ ... In case of repeated field assignments, gcc uses the last value (as per http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html). Best Regards, Michał Mirosław -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html