|
@@ -0,0 +1,39 @@
|
|
|
|
+diff -Naurp a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
|
|
|
|
+--- a/drivers/gpio/gpio-pca953x.c 2018-03-05 08:25:33.000000000 +0100
|
|
|
|
++++ b/drivers/gpio/gpio-pca953x.c 2018-03-10 21:16:09.597556913 +0100
|
|
|
|
+@@ -123,10 +123,16 @@ static int pca953x_read_single(struct pc
|
|
|
|
+
|
|
|
|
+ ret = i2c_smbus_read_byte_data(chip->client,
|
|
|
|
+ (reg << bank_shift) + offset);
|
|
|
|
++
|
|
|
|
++ if (ret < 0) { /* only one retry due to i2c quirks */
|
|
|
|
++ /*dev_err(&chip->client->dev, "retry failed reading (single) register\n");*/
|
|
|
|
++ ret = i2c_smbus_read_byte_data(chip->client,
|
|
|
|
++ (reg << bank_shift) + offset);
|
|
|
|
++ }
|
|
|
|
+ *val = ret;
|
|
|
|
+
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+- dev_err(&chip->client->dev, "failed reading register\n");
|
|
|
|
++ dev_err(&chip->client->dev, "failed reading (single) register\n");
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+@@ -207,7 +213,7 @@ static int pca953x_read_regs(struct pca9
|
|
|
|
+ val[1] = (u16)ret >> 8;
|
|
|
|
+ }
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+- dev_err(&chip->client->dev, "failed reading register\n");
|
|
|
|
++ dev_err(&chip->client->dev, "failed reading (regs) register\n");
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+@@ -315,7 +321,7 @@ static int pca953x_gpio_get_value(struct
|
|
|
|
+ * do unless gpio_*_value_cansleep() calls become different
|
|
|
|
+ * from their nonsleeping siblings (and report faults).
|
|
|
|
+ */
|
|
|
|
+- return 0;
|
|
|
|
++ return 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return (reg_val & (1u << (off % BANK_SZ))) ? 1 : 0;
|