mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-28 23:50:26 +09:00
dm: syscon: Allow finding devices by driver data
We have a way to find a regmap by its syscon driver data value. Add the same for syscon itself. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
907eed2ce3
commit
ac94b7bcbe
@ -32,7 +32,7 @@ static int syscon_pre_probe(struct udevice *dev)
|
|||||||
return regmap_init_mem(dev, &priv->regmap);
|
return regmap_init_mem(dev, &priv->regmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
|
int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
struct uclass *uc;
|
struct uclass *uc;
|
||||||
@ -40,22 +40,29 @@ struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
|
|||||||
|
|
||||||
ret = uclass_get(UCLASS_SYSCON, &uc);
|
ret = uclass_get(UCLASS_SYSCON, &uc);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ret;
|
||||||
uclass_foreach_dev(dev, uc) {
|
uclass_foreach_dev(dev, uc) {
|
||||||
if (dev->driver_data == driver_data) {
|
if (dev->driver_data == driver_data) {
|
||||||
struct syscon_uc_info *priv;
|
*devp = dev;
|
||||||
int ret;
|
return device_probe(dev);
|
||||||
|
|
||||||
ret = device_probe(dev);
|
|
||||||
if (ret)
|
|
||||||
return ERR_PTR(ret);
|
|
||||||
priv = dev_get_uclass_priv(dev);
|
|
||||||
|
|
||||||
return priv->regmap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERR_PTR(-ENODEV);
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct regmap *syscon_get_regmap_by_driver_data(ulong driver_data)
|
||||||
|
{
|
||||||
|
struct syscon_uc_info *priv;
|
||||||
|
struct udevice *dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = syscon_get_by_driver_data(driver_data, &dev);
|
||||||
|
if (ret)
|
||||||
|
return ERR_PTR(ret);
|
||||||
|
priv = dev_get_uclass_priv(dev);
|
||||||
|
|
||||||
|
return priv->regmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *syscon_get_first_range(ulong driver_data)
|
void *syscon_get_first_range(ulong driver_data)
|
||||||
|
@ -32,6 +32,20 @@ struct syscon_ops {
|
|||||||
*/
|
*/
|
||||||
struct regmap *syscon_get_regmap(struct udevice *dev);
|
struct regmap *syscon_get_regmap(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* syscon_get_regmap_by_driver_data() - Look up a controller by its ID
|
||||||
|
*
|
||||||
|
* Each system controller can be accessed by its driver data, which is
|
||||||
|
* assumed to be unique through the scope of all system controllers that
|
||||||
|
* are in use. This function looks up the controller given this driver data.
|
||||||
|
*
|
||||||
|
* @driver_data: Driver data value to look up
|
||||||
|
* @devp: Returns the controller correponding to @driver_data
|
||||||
|
* @return 0 on success, -ENODEV if the ID was not found, or other -ve error
|
||||||
|
* code
|
||||||
|
*/
|
||||||
|
int syscon_get_by_driver_data(ulong driver_data, struct udevice **devp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* syscon_get_regmap_by_driver_data() - Look up a controller by its ID
|
* syscon_get_regmap_by_driver_data() - Look up a controller by its ID
|
||||||
*
|
*
|
||||||
|
@ -29,3 +29,20 @@ static int dm_test_syscon_base(struct unit_test_state *uts)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
DM_TEST(dm_test_syscon_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
DM_TEST(dm_test_syscon_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
||||||
|
|
||||||
|
/* Test system controller finding */
|
||||||
|
static int dm_test_syscon_by_driver_data(struct unit_test_state *uts)
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
|
||||||
|
ut_assertok(syscon_get_by_driver_data(SYSCON0, &dev));
|
||||||
|
ut_asserteq(SYSCON0, dev->driver_data);
|
||||||
|
|
||||||
|
ut_assertok(syscon_get_by_driver_data(SYSCON1, &dev));
|
||||||
|
ut_asserteq(SYSCON1, dev->driver_data);
|
||||||
|
|
||||||
|
ut_asserteq(-ENODEV, syscon_get_by_driver_data(2, &dev));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
DM_TEST(dm_test_syscon_by_driver_data, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
|
||||||
|
Loading…
Reference in New Issue
Block a user