@@ -152,28 +152,39 @@ struct bmc150_accel_interrupt {
152
152
atomic_t users ;
153
153
};
154
154
155
+ struct bmc150_accel_trigger {
156
+ struct bmc150_accel_data * data ;
157
+ struct iio_trigger * indio_trig ;
158
+ int (* setup )(struct bmc150_accel_trigger * t , bool state );
159
+ int intr ;
160
+ bool enabled ;
161
+ };
162
+
155
163
enum bmc150_accel_interrupt_id {
156
164
BMC150_ACCEL_INT_DATA_READY ,
157
165
BMC150_ACCEL_INT_ANY_MOTION ,
158
166
BMC150_ACCEL_INT_WATERMARK ,
159
167
BMC150_ACCEL_INTERRUPTS ,
160
168
};
161
169
170
+ enum bmc150_accel_trigger_id {
171
+ BMC150_ACCEL_TRIGGER_DATA_READY ,
172
+ BMC150_ACCEL_TRIGGER_ANY_MOTION ,
173
+ BMC150_ACCEL_TRIGGERS ,
174
+ };
175
+
162
176
struct bmc150_accel_data {
163
177
struct i2c_client * client ;
164
178
struct bmc150_accel_interrupt interrupts [BMC150_ACCEL_INTERRUPTS ];
165
- struct iio_trigger * dready_trig ;
166
- struct iio_trigger * motion_trig ;
167
179
atomic_t active_intr ;
180
+ struct bmc150_accel_trigger triggers [BMC150_ACCEL_TRIGGERS ];
168
181
struct mutex mutex ;
169
182
s16 buffer [8 ];
170
183
u8 bw_bits ;
171
184
u32 slope_dur ;
172
185
u32 slope_thres ;
173
186
u32 range ;
174
187
int ev_enable_state ;
175
- bool dready_trigger_on ;
176
- bool motion_trigger_on ;
177
188
int64_t timestamp ;
178
189
const struct bmc150_accel_chip_info * chip_info ;
179
190
};
@@ -314,6 +325,15 @@ static int bmc150_accel_update_slope(struct bmc150_accel_data *data)
314
325
return ret ;
315
326
}
316
327
328
+ static int bmc150_accel_any_motion_setup (struct bmc150_accel_trigger * t ,
329
+ bool state )
330
+ {
331
+ if (state )
332
+ return bmc150_accel_update_slope (t -> data );
333
+
334
+ return 0 ;
335
+ }
336
+
317
337
static int bmc150_accel_chip_init (struct bmc150_accel_data * data )
318
338
{
319
339
int ret ;
@@ -793,11 +813,14 @@ static int bmc150_accel_validate_trigger(struct iio_dev *indio_dev,
793
813
struct iio_trigger * trig )
794
814
{
795
815
struct bmc150_accel_data * data = iio_priv (indio_dev );
816
+ int i ;
796
817
797
- if (data -> dready_trig != trig && data -> motion_trig != trig )
798
- return - EINVAL ;
818
+ for (i = 0 ; i < BMC150_ACCEL_TRIGGERS ; i ++ ) {
819
+ if (data -> triggers [i ].indio_trig == trig )
820
+ return 0 ;
821
+ }
799
822
800
- return 0 ;
823
+ return - EINVAL ;
801
824
}
802
825
803
826
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL (
@@ -969,12 +992,12 @@ static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p)
969
992
970
993
static int bmc150_accel_trig_try_reen (struct iio_trigger * trig )
971
994
{
972
- struct iio_dev * indio_dev = iio_trigger_get_drvdata (trig );
973
- struct bmc150_accel_data * data = iio_priv ( indio_dev ) ;
995
+ struct bmc150_accel_trigger * t = iio_trigger_get_drvdata (trig );
996
+ struct bmc150_accel_data * data = t -> data ;
974
997
int ret ;
975
998
976
999
/* new data interrupts don't need ack */
977
- if (data -> dready_trigger_on )
1000
+ if (t == & t -> data -> triggers [ BMC150_ACCEL_TRIGGER_DATA_READY ] )
978
1001
return 0 ;
979
1002
980
1003
mutex_lock (& data -> mutex );
@@ -993,54 +1016,43 @@ static int bmc150_accel_trig_try_reen(struct iio_trigger *trig)
993
1016
return 0 ;
994
1017
}
995
1018
996
- static int bmc150_accel_data_rdy_trigger_set_state (struct iio_trigger * trig ,
1019
+ static int bmc150_accel_trigger_set_state (struct iio_trigger * trig ,
997
1020
bool state )
998
1021
{
999
- struct iio_dev * indio_dev = iio_trigger_get_drvdata (trig );
1000
- struct bmc150_accel_data * data = iio_priv ( indio_dev ) ;
1022
+ struct bmc150_accel_trigger * t = iio_trigger_get_drvdata (trig );
1023
+ struct bmc150_accel_data * data = t -> data ;
1001
1024
int ret ;
1002
1025
1003
1026
mutex_lock (& data -> mutex );
1004
1027
1005
- if (data -> motion_trig == trig ) {
1006
- if (data -> motion_trigger_on == state ) {
1007
- mutex_unlock (& data -> mutex );
1008
- return 0 ;
1009
- }
1010
- } else {
1011
- if (data -> dready_trigger_on == state ) {
1028
+ if (t -> enabled == state ) {
1029
+ mutex_unlock (& data -> mutex );
1030
+ return 0 ;
1031
+ }
1032
+
1033
+ if (t -> setup ) {
1034
+ ret = t -> setup (t , state );
1035
+ if (ret < 0 ) {
1012
1036
mutex_unlock (& data -> mutex );
1013
- return 0 ;
1037
+ return ret ;
1014
1038
}
1015
1039
}
1016
1040
1017
- if (data -> motion_trig == trig ) {
1018
- ret = bmc150_accel_update_slope (data );
1019
- if (!ret )
1020
- ret = bmc150_accel_set_interrupt (data ,
1021
- BMC150_ACCEL_INT_ANY_MOTION ,
1022
- state );
1023
- } else {
1024
- ret = bmc150_accel_set_interrupt (data ,
1025
- BMC150_ACCEL_INT_DATA_READY ,
1026
- state );
1027
- }
1041
+ ret = bmc150_accel_set_interrupt (data , t -> intr , state );
1028
1042
if (ret < 0 ) {
1029
1043
mutex_unlock (& data -> mutex );
1030
1044
return ret ;
1031
1045
}
1032
- if (data -> motion_trig == trig )
1033
- data -> motion_trigger_on = state ;
1034
- else
1035
- data -> dready_trigger_on = state ;
1046
+
1047
+ t -> enabled = state ;
1036
1048
1037
1049
mutex_unlock (& data -> mutex );
1038
1050
1039
1051
return ret ;
1040
1052
}
1041
1053
1042
1054
static const struct iio_trigger_ops bmc150_accel_trigger_ops = {
1043
- .set_trigger_state = bmc150_accel_data_rdy_trigger_set_state ,
1055
+ .set_trigger_state = bmc150_accel_trigger_set_state ,
1044
1056
.try_reenable = bmc150_accel_trig_try_reen ,
1045
1057
.owner = THIS_MODULE ,
1046
1058
};
@@ -1086,7 +1098,7 @@ static irqreturn_t bmc150_accel_event_handler(int irq, void *private)
1086
1098
dir ),
1087
1099
data -> timestamp );
1088
1100
ack_intr_status :
1089
- if (!data -> dready_trigger_on )
1101
+ if (!data -> triggers [ BMC150_ACCEL_TRIGGER_DATA_READY ]. enabled )
1090
1102
ret = i2c_smbus_write_byte_data (data -> client ,
1091
1103
BMC150_ACCEL_REG_INT_RST_LATCH ,
1092
1104
BMC150_ACCEL_INT_MODE_LATCH_INT |
@@ -1099,13 +1111,16 @@ static irqreturn_t bmc150_accel_data_rdy_trig_poll(int irq, void *private)
1099
1111
{
1100
1112
struct iio_dev * indio_dev = private ;
1101
1113
struct bmc150_accel_data * data = iio_priv (indio_dev );
1114
+ int i ;
1102
1115
1103
1116
data -> timestamp = iio_get_time_ns ();
1104
1117
1105
- if (data -> dready_trigger_on )
1106
- iio_trigger_poll (data -> dready_trig );
1107
- else if (data -> motion_trigger_on )
1108
- iio_trigger_poll (data -> motion_trig );
1118
+ for (i = 0 ; i < BMC150_ACCEL_TRIGGERS ; i ++ ) {
1119
+ if (data -> triggers [i ].enabled ) {
1120
+ iio_trigger_poll (data -> triggers [i ].indio_trig );
1121
+ break ;
1122
+ }
1123
+ }
1109
1124
1110
1125
if (data -> ev_enable_state )
1111
1126
return IRQ_WAKE_THREAD ;
@@ -1153,6 +1168,70 @@ static int bmc150_accel_gpio_probe(struct i2c_client *client,
1153
1168
return ret ;
1154
1169
}
1155
1170
1171
+ static const struct {
1172
+ int intr ;
1173
+ const char * name ;
1174
+ int (* setup )(struct bmc150_accel_trigger * t , bool state );
1175
+ } bmc150_accel_triggers [BMC150_ACCEL_TRIGGERS ] = {
1176
+ {
1177
+ .intr = 0 ,
1178
+ .name = "%s-dev%d" ,
1179
+ },
1180
+ {
1181
+ .intr = 1 ,
1182
+ .name = "%s-any-motion-dev%d" ,
1183
+ .setup = bmc150_accel_any_motion_setup ,
1184
+ },
1185
+ };
1186
+
1187
+ static void bmc150_accel_unregister_triggers (struct bmc150_accel_data * data ,
1188
+ int from )
1189
+ {
1190
+ int i ;
1191
+
1192
+ for (i = from ; i >= 0 ; i ++ ) {
1193
+ if (data -> triggers [i ].indio_trig ) {
1194
+ iio_trigger_unregister (data -> triggers [i ].indio_trig );
1195
+ data -> triggers [i ].indio_trig = NULL ;
1196
+ }
1197
+ }
1198
+ }
1199
+
1200
+ static int bmc150_accel_triggers_setup (struct iio_dev * indio_dev ,
1201
+ struct bmc150_accel_data * data )
1202
+ {
1203
+ int i , ret ;
1204
+
1205
+ for (i = 0 ; i < BMC150_ACCEL_TRIGGERS ; i ++ ) {
1206
+ struct bmc150_accel_trigger * t = & data -> triggers [i ];
1207
+
1208
+ t -> indio_trig = devm_iio_trigger_alloc (& data -> client -> dev ,
1209
+ bmc150_accel_triggers [i ].name ,
1210
+ indio_dev -> name ,
1211
+ indio_dev -> id );
1212
+ if (!t -> indio_trig ) {
1213
+ ret = - ENOMEM ;
1214
+ break ;
1215
+ }
1216
+
1217
+ t -> indio_trig -> dev .parent = & data -> client -> dev ;
1218
+ t -> indio_trig -> ops = & bmc150_accel_trigger_ops ;
1219
+ t -> intr = bmc150_accel_triggers [i ].intr ;
1220
+ t -> data = data ;
1221
+ t -> setup = bmc150_accel_triggers [i ].setup ;
1222
+ iio_trigger_set_drvdata (t -> indio_trig , t );
1223
+
1224
+ ret = iio_trigger_register (t -> indio_trig );
1225
+ if (ret )
1226
+ break ;
1227
+ }
1228
+
1229
+ if (ret )
1230
+ bmc150_accel_unregister_triggers (data , i - 1 );
1231
+
1232
+ return ret ;
1233
+ }
1234
+
1156
1235
static int bmc150_accel_probe (struct i2c_client * client ,
1157
1236
const struct i2c_device_id * id )
1158
1237
{
@@ -1223,36 +1302,10 @@ static int bmc150_accel_probe(struct i2c_client *client,
1223
1302
1224
1303
bmc150_accel_interrupts_setup (indio_dev , data );
1225
1304
1226
- data -> dready_trig = devm_iio_trigger_alloc (& client -> dev ,
1227
- "%s-dev%d" ,
1228
- indio_dev -> name ,
1229
- indio_dev -> id );
1230
- if (!data -> dready_trig )
1231
- return - ENOMEM ;
1232
-
1233
- data -> motion_trig = devm_iio_trigger_alloc (& client -> dev ,
1234
- "%s-any-motion-dev%d" ,
1235
- indio_dev -> name ,
1236
- indio_dev -> id );
1237
- if (!data -> motion_trig )
1238
- return - ENOMEM ;
1239
-
1240
- data -> dready_trig -> dev .parent = & client -> dev ;
1241
- data -> dready_trig -> ops = & bmc150_accel_trigger_ops ;
1242
- iio_trigger_set_drvdata (data -> dready_trig , indio_dev );
1243
- ret = iio_trigger_register (data -> dready_trig );
1305
+ ret = bmc150_accel_triggers_setup (indio_dev , data );
1244
1306
if (ret )
1245
1307
return ret ;
1246
1308
1247
- data -> motion_trig -> dev .parent = & client -> dev ;
1248
- data -> motion_trig -> ops = & bmc150_accel_trigger_ops ;
1249
- iio_trigger_set_drvdata (data -> motion_trig , indio_dev );
1250
- ret = iio_trigger_register (data -> motion_trig );
1251
- if (ret ) {
1252
- data -> motion_trig = NULL ;
1253
- goto err_trigger_unregister ;
1254
- }
1255
-
1256
1309
ret = iio_triggered_buffer_setup (indio_dev ,
1257
1310
& iio_pollfunc_store_time ,
1258
1311
bmc150_accel_trigger_handler ,
@@ -1284,13 +1337,10 @@ static int bmc150_accel_probe(struct i2c_client *client,
1284
1337
err_iio_unregister :
1285
1338
iio_device_unregister (indio_dev );
1286
1339
err_buffer_cleanup :
1287
- if (data -> dready_trig )
1340
+ if (indio_dev -> pollfunc )
1288
1341
iio_triggered_buffer_cleanup (indio_dev );
1289
1342
err_trigger_unregister :
1290
- if (data -> dready_trig )
1291
- iio_trigger_unregister (data -> dready_trig );
1292
- if (data -> motion_trig )
1293
- iio_trigger_unregister (data -> motion_trig );
1343
+ bmc150_accel_unregister_triggers (data , BMC150_ACCEL_TRIGGERS - 1 );
1294
1344
1295
1345
return ret ;
1296
1346
}
@@ -1306,11 +1356,7 @@ static int bmc150_accel_remove(struct i2c_client *client)
1306
1356
1307
1357
iio_device_unregister (indio_dev );
1308
1358
1309
- if (data -> dready_trig ) {
1310
- iio_triggered_buffer_cleanup (indio_dev );
1311
- iio_trigger_unregister (data -> dready_trig );
1312
- iio_trigger_unregister (data -> motion_trig );
1313
- }
1359
+ bmc150_accel_unregister_triggers (data , BMC150_ACCEL_TRIGGERS - 1 );
1314
1360
1315
1361
mutex_lock (& data -> mutex );
1316
1362
bmc150_accel_set_mode (data , BMC150_ACCEL_SLEEP_MODE_DEEP_SUSPEND , 0 );
0 commit comments