The “secret” of kernel driver development is that, unless you are working on really exotic, never-before-seen hardware, there are lots of example drivers to choose from. Almost all accomplished kernel developers will read the code for the existing drivers before choosing one to copy and use as a template.
Thus the very best source for references for i2c client driver development is the kernel source itself. The critical skill a kernel driver writer must develop is how to select a driver to use as a template. Personally I look for a mix of freshness (i.e. a recently added driver where I can go and read the LKML review comments from the maintainer) and similarity of hardware (i.e. a driver for hardware that has similar data flow to the hardware I want to enable).
There is API documentation to help you understand what the drivers do: https://www.kernel.org/doc/html/v4.12/driver-api/i2c.html . However, since that documentation is derived from comments in the kernel sources, I prefer to use a source navigator to find out what a specific bit of kernel API does.
PS Linux Device Drivers is getting a bit old now, but nevertheless it remains a good primer for the overall structure of a kernel driver and as an introduction to some key kernel APIs. If you struggle to read the I2C drivers in the kernel you should take a look at this. Just be aware that not all the example code will run without modification on the latest kernels.