Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: light: apds9306: Improve apds9306_write_event_config()

Simplify event configuration flow.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Link: https://lore.kernel.org/all/20240310124237.52fa8a56@jic23-huawei/
Signed-off-by: Subhajit Ghosh <subhajit.ghosh@tweaklogic.com>
Link: https://lore.kernel.org/r/20240405104641.29478-1-subhajit.ghosh@tweaklogic.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Subhajit Ghosh and committed by
Jonathan Cameron
85795d3e 47ef0501

+27 -21
+27 -21
drivers/iio/light/apds9306.c
··· 1075 1075 { 1076 1076 struct apds9306_data *data = iio_priv(indio_dev); 1077 1077 struct apds9306_regfields *rf = &data->rf; 1078 - int ret, val; 1079 - 1080 - state = !!state; 1078 + int ret, enabled; 1081 1079 1082 1080 switch (type) { 1083 1081 case IIO_EV_TYPE_THRESH: { 1084 1082 guard(mutex)(&data->mutex); 1083 + 1084 + ret = regmap_field_read(rf->int_en, &enabled); 1085 + if (ret) 1086 + return ret; 1085 1087 1086 1088 /* 1087 1089 * If interrupt is enabled, the channel is set before enabling ··· 1093 1091 */ 1094 1092 if (state) { 1095 1093 if (chan->type == IIO_LIGHT) 1096 - val = 1; 1094 + ret = regmap_field_write(rf->int_src, 1); 1097 1095 else if (chan->type == IIO_INTENSITY) 1098 - val = 0; 1096 + ret = regmap_field_write(rf->int_src, 0); 1099 1097 else 1100 1098 return -EINVAL; 1101 1099 1102 - ret = regmap_field_write(rf->int_src, val); 1103 1100 if (ret) 1104 1101 return ret; 1105 - } 1106 1102 1107 - ret = regmap_field_read(rf->int_en, &val); 1108 - if (ret) 1109 - return ret; 1103 + if (enabled) 1104 + return 0; 1110 1105 1111 - if (val == state) 1112 - return 0; 1106 + ret = regmap_field_write(rf->int_en, 1); 1107 + if (ret) 1108 + return ret; 1113 1109 1114 - ret = regmap_field_write(rf->int_en, state); 1115 - if (ret) 1116 - return ret; 1117 - 1118 - if (state) 1119 1110 return pm_runtime_resume_and_get(data->dev); 1111 + } else { 1112 + if (!enabled) 1113 + return 0; 1120 1114 1121 - pm_runtime_mark_last_busy(data->dev); 1122 - pm_runtime_put_autosuspend(data->dev); 1115 + ret = regmap_field_write(rf->int_en, 0); 1116 + if (ret) 1117 + return ret; 1123 1118 1124 - return 0; 1119 + pm_runtime_mark_last_busy(data->dev); 1120 + pm_runtime_put_autosuspend(data->dev); 1121 + 1122 + return 0; 1123 + } 1125 1124 } 1126 1125 case IIO_EV_TYPE_THRESH_ADAPTIVE: 1127 - return regmap_field_write(rf->int_thresh_var_en, state); 1126 + if (state) 1127 + return regmap_field_write(rf->int_thresh_var_en, 1); 1128 + else 1129 + return regmap_field_write(rf->int_thresh_var_en, 0); 1128 1130 default: 1129 1131 return -EINVAL; 1130 1132 }