in core.c [629:680]
static int nvmem_validate_keepouts(struct nvmem_device *nvmem)
{
unsigned int cur = 0;
const struct nvmem_keepout *keepout = nvmem->keepout;
const struct nvmem_keepout *keepoutend = keepout + nvmem->nkeepout;
while (keepout < keepoutend) {
/* Ensure keepouts are sorted and don't overlap. */
if (keepout->start < cur) {
dev_err(&nvmem->dev,
"Keepout regions aren't sorted or overlap.\n");
return -ERANGE;
}
if (keepout->end < keepout->start) {
dev_err(&nvmem->dev,
"Invalid keepout region.\n");
return -EINVAL;
}
/*
* Validate keepouts (and holes between) don't violate
* word_size constraints.
*/
if ((keepout->end - keepout->start < nvmem->word_size) ||
((keepout->start != cur) &&
(keepout->start - cur < nvmem->word_size))) {
dev_err(&nvmem->dev,
"Keepout regions violate word_size constraints.\n");
return -ERANGE;
}
/* Validate keepouts don't violate stride (alignment). */
if (!IS_ALIGNED(keepout->start, nvmem->stride) ||
!IS_ALIGNED(keepout->end, nvmem->stride)) {
dev_err(&nvmem->dev,
"Keepout regions violate stride.\n");
return -EINVAL;
}
cur = keepout->end;
keepout++;
}
return 0;
}