Re: Implementing bus recovery

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Den 2014-08-23 02:41, Mark Roszko skrev:
Prepare_recovery and unprepare_recovery are to configure the pad
multiplexer since thats platform specific. You don't care about the
adapter reference as you just need the scl_gpio and sda_gpio values to
know what pins to reconfigure.

In fact Atmel's pad mux functions look like this:

at91_set_A_periph(unsigned pin, int use_pullup)
at91_set_B_periph(unsigned pin, int use_pullup)
at91_set_C_periph(unsigned pin, int use_pullup)
.....


Here's the latest(or close) driver specific patch that slipped through
the cracks it seems?
http://www.spinics.net/lists/linux-i2c/msg11357.html


We are using a sama5d3-based machine which is almost entirely dt based, so passing callbacks to the driver using the platform data seems like a bad fit. Hard coding these calls in the driver won't really work either (even for a single machine) since not all instances of the adapter exist on the same peripheral. Ie, one adapter is on peripheral A and the others are on peripheral B for this specific soc.

The way I assumed it would work was to declare a "recovery" pinmux state in the device tree and then switch to that during the recovery and then back to default once it's done. Could you expand a bit on this please?


Bus_recovery itself you have to call in the at91 driver on a
controller timeout just like the patch does.
  if (ret == 0) {
                  dev_err(dev->dev, "controller timed out\n");
-                at91_init_twi_bus(dev);
  +                if (i2c_recover_bus(dev->adapter->bus_recovery_info) < 0)
  +                      at91_init_twi_bus(dev);

                  ret = -ETIMEDOUT;
                  goto error;
}

the call stack looks something like this

--at91_twi_xfer
----- i2c_recover_bus
--------- i2c_generic_gpio_recovery
-------------i2c_get_gpios_for_recovery  (requests gpios)
-------------i2c_generic_recovery
----------------prepare_recovery         (configure padmux to put gpio
on the pin)
----------------get_sda, get_scl          (get gpio value, generic
function by default is fine for atmel)
----------------set_scl                       (set scl value, generic
function by default is fine for atmel)
----------------unrepare_recovery       (configure padmux to put twi
back on the pin)
-------------i2c_put_gpios_for_recovery (frees gpios)


Somewhere in at91_twi_probe before the adapter is registered you also
have to setup the bus_recovery_info struct and set recover_bus to the
i2c_generic_gpio_recovery function similar to the patch linked.


That matches my previous understanding, thanks for the confirmation.
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux