On Fri, May 11, 2012 at 5:17 PM, Anton Vorontsov <anton.vorontsov@xxxxxxxxxx> wrote: > The routine just creates a persistent ram zone at a specified address. > > For persistent_ram_init_ringbuffer() we'd need to add a > 'struct persistent_ram' to the global list, and associate it with a > device. We don't need all this complexity in pstore_ram, so we introduce > the simple function. > > Signed-off-by: Anton Vorontsov <anton.vorontsov@xxxxxxxxxx> > --- > drivers/staging/android/persistent_ram.c | 26 ++++++++++++++++++++++++++ > drivers/staging/android/persistent_ram.h | 4 ++++ > 2 files changed, 30 insertions(+) > > diff --git a/drivers/staging/android/persistent_ram.c b/drivers/staging/android/persistent_ram.c > index ec23822..c0c3d32 100644 > --- a/drivers/staging/android/persistent_ram.c > +++ b/drivers/staging/android/persistent_ram.c > @@ -412,6 +412,32 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool > return 0; > } > > +struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start, > + size_t size, > + bool ecc) > +{ > + struct persistent_ram_zone *prz; > + int ret = -ENOMEM; > + > + prz = kzalloc(sizeof(struct persistent_ram_zone), GFP_KERNEL); > + if (!prz) { > + pr_err("persistent_ram: failed to allocate persistent ram zone\n"); > + goto err; > + } > + > + ret = persistent_ram_buffer_map(start, size, prz); > + if (ret) > + goto err; > + > + persistent_ram_post_init(prz, ecc); > + persistent_ram_update_header_ecc(prz); > + > + return prz; > +err: > + kfree(prz); > + return ERR_PTR(ret); > +} > + > static __init > struct persistent_ram_zone *__persistent_ram_init(struct device *dev, bool ecc) > { > diff --git a/drivers/staging/android/persistent_ram.h b/drivers/staging/android/persistent_ram.h > index 5635355..8154d15 100644 > --- a/drivers/staging/android/persistent_ram.h > +++ b/drivers/staging/android/persistent_ram.h > @@ -19,6 +19,7 @@ > #include <linux/kernel.h> > #include <linux/list.h> > #include <linux/types.h> > +#include <linux/init.h> > > struct persistent_ram_buffer; > > @@ -62,6 +63,9 @@ struct persistent_ram_zone { > > int persistent_ram_early_init(struct persistent_ram *ram); > > +struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start, > + size_t size, > + bool ecc); > struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev, > bool ecc); > > -- > 1.7.9.2 > Overall I like this series, but I'm not sure I agree with persistent_ram_new(). The point of persistent_ram_early_init with the call to memblock_reserve and the persistent_ram_descriptor list was to have a single pool of persistent memory that could be parcelled out to whatever drivers needed it, keeping the code out of the board file. With persistent_ram_new, the board file is now responsible for making sure that the memory has been reserved with memblock_reserve(), or, even worse, mem= from the bootloader. Mixing the two methods together would be confusing. Either persistent_ram_early_init should be removed completely (or replaced with something that is easier to register ramoops into), or ramoops should use persistent_ram_init_ringbuffer like ram_console does. _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel