riscv/mpfs: add i2c reset handler

Add reset functionality into the mpfs i2c driver.

Signed-off-by: Eero Nurkkala <eero.nurkkala@offcode.fi>
This commit is contained in:
Eero Nurkkala 2021-06-16 08:46:20 +03:00 committed by Alan Carvalho de Assis
parent 04c805207a
commit 502210e98c
2 changed files with 45 additions and 1 deletions

View File

@ -95,10 +95,12 @@ config MPFS_UART4
config MPFS_I2C0
bool "I2C 0"
select ARCH_HAVE_I2CRESET
default n
config MPFS_I2C1
bool "I2C 1"
select ARCH_HAVE_I2CRESET
default n
endmenu

View File

@ -96,9 +96,16 @@ static int mpfs_i2c_transfer(struct i2c_master_s *dev,
struct i2c_msg_s *msgs,
int count);
#ifdef CONFIG_I2C_RESET
static int mpfs_i2c_reset(struct i2c_master_s *dev);
#endif
static const struct i2c_ops_s mpfs_i2c_ops =
{
.transfer = mpfs_i2c_transfer
.transfer = mpfs_i2c_transfer,
#ifdef CONFIG_I2C_RESET
.reset = mpfs_i2c_reset,
#endif
};
struct mpfs_i2c_priv_s
@ -692,6 +699,41 @@ static int mpfs_i2c_transfer(struct i2c_master_s *dev,
return ret;
}
/****************************************************************************
* Name: mpfs_i2c_reset
*
* Description:
* Performs an I2C bus reset. This may be used to recover from a buggy
* situation.
*
* Input Parameters:
* dev - Device-specific state data
*
* Returned Value:
* Zero (OK) on success; this should not fail.
*
****************************************************************************/
#ifdef CONFIG_I2C_RESET
static int mpfs_i2c_reset(struct i2c_master_s *dev)
{
struct mpfs_i2c_priv_s *priv = (struct mpfs_i2c_priv_s *)dev;
DEBUGASSERT(priv != NULL);
up_disable_irq(priv->plic_irq);
mpfs_i2c_init(priv);
priv->tx_size = 0;
priv->tx_idx = 0;
priv->rx_size = 0;
priv->rx_idx = 0;
/* up_enable_irq() will be called at mpfs_i2c_sendstart() */
return OK;
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/