Hi Mike,

Thanks for the reply,  I'll give this a go.

- Martin.

On Sat, Dec 1, 2018 at 10:01 AM Mike Looijmans <mike.looijm...@topic.nl>
wrote:

> One thing you may want to try is replace the cadence I2C driver with the
> generic bit-bang GPIO driver (on the same pins).
>
> Example devicetree that does this in the kernel (you'll need to activate
> the bitbang gpio i2c driver in the kernel config though):
>
> https://github.com/topic-embedded-products/linux/blob/topic-miami/arch/arm/boot/dts/topic-miami.dtsi#L52
>
> We have had lots of troubles with the I2C controller in the Zynq, it
> appears to be broken, and replacing the driver with a bitbang GPIO one
> solved all issues. In our case, the problem was with longer transfers
> like sending EDID tables to video encoder chips, but we've seen
> occasional failures on simple transfers (eeprom, hw monitors, etc) as well.
>
>
>
> On 30-11-18 19:47, Martin Townsend wrote:
> > Hi,
> >
> > We are in the process of upgrading to Sumo which has the 4.14
> > linux-xlnx kernel and everything is working fine except for our
> > LTC-3375 regulator device driver which was working fine with the 4.9
> > kernel but with the newer kernel we are getting the following in the
> > log.
> >
> > SW1: failed to get the current voltage(-6)
> > ltc3375 6-0034: failed to register regulator SW1: -6
> >
> > We get this message twice as there are 2 LTC-3375 on different
> > channels of the PCA9548, here's a cut down version of the device tree:
> >
> > &i2c0 {
> >      status = "okay";
> >      /* clock-frequency = <400000>; */
> >      clock-frequency = <100000>;
> >      pinctrl-names = "default";
> >      pinctrl-0 = <&pinctrl_i2c0_default>;
> >
> >
> >      /* I2C Switch */
> >      i2cswitch@70 {
> >          compatible = "nxp,pca9548";
> >          #address-cells = <1>;
> >          #size-cells = <0>;
> >          reg = <0x70>;
> >
> >          /* PS Power Switcher */
> >          i2c@4 {
> >              #address-cells = <1>;
> >              #size-cells = <0>;
> >              reg = <4>;
> >
> >              powerswitcher1@34 {
> >                  compatible = "ltc,ltc3375";
> >                  reg = <0x34>;
> >                  interrupt-parent = <&gpiom2>;
> >                  interrupts = <12 1>;
> >
> >                  regulators {
> >                    sw1 {
> >                          regulator-min-microvolt = <693987>;
> >                          regulator-max-microvolt = <1306329>;
> >                          lltc,fb-voltage-divider = <100000 158000>;
> >                          regulator-ramp-delay = <7000>;
> >                          regulator-boot-on;
> >                          regulator-always-on;
> >                      };
> >                      sw2 {
> >                          ...
> >                      };
> >                      sw3 {
> >                          ...
> >                      };
> >                      sw4 {
> >                          ...
> >                      };
> >                      sw5 {
> >                          ...
> >                      };
> >                      sw6 {
> >                          ...
> >                      };
> >                      sw7 {
> >                          ...
> >                      };
> >                      sw8 {
> >                          ...
> >                      };
> >                  };
> >              };
> >          };
> >
> >          /* PL Power Switcher */
> >          i2c@5 {
> >              #address-cells = <1>;
> >              #size-cells = <0>;
> >              reg = <5>;
> >
> >              powerswitcher1@34 {
> >                  compatible = "ltc,ltc3375";
> >                  reg = <0x34>;
> >                  interrupt-parent = <&gpiom2>;
> >                  interrupts = <13 1>;
> >
> >                  regulators {
> >                      sw1 {
> >                          regulator-min-microvolt = <693987>;
> >                          regulator-max-microvolt = <1306329>;
> >                          lltc,fb-voltage-divider = <100000 158000>;
> >                          regulator-ramp-delay = <7000>;
> >                          regulator-boot-on;
> >                          regulator-always-on;
> >                      };
> >                      sw2 {
> >                          ...
> >                      };
> >                      sw3 {
> >                          ...
> >                      };
> >                      sw4 {
> >                          ...
> >                      };
> >                      sw5 {
> >                          ...
> >                      };
> >                      sw6 {
> >                          ...
> >                      };
> >                      sw7 {
> >                          ...
> >                      };
> >                      sw8 {
> >                          ...
> >                      };
> >                  };
> >              };
> >          };
> >      };
> > };
> >
> > I traced the -6 error code (-ENXIO) to the cadence driver where it
> > basically receives a NAK.
> >
> > static int cdns_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg
> *msgs,
> >                  int num)
> > {
> >       ...
> >      /* Process the msg one by one */
> >      for (count = 0; count < num; count++, msgs++) {
> >          if (count == (num - 1))
> >              id->bus_hold_flag = 0;
> >
> >          ret = cdns_i2c_process_msg(id, msgs, adap);
> >          if (ret)
> >              goto out;
> >
> >          /* Report the other error interrupts to application */
> >          if (id->err_status) {
> >              cdns_i2c_master_reset(adap);
> >
> >              if (id->err_status & CDNS_I2C_IXR_NACK) {
> >                  ret = -ENXIO;
> >                  goto out;
> >              }
> >              ret = -EIO;
> >              goto out;
> >          }
> >      }
> > }
> >
> > After debugging further I can see that it's trying to select the right
> > channel of the PCA9548 but the i2c controller on the Xilinx is failing
> > with a NAK.  So it's not even getting as far as the LTC driver.  Here
> > is some of my debug that shows it's the PCA9548 that is failing as
> > this is address 0x70 whereas the LTC is at 0x34
> >
> > pca954x_select_chan: chan:4 regval:10
> > pca954x_reg_write: addr:70 val:10
> > cdns-i2c e0004000.i2c: cdns_i2c_master_xfer: id->err_status=4
> > cdns-i2c e0004000.i2c: cdns_i2c_master_xfer: id->p_msg->addr=70
> >
> > I've done a diff between the 4.9 and 4.14 kernel but can't see any
> > obvious in either of these drivers.  I've checked the device tree in
> > this area but again can see no changes.  The second I2C interface is
> > working fine, I2C1.
> >
> > I did a dump_stack on the i2c read that was failing
> > [<c010e854>] (unwind_backtrace) from [<c010aa68>] (show_stack+0x10/0x14)
> > [<c010aa68>] (show_stack) from [<c064a3e8>] (dump_stack+0x80/0xa0)
> > [<c064a3e8>] (dump_stack) from [<c04a2e50>]
> (cdns_i2c_master_xfer+0x2fc/0x3e4)
> > [<c04a2e50>] (cdns_i2c_master_xfer) from [<c049e908>]
> > (_i2c_transfer+0x1cc/0x20c)
> > [<c049e908>] (_i2c_transfer) from [<c04a38dc>]
> (pca954x_reg_write+0x4c/0x8c)
> > [<c04a38dc>] (pca954x_reg_write) from [<c04a3990>]
> > (pca954x_select_chan+0x44/0x5c)
> > [<c04a3990>] (pca954x_select_chan) from [<c04a1548>]
> > (_i2c_mux_master_xfer+0x28/0x64)
> > [<c04a1548>] (_i2c_mux_master_xfer) from [<c049e908>]
> > (_i2c_transfer+0x1cc/0x20c)
> > [<c049e908>] (_i2c_transfer) from [<c049e9d4>] (i2c_transfer+0x8c/0xac)
> > [<c049e9d4>] (i2c_transfer) from [<c03d553c>] (regmap_i2c_read+0x48/0x64)
> > [<c03d553c>] (regmap_i2c_read) from [<c03d29fc>]
> (regmap_raw_read+0x84/0xd0)
> > [<c03d29fc>] (_regmap_raw_read) from [<c03d2a70>]
> (_regmap_bus_read+0x28/0x48)
> > [<c03d2a70>] (_regmap_bus_read) from [<c03d2504>]
> (_regmap_read+0x84/0xac)
> > [<c03d2504>] (_regmap_read) from [<c03d256c>] (regmap_read+0x40/0x58)
> > [<c03d256c>] (regmap_read) from [<c0364bec>]
> > (regulator_get_voltage_sel_regmap+0x1c/0x50)
> > [<c0364bec>] (regulator_get_voltage_sel_regmap) from [<bf0472a8>]
> > (ltc3375_get_voltage_sel_regmap+0xc/0x4c [oina_regulator_ltc3375])
> > [<bf0472a8>] (ltc3375_get_voltage_sel_regmap [oina_regulator_ltc3375])
> > from [<c0361a10>] (_regulator_get_voltage+0x8c/0x128)
> > [<c0361a10>] (_regulator_get_voltage) from [<c03637f4>]
> > (regulator_register+0x3ec/0xb60)
> > [<c03637f4>] (regulator_register) from [<bf0475a4>]
> > (ltc3375_probe+0x2bc/0x394 [oina_regulator_ltc3375])
> > [<bf0475a4>] (ltc3375_probe [regulator_ltc3375]) from [<c049e3d0>]
> > (i2c_device_probe+0x22c/0x244)
> >
> > I'll look into the regulator_register code next but was just wondering
> > if anyone else has seen this or if anyone knows if there's a fix
> > available for this?
> >
> > Any help appreciated,
> >
> > Cheers,
> > Martin
> >
>
>
> --
> Mike Looijmans
> --
> _______________________________________________
> meta-xilinx mailing list
> meta-xilinx@yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-xilinx
>
-- 
_______________________________________________
meta-xilinx mailing list
meta-xilinx@yoctoproject.org
https://lists.yoctoproject.org/listinfo/meta-xilinx

Reply via email to