UPSTREAM: mfd: syscon: Add arguments support for syscon reference
There are a lot of similar global registers being used across multiple SoCs from Unisoc. But most of these registers are assigned with different offset for different SoCs. It is hard to handle all of them in an all-in-one kernel image. Add a helper function to get regmap with arguments where we could put some extra information such as the offset value. Signed-off-by: Orson Zhai <orson.zhai@unisoc.com> Tested-by: Baolin Wang <baolin.wang@unisoc.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Lee Jones <lee.jones@linaro.org> Bug: 146258076 Change-Id: I836fb64d0cdc9596623453b49fad10d3d181906e (cherry picked from commit 6a24f567af4accef6d73b0be407227c537b94a1f) Signed-off-by: Orson Zhai <orson.zhai@unisoc.com>
This commit is contained in:
parent
015003c5cb
commit
f7b16cfafc
@ -225,6 +225,35 @@ struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_phandle);
|
||||
|
||||
struct regmap *syscon_regmap_lookup_by_phandle_args(struct device_node *np,
|
||||
const char *property,
|
||||
int arg_count,
|
||||
unsigned int *out_args)
|
||||
{
|
||||
struct device_node *syscon_np;
|
||||
struct of_phandle_args args;
|
||||
struct regmap *regmap;
|
||||
unsigned int index;
|
||||
int rc;
|
||||
|
||||
rc = of_parse_phandle_with_fixed_args(np, property, arg_count,
|
||||
0, &args);
|
||||
if (rc)
|
||||
return ERR_PTR(rc);
|
||||
|
||||
syscon_np = args.np;
|
||||
if (!syscon_np)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
regmap = syscon_node_to_regmap(syscon_np);
|
||||
for (index = 0; index < arg_count; index++)
|
||||
out_args[index] = args.args[index];
|
||||
of_node_put(syscon_np);
|
||||
|
||||
return regmap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_phandle_args);
|
||||
|
||||
static int syscon_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
|
@ -23,6 +23,11 @@ extern struct regmap *syscon_regmap_lookup_by_compatible(const char *s);
|
||||
extern struct regmap *syscon_regmap_lookup_by_phandle(
|
||||
struct device_node *np,
|
||||
const char *property);
|
||||
extern struct regmap *syscon_regmap_lookup_by_phandle_args(
|
||||
struct device_node *np,
|
||||
const char *property,
|
||||
int arg_count,
|
||||
unsigned int *out_args);
|
||||
#else
|
||||
static inline struct regmap *device_node_to_regmap(struct device_node *np)
|
||||
{
|
||||
@ -45,6 +50,15 @@ static inline struct regmap *syscon_regmap_lookup_by_phandle(
|
||||
{
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
static struct regmap *syscon_regmap_lookup_by_phandle_args(
|
||||
struct device_node *np,
|
||||
const char *property,
|
||||
int arg_count,
|
||||
unsigned int *out_args)
|
||||
{
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_MFD_SYSCON_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user