dm: sandbox: i2c: Use new emulator parent uclass
Update the device tree, sandbox i2c driver and tests to use the new
emulation parent to hold emulators.
Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 1cda911..ce3c88c 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -95,19 +95,11 @@
eeprom@2c {
reg = <0x2c>;
compatible = "i2c-eeprom";
- emul {
- compatible = "sandbox,i2c-eeprom";
- sandbox,filename = "i2c.bin";
- sandbox,size = <128>;
- };
};
rtc_0: rtc@43 {
reg = <0x43>;
compatible = "sandbox-rtc";
- emul {
- compatible = "sandbox,i2c-rtc";
- };
};
sandbox_pmic: sandbox_pmic {
reg = <0x40>;
@@ -116,6 +108,23 @@
mc34708: pmic@41 {
reg = <0x41>;
};
+
+ i2c_emul: emul {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0xff>;
+ compatible = "sandbox,i2c-emul-parent";
+ emul-eeprom {
+ reg = <0x2c>;
+ compatible = "sandbox,i2c-eeprom";
+ sandbox,filename = "i2c.bin";
+ sandbox,size = <256>;
+ };
+ emul0 {
+ reg = <0x43>;
+ compatible = "sandbox,i2c-rtc";
+ };
+ };
};
lcd {
diff --git a/arch/sandbox/dts/sandbox64.dts b/arch/sandbox/dts/sandbox64.dts
index 2c6d351..d30fd62 100644
--- a/arch/sandbox/dts/sandbox64.dts
+++ b/arch/sandbox/dts/sandbox64.dts
@@ -90,19 +90,11 @@
eeprom@2c {
reg = <0x2c>;
compatible = "i2c-eeprom";
- emul {
- compatible = "sandbox,i2c-eeprom";
- sandbox,filename = "i2c.bin";
- sandbox,size = <128>;
- };
};
rtc_0: rtc@43 {
reg = <0x43>;
compatible = "sandbox-rtc";
- emul {
- compatible = "sandbox,i2c-rtc";
- };
};
sandbox_pmic: sandbox_pmic {
reg = <0x40>;
@@ -111,6 +103,19 @@
mc34708: pmic@41 {
reg = <0x41>;
};
+
+ i2c_emul: emul {
+ reg = <0xff>;
+ compatible = "sandbox,i2c-emul-parent";
+ emul-eeprom {
+ compatible = "sandbox,i2c-eeprom";
+ sandbox,filename = "i2c.bin";
+ sandbox,size = <256>;
+ };
+ emul0 {
+ compatible = "sandbox,i2c-rtc";
+ };
+ };
};
lcd {
diff --git a/arch/sandbox/dts/sandbox_pmic.dtsi b/arch/sandbox/dts/sandbox_pmic.dtsi
index 5ecafaa..565c382 100644
--- a/arch/sandbox/dts/sandbox_pmic.dtsi
+++ b/arch/sandbox/dts/sandbox_pmic.dtsi
@@ -11,40 +11,6 @@
&sandbox_pmic {
compatible = "sandbox,pmic";
- pmic_emul {
- compatible = "sandbox,i2c-pmic";
-
- /*
- * Default PMICs register values are set by macro
- * VAL2REG(min, step, value) [uV/uA]
- * VAL2OMREG(mode id)
- * reg-defaults - byte array
- */
- reg-defaults = /bits/ 8 <
- /* BUCK1 */
- VAL2REG(800000, 25000, 1000000)
- VAL2REG(150000, 25000, 150000)
- VAL2OMREG(BUCK_OM_OFF)
- /* BUCK2 */
- VAL2REG(750000, 50000, 3000000)
- VAL2REG(150000, 25000, 150000)
- VAL2OMREG(0)
- /* LDO1 */
- VAL2REG(800000, 25000, 1600000)
- VAL2REG(100000, 50000, 150000)
- VAL2OMREG(LDO_OM_OFF)
- /* LDO2 */
- VAL2REG(750000, 50000, 3000000)
- VAL2REG(150000, 25000, 150000)
- VAL2OMREG(0)
- /* reg[12:15] - not used */
- 0x00
- 0x00
- 0x00
- 0x00
- >;
- };
-
buck1 {
regulator-name = "SUPPLY_1.2V";
regulator-min-microvolt = <1200000>;
@@ -84,10 +50,45 @@
&mc34708 {
compatible = "fsl,mc34708";
+};
- pmic_emul {
+&i2c_emul {
+ emul_pmic0: pmic-emul0 {
compatible = "sandbox,i2c-pmic";
+ /*
+ * Default PMICs register values are set by macro
+ * VAL2REG(min, step, value) [uV/uA]
+ * VAL2OMREG(mode id)
+ * reg-defaults - byte array
+ */
+ reg-defaults = /bits/ 8 <
+ /* BUCK1 */
+ VAL2REG(800000, 25000, 1000000)
+ VAL2REG(150000, 25000, 150000)
+ VAL2OMREG(BUCK_OM_OFF)
+ /* BUCK2 */
+ VAL2REG(750000, 50000, 3000000)
+ VAL2REG(150000, 25000, 150000)
+ VAL2OMREG(0)
+ /* LDO1 */
+ VAL2REG(800000, 25000, 1600000)
+ VAL2REG(100000, 50000, 150000)
+ VAL2OMREG(LDO_OM_OFF)
+ /* LDO2 */
+ VAL2REG(750000, 50000, 3000000)
+ VAL2REG(150000, 25000, 150000)
+ VAL2OMREG(0)
+ /* reg[12:15] - not used */
+ 0x00
+ 0x00
+ 0x00
+ 0x00
+ >;
+ };
+
+ emul_pmic1: pmic-emul1 {
+ compatible = "sandbox,i2c-pmic";
reg-defaults = /bits/ 8 <
0x00 0x80 0x08 0xff 0xff 0xff 0x2e 0x01 0x08
0x40 0x80 0x81 0x5f 0xff 0xfb 0x1e 0x80 0x18
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 2c6b422..252aa7b 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -266,35 +266,45 @@
eeprom@2c {
reg = <0x2c>;
compatible = "i2c-eeprom";
- emul {
- compatible = "sandbox,i2c-eeprom";
- sandbox,filename = "i2c.bin";
- sandbox,size = <256>;
- };
+ sandbox,emul = <&emul_eeprom>;
};
rtc_0: rtc@43 {
reg = <0x43>;
compatible = "sandbox-rtc";
- emul {
- compatible = "sandbox,i2c-rtc";
- };
+ sandbox,emul = <&emul0>;
};
rtc_1: rtc@61 {
reg = <0x61>;
compatible = "sandbox-rtc";
- emul {
+ sandbox,emul = <&emul1>;
+ };
+
+ i2c_emul: emul {
+ reg = <0xff>;
+ compatible = "sandbox,i2c-emul-parent";
+ emul_eeprom: emul-eeprom {
+ compatible = "sandbox,i2c-eeprom";
+ sandbox,filename = "i2c.bin";
+ sandbox,size = <256>;
+ };
+ emul0: emul0 {
+ compatible = "sandbox,i2c-rtc";
+ };
+ emul1: emull {
compatible = "sandbox,i2c-rtc";
};
};
sandbox_pmic: sandbox_pmic {
reg = <0x40>;
+ sandbox,emul = <&emul_pmic0>;
};
mc34708: pmic@41 {
reg = <0x41>;
+ sandbox,emul = <&emul_pmic1>;
};
};
diff --git a/drivers/i2c/sandbox_i2c.c b/drivers/i2c/sandbox_i2c.c
index 66578510..0dbbaa0 100644
--- a/drivers/i2c/sandbox_i2c.c
+++ b/drivers/i2c/sandbox_i2c.c
@@ -21,33 +21,15 @@
struct dm_i2c_ops **opsp)
{
struct dm_i2c_chip *plat;
- struct udevice *child;
int ret;
*devp = NULL;
*opsp = NULL;
plat = dev_get_parent_platdata(dev);
if (!plat->emul) {
- ret = dm_scan_fdt_dev(dev);
+ ret = i2c_emul_find(dev, &plat->emul);
if (ret)
return ret;
-
- for (device_find_first_child(dev, &child); child;
- device_find_next_child(&child)) {
- if (device_get_uclass_id(child) != UCLASS_I2C_EMUL)
- continue;
-
- ret = device_probe(child);
- if (ret)
- return ret;
-
- break;
- }
-
- if (child)
- plat->emul = child;
- else
- return -ENODEV;
}
*devp = plat->emul;
*opsp = i2c_get_ops(plat->emul);
diff --git a/drivers/power/pmic/i2c_pmic_emul.c b/drivers/power/pmic/i2c_pmic_emul.c
index 61fa76a..80efc02 100644
--- a/drivers/power/pmic/i2c_pmic_emul.c
+++ b/drivers/power/pmic/i2c_pmic_emul.c
@@ -104,7 +104,7 @@
static int sandbox_i2c_pmic_ofdata_to_platdata(struct udevice *emul)
{
struct sandbox_i2c_pmic_plat_data *plat = dev_get_platdata(emul);
- struct udevice *pmic_dev = dev_get_parent(emul);
+ struct udevice *pmic_dev = i2c_emul_get_device(emul);
struct uc_pmic_priv *priv = dev_get_uclass_priv(pmic_dev);
const u8 *reg_defaults;
diff --git a/test/dm/i2c.c b/test/dm/i2c.c
index 772f62b..cbbd4aa 100644
--- a/test/dm/i2c.c
+++ b/test/dm/i2c.c
@@ -35,7 +35,7 @@
*/
ut_assertok(uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus));
ut_assertok(dm_i2c_probe(bus, chip, 0, &dev));
- ut_asserteq(-ENODEV, dm_i2c_probe(bus, no_chip, 0, &dev));
+ ut_asserteq(-ENOENT, dm_i2c_probe(bus, no_chip, 0, &dev));
ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_I2C, 1, &bus));
return 0;
diff --git a/test/dm/rtc.c b/test/dm/rtc.c
index e2bc648..7188742 100644
--- a/test/dm/rtc.c
+++ b/test/dm/rtc.c
@@ -6,6 +6,7 @@
#include <common.h>
#include <dm.h>
+#include <i2c.h>
#include <rtc.h>
#include <asm/io.h>
#include <asm/test.h>
@@ -60,7 +61,7 @@
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
ut_assertok(dm_rtc_get(dev, &now));
- ut_assertok(device_find_first_child(dev, &emul));
+ ut_assertok(i2c_emul_find(dev, &emul));
ut_assert(emul != NULL);
/* Tell the RTC to go into manual mode */
@@ -125,7 +126,7 @@
ut_assertok(uclass_get_device(UCLASS_RTC, 0, &dev));
ut_assertok(dm_rtc_get(dev, &now));
- ut_assertok(device_find_first_child(dev, &emul));
+ ut_assertok(i2c_emul_find(dev, &emul));
ut_assert(emul != NULL);
old_base_time = sandbox_i2c_rtc_get_set_base_time(emul, 0);
@@ -154,9 +155,9 @@
ut_assertok(uclass_get_device(UCLASS_RTC, 1, &dev2));
ut_assertok(dm_rtc_get(dev2, &now2));
- ut_assertok(device_find_first_child(dev1, &emul1));
+ ut_assertok(i2c_emul_find(dev1, &emul1));
ut_assert(emul1 != NULL);
- ut_assertok(device_find_first_child(dev2, &emul2));
+ ut_assertok(i2c_emul_find(dev2, &emul2));
ut_assert(emul2 != NULL);
offset = sandbox_i2c_rtc_set_offset(emul1, false, -1);