[PATCH v2 0/3] i2c: at91: slave mode support

From: Juergen Fitschen
Date: Thu Nov 09 2017 - 12:21:48 EST


Based on the discussion we had on the i2c-linux list [1], I wrote a patch for
AT91 hardware and tried to fulfill the Linux I2C slave interface description
[2] as good as possible. This enables aforementioned hardware to act as an I2C
slave that can be accessed by a remote I2C master.


I have tested this patchset successfully on an ATSAMA5D27.

^ 3.3V ^ 3.3V
+-----------------------+ | | +-----------------------+
| Slave: ATSAMA5D27 | +-+ +-+ | Master: ATSAMA5D35 |
| with i2c-slave-eeprom | | | 100k | | 100k | with i2cset |
+-------------------+-+-+ +-+ +-+ +-+-+-------------------+
| | | | | |
| +------+---------|---(SDA)---+ |
+------------------+---(SCL)-----+

Schematic: Connection of slave and master with 100kOhm pullup resistors.

On the master the following BASH script has been used to stress the slave.

root@emblinux:~# cat ./stress.sh
#!/bin/bash
I=0
while true
do
if i2cset -y -r 1 0x64 0 $I w | grep mismatch
then
echo "$(date): Error in transmission ${I}"
fi
((I++))
if [ $I -eq 65536 ]
then
I=0
echo "$(date): Sent 65536 transmissions"
fi
done


After running the script for some time I had the following output. To me this
looks promising :)

root@emblinux:~# ./stress.sh
Thu Nov 9 13:58:45 CTE 2017: Sent 65536 transmissions
Thu Nov 9 14:35:20 CTE 2017: Sent 65536 transmissions
Thu Nov 9 15:12:11 CTE 2017: Sent 65536 transmissions
Thu Nov 9 15:49:04 CTE 2017: Sent 65536 transmissions
Thu Nov 9 16:26:00 CTE 2017: Sent 65536 transmissions
Thu Nov 9 17:03:07 UTC 2017: Sent 65536 transmissions
Thu Nov 9 17:40:15 UTC 2017: Sent 65536 transmissions

If you have some hardware with an at91-i2c interface included at hand, I really
would appreciate if you can run the test script on your hardware and test this
driver.


Best regards
Juergen


Changes in v2:
- Implemented all suggestions made by Ludovic. (Thank you!)
- Reworked the IRQ handler completely. Have a look in patch 3 fort further
details.

[1] https://marc.info/?t=150824004800001&r=1&w=1
[2] https://www.kernel.org/doc/Documentation/i2c/slave-interface

Juergen Fitschen (3):
i2c: at91: segregate master mode specific code from probe and init
func
i2c: at91: split driver into core and master file
i2c: at91: added slave mode support

Documentation/devicetree/bindings/i2c/i2c-at91.txt | 14 +
MAINTAINERS | 3 +-
drivers/i2c/busses/Kconfig | 10 +
drivers/i2c/busses/Makefile | 4 +
drivers/i2c/busses/i2c-at91-core.c | 390 ++++++
drivers/i2c/busses/i2c-at91-master.c | 806 +++++++++++++
drivers/i2c/busses/i2c-at91-slave.c | 216 ++++
drivers/i2c/busses/i2c-at91.c | 1243 --------------------
drivers/i2c/busses/i2c-at91.h | 191 +++
9 files changed, 1633 insertions(+), 1244 deletions(-)
create mode 100644 drivers/i2c/busses/i2c-at91-core.c
create mode 100644 drivers/i2c/busses/i2c-at91-master.c
create mode 100644 drivers/i2c/busses/i2c-at91-slave.c
delete mode 100644 drivers/i2c/busses/i2c-at91.c
create mode 100644 drivers/i2c/busses/i2c-at91.h

--
2.7.4