Message ID | 20190927132221.17892-3-jjhiblot@ti.com |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
Series | regmap: Add a managed API, custom read/write callbacks and support for regmap fields | expand |
Hi Jean-Jacques, On Fri, 27 Sep 2019 at 07:22, Jean-Jacques Hiblot <jjhiblot@ti.com> wrote: > > Most of new linux drivers are using managed-API to allocate resources. To > ease porting drivers from linux to u-boot, introduce devm_regmap_init() as U-Boot Please always spell it that way. > a managed API to get a regmap from the device tree. > > Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> > --- > > drivers/core/regmap.c | 26 ++++++++++++++++++++++++++ > include/regmap.h | 19 +++++++++++++++++++ > 2 files changed, 45 insertions(+) Reviewed-by: Simon Glass <sjg@chromium.org> Nit below > > diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c > index e9e55c9d16..f69ff6d12f 100644 > --- a/drivers/core/regmap.c > +++ b/drivers/core/regmap.c > @@ -219,6 +219,32 @@ int regmap_init_mem(ofnode node, struct regmap **mapp) > > return 0; > } > + > +static void devm_regmap_release(struct udevice *dev, void *res) > +{ > + regmap_uninit(*(struct regmap **)res); > +} > + > +struct regmap *devm_regmap_init(struct udevice *dev, > + const struct regmap_bus *bus, > + void *bus_context, > + const struct regmap_config *config) > +{ > + int rc; > + struct regmap **mapp; > + > + mapp = devres_alloc(devm_regmap_release, sizeof(struct regmap *), > + __GFP_ZERO); > + if (unlikely(!mapp)) > + return ERR_PTR(-ENOMEM); > + > + rc = regmap_init_mem(dev_ofnode(dev), mapp); > + if (rc) > + return ERR_PTR(rc); > + > + devres_add(dev, mapp); > + return *mapp; > +} > #endif > > void *regmap_get_range(struct regmap *map, unsigned int range_num) > diff --git a/include/regmap.h b/include/regmap.h > index 0854200a9c..63a362d86d 100644 > --- a/include/regmap.h > +++ b/include/regmap.h > @@ -73,6 +73,9 @@ struct regmap_range { > ulong size; > }; > > +struct regmap_bus; > +struct regmap_config; > + > /** > * struct regmap - a way of accessing hardware/bus registers > * > @@ -332,6 +335,22 @@ int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count, > > int regmap_init_mem_index(ofnode node, struct regmap **mapp, int index); > > +/** > + * devm_regmap_init() - Initialise register map (device managed) > + * > + * @dev: Device that will be interacted with > + * @bus: Bus-specific callbacks to use with device (IGNORED) > + * @bus_context: Data passed to bus-specific callbacks (IGNORED) > + * @config: Configuration for register map (IGNORED) > + * @return > + * The return value will be an ERR_PTR() on error or a valid pointer to > + * a struct regmap. > + * The structure is automatically freed when the device is unbound > + */ > +struct regmap *devm_regmap_init(struct udevice *dev, > + const struct regmap_bus *bus, > + void *bus_context, > + const struct regmap_config *config); > /** > * regmap_get_range() - Obtain the base memory address of a regmap range > * > -- > 2.17.1 >
diff --git a/drivers/core/regmap.c b/drivers/core/regmap.c index e9e55c9d16..f69ff6d12f 100644 --- a/drivers/core/regmap.c +++ b/drivers/core/regmap.c @@ -219,6 +219,32 @@ int regmap_init_mem(ofnode node, struct regmap **mapp) return 0; } + +static void devm_regmap_release(struct udevice *dev, void *res) +{ + regmap_uninit(*(struct regmap **)res); +} + +struct regmap *devm_regmap_init(struct udevice *dev, + const struct regmap_bus *bus, + void *bus_context, + const struct regmap_config *config) +{ + int rc; + struct regmap **mapp; + + mapp = devres_alloc(devm_regmap_release, sizeof(struct regmap *), + __GFP_ZERO); + if (unlikely(!mapp)) + return ERR_PTR(-ENOMEM); + + rc = regmap_init_mem(dev_ofnode(dev), mapp); + if (rc) + return ERR_PTR(rc); + + devres_add(dev, mapp); + return *mapp; +} #endif void *regmap_get_range(struct regmap *map, unsigned int range_num) diff --git a/include/regmap.h b/include/regmap.h index 0854200a9c..63a362d86d 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -73,6 +73,9 @@ struct regmap_range { ulong size; }; +struct regmap_bus; +struct regmap_config; + /** * struct regmap - a way of accessing hardware/bus registers * @@ -332,6 +335,22 @@ int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count, int regmap_init_mem_index(ofnode node, struct regmap **mapp, int index); +/** + * devm_regmap_init() - Initialise register map (device managed) + * + * @dev: Device that will be interacted with + * @bus: Bus-specific callbacks to use with device (IGNORED) + * @bus_context: Data passed to bus-specific callbacks (IGNORED) + * @config: Configuration for register map (IGNORED) + * + * The return value will be an ERR_PTR() on error or a valid pointer to + * a struct regmap. + * The structure is automatically freed when the device is unbound + */ +struct regmap *devm_regmap_init(struct udevice *dev, + const struct regmap_bus *bus, + void *bus_context, + const struct regmap_config *config); /** * regmap_get_range() - Obtain the base memory address of a regmap range *
Most of new linux drivers are using managed-API to allocate resources. To ease porting drivers from linux to u-boot, introduce devm_regmap_init() as a managed API to get a regmap from the device tree. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> --- drivers/core/regmap.c | 26 ++++++++++++++++++++++++++ include/regmap.h | 19 +++++++++++++++++++ 2 files changed, 45 insertions(+)