On 04.02.2013 23:43, Thierry Reding wrote: > My point was that you could include the call to host1x_syncpt_reset() > within host1x_syncpt_init(). That will keep unneeded code out of the > host1x_probe() function. Also you don't want to use the syncpoints > uninitialized, right? Of course, sorry, I misunderstood. That makes a lot of sense. >>>> + */ >>>> +static u32 syncpt_load_min(struct host1x_syncpt *sp) >>>> +{ >>>> + struct host1x *dev = sp->dev; >>>> + u32 old, live; >>>> + >>>> + do { >>>> + old = host1x_syncpt_read_min(sp); >>>> + live = host1x_sync_readl(dev, >>>> + HOST1X_SYNC_SYNCPT_0 + sp->id * 4); >>>> + } while ((u32)atomic_cmpxchg(&sp->min_val, old, live) != old); >>> >>> I think this warrants a comment. >> >> Sure. It just loops in case there's a race writing to min_val. > > Oh, I see. That'd make a good comment. Is the cast to (u32) really > necessary? I'll add a comment. atomic_cmpxchg returns a signed value, so I think the cast is needed. > Save/restore has the disadvantage of the direction not being implicit. > Save could mean save to hardware or save to software. The same is true > for restore. However if the direction is clearly defined, save and > restore work for me. > > Maybe the comment could be changed to be more explicit. Something like: > > /* > * Write cached syncpoint and waitbase values to hardware. > */ > > And for host1x_syncpt_save(): > > /* > * For client-managed registers, update the cached syncpoint and > * waitbase values by reading from the registers. > */ I was using save in the same way as f.ex. i915 (i915_suspend.c): save state of hardware to RAM, restore state from RAM. I'll add proper comments, but save and restore are for all syncpts, not only client managed. > >>>> +/* >>>> + * Updates the last value read from hardware. >>>> + */ >>>> +u32 host1x_syncpt_load_min(struct host1x_syncpt *sp) >>>> +{ >>>> + u32 val; >>>> + val = sp->dev->syncpt_op.load_min(sp); >>>> + trace_host1x_syncpt_load_min(sp->id, val); >>>> + >>>> + return val; >>>> +} > Maybe the function should be called host1x_syncpt_load() if there is no > equivalent way to load the maximum value (since there is no register to > read from). Sounds good. Maximum is just a software concept. > That's certainly true for interrupts. However, if you look at the DMA > subsystem for example, you can also request an unnamed resource. > > The difference is sufficiently subtle that host1x_syncpt_allocate() > would work for me too, though. I just have a slight preference for > host1x_syncpt_request(). I don't really have a strong preference, so I'll follow your suggestion. Terje -- To unsubscribe from this list: send the line "unsubscribe linux-tegra" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html