regmap: Add devm_regmap_init()
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> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
This commit is contained in:
parent
88e6a60e4a
commit
ffb22f6b84
@ -14,7 +14,10 @@
|
|||||||
#include <regmap.h>
|
#include <regmap.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <dm/of_addr.h>
|
#include <dm/of_addr.h>
|
||||||
|
#include <dm/devres.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/compat.h>
|
||||||
|
#include <linux/err.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -228,6 +231,32 @@ err:
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
#endif
|
||||||
|
|
||||||
void *regmap_get_range(struct regmap *map, unsigned int range_num)
|
void *regmap_get_range(struct regmap *map, unsigned int range_num)
|
||||||
|
@ -75,6 +75,9 @@ struct regmap_range {
|
|||||||
ulong size;
|
ulong size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct regmap_bus;
|
||||||
|
struct regmap_config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct regmap - a way of accessing hardware/bus registers
|
* struct regmap - a way of accessing hardware/bus registers
|
||||||
*
|
*
|
||||||
@ -335,6 +338,21 @@ 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);
|
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 a valid pointer to a struct regmap or a ERR_PTR() on error.
|
||||||
|
* 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
|
* regmap_get_range() - Obtain the base memory address of a regmap range
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user