Re: [PATCH v3 5/7] i2c: aspeed: Add aspeed_set_slave_busy()
From: Quan Nguyen <quan@os.amperecomputing.com>
Date: 2021-05-28 01:00:33
Also in:
linux-aspeed, linux-devicetree, linux-i2c, lkml, openbmc
On 21/05/2021 13:09, Ryan Chen wrote:
quoted
-----Original Message----- From: Quan Nguyen <quan@os.amperecomputing.com> Sent: Thursday, May 20, 2021 10:10 PM To: Ryan Chen <ryan_chen@aspeedtech.com>; Corey Minyard [off-list ref]; Rob Herring [off-list ref]; Joel Stanley [off-list ref]; Andrew Jeffery [off-list ref]; Brendan Higgins [off-list ref]; Benjamin Herrenschmidt [off-list ref]; Wolfram Sang [off-list ref]; Philipp Zabel [off-list ref]; openipmi-developer@lists.sourceforge.net; devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-aspeed@lists.ozlabs.org; linux-kernel@vger.kernel.org; linux-i2c@vger.kernel.org Cc: Open Source Submission <redacted>; Thang Q . Nguyen [off-list ref]; Phong Vo [off-list ref]; openbmc@lists.ozlabs.org Subject: Re: [PATCH v3 5/7] i2c: aspeed: Add aspeed_set_slave_busy() On 20/05/2021 18:06, Ryan Chen wrote:quoted
quoted
-----Original Message----- From: openbmc [off-list ref] OnBehalfquoted
quoted
Of Quan Nguyen Sent: Wednesday, May 19, 2021 3:50 PM To: Corey Minyard <redacted>; Rob Herring [off-list ref]; Joel Stanley [off-list ref]; Andrew Jeffery [off-list ref]; Brendan Higgins [off-list ref]; Benjamin Herrenschmidt [off-list ref]; Wolfram Sang [off-list ref]; Philipp Zabel [off-list ref]; openipmi-developer@lists.sourceforge.net; devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-aspeed@lists.ozlabs.org; linux-kernel@vger.kernel.org; linux-i2c@vger.kernel.org Cc: Open Source Submission <redacted>; Thang Q . Nguyen [off-list ref]; Phong Vo [off-list ref]; openbmc@lists.ozlabs.org Subject: [PATCH v3 5/7] i2c: aspeed: Add aspeed_set_slave_busy() Slave i2c device on AST2500 received a lot of slave irq while it is busy processing the response. To handle this case, adds and exports aspeed_set_slave_busy() for controller to temporary stop slave irq while slave is handling the response, and re-enable them again when theresponse is ready.quoted
quoted
Signed-off-by: Quan Nguyen <quan@os.amperecomputing.com> --- v3: + First introduce in v3 [Quan] drivers/i2c/busses/i2c-aspeed.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)diff --git a/drivers/i2c/busses/i2c-aspeed.cb/drivers/i2c/busses/i2c-aspeed.c index b2e9c8f0ddf7..9926d04831a2 100644--- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c@@ -944,6 +944,26 @@ static int aspeed_i2c_init(struct aspeed_i2c_bus*bus, return 0; } +#if IS_ENABLED(CONFIG_I2C_SLAVE) +void aspeed_set_slave_busy(struct i2c_adapter *adap, bool busy) { + struct aspeed_i2c_bus *bus = i2c_get_adapdata(adap); + unsigned long current_mask, flags; + + spin_lock_irqsave(&bus->lock, flags); + + current_mask = readl(bus->base + ASPEED_I2C_INTR_CTRL_REG); + if (busy) + current_mask &= ~(ASPEED_I2CD_INTR_RX_DONE | ASPEED_I2CD_INTR_SLAVE_MATCH); + else + current_mask |= ASPEED_I2CD_INTR_RX_DONE | ASPEED_I2CD_INTR_SLAVE_MATCH; + writel(current_mask, bus->base + ASPEED_I2C_INTR_CTRL_REG); + + spin_unlock_irqrestore(&bus->lock, flags); } +EXPORT_SYMBOL_GPL(aspeed_set_slave_busy); +#endif + static int aspeed_i2c_reset(struct aspeed_i2c_bus *bus) { struct platform_device *pdev = to_platform_device(bus->dev); -- 2.28.0Hello, The better idea is use disable i2c slave mode. Due to if i2c controller running in slave will get slave match, and latch theSCL.quoted
Until cpu clear interrupt status. RyanThanks Ryan, Do you mean to enable/disable slave function as per example code below ?Yes. it is.
Dear Ryan, This solution looks good. I'll switch to use this way in next version. Thanks for the suggestion. - Quan
quoted
/* Turn on slave mode. */ func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG); func_ctrl_reg_val |= ASPEED_I2CD_SLAVE_EN; writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG); Will try this idea. - Quan
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel