Lines Matching refs:encoder
11 * See file:Documentation/input/devices/rotary-encoder.rst for more information
26 #define DRV_NAME "rotary-encoder"
56 static unsigned int rotary_encoder_get_state(struct rotary_encoder *encoder)
61 for (i = 0; i < encoder->gpios->ndescs; ++i) {
62 int val = gpiod_get_value_cansleep(encoder->gpios->desc[i]);
65 if (encoder->encoding == ROTENC_GRAY && ret & 1)
74 static void rotary_encoder_report_event(struct rotary_encoder *encoder)
76 if (encoder->relative_axis) {
77 input_report_rel(encoder->input,
78 encoder->axis, encoder->dir);
80 unsigned int pos = encoder->pos;
82 if (encoder->dir < 0) {
84 if (encoder->rollover)
85 pos += encoder->steps;
90 if (encoder->rollover || pos < encoder->steps)
94 if (encoder->rollover)
95 pos %= encoder->steps;
97 encoder->pos = pos;
98 input_report_abs(encoder->input, encoder->axis, encoder->pos);
101 input_sync(encoder->input);
106 struct rotary_encoder *encoder = dev_id;
109 mutex_lock(&encoder->access_mutex);
111 state = rotary_encoder_get_state(encoder);
115 if (encoder->armed) {
116 rotary_encoder_report_event(encoder);
117 encoder->armed = false;
123 if (encoder->armed)
124 encoder->dir = 2 - state;
128 encoder->armed = true;
132 mutex_unlock(&encoder->access_mutex);
139 struct rotary_encoder *encoder = dev_id;
142 mutex_lock(&encoder->access_mutex);
144 state = rotary_encoder_get_state(encoder);
147 encoder->dir = ((encoder->last_stable - state + 1) % 4) - 1;
149 if (state != encoder->last_stable) {
150 rotary_encoder_report_event(encoder);
151 encoder->last_stable = state;
155 mutex_unlock(&encoder->access_mutex);
162 struct rotary_encoder *encoder = dev_id;
165 mutex_lock(&encoder->access_mutex);
167 state = rotary_encoder_get_state(encoder);
169 if ((encoder->last_stable + 1) % 4 == state)
170 encoder->dir = 1;
171 else if (encoder->last_stable == (state + 1) % 4)
172 encoder->dir = -1;
176 rotary_encoder_report_event(encoder);
179 encoder->last_stable = state;
180 mutex_unlock(&encoder->access_mutex);
188 struct rotary_encoder *encoder;
195 encoder = devm_kzalloc(dev, sizeof(struct rotary_encoder), GFP_KERNEL);
196 if (!encoder)
199 mutex_init(&encoder->access_mutex);
201 device_property_read_u32(dev, "rotary-encoder,steps", &encoder->steps);
203 err = device_property_read_u32(dev, "rotary-encoder,steps-per-period",
214 "rotary-encoder,half-period") ? 2 : 1;
217 encoder->rollover =
218 device_property_read_bool(dev, "rotary-encoder,rollover");
220 if (!device_property_present(dev, "rotary-encoder,encoding") ||
221 !device_property_match_string(dev, "rotary-encoder,encoding",
224 encoder->encoding = ROTENC_GRAY;
225 } else if (!device_property_match_string(dev, "rotary-encoder,encoding",
228 encoder->encoding = ROTENC_BINARY;
234 device_property_read_u32(dev, "linux,axis", &encoder->axis);
235 encoder->relative_axis =
236 device_property_read_bool(dev, "rotary-encoder,relative-axis");
238 encoder->gpios = devm_gpiod_get_array(dev, NULL, GPIOD_IN);
239 if (IS_ERR(encoder->gpios))
240 return dev_err_probe(dev, PTR_ERR(encoder->gpios), "unable to get gpios\n");
241 if (encoder->gpios->ndescs < 2) {
250 encoder->input = input;
255 if (encoder->relative_axis)
256 input_set_capability(input, EV_REL, encoder->axis);
259 encoder->axis, 0, encoder->steps, 0, 1);
261 switch (steps_per_period >> (encoder->gpios->ndescs - 2)) {
264 encoder->last_stable = rotary_encoder_get_state(encoder);
268 encoder->last_stable = rotary_encoder_get_state(encoder);
279 encoder->irq =
281 encoder->gpios->ndescs, sizeof(*encoder->irq),
283 if (!encoder->irq)
286 for (i = 0; i < encoder->gpios->ndescs; ++i) {
287 encoder->irq[i] = gpiod_to_irq(encoder->gpios->desc[i]);
289 err = devm_request_threaded_irq(dev, encoder->irq[i],
293 DRV_NAME, encoder);
296 encoder->irq[i], i);
310 platform_set_drvdata(pdev, encoder);
317 struct rotary_encoder *encoder = dev_get_drvdata(dev);
321 for (i = 0; i < encoder->gpios->ndescs; ++i)
322 enable_irq_wake(encoder->irq[i]);
330 struct rotary_encoder *encoder = dev_get_drvdata(dev);
334 for (i = 0; i < encoder->gpios->ndescs; ++i)
335 disable_irq_wake(encoder->irq[i]);
346 { .compatible = "rotary-encoder", },
363 MODULE_DESCRIPTION("GPIO rotary encoder driver");