android: persistent_ram: Allow specifying ecc parameters in platform data

Change-Id: If5aaa968f6ce85ac8e18f07cca286f20f0aa6e58
Signed-off-by: Arve Hjønnevåg <arve@android.com>
This commit is contained in:
Arve Hjønnevåg
2012-05-22 16:33:23 -07:00
parent 6ce7d7aa4b
commit 6411d5781d
2 changed files with 17 additions and 9 deletions

View File

@@ -190,7 +190,7 @@ static void persistent_ram_ecc_old(struct persistent_ram_zone *prz)
} }
static int persistent_ram_init_ecc(struct persistent_ram_zone *prz, static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,
size_t buffer_size) size_t buffer_size, struct persistent_ram *ram)
{ {
int numerr; int numerr;
struct persistent_ram_buffer *buffer = prz->buffer; struct persistent_ram_buffer *buffer = prz->buffer;
@@ -199,10 +199,10 @@ static int persistent_ram_init_ecc(struct persistent_ram_zone *prz,
if (!prz->ecc) if (!prz->ecc)
return 0; return 0;
prz->ecc_block_size = 128; prz->ecc_block_size = ram->ecc_block_size ?: 128;
prz->ecc_size = 16; prz->ecc_size = ram->ecc_size ?: 16;
prz->ecc_symsize = 8; prz->ecc_symsize = ram->ecc_symsize ?: 8;
prz->ecc_poly = 0x11d; prz->ecc_poly = ram->ecc_poly ?: 0x11d;
ecc_blocks = DIV_ROUND_UP(prz->buffer_size - prz->ecc_size, ecc_blocks = DIV_ROUND_UP(prz->buffer_size - prz->ecc_size,
prz->ecc_block_size + prz->ecc_size); prz->ecc_block_size + prz->ecc_size);
@@ -375,7 +375,7 @@ static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
} }
static int __devinit persistent_ram_buffer_init(const char *name, static int __devinit persistent_ram_buffer_init(const char *name,
struct persistent_ram_zone *prz) struct persistent_ram_zone *prz, struct persistent_ram **ramp)
{ {
int i; int i;
struct persistent_ram *ram; struct persistent_ram *ram;
@@ -386,9 +386,11 @@ static int __devinit persistent_ram_buffer_init(const char *name,
start = ram->start; start = ram->start;
for (i = 0; i < ram->num_descs; i++) { for (i = 0; i < ram->num_descs; i++) {
desc = &ram->descs[i]; desc = &ram->descs[i];
if (!strcmp(desc->name, name)) if (!strcmp(desc->name, name)) {
*ramp = ram;
return persistent_ram_buffer_map(start, return persistent_ram_buffer_map(start,
desc->size, prz); desc->size, prz);
}
start += desc->size; start += desc->size;
} }
} }
@@ -399,6 +401,7 @@ static int __devinit persistent_ram_buffer_init(const char *name,
static __devinit static __devinit
struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc) struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc)
{ {
struct persistent_ram *ram;
struct persistent_ram_zone *prz; struct persistent_ram_zone *prz;
int ret = -ENOMEM; int ret = -ENOMEM;
@@ -410,14 +413,14 @@ struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc)
INIT_LIST_HEAD(&prz->node); INIT_LIST_HEAD(&prz->node);
ret = persistent_ram_buffer_init(dev_name(dev), prz); ret = persistent_ram_buffer_init(dev_name(dev), prz, &ram);
if (ret) { if (ret) {
pr_err("persistent_ram: failed to initialize buffer\n"); pr_err("persistent_ram: failed to initialize buffer\n");
goto err; goto err;
} }
prz->ecc = ecc; prz->ecc = ecc;
ret = persistent_ram_init_ecc(prz, prz->buffer_size); ret = persistent_ram_init_ecc(prz, prz->buffer_size, ram);
if (ret) if (ret)
goto err; goto err;

View File

@@ -31,6 +31,11 @@ struct persistent_ram {
phys_addr_t start; phys_addr_t start;
phys_addr_t size; phys_addr_t size;
int ecc_block_size;
int ecc_size;
int ecc_symsize;
int ecc_poly;
int num_descs; int num_descs;
struct persistent_ram_descriptor *descs; struct persistent_ram_descriptor *descs;