From: Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx> Add new platform data support for analog filtering for i2c. The sama5d2 and sam9x60 support this feature. Signed-off-by: Eugen Hristev <eugen.hristev@xxxxxxxxxxxxx> --- drivers/i2c/busses/i2c-at91-core.c | 9 +++++++++ drivers/i2c/busses/i2c-at91-master.c | 15 +++++++++++---- drivers/i2c/busses/i2c-at91.h | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-at91-core.c b/drivers/i2c/busses/i2c-at91-core.c index 3bbe37c..d2840ba 100644 --- a/drivers/i2c/busses/i2c-at91-core.c +++ b/drivers/i2c/busses/i2c-at91-core.c @@ -70,6 +70,7 @@ static struct at91_twi_pdata at91rm9200_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata at91sam9261_config = { @@ -80,6 +81,7 @@ static struct at91_twi_pdata at91sam9261_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata at91sam9260_config = { @@ -90,6 +92,7 @@ static struct at91_twi_pdata at91sam9260_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata at91sam9g20_config = { @@ -100,6 +103,7 @@ static struct at91_twi_pdata at91sam9g20_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata at91sam9g10_config = { @@ -110,6 +114,7 @@ static struct at91_twi_pdata at91sam9g10_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static const struct platform_device_id at91_twi_devtypes[] = { @@ -142,6 +147,7 @@ static struct at91_twi_pdata at91sam9x5_config = { .has_hold_field = false, .has_dig_filtr = false, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata sama5d4_config = { @@ -152,6 +158,7 @@ static struct at91_twi_pdata sama5d4_config = { .has_hold_field = true, .has_dig_filtr = true, .has_adv_dig_filtr = false, + .has_ana_filtr = false, }; static struct at91_twi_pdata sama5d2_config = { @@ -162,6 +169,7 @@ static struct at91_twi_pdata sama5d2_config = { .has_hold_field = true, .has_dig_filtr = true, .has_adv_dig_filtr = true, + .has_ana_filtr = true, }; static struct at91_twi_pdata sam9x60_config = { @@ -172,6 +180,7 @@ static struct at91_twi_pdata sam9x60_config = { .has_hold_field = true, .has_dig_filtr = true, .has_adv_dig_filtr = true, + .has_ana_filtr = true, }; static const struct of_device_id atmel_twi_dt_ids[] = { diff --git a/drivers/i2c/busses/i2c-at91-master.c b/drivers/i2c/busses/i2c-at91-master.c index b9e601e..6b591ac 100644 --- a/drivers/i2c/busses/i2c-at91-master.c +++ b/drivers/i2c/busses/i2c-at91-master.c @@ -32,6 +32,7 @@ void at91_init_twi_bus_master(struct at91_twi_dev *dev) { struct at91_twi_pdata *pdata = dev->pdata; + u32 filtr = 0; /* FIFO should be enabled immediately after the software reset */ if (dev->fifo_size) @@ -42,13 +43,19 @@ void at91_init_twi_bus_master(struct at91_twi_dev *dev) /* enable digital filter */ if (pdata->has_dig_filtr) - at91_twi_write(dev, AT91_TWI_FILTR, AT91_TWI_FILTR_FILT); + filtr |= AT91_TWI_FILTR_FILT; /* enable advanced digital filter */ if (pdata->has_adv_dig_filtr) - at91_twi_write(dev, AT91_TWI_FILTR, AT91_TWI_FILTR_FILT | - (AT91_TWI_FILTR_THRES(7) & - AT91_TWI_FILTR_THRES_MASK)); + filtr |= AT91_TWI_FILTR_FILT | + (AT91_TWI_FILTR_THRES(7) & AT91_TWI_FILTR_THRES_MASK); + + /* enable analog filter */ + if (pdata->has_ana_filtr) + filtr |= AT91_TWI_FILTR_PADFEN | AT91_TWI_FILTR_PADFCFG; + + if (filtr) + at91_twi_write(dev, AT91_TWI_FILTR, filtr); } /* diff --git a/drivers/i2c/busses/i2c-at91.h b/drivers/i2c/busses/i2c-at91.h index ccf18ba..f009799 100644 --- a/drivers/i2c/busses/i2c-at91.h +++ b/drivers/i2c/busses/i2c-at91.h @@ -86,6 +86,8 @@ #define AT91_TWI_FILTR 0x0044 #define AT91_TWI_FILTR_FILT BIT(0) +#define AT91_TWI_FILTR_PADFEN BIT(1) +#define AT91_TWI_FILTR_PADFCFG BIT(2) #define AT91_TWI_FILTR_THRES(v) ((v) << 8) #define AT91_TWI_FILTR_THRES_MASK GENMASK(10, 8) @@ -115,6 +117,7 @@ struct at91_twi_pdata { bool has_hold_field; bool has_dig_filtr; bool has_adv_dig_filtr; + bool has_ana_filtr; struct at_dma_slave dma_slave; }; -- 2.7.4