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
159163static 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)
185189static 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
858870static 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
868881static 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
878892static 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
888903static 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
898914static 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
930947static 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
940958static 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
950969static 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
960980static 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