diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-bcm2835.c | 21 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-designware-master.c | 4 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sirf.c | 4 | 
5 files changed, 27 insertions, 5 deletions
| diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index a9805c7cb305..e2954fb86d65 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -123,8 +123,10 @@ config I2C_I801  	    Wildcat Point (PCH)  	    Wildcat Point-LP (PCH)  	    BayTrail (SOC) +	    Braswell (SOC)  	    Sunrise Point-H (PCH)  	    Sunrise Point-LP (PCH) +	    Kaby Lake-H (PCH)  	    DNV (SOC)  	    Broxton (SOC)  	    Lewisburg (PCH) diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c index cd07a69e2e93..44deae78913e 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -50,6 +50,9 @@  #define BCM2835_I2C_S_CLKT	BIT(9)  #define BCM2835_I2C_S_LEN	BIT(10) /* Fake bit for SW error reporting */ +#define BCM2835_I2C_FEDL_SHIFT	16 +#define BCM2835_I2C_REDL_SHIFT	0 +  #define BCM2835_I2C_CDIV_MIN	0x0002  #define BCM2835_I2C_CDIV_MAX	0xFFFE @@ -81,7 +84,7 @@ static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg)  static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev)  { -	u32 divider; +	u32 divider, redl, fedl;  	divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk),  			       i2c_dev->bus_clk_rate); @@ -100,6 +103,22 @@ static int bcm2835_i2c_set_divider(struct bcm2835_i2c_dev *i2c_dev)  	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); +	/* +	 * Number of core clocks to wait after falling edge before +	 * outputting the next data bit.  Note that both FEDL and REDL +	 * can't be greater than CDIV/2. +	 */ +	fedl = max(divider / 16, 1u); + +	/* +	 * Number of core clocks to wait after rising edge before +	 * sampling the next incoming data bit. +	 */ +	redl = max(divider / 4, 1u); + +	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DEL, +			   (fedl << BCM2835_I2C_FEDL_SHIFT) | +			   (redl << BCM2835_I2C_REDL_SHIFT));  	return 0;  } diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index ae691884d071..05732531829f 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -209,7 +209,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)  	i2c_dw_disable_int(dev);  	/* Enable the adapter */ -	__i2c_dw_enable(dev, true); +	__i2c_dw_enable_and_wait(dev, true);  	/* Clear and enable interrupts */  	dw_readl(dev, DW_IC_CLR_INTR); @@ -644,7 +644,7 @@ static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev)  	gpio = devm_gpiod_get(dev->dev, "scl", GPIOD_OUT_HIGH);  	if (IS_ERR(gpio)) {  		r = PTR_ERR(gpio); -		if (r == -ENOENT) +		if (r == -ENOENT || r == -ENOSYS)  			return 0;  		return r;  	} diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 8eac00efadc1..692b34125866 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -58,6 +58,7 @@   * Wildcat Point (PCH)		0x8ca2	32	hard	yes	yes	yes   * Wildcat Point-LP (PCH)	0x9ca2	32	hard	yes	yes	yes   * BayTrail (SOC)		0x0f12	32	hard	yes	yes	yes + * Braswell (SOC)		0x2292	32	hard	yes	yes	yes   * Sunrise Point-H (PCH) 	0xa123  32	hard	yes	yes	yes   * Sunrise Point-LP (PCH)	0x9d23	32	hard	yes	yes	yes   * DNV (SOC)			0x19df	32	hard	yes	yes	yes diff --git a/drivers/i2c/busses/i2c-sirf.c b/drivers/i2c/busses/i2c-sirf.c index 2fd8b6d00391..87197ece0f90 100644 --- a/drivers/i2c/busses/i2c-sirf.c +++ b/drivers/i2c/busses/i2c-sirf.c @@ -341,7 +341,7 @@ static int i2c_sirfsoc_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, adap);  	init_completion(&siic->done); -	/* Controller Initalisation */ +	/* Controller initialisation */  	writel(SIRFSOC_I2C_RESET, siic->base + SIRFSOC_I2C_CTRL);  	while (readl(siic->base + SIRFSOC_I2C_CTRL) & SIRFSOC_I2C_RESET) @@ -369,7 +369,7 @@ static int i2c_sirfsoc_probe(struct platform_device *pdev)  	 * but they start to affect the speed when clock is set to faster  	 * frequencies.  	 * Through the actual tests, use the different user_div value(which -	 * in the divider formular 'Fio / (Fi2c * user_div)') to adapt +	 * in the divider formula 'Fio / (Fi2c * user_div)') to adapt  	 * the different ranges of i2c bus clock frequency, to make the SCL  	 * more accurate.  	 */ |