summaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch')
-rw-r--r--target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch286
1 files changed, 286 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch b/target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch
new file mode 100644
index 0000000000..873077f51c
--- /dev/null
+++ b/target/linux/bcm27xx/patches-6.1/950-0840-gpio-fsm-Sort-functions-into-a-more-logical-order.patch
@@ -0,0 +1,286 @@
+From cee471c3ada3215d6dfc53fb0f1b97548444dea7 Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.com>
+Date: Tue, 5 Sep 2023 11:56:19 +0100
+Subject: [PATCH] gpio-fsm: Sort functions into a more logical order
+
+Move some functions into a more logical ordering. This change causes
+no functional change and is essentially cosmetic.
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+---
+ drivers/gpio/gpio-fsm.c | 245 ++++++++++++++++++++--------------------
+ 1 file changed, 125 insertions(+), 120 deletions(-)
+
+--- a/drivers/gpio/gpio-fsm.c
++++ b/drivers/gpio/gpio-fsm.c
+@@ -193,131 +193,14 @@ static void free_symbols(struct symtab_e
+ }
+ }
+
+-static int gpio_fsm_get_direction(struct gpio_chip *gc, unsigned int off)
+-{
+- struct gpio_fsm *gf = gpiochip_get_data(gc);
+- struct soft_gpio *sg;
+-
+- if (off >= gf->num_soft_gpios)
+- return -EINVAL;
+- sg = &gf->soft_gpios[off];
+-
+- return sg->dir;
+-}
+-
+-static int gpio_fsm_get(struct gpio_chip *gc, unsigned int off)
+-{
+- struct gpio_fsm *gf = gpiochip_get_data(gc);
+- struct soft_gpio *sg;
+-
+- if (off >= gf->num_soft_gpios)
+- return -EINVAL;
+- sg = &gf->soft_gpios[off];
+-
+- return sg->value;
+-}
+-
+ static void gpio_fsm_go_to_state(struct gpio_fsm *gf,
+- struct fsm_state *new_state)
+-{
+- struct input_gpio_state *inp_state;
+- struct gpio_event *gp_ev;
+- struct fsm_state *state;
+- int i;
+-
+- dev_dbg(gf->dev, "go_to_state(%s)\n",
+- new_state ? new_state->name : "<unset>");
+-
+- spin_lock(&gf->spinlock);
+-
+- if (gf->next_state) {
+- /* Something else has already requested a transition */
+- spin_unlock(&gf->spinlock);
+- return;
+- }
+-
+- gf->next_state = new_state;
+- state = gf->current_state;
+- gf->delay_target_state = NULL;
+-
+- if (state) {
+- /* Disarm any GPIO IRQs */
+- for (i = 0; i < state->num_gpio_events; i++) {
+- gp_ev = &state->gpio_events[i];
+- inp_state = &gf->input_gpio_states[gp_ev->index];
+- inp_state->target = NULL;
+- }
+- }
+-
+- spin_unlock(&gf->spinlock);
+-
+- if (new_state)
+- schedule_work(&gf->work);
+-}
++ struct fsm_state *new_state);
+
+ static void gpio_fsm_set_soft(struct gpio_fsm *gf,
+- unsigned int off, int val)
+-{
+- struct soft_gpio *sg = &gf->soft_gpios[off];
+- struct gpio_event *gp_ev;
+- struct fsm_state *state;
+- int i;
+-
+- dev_dbg(gf->dev, "set(%d,%d)\n", off, val);
+- state = gf->current_state;
+- sg->value = val;
+- for (i = 0; i < state->num_soft_events; i++) {
+- gp_ev = &state->soft_events[i];
+- if (gp_ev->index == off && gp_ev->value == val) {
+- if (gf->debug)
+- dev_info(gf->dev,
+- "GF_SOFT %d->%d -> %s\n", gp_ev->index,
+- gp_ev->value, gp_ev->target->name);
+- gpio_fsm_go_to_state(gf, gp_ev->target);
+- break;
+- }
+- }
+-}
+-
+-static int gpio_fsm_direction_input(struct gpio_chip *gc, unsigned int off)
+-{
+- struct gpio_fsm *gf = gpiochip_get_data(gc);
+- struct soft_gpio *sg;
+-
+- if (off >= gf->num_soft_gpios)
+- return -EINVAL;
+- sg = &gf->soft_gpios[off];
+- sg->dir = GPIOF_DIR_IN;
+-
+- return 0;
+-}
+-
+-static int gpio_fsm_direction_output(struct gpio_chip *gc, unsigned int off,
+- int value)
+-{
+- struct gpio_fsm *gf = gpiochip_get_data(gc);
+- struct soft_gpio *sg;
+-
+- if (off >= gf->num_soft_gpios)
+- return -EINVAL;
+- sg = &gf->soft_gpios[off];
+- sg->dir = GPIOF_DIR_OUT;
+- gpio_fsm_set_soft(gf, off, value);
+-
+- return 0;
+-}
+-
+-static void gpio_fsm_set(struct gpio_chip *gc, unsigned int off, int val)
+-{
+- struct gpio_fsm *gf;
+-
+- gf = gpiochip_get_data(gc);
+- if (off < gf->num_soft_gpios)
+- gpio_fsm_set_soft(gf, off, val);
+-}
++ unsigned int off, int val);
+
+ static void gpio_fsm_enter_state(struct gpio_fsm *gf,
+- struct fsm_state *state)
++ struct fsm_state *state)
+ {
+ struct input_gpio_state *inp_state;
+ struct output_signal *signal;
+@@ -431,6 +314,44 @@ static void gpio_fsm_enter_state(struct
+ }
+ }
+
++static void gpio_fsm_go_to_state(struct gpio_fsm *gf,
++ struct fsm_state *new_state)
++{
++ struct input_gpio_state *inp_state;
++ struct gpio_event *gp_ev;
++ struct fsm_state *state;
++ int i;
++
++ dev_dbg(gf->dev, "go_to_state(%s)\n",
++ new_state ? new_state->name : "<unset>");
++
++ spin_lock(&gf->spinlock);
++
++ if (gf->next_state) {
++ /* Something else has already requested a transition */
++ spin_unlock(&gf->spinlock);
++ return;
++ }
++
++ gf->next_state = new_state;
++ state = gf->current_state;
++ gf->delay_target_state = NULL;
++
++ if (state) {
++ /* Disarm any GPIO IRQs */
++ for (i = 0; i < state->num_gpio_events; i++) {
++ gp_ev = &state->gpio_events[i];
++ inp_state = &gf->input_gpio_states[gp_ev->index];
++ inp_state->target = NULL;
++ }
++ }
++
++ spin_unlock(&gf->spinlock);
++
++ if (new_state)
++ schedule_work(&gf->work);
++}
++
+ static void gpio_fsm_work(struct work_struct *work)
+ {
+ struct input_gpio_state *inp_state;
+@@ -851,6 +772,90 @@ static int resolve_sym_to_state(struct g
+ return 0;
+ }
+
++static void gpio_fsm_set_soft(struct gpio_fsm *gf,
++ unsigned int off, int val)
++{
++ struct soft_gpio *sg = &gf->soft_gpios[off];
++ struct gpio_event *gp_ev;
++ struct fsm_state *state;
++ int i;
++
++ dev_dbg(gf->dev, "set(%d,%d)\n", off, val);
++ state = gf->current_state;
++ sg->value = val;
++ for (i = 0; i < state->num_soft_events; i++) {
++ gp_ev = &state->soft_events[i];
++ if (gp_ev->index == off && gp_ev->value == val) {
++ if (gf->debug)
++ dev_info(gf->dev,
++ "GF_SOFT %d->%d -> %s\n", gp_ev->index,
++ gp_ev->value, gp_ev->target->name);
++ gpio_fsm_go_to_state(gf, gp_ev->target);
++ break;
++ }
++ }
++}
++
++static int gpio_fsm_get(struct gpio_chip *gc, unsigned int off)
++{
++ struct gpio_fsm *gf = gpiochip_get_data(gc);
++ struct soft_gpio *sg;
++
++ if (off >= gf->num_soft_gpios)
++ return -EINVAL;
++ sg = &gf->soft_gpios[off];
++
++ return sg->value;
++}
++
++static void gpio_fsm_set(struct gpio_chip *gc, unsigned int off, int val)
++{
++ struct gpio_fsm *gf;
++
++ gf = gpiochip_get_data(gc);
++ if (off < gf->num_soft_gpios)
++ gpio_fsm_set_soft(gf, off, val);
++}
++
++static int gpio_fsm_get_direction(struct gpio_chip *gc, unsigned int off)
++{
++ struct gpio_fsm *gf = gpiochip_get_data(gc);
++ struct soft_gpio *sg;
++
++ if (off >= gf->num_soft_gpios)
++ return -EINVAL;
++ sg = &gf->soft_gpios[off];
++
++ return sg->dir;
++}
++
++static int gpio_fsm_direction_input(struct gpio_chip *gc, unsigned int off)
++{
++ struct gpio_fsm *gf = gpiochip_get_data(gc);
++ struct soft_gpio *sg;
++
++ if (off >= gf->num_soft_gpios)
++ return -EINVAL;
++ sg = &gf->soft_gpios[off];
++ sg->dir = GPIOF_DIR_IN;
++
++ return 0;
++}
++
++static int gpio_fsm_direction_output(struct gpio_chip *gc, unsigned int off,
++ int value)
++{
++ struct gpio_fsm *gf = gpiochip_get_data(gc);
++ struct soft_gpio *sg;
++
++ if (off >= gf->num_soft_gpios)
++ return -EINVAL;
++ sg = &gf->soft_gpios[off];
++ sg->dir = GPIOF_DIR_OUT;
++ gpio_fsm_set_soft(gf, off, value);
++
++ return 0;
++}
+
+ /*
+ * /sys/class/gpio-fsm/<fsm-name>/