Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 521a8f5c authored by Johan Hovold's avatar Johan Hovold Committed by Dmitry Torokhov
Browse files

Input: rotary-encoder - refactor and clean up



Refactor state retrieval and event reporting in interrupt handler.
Remove a few empty lines.

Signed-off-by: default avatarJohan Hovold <jhovold@gmail.com>
Reviewed-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Acked-by: default avatarDaniel Mack <zonque@gmail.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent baafb435
Loading
Loading
Loading
Loading
+44 −33
Original line number Original line Diff line number Diff line
@@ -40,27 +40,24 @@ struct rotary_encoder {
	unsigned char dir;	/* 0 - clockwise, 1 - CCW */
	unsigned char dir;	/* 0 - clockwise, 1 - CCW */
};
};


static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
static int rotary_encoder_get_state(struct rotary_encoder_platform_data *pdata)
{
{
	struct rotary_encoder *encoder = dev_id;
	struct rotary_encoder_platform_data *pdata = encoder->pdata;
	int a = !!gpio_get_value(pdata->gpio_a);
	int a = !!gpio_get_value(pdata->gpio_a);
	int b = !!gpio_get_value(pdata->gpio_b);
	int b = !!gpio_get_value(pdata->gpio_b);
	int state;


	a ^= pdata->inverted_a;
	a ^= pdata->inverted_a;
	b ^= pdata->inverted_b;
	b ^= pdata->inverted_b;
	state = (a << 1) | b;


	switch (state) {
	return ((a << 1) | b);
}


	case 0x0:
static void rotary_encoder_report_event(struct rotary_encoder *encoder)
		if (!encoder->armed)
{
			break;
	struct rotary_encoder_platform_data *pdata = encoder->pdata;


	if (pdata->relative_axis) {
	if (pdata->relative_axis) {
			input_report_rel(encoder->input, pdata->axis,
		input_report_rel(encoder->input,
					 encoder->dir ? -1 : 1);
				 pdata->axis, encoder->dir ? -1 : 1);
	} else {
	} else {
		unsigned int pos = encoder->pos;
		unsigned int pos = encoder->pos;


@@ -75,15 +72,30 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
			if (pdata->rollover || pos < pdata->steps)
			if (pdata->rollover || pos < pdata->steps)
				pos++;
				pos++;
		}
		}

		if (pdata->rollover)
		if (pdata->rollover)
			pos %= pdata->steps;
			pos %= pdata->steps;

		encoder->pos = pos;
		encoder->pos = pos;
			input_report_abs(encoder->input, pdata->axis,
		input_report_abs(encoder->input, pdata->axis, encoder->pos);
					 encoder->pos);
	}
	}

	input_sync(encoder->input);
	input_sync(encoder->input);
}

static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
{
	struct rotary_encoder *encoder = dev_id;
	int state;

	state = rotary_encoder_get_state(encoder->pdata);


	switch (state) {
	case 0x0:
		if (encoder->armed) {
			rotary_encoder_report_event(encoder);
			encoder->armed = false;
			encoder->armed = false;
		}
		break;
		break;


	case 0x1:
	case 0x1:
@@ -254,4 +266,3 @@ MODULE_ALIAS("platform:" DRV_NAME);
MODULE_DESCRIPTION("GPIO rotary encoder driver");
MODULE_DESCRIPTION("GPIO rotary encoder driver");
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("GPL v2");