aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch b/target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch
new file mode 100644
index 0000000000..9b6cb1d564
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.4/950-0764-overlays-i2c-gpio-Avoid-open-drain-warnings.patch
@@ -0,0 +1,93 @@
+From 11f89a12530471a2b25c71416e106eaa014818c0 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.com>
+Date: Fri, 5 Jun 2020 16:07:07 +0100
+Subject: [PATCH] overlays: i2c-gpio: Avoid open-drain warnings
+
+The i2c-gpio driver expects to use a GPIO in open-drain mode. Failure
+to configure it in that way causes alarming warnings in the kernel log.
+The BCM283x and BCM2711 GPIO blocks don't support open-drain mode, but
+gpiolib can emulate it in software if configured correctly.
+
+Silence the warning by declaring the GPIOs as requiring open-drain
+mode, trusting gpiolib to manage the emulation. The previous
+incarnation of this patch took the other approach of telling the
+i2c-gpio driver that the GPIOs were configured for open-drain, but
+this had the effect of disabling the emulation. In some cases this
+appears to work, but examining the waveforms as analogue voltages
+shows contention, the success or failure depending on drive strengths.
+
+See: https://github.com/raspberrypi/firmware/issues/1381
+See: https://github.com/raspberrypi/firmware/issues/1401
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+---
+ arch/arm/boot/dts/overlays/balena-fin-overlay.dts | 5 ++++-
+ arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts | 6 ++++--
+ arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts | 6 ++++--
+ 3 files changed, 12 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/boot/dts/overlays/balena-fin-overlay.dts
++++ b/arch/arm/boot/dts/overlays/balena-fin-overlay.dts
+@@ -1,6 +1,8 @@
+ /dts-v1/;
+ /plugin/;
+
++#include <dt-bindings/gpio/gpio.h>
++
+ /{
+ compatible = "brcm,bcm2835";
+
+@@ -48,7 +50,8 @@
+
+ i2c_soft: i2c@0 {
+ compatible = "i2c-gpio";
+- gpios = <&gpio 43 0 /* sda */ &gpio 42 0 /* scl */>;
++ gpios = <&gpio 43 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* sda */
++ &gpio 42 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* scl */>;
+ i2c-gpio,delay-us = <5>;
+ i2c-gpio,scl-open-drain;
+ i2c-gpio,sda-open-drain;
+--- a/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts
+@@ -2,6 +2,8 @@
+ /dts-v1/;
+ /plugin/;
+
++#include <dt-bindings/gpio/gpio.h>
++
+ / {
+ compatible = "brcm,bcm2835";
+
+@@ -12,8 +14,8 @@
+ i2c_gpio: i2c@0 {
+ reg = <0xffffffff>;
+ compatible = "i2c-gpio";
+- gpios = <&gpio 23 0 /* sda */
+- &gpio 24 0 /* scl */
++ gpios = <&gpio 23 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* sda */
++ &gpio 24 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* scl */
+ >;
+ i2c-gpio,delay-us = <2>; /* ~100 kHz */
+ #address-cells = <1>;
+--- a/arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts
++++ b/arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts
+@@ -3,6 +3,8 @@
+ /dts-v1/;
+ /plugin/;
+
++#include <dt-bindings/gpio/gpio.h>
++
+ / {
+ compatible = "brcm,bcm2835";
+
+@@ -11,8 +13,8 @@
+ __overlay__ {
+ i2c_gpio: i2c-gpio-rtc@0 {
+ compatible = "i2c-gpio";
+- gpios = <&gpio 23 0 /* sda */
+- &gpio 24 0 /* scl */
++ gpios = <&gpio 23 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* sda */
++ &gpio 24 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN) /* scl */
+ >;
+ i2c-gpio,delay-us = <2>; /* ~100 kHz */
+ #address-cells = <1>;