Skip to content

Commit

Permalink
i2c: at91: add support for digital filtering
Browse files Browse the repository at this point in the history
Add new platform data support for digital filtering for i2c.
The sama5d4, sama5d2 and sam9x60 support this feature.

Signed-off-by: Eugen Hristev <[email protected]>
Acked-by: Ludovic Desroches <[email protected]>
Reviewed-by: Peter Rosin <[email protected]>
Signed-off-by: Wolfram Sang <[email protected]>
  • Loading branch information
ehristev authored and Wolfram Sang committed Oct 24, 2019
1 parent b002779 commit 2989b45
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
9 changes: 9 additions & 0 deletions drivers/i2c/busses/i2c-at91-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ static struct at91_twi_pdata at91rm9200_config = {
.has_unre_flag = true,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static struct at91_twi_pdata at91sam9261_config = {
Expand All @@ -76,6 +77,7 @@ static struct at91_twi_pdata at91sam9261_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static struct at91_twi_pdata at91sam9260_config = {
Expand All @@ -84,6 +86,7 @@ static struct at91_twi_pdata at91sam9260_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static struct at91_twi_pdata at91sam9g20_config = {
Expand All @@ -92,6 +95,7 @@ static struct at91_twi_pdata at91sam9g20_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static struct at91_twi_pdata at91sam9g10_config = {
Expand All @@ -100,6 +104,7 @@ static struct at91_twi_pdata at91sam9g10_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static const struct platform_device_id at91_twi_devtypes[] = {
Expand Down Expand Up @@ -130,6 +135,7 @@ static struct at91_twi_pdata at91sam9x5_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = false,
.has_dig_filtr = false,
};

static struct at91_twi_pdata sama5d4_config = {
Expand All @@ -138,6 +144,7 @@ static struct at91_twi_pdata sama5d4_config = {
.has_unre_flag = false,
.has_alt_cmd = false,
.has_hold_field = true,
.has_dig_filtr = true,
};

static struct at91_twi_pdata sama5d2_config = {
Expand All @@ -146,6 +153,7 @@ static struct at91_twi_pdata sama5d2_config = {
.has_unre_flag = true,
.has_alt_cmd = true,
.has_hold_field = true,
.has_dig_filtr = true,
};

static struct at91_twi_pdata sam9x60_config = {
Expand All @@ -154,6 +162,7 @@ static struct at91_twi_pdata sam9x60_config = {
.has_unre_flag = true,
.has_alt_cmd = true,
.has_hold_field = true,
.has_dig_filtr = true,
};

static const struct of_device_id atmel_twi_dt_ids[] = {
Expand Down
9 changes: 9 additions & 0 deletions drivers/i2c/busses/i2c-at91-master.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,18 @@

void at91_init_twi_bus_master(struct at91_twi_dev *dev)
{
struct at91_twi_pdata *pdata = dev->pdata;

/* FIFO should be enabled immediately after the software reset */
if (dev->fifo_size)
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_FIFOEN);
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN);
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS);
at91_twi_write(dev, AT91_TWI_CWGR, dev->twi_cwgr_reg);

/* enable digital filter */
if (pdata->has_dig_filtr && dev->enable_dig_filt)
at91_twi_write(dev, AT91_TWI_FILTR, AT91_TWI_FILTR_FILT);
}

/*
Expand Down Expand Up @@ -793,6 +799,9 @@ int at91_twi_probe_master(struct platform_device *pdev,
dev_info(dev->dev, "Using FIFO (%u data)\n", dev->fifo_size);
}

dev->enable_dig_filt = of_property_read_bool(pdev->dev.of_node,
"i2c-digital-filter");

at91_calc_twi_clock(dev);

dev->adapter.algo = &at91_twi_algorithm;
Expand Down
5 changes: 5 additions & 0 deletions drivers/i2c/busses/i2c-at91.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@
#define AT91_TWI_ACR_DATAL(len) ((len) & 0xff)
#define AT91_TWI_ACR_DIR BIT(8)

#define AT91_TWI_FILTR 0x0044
#define AT91_TWI_FILTR_FILT BIT(0)

#define AT91_TWI_FMR 0x0050 /* FIFO Mode Register */
#define AT91_TWI_FMR_TXRDYM(mode) (((mode) & 0x3) << 0)
#define AT91_TWI_FMR_TXRDYM_MASK (0x3 << 0)
Expand All @@ -108,6 +111,7 @@ struct at91_twi_pdata {
bool has_unre_flag;
bool has_alt_cmd;
bool has_hold_field;
bool has_dig_filtr;
struct at_dma_slave dma_slave;
};

Expand Down Expand Up @@ -145,6 +149,7 @@ struct at91_twi_dev {
unsigned smr;
struct i2c_client *slave;
#endif
bool enable_dig_filt;
};

unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg);
Expand Down

0 comments on commit 2989b45

Please sign in to comment.