|
@@ -21,17 +21,17 @@
|
|
|
* ----------------------------------------------------------------------------
|
|
|
*
|
|
|
*/
|
|
|
+#include <linux/delay.h>
|
|
|
#include <linux/export.h>
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/err.h>
|
|
|
#include <linux/i2c.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/io.h>
|
|
|
-#include <linux/pm_runtime.h>
|
|
|
-#include <linux/delay.h>
|
|
|
#include <linux/module.h>
|
|
|
-#include "i2c-designware-core.h"
|
|
|
+#include <linux/pm_runtime.h>
|
|
|
|
|
|
+#include "i2c-designware-core.h"
|
|
|
/*
|
|
|
* Registers offset
|
|
|
*/
|
|
@@ -98,7 +98,7 @@
|
|
|
|
|
|
#define DW_IC_ERR_TX_ABRT 0x1
|
|
|
|
|
|
-#define DW_IC_TAR_10BITADDR_MASTER BIT(12)
|
|
|
+#define DW_IC_TAR_10BITADDR_MASTER BIT(12)
|
|
|
|
|
|
#define DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH (BIT(2) | BIT(3))
|
|
|
#define DW_IC_COMP_PARAM_1_SPEED_MODE_MASK GENMASK(3, 2)
|
|
@@ -113,10 +113,10 @@
|
|
|
#define TIMEOUT 20 /* ms */
|
|
|
|
|
|
/*
|
|
|
- * hardware abort codes from the DW_IC_TX_ABRT_SOURCE register
|
|
|
+ * Hardware abort codes from the DW_IC_TX_ABRT_SOURCE register
|
|
|
*
|
|
|
- * only expected abort codes are listed here
|
|
|
- * refer to the datasheet for the full list
|
|
|
+ * Only expected abort codes are listed here,
|
|
|
+ * refer to the datasheet for the full list.
|
|
|
*/
|
|
|
#define ABRT_7B_ADDR_NOACK 0
|
|
|
#define ABRT_10ADDR1_NOACK 1
|
|
@@ -318,7 +318,7 @@ static void i2c_dw_release_lock(struct dw_i2c_dev *dev)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * i2c_dw_init() - initialize the designware i2c master hardware
|
|
|
+ * i2c_dw_init() - Initialize the designware I2C master hardware
|
|
|
* @dev: device private data
|
|
|
*
|
|
|
* This functions configures and enables the I2C master.
|
|
@@ -344,8 +344,8 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
|
|
|
/* Configure register access mode 16bit */
|
|
|
dev->flags |= ACCESS_16BIT;
|
|
|
} else if (reg != DW_IC_COMP_TYPE_VALUE) {
|
|
|
- dev_err(dev->dev, "Unknown Synopsys component type: "
|
|
|
- "0x%08x\n", reg);
|
|
|
+ dev_err(dev->dev,
|
|
|
+ "Unknown Synopsys component type: 0x%08x\n", reg);
|
|
|
i2c_dw_release_lock(dev);
|
|
|
return -ENODEV;
|
|
|
}
|
|
@@ -355,7 +355,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
|
|
|
/* Disable the adapter */
|
|
|
__i2c_dw_enable_and_wait(dev, false);
|
|
|
|
|
|
- /* set standard and fast speed deviders for high/low periods */
|
|
|
+ /* Set standard and fast speed deviders for high/low periods */
|
|
|
|
|
|
sda_falling_time = dev->sda_falling_time ?: 300; /* ns */
|
|
|
scl_falling_time = dev->scl_falling_time ?: 300; /* ns */
|
|
@@ -444,7 +444,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
|
|
|
dw_writel(dev, dev->tx_fifo_depth / 2, DW_IC_TX_TL);
|
|
|
dw_writel(dev, 0, DW_IC_RX_TL);
|
|
|
|
|
|
- /* configure the i2c master */
|
|
|
+ /* Configure the I2C master */
|
|
|
dw_writel(dev, dev->master_cfg , DW_IC_CON);
|
|
|
|
|
|
i2c_dw_release_lock(dev);
|
|
@@ -480,7 +480,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
|
|
|
/* Disable the adapter */
|
|
|
__i2c_dw_enable_and_wait(dev, false);
|
|
|
|
|
|
- /* if the slave address is ten bit address, enable 10BITADDR */
|
|
|
+ /* If the slave address is ten bit address, enable 10BITADDR */
|
|
|
ic_con = dw_readl(dev, DW_IC_CON);
|
|
|
if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) {
|
|
|
ic_con |= DW_IC_CON_10BITADDR_MASTER;
|
|
@@ -503,7 +503,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
|
|
|
*/
|
|
|
dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR);
|
|
|
|
|
|
- /* enforce disabled interrupts (due to HW issues) */
|
|
|
+ /* Enforce disabled interrupts (due to HW issues) */
|
|
|
i2c_dw_disable_int(dev);
|
|
|
|
|
|
/* Enable the adapter */
|
|
@@ -537,9 +537,9 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
|
|
|
u32 flags = msgs[dev->msg_write_idx].flags;
|
|
|
|
|
|
/*
|
|
|
- * if target address has changed, we need to
|
|
|
- * reprogram the target address in the i2c
|
|
|
- * adapter when we are done with this transfer
|
|
|
+ * If target address has changed, we need to
|
|
|
+ * reprogram the target address in the I2C
|
|
|
+ * adapter when we are done with this transfer.
|
|
|
*/
|
|
|
if (msgs[dev->msg_write_idx].addr != addr) {
|
|
|
dev_err(dev->dev,
|
|
@@ -599,7 +599,7 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
|
|
|
|
|
|
if (msgs[dev->msg_write_idx].flags & I2C_M_RD) {
|
|
|
|
|
|
- /* avoid rx buffer overrun */
|
|
|
+ /* Avoid rx buffer overrun */
|
|
|
if (dev->rx_outstanding >= dev->rx_fifo_depth)
|
|
|
break;
|
|
|
|
|
@@ -728,7 +728,7 @@ static int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Prepare controller for a transaction and call i2c_dw_xfer_msg
|
|
|
+ * Prepare controller for a transaction and call i2c_dw_xfer_msg.
|
|
|
*/
|
|
|
static int
|
|
|
i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
|
@@ -759,10 +759,10 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
|
|
if (ret < 0)
|
|
|
goto done;
|
|
|
|
|
|
- /* start the transfers */
|
|
|
+ /* Start the transfers */
|
|
|
i2c_dw_xfer_init(dev);
|
|
|
|
|
|
- /* wait for tx to complete */
|
|
|
+ /* Wait for tx to complete */
|
|
|
if (!wait_for_completion_timeout(&dev->cmd_complete, adap->timeout)) {
|
|
|
dev_err(dev->dev, "controller timed out\n");
|
|
|
/* i2c_dw_init implicitly disables the adapter */
|
|
@@ -786,7 +786,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
- /* no error */
|
|
|
+ /* No error */
|
|
|
if (likely(!dev->cmd_err && !dev->status)) {
|
|
|
ret = num;
|
|
|
goto done;
|
|
@@ -821,8 +821,8 @@ static u32 i2c_dw_func(struct i2c_adapter *adap)
|
|
|
}
|
|
|
|
|
|
static const struct i2c_algorithm i2c_dw_algo = {
|
|
|
- .master_xfer = i2c_dw_xfer,
|
|
|
- .functionality = i2c_dw_func,
|
|
|
+ .master_xfer = i2c_dw_xfer,
|
|
|
+ .functionality = i2c_dw_func,
|
|
|
};
|
|
|
|
|
|
static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
|
|
@@ -903,7 +903,7 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
|
|
|
|
|
|
/*
|
|
|
* Anytime TX_ABRT is set, the contents of the tx/rx
|
|
|
- * buffers are flushed. Make sure to skip them.
|
|
|
+ * buffers are flushed. Make sure to skip them.
|
|
|
*/
|
|
|
dw_writel(dev, 0, DW_IC_INTR_MASK);
|
|
|
goto tx_aborted;
|
|
@@ -925,7 +925,7 @@ tx_aborted:
|
|
|
if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err)
|
|
|
complete(&dev->cmd_complete);
|
|
|
else if (unlikely(dev->flags & ACCESS_INTR_MASK)) {
|
|
|
- /* workaround to trigger pending interrupt */
|
|
|
+ /* Workaround to trigger pending interrupt */
|
|
|
stat = dw_readl(dev, DW_IC_INTR_MASK);
|
|
|
i2c_dw_disable_int(dev);
|
|
|
dw_writel(dev, stat, DW_IC_INTR_MASK);
|
|
@@ -961,13 +961,13 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
|
|
|
{
|
|
|
struct i2c_adapter *adap = &dev->adapter;
|
|
|
unsigned long irq_flags;
|
|
|
- int r;
|
|
|
+ int ret;
|
|
|
|
|
|
init_completion(&dev->cmd_complete);
|
|
|
|
|
|
- r = i2c_dw_init(dev);
|
|
|
- if (r)
|
|
|
- return r;
|
|
|
+ ret = i2c_dw_init(dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
snprintf(adap->name, sizeof(adap->name),
|
|
|
"Synopsys DesignWare I2C adapter");
|
|
@@ -984,12 +984,12 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
|
|
|
}
|
|
|
|
|
|
i2c_dw_disable_int(dev);
|
|
|
- r = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, irq_flags,
|
|
|
- dev_name(dev->dev), dev);
|
|
|
- if (r) {
|
|
|
+ ret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, irq_flags,
|
|
|
+ dev_name(dev->dev), dev);
|
|
|
+ if (ret) {
|
|
|
dev_err(dev->dev, "failure requesting irq %i: %d\n",
|
|
|
- dev->irq, r);
|
|
|
- return r;
|
|
|
+ dev->irq, ret);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -999,12 +999,12 @@ int i2c_dw_probe(struct dw_i2c_dev *dev)
|
|
|
* registered I2C slaves that do I2C transfers in their probe.
|
|
|
*/
|
|
|
pm_runtime_get_noresume(dev->dev);
|
|
|
- r = i2c_add_numbered_adapter(adap);
|
|
|
- if (r)
|
|
|
- dev_err(dev->dev, "failure adding adapter: %d\n", r);
|
|
|
+ ret = i2c_add_numbered_adapter(adap);
|
|
|
+ if (ret)
|
|
|
+ dev_err(dev->dev, "failure adding adapter: %d\n", ret);
|
|
|
pm_runtime_put_noidle(dev->dev);
|
|
|
|
|
|
- return r;
|
|
|
+ return ret;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(i2c_dw_probe);
|
|
|
|