On Thu, Jan 22, 2009 at 12:55:48PM +0100, Arnd Bergmann wrote: > On Thursday 22 January 2009, Anton Vorontsov wrote: > > + /* > > + * These accessors duplicate sdhci_ops, but there are two reasons > > for > > + * this: > > + * 1. sdhci_ops are const, so the sdhci driver won't able to assign > > + * default ops; > > You could assign the pointer to a const default_sdhci_ops structure, > which IMHO would be cleaner than copying the function pointers > separately.
This won't work because ops also specify non-memory accessors ops (i.e. enable_dma, set_clock, ...), so we can't just assign default_ops ptr. > > + * 2. Using host->X instead of host->ops->X saves us one > > dereference. > > + * This can be useful in PIO mode. (Though the benefit of this > > + * is negligibly small). > > + */ > > I doubt that this is even measurable. Yeah, I didn't even bother w/ measuring. ;-) > If it was, you could still use a copy of that structure, like > > struct sdhci_host { > ... > struct sdhci_ops ops; /* not struct sdhci_ops *ops */ > ... > }; > > and do an assignment of the structure, like > > static void assign_ops(struct sdhci_host *host, struct sdhci_ops *ops) > { > host->ops = *ops; > } This will work. Pierre, what do you think? That way drivers will call this routine instead of "host->ops = driver_ops_ptr". The other option would be to remove const from the ops. Or implement another non-const ops struct (struct sdhci_io_ops?). In any way, the type-checked variant will be even longer to type: host->mem_ops->writel(val, host->ioaddr + reg); host->ops.writel(val, host->ioaddr + reg); host->writel(val, host->ioaddr + reg); Thanks, -- Anton Vorontsov email: cbouatmai...@gmail.com irc://irc.freenode.net/bd2 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev