Clark Wang
7ff730ca45
i3c: master: svc: enable the interrupt in the enable ibi function
...
If enable interrupt in the svc_i3c_master_bus_init() but do not call
enable ibi in the device driver, it will cause a kernel dump in the
svc_i3c_master_handle_ibi() when a slave start occurs on the i3c bus,
because the data->ibi_pool is not initialized.
So only enable the interrupt in svc_i3c_master_enable_ibi() function.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-9-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
c5d4587bb9
i3c: master: svc: add the missing module device table
...
The missing MODULE_DEVICE_TABLE() will cause the svc-i3c-master cannot
be auto probed when it is built in moudle.
So add it.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-8-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
05be23ef78
i3c: master: svc: add runtime pm support
...
Add runtime pm support to dynamically manage the clock.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-7-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
173fcb2721
i3c: master: svc: set ODSTOP to let I2C device see the STOP signal
...
If using I2C/I3C mixed mode, need to set ODSTOP. Otherwise, the I2C
devices cannot see the stop signal. It may cause message sending errors.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-6-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
d5e512574d
i3c: master: svc: add support for slave to stop returning data
...
When i3c controller reads data from slave device, slave device can stop
returning data with an ACK after any byte.
Add this support for svc i3c controller. Otherwise, it will timeout
when the slave device ends the read operation early.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-5-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
9fd6b5ce85
i3c: master: svc: separate err, fifo and disable interrupt of reset function
...
Sometimes only need to reset err and fifo regs, so split the origin
reset function to three functions.
Put them at the top of the file, to let more functions can call them.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-4-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
a84a9222b2
i3c: master: svc: fix atomic issue
...
do_daa_locked() function is in a spin lock environment, use
readl_poll_timeout_atomic() to replace the origin
readl_poll_timeout().
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-3-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Clark Wang
57d8d3fc06
i3c: master: svc: move module reset behind clk enable
...
Reset I3C module will R/W its regs, so enable its clocks first.
Signed-off-by: Clark Wang <xiaoning.wang@nxp.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Reviewed-by: Jun Li <jun.li@nxp.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20211227074529.1660398-2-xiaoning.wang@nxp.com
2022-01-05 09:53:44 +01:00
Yang Yingliang
3e5feb11a8
i3c: master: svc: fix doc warning in svc-i3c-master.c
...
Fix the following make W=1 warning:
drivers/i3c/master/svc-i3c-master.c:207: warning: expecting prototype for struct svc_i3c_i3c_dev_data. Prototype was for struct svc_i3c_i2c_dev_data instead
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20210602085544.4101980-1-yangyingliang@huawei.com
2021-06-09 02:02:45 +02:00
Yang Yingliang
59a61e69c4
i3c: master: svc: drop free_irq of devm_request_irq allocated irq
...
irq allocated with devm_request_irq() will be freed in devm_irq_release(),
using free_irq() in ->remove() will causes a dangling pointer, and a
subsequent double free. So remove the free_irq() in svc_i3c_master_remove().
Reported-by: Hulk Robot <hulkci@huawei.com >
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20210602084935.3977636-1-yangyingliang@huawei.com
2021-06-09 02:02:22 +02:00
Colin Ian King
436cb709f8
i3c: master: svc: remove redundant assignment to cmd->read_len
...
The assignment of xfer_len to cmd->read_len appears to be redundant
as the next statement re-assigns the value 0 to it. Clean up the
code by removing the redundant first assignment.
Addresses-Coverity: ("Unused value")
Fixes: dd3c52846d ("i3c: master: svc: Add Silvaco I3C master driver")
Signed-off-by: Colin Ian King <colin.king@canonical.com >
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20210224151349.202332-1-colin.king@canonical.com
2021-03-09 21:13:31 +01:00
Miquel Raynal
dd3c52846d
i3c: master: svc: Add Silvaco I3C master driver
...
Add support for Silvaco I3C dual-role IP. The master role is supported
in SDR mode only. I2C transfers have not been tested but are shared
because they are very close to the I3C transfers in terms of register
configuration.
The IBI processing follows this logic:
- When a slave advertizes an interrupt (SDA pulled low) an interrupt
gets generated by the master. This time is unbounded and may be
deferred.
- The IRQ handler itself does not process anything: it only queues a
work that will be run in non-atomic context. This is needed because
short wait periods must be experienced.
- The IBI job is divided in two parts: the first one is "critical" in
the sense that it may not support getting interrupted. If this
happens, after this first section the driver checks the master error
register and depending on its content either flushes everything and
errors out, or ends the processing (this second section may be
interrupted).
- If the critical section got interrupted, the slave will
automatically respin it's IBI request when it will be allowed to.
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com >
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com >
Link: https://lore.kernel.org/r/20210121101808.14654-6-miquel.raynal@bootlin.com
2021-02-06 00:43:29 +01:00