This is the sort of thing I started with. It looks easier at first, but as you hit kernel churn, white space issues, the need to delete struct members or even rewrite structs and the code that uses them, and a lot of other trivial things, I expect you to quickly find you need a semantic patch. But the proof is in the pudding -- just give it a try and see how it goes.
Note that on i915tool, I got about 50% of the way there with coccinnelle, and even had things working in user mode, but my new approach is to build up code from the traced IO stream. And, at the end, there's no way to avoid a lot of hand work, it seems. But maybe the intel stuff is particularly hard, that seems to be the rule.
ron