dm: sandbox: i2c: Use new emulator parent uclass
authorSimon Glass <sjg@chromium.org>
Sun, 18 Nov 2018 15:14:34 +0000 (08:14 -0700)
committerSimon Glass <sjg@chromium.org>
Thu, 29 Nov 2018 16:30:05 +0000 (09:30 -0700)
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>
arch/sandbox/dts/sandbox.dts
arch/sandbox/dts/sandbox64.dts
arch/sandbox/dts/sandbox_pmic.dtsi
arch/sandbox/dts/test.dts
drivers/i2c/sandbox_i2c.c
drivers/power/pmic/i2c_pmic_emul.c
test/dm/i2c.c
test/dm/rtc.c

index 1cda911d1f0877a54eb527dca85f385ab448fb59..ce3c88c221d233149f738c51c43f554db1360c38 100644 (file)
                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>;
                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 {
index 2c6d35138155db3fad0b05cfaa91ab7adc85389e..d30fd62a2a489d7c34b49811d2b8c045d44143e2 100644 (file)
                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>;
                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 {
index 5ecafaab364049a201de804716fd68913e7b084f..565c382ed45c2d83a1b423074eec069ed1ca25e6 100644 (file)
 &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>;
 
 &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
index 2c6b42231230a1fe87df8dd15e2bc79494c298ee..252aa7b6b6310306dd657fcdb719f2385b436fc8 100644 (file)
                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>;
                };
        };
 
index 66578510849dbb770059136fd8cddb50b068296b..0dbbaa0c44730b86370b928bd67efc71dfae9ea3 100644 (file)
@@ -21,33 +21,15 @@ static int get_emul(struct udevice *dev, struct udevice **devp,
                    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);
index 61fa76a5619948b81b56e3e59738fb05143d77ea..80efc0265d9fa8096b9ce3cf46baedd6e0175229 100644 (file)
@@ -104,7 +104,7 @@ static int sandbox_i2c_pmic_xfer(struct udevice *emul, struct i2c_msg *msg,
 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;
 
index 772f62b265d0c37f48098bacd2d5fe88a7b8ea32..cbbd4aa29a1fdc8752b1e7d2b9334f9035ad241d 100644 (file)
@@ -35,7 +35,7 @@ static int dm_test_i2c_find(struct unit_test_state *uts)
         */
        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;
index e2bc648fdcf2c1453a59f44d6944c88b0e610467..71887427647b1540ed6866ca32614a26c5a47ef1 100644 (file)
@@ -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 @@ static int dm_test_rtc_set_get(struct unit_test_state *uts)
        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 @@ static int dm_test_rtc_reset(struct unit_test_state *uts)
        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 @@ static int dm_test_rtc_dual(struct unit_test_state *uts)
        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);