in core.c [100:162]
static int nvmem_access_with_keepouts(struct nvmem_device *nvmem,
unsigned int offset, void *val,
size_t bytes, int write)
{
unsigned int end = offset + bytes;
unsigned int kend, ksize;
const struct nvmem_keepout *keepout = nvmem->keepout;
const struct nvmem_keepout *keepoutend = keepout + nvmem->nkeepout;
int rc;
/*
* Skip all keepouts before the range being accessed.
* Keepouts are sorted.
*/
while ((keepout < keepoutend) && (keepout->end <= offset))
keepout++;
while ((offset < end) && (keepout < keepoutend)) {
/* Access the valid portion before the keepout. */
if (offset < keepout->start) {
kend = min(end, keepout->start);
ksize = kend - offset;
if (write)
rc = __nvmem_reg_write(nvmem, offset, val, ksize);
else
rc = __nvmem_reg_read(nvmem, offset, val, ksize);
if (rc)
return rc;
offset += ksize;
val += ksize;
}
/*
* Now we're aligned to the start of this keepout zone. Go
* through it.
*/
kend = min(end, keepout->end);
ksize = kend - offset;
if (!write)
memset(val, keepout->value, ksize);
val += ksize;
offset += ksize;
keepout++;
}
/*
* If we ran out of keepouts but there's still stuff to do, send it
* down directly
*/
if (offset < end) {
ksize = end - offset;
if (write)
return __nvmem_reg_write(nvmem, offset, val, ksize);
else
return __nvmem_reg_read(nvmem, offset, val, ksize);
}
return 0;
}