aboutsummaryrefslogtreecommitdiffstats
path: root/main/linux-rpi/rotary-encoder-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/linux-rpi/rotary-encoder-fix.patch')
-rw-r--r--main/linux-rpi/rotary-encoder-fix.patch324
1 files changed, 0 insertions, 324 deletions
diff --git a/main/linux-rpi/rotary-encoder-fix.patch b/main/linux-rpi/rotary-encoder-fix.patch
deleted file mode 100644
index 7e08ba6fbe..0000000000
--- a/main/linux-rpi/rotary-encoder-fix.patch
+++ /dev/null
@@ -1,324 +0,0 @@
-commit 0f940be407b87ca629fa2f3085f613483a075b16
-Author: Timo Teräs <timo.teras@iki.fi>
-Date: Fri Jan 15 15:24:14 2016 +0200
-
- Input: rotary_encoder - convert to devm-* api
-
- Use managed resource API for simplifying error paths.
-
- Signed-off-by: Timo Teräs <timo.teras@iki.fi>
-
-diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
-index 8aee719..0f23d32 100644
---- a/drivers/input/misc/rotary_encoder.c
-+++ b/drivers/input/misc/rotary_encoder.c
-@@ -211,8 +211,8 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic
- if (!of_id || !np)
- return NULL;
-
-- pdata = kzalloc(sizeof(struct rotary_encoder_platform_data),
-- GFP_KERNEL);
-+ pdata = devm_kzalloc(dev, sizeof(struct rotary_encoder_platform_data),
-+ GFP_KERNEL);
- if (!pdata)
- return ERR_PTR(-ENOMEM);
-
-@@ -277,12 +277,10 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- }
- }
-
-- encoder = kzalloc(sizeof(struct rotary_encoder), GFP_KERNEL);
-- input = input_allocate_device();
-- if (!encoder || !input) {
-- err = -ENOMEM;
-- goto exit_free_mem;
-- }
-+ encoder = devm_kzalloc(dev, sizeof(struct rotary_encoder), GFP_KERNEL);
-+ input = devm_input_allocate_device(dev);
-+ if (!encoder || !input)
-+ return -ENOMEM;
-
- encoder->input = input;
- encoder->pdata = pdata;
-@@ -301,16 +299,16 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- }
-
- /* request the GPIOs */
-- err = gpio_request_one(pdata->gpio_a, GPIOF_IN, dev_name(dev));
-+ err = devm_gpio_request_one(dev, pdata->gpio_a, GPIOF_IN, dev_name(dev));
- if (err) {
- dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_a);
-- goto exit_free_mem;
-+ return err;
- }
-
-- err = gpio_request_one(pdata->gpio_b, GPIOF_IN, dev_name(dev));
-+ err = devm_gpio_request_one(dev, pdata->gpio_b, GPIOF_IN, dev_name(dev));
- if (err) {
- dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_b);
-- goto exit_free_gpio_a;
-+ return err;
- }
-
- encoder->irq_a = gpio_to_irq(pdata->gpio_a);
-@@ -331,30 +329,29 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- default:
- dev_err(dev, "'%d' is not a valid steps-per-period value\n",
- pdata->steps_per_period);
-- err = -EINVAL;
-- goto exit_free_gpio_b;
-+ return-EINVAL;
- }
-
-- err = request_irq(encoder->irq_a, handler,
-- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-- DRV_NAME, encoder);
-+ err = devm_request_irq(dev, encoder->irq_a, handler,
-+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-+ DRV_NAME, encoder);
- if (err) {
- dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a);
-- goto exit_free_gpio_b;
-+ return err;
- }
-
-- err = request_irq(encoder->irq_b, handler,
-- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-- DRV_NAME, encoder);
-+ err = devm_request_irq(dev, encoder->irq_b, handler,
-+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-+ DRV_NAME, encoder);
- if (err) {
- dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b);
-- goto exit_free_irq_a;
-+ return err;
- }
-
- err = input_register_device(input);
- if (err) {
- dev_err(dev, "failed to register input device\n");
-- goto exit_free_irq_b;
-+ return err;
- }
-
- device_init_wakeup(&pdev->dev, pdata->wakeup_source);
-@@ -362,42 +359,12 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- platform_set_drvdata(pdev, encoder);
-
- return 0;
--
--exit_free_irq_b:
-- free_irq(encoder->irq_b, encoder);
--exit_free_irq_a:
-- free_irq(encoder->irq_a, encoder);
--exit_free_gpio_b:
-- gpio_free(pdata->gpio_b);
--exit_free_gpio_a:
-- gpio_free(pdata->gpio_a);
--exit_free_mem:
-- input_free_device(input);
-- kfree(encoder);
-- if (!dev_get_platdata(&pdev->dev))
-- kfree(pdata);
--
-- return err;
- }
-
- static int rotary_encoder_remove(struct platform_device *pdev)
- {
-- struct rotary_encoder *encoder = platform_get_drvdata(pdev);
-- const struct rotary_encoder_platform_data *pdata = encoder->pdata;
--
- device_init_wakeup(&pdev->dev, false);
-
-- free_irq(encoder->irq_a, encoder);
-- free_irq(encoder->irq_b, encoder);
-- gpio_free(pdata->gpio_a);
-- gpio_free(pdata->gpio_b);
--
-- input_unregister_device(encoder->input);
-- kfree(encoder);
--
-- if (!dev_get_platdata(&pdev->dev))
-- kfree(pdata);
--
- return 0;
- }
-
-
-commit 3467a8dafd27e2c6c1545028ea4e4a78701031df
-Author: Timo Teräs <timo.teras@iki.fi>
-Date: Fri Jan 15 15:37:00 2016 +0200
-
- Input: rotary_encoder - fix device tree error handling
-
- of_get_gpio_flags() can fail, so pass through the error code
- properly. Most important use case is when it returns EPROBE_DEFER
- so that the probe gets called again later.
-
- Signed-off-by: Timo Teräs <timo.teras@iki.fi>
-
-diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
-index 0f23d32..156f40f 100644
---- a/drivers/input/misc/rotary_encoder.c
-+++ b/drivers/input/misc/rotary_encoder.c
-@@ -206,7 +206,7 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic
- struct device_node *np = dev->of_node;
- struct rotary_encoder_platform_data *pdata;
- enum of_gpio_flags flags;
-- int error;
-+ int ret;
-
- if (!of_id || !np)
- return NULL;
-@@ -219,19 +219,25 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic
- of_property_read_u32(np, "rotary-encoder,steps", &pdata->steps);
- of_property_read_u32(np, "linux,axis", &pdata->axis);
-
-- pdata->gpio_a = of_get_gpio_flags(np, 0, &flags);
-+ ret = of_get_gpio_flags(np, 0, &flags);
-+ if (ret < 0)
-+ return ERR_PTR(ret);
-+ pdata->gpio_a = ret;
- pdata->inverted_a = flags & OF_GPIO_ACTIVE_LOW;
-
-- pdata->gpio_b = of_get_gpio_flags(np, 1, &flags);
-+ ret = of_get_gpio_flags(np, 1, &flags);
-+ if (ret < 0)
-+ return ERR_PTR(ret);
-+ pdata->gpio_b = ret;
- pdata->inverted_b = flags & OF_GPIO_ACTIVE_LOW;
-
- pdata->relative_axis =
- of_property_read_bool(np, "rotary-encoder,relative-axis");
- pdata->rollover = of_property_read_bool(np, "rotary-encoder,rollover");
-
-- error = of_property_read_u32(np, "rotary-encoder,steps-per-period",
-- &pdata->steps_per_period);
-- if (error) {
-+ ret = of_property_read_u32(np, "rotary-encoder,steps-per-period",
-+ &pdata->steps_per_period);
-+ if (ret) {
- /*
- * The 'half-period' property has been deprecated, you must use
- * 'steps-per-period' and set an appropriate value, but we still
-
-commit 85bec2ad5ac7ee79b3f1d264947a5b4dc4c5ef6e (HEAD -> master)
-Author: Timo Teräs <timo.teras@iki.fi>
-Date: Fri Jan 15 15:55:48 2016 +0200
-
- Input: rotary_encoder - use threaded irqs
-
- Convert to use threaded IRQs to support GPIOs that can sleep.
- Protect the irq handler with mutex as it can be triggered from
- two different irq lines accessing the same state.
-
- This allows using GPIO expanders behind I2C or SPI bus.
-
- Signed-off-by: Timo Teräs <timo.teras@iki.fi>
-
-diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c
-index 156f40f..a2d47ce 100644
---- a/drivers/input/misc/rotary_encoder.c
-+++ b/drivers/input/misc/rotary_encoder.c
-@@ -33,6 +33,7 @@
- struct rotary_encoder {
- struct input_dev *input;
- const struct rotary_encoder_platform_data *pdata;
-+ struct mutex access_mutex;
-
- unsigned int axis;
- unsigned int pos;
-@@ -48,8 +49,8 @@ struct rotary_encoder {
-
- static int rotary_encoder_get_state(const struct rotary_encoder_platform_data *pdata)
- {
-- int a = !!gpio_get_value(pdata->gpio_a);
-- int b = !!gpio_get_value(pdata->gpio_b);
-+ int a = !!gpio_get_value_cansleep(pdata->gpio_a);
-+ int b = !!gpio_get_value_cansleep(pdata->gpio_b);
-
- a ^= pdata->inverted_a;
- b ^= pdata->inverted_b;
-@@ -94,6 +95,7 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
- struct rotary_encoder *encoder = dev_id;
- int state;
-
-+ mutex_lock(&encoder->access_mutex);
- state = rotary_encoder_get_state(encoder->pdata);
-
- switch (state) {
-@@ -114,6 +116,7 @@ static irqreturn_t rotary_encoder_irq(int irq, void *dev_id)
- encoder->armed = true;
- break;
- }
-+ mutex_unlock(&encoder->access_mutex);
-
- return IRQ_HANDLED;
- }
-@@ -123,6 +126,7 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
- struct rotary_encoder *encoder = dev_id;
- int state;
-
-+ mutex_lock(&encoder->access_mutex);
- state = rotary_encoder_get_state(encoder->pdata);
-
- switch (state) {
-@@ -139,6 +143,7 @@ static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id)
- encoder->dir = (encoder->last_stable + state) & 0x01;
- break;
- }
-+ mutex_unlock(&encoder->access_mutex);
-
- return IRQ_HANDLED;
- }
-@@ -149,6 +154,7 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
- unsigned char sum;
- int state;
-
-+ mutex_lock(&encoder->access_mutex);
- state = rotary_encoder_get_state(encoder->pdata);
-
- /*
-@@ -189,6 +195,8 @@ static irqreturn_t rotary_encoder_quarter_period_irq(int irq, void *dev_id)
-
- out:
- encoder->last_stable = state;
-+ mutex_unlock(&encoder->access_mutex);
-+
- return IRQ_HANDLED;
- }
-
-@@ -288,6 +296,8 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- if (!encoder || !input)
- return -ENOMEM;
-
-+ mutex_init(&encoder->access_mutex);
-+
- encoder->input = input;
- encoder->pdata = pdata;
-
-@@ -338,17 +348,17 @@ static int rotary_encoder_probe(struct platform_device *pdev)
- return-EINVAL;
- }
-
-- err = devm_request_irq(dev, encoder->irq_a, handler,
-- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-- DRV_NAME, encoder);
-+ err = devm_request_threaded_irq(dev, encoder->irq_a, NULL, handler,
-+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-+ DRV_NAME, encoder);
- if (err) {
- dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a);
- return err;
- }
-
-- err = devm_request_irq(dev, encoder->irq_b, handler,
-- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-- DRV_NAME, encoder);
-+ err = devm_request_threaded_irq(dev, encoder->irq_b, NULL, handler,
-+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-+ DRV_NAME, encoder);
- if (err) {
- dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b);
- return err;