소스 검색

gpio-pca953x i2c issues

Reinhard Russinger 7 년 전
부모
커밋
fb0e6a6cd4
1개의 변경된 파일39개의 추가작업 그리고 0개의 파일을 삭제
  1. 39 0
      board/GfA/Display001/linux_4.4.94_rt19/linux-026-gpio-pca953x-sitara-i2c-quirks.patch

+ 39 - 0
board/GfA/Display001/linux_4.4.94_rt19/linux-026-gpio-pca953x-sitara-i2c-quirks.patch

@@ -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;