Skip to content

Commit b0faf02

Browse files
committed
i2c: at91: add support for analog filtering
Add support for analog filtering for i2c lines. The sama5d2 and sam9x60 support this feature. Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
1 parent 7c75daa commit b0faf02

1 file changed

Lines changed: 27 additions & 4 deletions

File tree

drivers/i2c/busses/i2c-at91.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@
9292

9393
#define AT91_TWI_FILTR 0x0044
9494
#define AT91_TWI_FILTR_FILT BIT(0)
95+
#define AT91_TWI_FILTR_PADFEN BIT(1)
96+
#define AT91_TWI_FILTR_PADFCFG BIT(2)
9597
#define AT91_TWI_FILTR_THRES(v) ((v) << 8)
9698
#define AT91_TWI_FILTR_THRES_MASK GENMASK(10, 8)
9799

@@ -121,6 +123,7 @@ struct at91_twi_pdata {
121123
bool has_hold_field;
122124
bool has_dig_filtr;
123125
bool has_adv_dig_filtr;
126+
bool has_ana_filtr;
124127
struct at_dma_slave dma_slave;
125128
};
126129

@@ -154,6 +157,7 @@ struct at91_twi_dev {
154157
u32 fifo_size;
155158
struct at91_twi_dma dma;
156159
bool enable_dig_filt;
160+
bool enable_ana_filt;
157161
};
158162

159163
static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg)
@@ -185,6 +189,7 @@ static void at91_twi_irq_restore(struct at91_twi_dev *dev)
185189
static void at91_init_twi_bus(struct at91_twi_dev *dev)
186190
{
187191
struct at91_twi_pdata *pdata = dev->pdata;
192+
u32 filtr = 0;
188193

189194
at91_disable_twi_interrupts(dev);
190195
at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SWRST);
@@ -197,13 +202,19 @@ static void at91_init_twi_bus(struct at91_twi_dev *dev)
197202

198203
/* enable digital filter */
199204
if (pdata->has_dig_filtr && dev->enable_dig_filt)
200-
at91_twi_write(dev, AT91_TWI_FILTR, AT91_TWI_FILTR_FILT);
205+
filtr |= AT91_TWI_FILTR_FILT;
201206

202207
/* enable advanced digital filter */
203208
if (pdata->has_adv_dig_filtr && dev->enable_dig_filt)
204-
at91_twi_write(dev, AT91_TWI_FILTR, AT91_TWI_FILTR_FILT |
205-
(AT91_TWI_FILTR_THRES(7) &
206-
AT91_TWI_FILTR_THRES_MASK));
209+
filtr |= AT91_TWI_FILTR_FILT |
210+
(AT91_TWI_FILTR_THRES(7) & AT91_TWI_FILTR_THRES_MASK);
211+
212+
/* enable analog filter */
213+
if (pdata->has_ana_filtr && dev->enable_ana_filt)
214+
filtr |= AT91_TWI_FILTR_PADFEN | AT91_TWI_FILTR_PADFCFG;
215+
216+
if (filtr)
217+
at91_twi_write(dev, AT91_TWI_FILTR, filtr);
207218
}
208219

209220
/*
@@ -853,6 +864,7 @@ static struct at91_twi_pdata at91rm9200_config = {
853864
.has_hold_field = false,
854865
.has_dig_filtr = false,
855866
.has_adv_dig_filtr = false,
867+
.has_ana_filtr = false,
856868
};
857869

858870
static struct at91_twi_pdata at91sam9261_config = {
@@ -863,6 +875,7 @@ static struct at91_twi_pdata at91sam9261_config = {
863875
.has_hold_field = false,
864876
.has_dig_filtr = false,
865877
.has_adv_dig_filtr = false,
878+
.has_ana_filtr = false,
866879
};
867880

868881
static struct at91_twi_pdata at91sam9260_config = {
@@ -873,6 +886,7 @@ static struct at91_twi_pdata at91sam9260_config = {
873886
.has_hold_field = false,
874887
.has_dig_filtr = false,
875888
.has_adv_dig_filtr = false,
889+
.has_ana_filtr = false,
876890
};
877891

878892
static struct at91_twi_pdata at91sam9g20_config = {
@@ -883,6 +897,7 @@ static struct at91_twi_pdata at91sam9g20_config = {
883897
.has_hold_field = false,
884898
.has_dig_filtr = false,
885899
.has_adv_dig_filtr = false,
900+
.has_ana_filtr = false,
886901
};
887902

888903
static struct at91_twi_pdata at91sam9g10_config = {
@@ -893,6 +908,7 @@ static struct at91_twi_pdata at91sam9g10_config = {
893908
.has_hold_field = false,
894909
.has_dig_filtr = false,
895910
.has_adv_dig_filtr = false,
911+
.has_ana_filtr = false,
896912
};
897913

898914
static const struct platform_device_id at91_twi_devtypes[] = {
@@ -925,6 +941,7 @@ static struct at91_twi_pdata at91sam9x5_config = {
925941
.has_hold_field = false,
926942
.has_dig_filtr = false,
927943
.has_adv_dig_filtr = false,
944+
.has_ana_filtr = false,
928945
};
929946

930947
static struct at91_twi_pdata sama5d4_config = {
@@ -935,6 +952,7 @@ static struct at91_twi_pdata sama5d4_config = {
935952
.has_hold_field = true,
936953
.has_dig_filtr = true,
937954
.has_adv_dig_filtr = false,
955+
.has_ana_filtr = false,
938956
};
939957

940958
static struct at91_twi_pdata sama5d2_config = {
@@ -945,6 +963,7 @@ static struct at91_twi_pdata sama5d2_config = {
945963
.has_hold_field = true,
946964
.has_dig_filtr = true,
947965
.has_adv_dig_filtr = true,
966+
.has_ana_filtr = true,
948967
};
949968

950969
static struct at91_twi_pdata sam9x60_config = {
@@ -955,6 +974,7 @@ static struct at91_twi_pdata sam9x60_config = {
955974
.has_hold_field = true,
956975
.has_dig_filtr = true,
957976
.has_adv_dig_filtr = true,
977+
.has_ana_filtr = true,
958978
};
959979

960980
static const struct of_device_id atmel_twi_dt_ids[] = {
@@ -1157,6 +1177,9 @@ static int at91_twi_probe(struct platform_device *pdev)
11571177
dev->enable_dig_filt = of_property_read_bool(pdev->dev.of_node,
11581178
"enable-dig-filt");
11591179

1180+
dev->enable_ana_filt = of_property_read_bool(pdev->dev.of_node,
1181+
"enable-ana-filt");
1182+
11601183
at91_calc_twi_clock(dev, bus_clk_rate);
11611184
at91_init_twi_bus(dev);
11621185

0 commit comments

Comments
 (0)