summaryrefslogtreecommitdiff
path: root/drivers/i3c
diff options
context:
space:
mode:
authorIwona Winiarska <iwona.winiarska@intel.com>2022-01-10 14:50:28 +0300
committerIwona Winiarska <iwona.winiarska@intel.com>2022-01-10 14:54:48 +0300
commit3ad0fced464c522738ef765747d09d8f8b896de3 (patch)
treef0cd248c2667cb563f2d6adfde27de15583c1803 /drivers/i3c
parentaaccb149bfa6ff74dc8e9ff043191730060002db (diff)
downloadlinux-3ad0fced464c522738ef765747d09d8f8b896de3.tar.xz
Revert "iklimasz/i3c-fixups (#1)"
This reverts commit aaccb149bfa6ff74dc8e9ff043191730060002db. A series of commits were unintentionally squashed. Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
Diffstat (limited to 'drivers/i3c')
-rw-r--r--drivers/i3c/master/dw-i3c-master.c42
1 files changed, 14 insertions, 28 deletions
diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index f883256665a6..a026b7e6dca6 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -146,7 +146,8 @@
INTR_TX_THLD_STAT | \
INTR_RX_THLD_STAT)
#define INTR_MASTER_MASK (INTR_TRANSFER_ERR_STAT | \
- INTR_RESP_READY_STAT)
+ INTR_RESP_READY_STAT | \
+ INTR_IBI_THLD_STAT)
#define QUEUE_STATUS_LEVEL 0x4c
#define QUEUE_STATUS_IBI_STATUS_CNT(x) (((x) & GENMASK(28, 24)) >> 24)
@@ -200,11 +201,6 @@
#define BUS_IDLE_TIMING 0xd8
#define I3C_VER_ID 0xe0
#define I3C_VER_TYPE 0xe4
-#define I3C_VER_RELEASE_TYPE(x) (((x) & GENMASK(31, 16)) >> 16)
-#define I3C_VER_RELEASE_VERSION(x) ((x) & GENMASK(15, 0))
-
-#define I3C_LC_RELEASE 0x6c63
-
#define EXTENDED_CAPABILITY 0xe8
#define SLAVE_CONFIG 0xec
@@ -279,8 +275,8 @@ struct dw_i3c_master {
void __iomem *regs;
struct reset_control *core_rst;
struct clk *core_clk;
- u32 ver_id;
- u16 ver_type;
+ char version[5];
+ char type[5];
u8 addrs[MAX_DEVS];
};
@@ -708,7 +704,6 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m)
{
struct dw_i3c_master *master = to_dw_i3c_master(m);
struct i3c_bus *bus = i3c_master_get_bus(m);
- u32 interrupt_mask = INTR_MASTER_MASK;
struct i3c_device_info info = { };
u32 thld_ctrl;
int ret;
@@ -737,18 +732,15 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m)
thld_ctrl &= ~DATA_BUFFER_THLD_CTRL_RX_BUF;
writel(thld_ctrl, master->regs + DATA_BUFFER_THLD_CTRL);
- if (master->ver_type >= I3C_LC_RELEASE) {
- thld_ctrl = readl(master->regs + QUEUE_THLD_CTRL);
- thld_ctrl &= ~(QUEUE_THLD_CTRL_IBI_STA_MASK | QUEUE_THLD_CTRL_IBI_DAT_MASK);
- thld_ctrl |= QUEUE_THLD_CTRL_IBI_STA(1) | QUEUE_THLD_CTRL_IBI_DAT(1);
- writel(thld_ctrl, master->regs + QUEUE_THLD_CTRL);
- interrupt_mask |= INTR_IBI_THLD_STAT;
- }
-
writel(INTR_ALL, master->regs + INTR_STATUS);
- writel(interrupt_mask, master->regs + INTR_STATUS_EN);
- writel(interrupt_mask, master->regs + INTR_SIGNAL_EN);
+ writel(INTR_MASTER_MASK, master->regs + INTR_STATUS_EN);
+ writel(INTR_MASTER_MASK, master->regs + INTR_SIGNAL_EN);
+ thld_ctrl = readl(master->regs + QUEUE_THLD_CTRL);
+ thld_ctrl &= ~(QUEUE_THLD_CTRL_IBI_STA_MASK | QUEUE_THLD_CTRL_IBI_DAT_MASK);
+ thld_ctrl |= QUEUE_THLD_CTRL_IBI_STA(1);
+ thld_ctrl |= QUEUE_THLD_CTRL_IBI_DAT(1);
+ writel(thld_ctrl, master->regs + QUEUE_THLD_CTRL);
ret = i3c_master_get_free_addr(m, 0);
if (ret < 0)
@@ -1271,9 +1263,6 @@ static int dw_i3c_master_request_ibi(struct i3c_dev_desc *dev,
struct dw_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
unsigned int i;
- if (master->ver_type < I3C_LC_RELEASE)
- return -EOPNOTSUPP;
-
data->ibi_pool = i3c_generic_ibi_alloc_pool(dev, req);
if (IS_ERR(data->ibi_pool))
return PTR_ERR(data->ibi_pool);
@@ -1467,6 +1456,7 @@ static void dw_i3c_master_sir_handler(struct dw_i3c_master *master,
struct i3c_ibi_slot *slot;
struct i3c_dev_desc *dev;
u8 *buf;
+ int i;
dev = dw_get_i3c_dev_by_addr(master, addr);
if (!dev) {
@@ -1485,7 +1475,8 @@ static void dw_i3c_master_sir_handler(struct dw_i3c_master *master,
memcpy(buf, &ibi_status, sizeof(ibi_status));
buf += sizeof(ibi_status);
- dw_i3c_master_read_ibi_fifo(master, buf, length);
+ for (i = 0; i < (!(length % 4) ? (length / 4) : (length / 4 + 1)); i++)
+ dw_i3c_master_read_ibi_fifo(master, buf, length);
slot->len = length + sizeof(ibi_status);
@@ -1581,8 +1572,6 @@ static int dw_i3c_probe(struct platform_device *pdev)
if (!master)
return -ENOMEM;
- master->dev = &pdev->dev;
-
master->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(master->regs))
return PTR_ERR(master->regs);
@@ -1639,9 +1628,6 @@ static int dw_i3c_probe(struct platform_device *pdev)
if (ret)
goto err_assert_rst;
- ret = readl(master->regs + I3C_VER_TYPE);
- master->ver_type = I3C_VER_RELEASE_TYPE(ret);
-
ret = i3c_master_register(&master->base, &pdev->dev,
&dw_mipi_i3c_ops, false);
if (ret)