1 // SPDX-License-Identifier: GPL-2.0+
5 * This driver implements simple state machines that allow real GPIOs to be
6 * controlled in response to inputs from other GPIOs - real and soft/virtual -
7 * and time delays. It can:
8 * + create dummy GPIOs for drivers that demand them
9 * + drive multiple GPIOs from a single input, with optional delays
10 * + add a debounce circuit to an input
11 * + drive pattern sequences onto LEDs
14 * Copyright (C) 2020 Raspberry Pi (Trading) Ltd.
17 #include <linux/err.h>
18 #include <linux/gpio.h>
19 #include <linux/gpio/driver.h>
20 #include <linux/interrupt.h>
21 #include <linux/kdev_t.h>
22 #include <linux/module.h>
23 #include <linux/platform_device.h>
24 #include <linux/sysfs.h>
26 #include <dt-bindings/gpio/gpio-fsm.h>
28 #define MODULE_NAME "gpio-fsm"
30 #define GF_IO_TYPE(x) ((u32)(x) & 0xffff)
31 #define GF_IO_INDEX(x) ((u32)(x) >> 16)
58 struct input_gpio_state {
60 struct gpio_desc *desc;
61 struct fsm_state *target;
72 struct fsm_state *target;
78 struct symtab_entry *next;
81 struct output_signal {
89 struct output_signal *signals;
90 struct gpio_event *gpio_events;
91 struct gpio_event *soft_events;
92 struct fsm_state *delay_target;
93 struct fsm_state *shutdown_target;
94 unsigned int num_signals;
95 unsigned int num_gpio_events;
96 unsigned int num_soft_events;
97 unsigned int delay_ms;
98 unsigned int shutdown_ms;
105 struct work_struct work;
106 struct timer_list timer;
107 wait_queue_head_t shutdown_event;
108 struct fsm_state *states;
109 struct input_gpio_state *input_gpio_states;
110 struct gpio_descs *input_gpios;
111 struct gpio_descs *output_gpios;
112 struct soft_gpio *soft_gpios;
113 struct fsm_state *start_state;
114 struct fsm_state *shutdown_state;
115 unsigned int num_states;
116 unsigned int num_output_gpios;
117 unsigned int num_input_gpios;
118 unsigned int num_soft_gpios;
119 unsigned int shutdown_timeout_ms;
120 unsigned int shutdown_jiffies;
122 struct fsm_state *current_state;
123 struct fsm_state *next_state;
124 struct fsm_state *delay_target_state;
125 unsigned long delay_jiffies;
129 struct symtab_entry *symtab;
132 static struct symtab_entry *do_add_symbol(struct symtab_entry **symtab,
133 const char *name, void *value)
135 struct symtab_entry **p = symtab;
137 while (*p && strcmp((*p)->name, name))
141 /* This is an existing symbol */
143 /* Already defined */
145 if ((uintptr_t)value < SYM_MAX)
146 return ERR_PTR(-EINVAL);
148 return ERR_PTR(-EEXIST);
155 /* This is a new symbol */
156 *p = kmalloc(sizeof(struct symtab_entry), GFP_KERNEL);
166 static int add_symbol(struct symtab_entry **symtab,
167 const char *name, void *value)
169 struct symtab_entry *sym = do_add_symbol(symtab, name, value);
171 return PTR_ERR_OR_ZERO(sym);
174 static struct symtab_entry *get_symbol(struct symtab_entry **symtab,
177 struct symtab_entry *sym = do_add_symbol(symtab, name, NULL);
184 static void free_symbols(struct symtab_entry **symtab)
186 struct symtab_entry *sym = *symtab;
197 static void gpio_fsm_set_soft(struct gpio_fsm *gf,
198 unsigned int off, int val);
200 static void gpio_fsm_enter_state(struct gpio_fsm *gf,
201 struct fsm_state *state)
203 struct input_gpio_state *inp_state;
204 struct output_signal *signal;
205 struct gpio_event *event;
206 struct gpio_desc *gpiod;
207 struct soft_gpio *soft;
211 dev_dbg(gf->dev, "enter_state(%s)\n", state->name);
213 gf->current_state = state;
214 gf->delay_target_state = NULL;
216 // 1. Apply any listed signals
217 for (i = 0; i < state->num_signals; i++) {
218 signal = &state->signals[i];
221 dev_info(gf->dev, " set %s %d->%d\n",
222 (signal->type == SIGNAL_GPIO) ? "GF_OUT" :
224 signal->index, signal->value);
225 switch (signal->type) {
227 gpiod = gf->output_gpios->desc[signal->index];
228 gpiod_set_value_cansleep(gpiod, signal->value);
231 soft = &gf->soft_gpios[signal->index];
232 gpio_fsm_set_soft(gf, signal->index, signal->value);
237 // 2. Exit if successfully reached shutdown state
238 if (gf->shutting_down && state == state->shutdown_target) {
239 wake_up(&gf->shutdown_event);
243 // 3. Schedule a timer callback if shutting down
244 if (state->shutdown_target) {
245 // Remember the absolute shutdown time in case remove is called
247 gf->shutdown_jiffies =
248 jiffies + msecs_to_jiffies(state->shutdown_ms);
250 if (gf->shutting_down) {
251 gf->delay_jiffies = gf->shutdown_jiffies;
252 gf->delay_target_state = state->shutdown_target;
253 gf->delay_ms = state->shutdown_ms;
254 mod_timer(&gf->timer, gf->delay_jiffies);
258 // During shutdown, skip everything else
259 if (gf->shutting_down)
262 // Otherwise record what the shutdown time would be
263 gf->shutdown_jiffies = jiffies + msecs_to_jiffies(state->shutdown_ms);
265 // 4. Check soft inputs for transitions to take
266 for (i = 0; i < state->num_soft_events; i++) {
267 event = &state->soft_events[i];
268 if (gf->soft_gpios[event->index].value == event->value) {
271 "GF_SOFT %d=%d -> %s\n", event->index,
272 event->value, event->target->name);
273 gpio_fsm_enter_state(gf, event->target);
278 // 5. Check GPIOs for transitions to take, enabling the IRQs
279 for (i = 0; i < state->num_gpio_events; i++) {
280 event = &state->gpio_events[i];
281 inp_state = &gf->input_gpio_states[event->index];
282 inp_state->target = event->target;
283 inp_state->value = event->value;
284 inp_state->enabled = true;
286 value = gpiod_get_value_cansleep(gf->input_gpios->desc[event->index]);
288 // Clear stale event state
289 disable_irq(inp_state->irq);
291 irq_set_irq_type(inp_state->irq,
292 (inp_state->value ^ inp_state->active_low) ?
293 IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING);
294 enable_irq(inp_state->irq);
296 if (value == event->value && inp_state->target) {
299 "GF_IN %d=%d -> %s\n", event->index,
300 event->value, event->target->name);
301 gpio_fsm_enter_state(gf, event->target);
306 // 6. Schedule a timer callback if delay_target
307 if (state->delay_target) {
308 gf->delay_target_state = state->delay_target;
309 gf->delay_jiffies = jiffies +
310 msecs_to_jiffies(state->delay_ms);
311 gf->delay_ms = state->delay_ms;
312 mod_timer(&gf->timer, gf->delay_jiffies);
316 static void gpio_fsm_go_to_state(struct gpio_fsm *gf,
317 struct fsm_state *new_state)
319 struct input_gpio_state *inp_state;
320 struct gpio_event *gp_ev;
321 struct fsm_state *state;
324 dev_dbg(gf->dev, "go_to_state(%s)\n",
325 new_state ? new_state->name : "<unset>");
327 state = gf->current_state;
329 /* Disable any enabled GPIO IRQs */
330 for (i = 0; i < state->num_gpio_events; i++) {
331 gp_ev = &state->gpio_events[i];
332 inp_state = &gf->input_gpio_states[gp_ev->index];
333 if (inp_state->enabled) {
334 inp_state->enabled = false;
335 irq_set_irq_type(inp_state->irq,
340 gpio_fsm_enter_state(gf, new_state);
343 static void gpio_fsm_go_to_state_deferred(struct gpio_fsm *gf,
344 struct fsm_state *new_state)
346 struct input_gpio_state *inp_state;
347 struct gpio_event *gp_ev;
348 struct fsm_state *state;
351 dev_dbg(gf->dev, "go_to_state_deferred(%s)\n",
352 new_state ? new_state->name : "<unset>");
354 spin_lock(&gf->spinlock);
356 if (gf->next_state) {
357 /* Something else has already requested a transition */
358 spin_unlock(&gf->spinlock);
362 gf->next_state = new_state;
363 state = gf->current_state;
365 /* Disarm any GPIO IRQs */
366 for (i = 0; i < state->num_gpio_events; i++) {
367 gp_ev = &state->gpio_events[i];
368 inp_state = &gf->input_gpio_states[gp_ev->index];
369 inp_state->target = NULL;
372 spin_unlock(&gf->spinlock);
374 schedule_work(&gf->work);
377 static void gpio_fsm_work(struct work_struct *work)
379 struct fsm_state *new_state;
382 gf = container_of(work, struct gpio_fsm, work);
383 spin_lock(&gf->spinlock);
384 new_state = gf->next_state;
385 gf->next_state = NULL;
386 spin_unlock(&gf->spinlock);
388 gpio_fsm_go_to_state(gf, new_state);
391 static irqreturn_t gpio_fsm_gpio_irq_handler(int irq, void *dev_id)
393 struct input_gpio_state *inp_state = dev_id;
394 struct gpio_fsm *gf = inp_state->gf;
395 struct fsm_state *target;
397 target = inp_state->target;
401 /* If the IRQ has fired then the desired state _must_ have occurred */
402 inp_state->enabled = false;
403 irq_set_irq_type(inp_state->irq, IRQF_TRIGGER_NONE);
405 dev_info(gf->dev, "GF_IN %d->%d -> %s\n",
406 inp_state->index, inp_state->value, target->name);
407 gpio_fsm_go_to_state_deferred(gf, target);
411 static void gpio_fsm_timer(struct timer_list *timer)
413 struct gpio_fsm *gf = container_of(timer, struct gpio_fsm, timer);
414 struct fsm_state *target;
416 target = gf->delay_target_state;
420 dev_info(gf->dev, "GF_DELAY %d -> %s\n", gf->delay_ms,
423 gpio_fsm_go_to_state_deferred(gf, target);
426 int gpio_fsm_parse_signals(struct gpio_fsm *gf, struct fsm_state *state,
427 struct property *prop)
429 const __be32 *cells = prop->value;
430 struct output_signal *signal;
438 if (prop->length % 8) {
439 dev_err(gf->dev, "malformed set in state %s\n",
444 state->num_signals = prop->length/8;
445 state->signals = devm_kcalloc(gf->dev, state->num_signals,
446 sizeof(struct output_signal),
448 for (i = 0; i < state->num_signals; i++) {
449 signal = &state->signals[i];
450 io = be32_to_cpu(cells[0]);
451 type = GF_IO_TYPE(io);
452 index = GF_IO_INDEX(io);
453 value = be32_to_cpu(cells[1]);
455 if (type != GF_OUT && type != GF_SOFT) {
457 "invalid set type %d in state %s\n",
462 if (type == GF_OUT && index >= gf->num_output_gpios) {
464 "invalid GF_OUT number %d in state %s\n",
469 if (type == GF_SOFT && index >= gf->num_soft_gpios) {
471 "invalid GF_SOFT number %d in state %s\n",
476 if (value != 0 && value != 1) {
478 "invalid set value %d in state %s\n",
483 signal->type = (type == GF_OUT) ? SIGNAL_GPIO : SIGNAL_SOFT;
484 signal->index = index;
485 signal->value = value;
492 struct gpio_event *new_event(struct gpio_event **events, int *num_events)
494 int num = ++(*num_events);
495 *events = krealloc(*events, num * sizeof(struct gpio_event),
497 return *events ? *events + (num - 1) : NULL;
500 int gpio_fsm_parse_events(struct gpio_fsm *gf, struct fsm_state *state,
501 struct property *prop)
503 const __be32 *cells = prop->value;
504 struct symtab_entry *sym;
509 if (prop->length % 8) {
511 "malformed transitions from state %s to state %s\n",
512 state->name, prop->name);
516 sym = get_symbol(&gf->symtab, prop->name);
517 num_cells = prop->length / 4;
519 while (i < num_cells) {
520 struct gpio_event *gp_ev;
524 event = be32_to_cpu(cells[i++]);
525 param = be32_to_cpu(cells[i++]);
526 index = GF_IO_INDEX(event);
528 switch (GF_IO_TYPE(event)) {
530 if (index >= gf->num_input_gpios) {
532 "invalid GF_IN %d in transitions from state %s to state %s\n",
533 index, state->name, prop->name);
538 "invalid GF_IN value %d in transitions from state %s to state %s\n",
539 param, state->name, prop->name);
542 gp_ev = new_event(&state->gpio_events,
543 &state->num_gpio_events);
546 gp_ev->index = index;
547 gp_ev->value = param;
548 gp_ev->target = (struct fsm_state *)sym;
552 if (index >= gf->num_soft_gpios) {
554 "invalid GF_SOFT %d in transitions from state %s to state %s\n",
555 index, state->name, prop->name);
560 "invalid GF_SOFT value %d in transitions from state %s to state %s\n",
561 param, state->name, prop->name);
564 gp_ev = new_event(&state->soft_events,
565 &state->num_soft_events);
568 gp_ev->index = index;
569 gp_ev->value = param;
570 gp_ev->target = (struct fsm_state *)sym;
574 if (state->delay_target) {
576 "state %s has multiple GF_DELAYs\n",
580 state->delay_target = (struct fsm_state *)sym;
581 state->delay_ms = param;
585 if (state->shutdown_target == state) {
587 "shutdown state %s has GF_SHUTDOWN\n",
590 } else if (state->shutdown_target) {
592 "state %s has multiple GF_SHUTDOWNs\n",
596 state->shutdown_target =
597 (struct fsm_state *)sym;
598 state->shutdown_ms = param;
603 "invalid event %08x in transitions from state %s to state %s\n",
604 event, state->name, prop->name);
608 if (i != num_cells) {
610 "malformed transitions from state %s to state %s\n",
611 state->name, prop->name);
618 int gpio_fsm_parse_state(struct gpio_fsm *gf,
619 struct fsm_state *state,
620 struct device_node *np)
622 struct symtab_entry *sym;
623 struct property *prop;
626 state->name = np->name;
627 ret = add_symbol(&gf->symtab, np->name, state);
631 dev_err(gf->dev, "'%s' is not a valid state name\n",
635 dev_err(gf->dev, "state %s already defined\n",
639 dev_err(gf->dev, "error %d adding state %s symbol\n",
646 for_each_property_of_node(np, prop) {
647 sym = get_symbol(&gf->symtab, prop->name);
653 switch ((uintptr_t)sym->value) {
655 ret = gpio_fsm_parse_signals(gf, state, prop);
658 if (gf->start_state) {
659 dev_err(gf->dev, "multiple start states\n");
662 gf->start_state = state;
666 state->shutdown_target = state;
667 gf->shutdown_state = state;
673 /* A set of transition events to this state */
674 ret = gpio_fsm_parse_events(gf, state, prop);
682 static void dump_all(struct gpio_fsm *gf)
686 dev_info(gf->dev, "Input GPIOs:\n");
687 for (i = 0; i < gf->num_input_gpios; i++)
688 dev_info(gf->dev, " %d: %p\n", i,
689 gf->input_gpios->desc[i]);
691 dev_info(gf->dev, "Output GPIOs:\n");
692 for (i = 0; i < gf->num_output_gpios; i++)
693 dev_info(gf->dev, " %d: %p\n", i,
694 gf->output_gpios->desc[i]);
696 dev_info(gf->dev, "Soft GPIOs:\n");
697 for (i = 0; i < gf->num_soft_gpios; i++)
698 dev_info(gf->dev, " %d: %s %d\n", i,
699 (gf->soft_gpios[i].dir == GPIOF_DIR_IN) ? "IN" : "OUT",
700 gf->soft_gpios[i].value);
702 dev_info(gf->dev, "Start state: %s\n",
703 gf->start_state ? gf->start_state->name : "-");
705 dev_info(gf->dev, "Shutdown timeout: %d ms\n",
706 gf->shutdown_timeout_ms);
708 for (i = 0; i < gf->num_states; i++) {
709 struct fsm_state *state = &gf->states[i];
711 dev_info(gf->dev, "State %s:\n", state->name);
713 if (state->shutdown_target == state)
714 dev_info(gf->dev, " Shutdown state\n");
716 dev_info(gf->dev, " Signals:\n");
717 for (j = 0; j < state->num_signals; j++) {
718 struct output_signal *signal = &state->signals[j];
720 dev_info(gf->dev, " %d: %s %d=%d\n", j,
721 (signal->type == SIGNAL_GPIO) ? "GPIO" :
723 signal->index, signal->value);
726 dev_info(gf->dev, " GPIO events:\n");
727 for (j = 0; j < state->num_gpio_events; j++) {
728 struct gpio_event *event = &state->gpio_events[j];
730 dev_info(gf->dev, " %d: %d=%d -> %s\n", j,
731 event->index, event->value,
732 event->target->name);
735 dev_info(gf->dev, " Soft events:\n");
736 for (j = 0; j < state->num_soft_events; j++) {
737 struct gpio_event *event = &state->soft_events[j];
739 dev_info(gf->dev, " %d: %d=%d -> %s\n", j,
740 event->index, event->value,
741 event->target->name);
744 if (state->delay_target)
745 dev_info(gf->dev, " Delay: %d ms -> %s\n",
746 state->delay_ms, state->delay_target->name);
748 if (state->shutdown_target && state->shutdown_target != state)
749 dev_info(gf->dev, " Shutdown: %d ms -> %s\n",
751 state->shutdown_target->name);
753 dev_info(gf->dev, "\n");
756 static int resolve_sym_to_state(struct gpio_fsm *gf, struct fsm_state **pstate)
758 struct symtab_entry *sym = (struct symtab_entry *)*pstate;
763 *pstate = sym->value;
766 dev_err(gf->dev, "state %s not defined\n",
774 static void gpio_fsm_set_soft(struct gpio_fsm *gf,
775 unsigned int off, int val)
777 struct soft_gpio *sg = &gf->soft_gpios[off];
778 struct gpio_event *gp_ev;
779 struct fsm_state *state;
782 dev_dbg(gf->dev, "set(%d,%d)\n", off, val);
783 state = gf->current_state;
785 for (i = 0; i < state->num_soft_events; i++) {
786 gp_ev = &state->soft_events[i];
787 if (gp_ev->index == off && gp_ev->value == val) {
790 "GF_SOFT %d->%d -> %s\n", gp_ev->index,
791 gp_ev->value, gp_ev->target->name);
792 gpio_fsm_go_to_state(gf, gp_ev->target);
798 static int gpio_fsm_get(struct gpio_chip *gc, unsigned int off)
800 struct gpio_fsm *gf = gpiochip_get_data(gc);
801 struct soft_gpio *sg;
803 if (off >= gf->num_soft_gpios)
805 sg = &gf->soft_gpios[off];
810 static void gpio_fsm_set(struct gpio_chip *gc, unsigned int off, int val)
814 gf = gpiochip_get_data(gc);
815 if (off < gf->num_soft_gpios)
816 gpio_fsm_set_soft(gf, off, val);
819 static int gpio_fsm_get_direction(struct gpio_chip *gc, unsigned int off)
821 struct gpio_fsm *gf = gpiochip_get_data(gc);
822 struct soft_gpio *sg;
824 if (off >= gf->num_soft_gpios)
826 sg = &gf->soft_gpios[off];
831 static int gpio_fsm_direction_input(struct gpio_chip *gc, unsigned int off)
833 struct gpio_fsm *gf = gpiochip_get_data(gc);
834 struct soft_gpio *sg;
836 if (off >= gf->num_soft_gpios)
838 sg = &gf->soft_gpios[off];
839 sg->dir = GPIOF_DIR_IN;
844 static int gpio_fsm_direction_output(struct gpio_chip *gc, unsigned int off,
847 struct gpio_fsm *gf = gpiochip_get_data(gc);
848 struct soft_gpio *sg;
850 if (off >= gf->num_soft_gpios)
852 sg = &gf->soft_gpios[off];
853 sg->dir = GPIOF_DIR_OUT;
854 gpio_fsm_set_soft(gf, off, value);
860 * /sys/class/gpio-fsm/<fsm-name>/
861 * /state ... the current state
864 static ssize_t state_show(struct device *dev,
865 struct device_attribute *attr, char *buf)
867 const struct gpio_fsm *gf = dev_get_drvdata(dev);
869 return sprintf(buf, "%s\n", gf->current_state->name);
871 static DEVICE_ATTR_RO(state);
873 static ssize_t delay_state_show(struct device *dev,
874 struct device_attribute *attr, char *buf)
876 const struct gpio_fsm *gf = dev_get_drvdata(dev);
878 return sprintf(buf, "%s\n",
879 gf->delay_target_state ? gf->delay_target_state->name :
883 static DEVICE_ATTR_RO(delay_state);
885 static ssize_t delay_ms_show(struct device *dev,
886 struct device_attribute *attr, char *buf)
888 const struct gpio_fsm *gf = dev_get_drvdata(dev);
891 jiffies_left = max((int)(gf->delay_jiffies - jiffies), 0);
893 gf->delay_target_state ? "%u\n" : "-\n",
894 jiffies_to_msecs(jiffies_left));
896 static DEVICE_ATTR_RO(delay_ms);
898 static struct attribute *gpio_fsm_attrs[] = {
899 &dev_attr_state.attr,
900 &dev_attr_delay_state.attr,
901 &dev_attr_delay_ms.attr,
905 static const struct attribute_group gpio_fsm_group = {
906 .attrs = gpio_fsm_attrs,
907 //.is_visible = gpio_is_visible,
910 static const struct attribute_group *gpio_fsm_groups[] = {
915 static struct attribute *gpio_fsm_class_attrs[] = {
916 // There are no top-level attributes
919 ATTRIBUTE_GROUPS(gpio_fsm_class);
921 static struct class gpio_fsm_class = {
924 .class_groups = gpio_fsm_class_groups,
927 static int gpio_fsm_probe(struct platform_device *pdev)
929 struct input_gpio_state *inp_state;
930 struct device *dev = &pdev->dev;
931 struct device *sysfs_dev;
932 struct device_node *np = dev_of_node(dev);
933 struct device_node *cp;
940 static const char *const reserved_symbols[] = {
943 [SYM_START] = "start_state",
944 [SYM_SHUTDOWN] = "shutdown_state",
947 if (of_property_read_u32(np, "num-swgpios", &num_soft_gpios) &&
948 of_property_read_u32(np, "num-soft-gpios", &num_soft_gpios)) {
949 dev_err(dev, "missing 'num-swgpios' property\n");
953 of_property_read_u32(np, "debug", &debug);
955 gf = devm_kzalloc(dev, sizeof(*gf), GFP_KERNEL);
962 if (of_property_read_u32(np, "shutdown-timeout-ms",
963 &gf->shutdown_timeout_ms))
964 gf->shutdown_timeout_ms = 5000;
966 gf->num_soft_gpios = num_soft_gpios;
967 gf->soft_gpios = devm_kcalloc(dev, num_soft_gpios,
968 sizeof(struct soft_gpio), GFP_KERNEL);
971 for (i = 0; i < num_soft_gpios; i++) {
972 struct soft_gpio *sg = &gf->soft_gpios[i];
974 sg->dir = GPIOF_DIR_IN;
978 gf->input_gpios = devm_gpiod_get_array_optional(dev, "input", GPIOD_IN);
979 if (IS_ERR(gf->input_gpios)) {
980 ret = PTR_ERR(gf->input_gpios);
981 dev_err(dev, "failed to get input gpios from DT - %d\n", ret);
984 gf->num_input_gpios = (gf->input_gpios ? gf->input_gpios->ndescs : 0);
986 gf->input_gpio_states = devm_kcalloc(dev, gf->num_input_gpios,
987 sizeof(struct input_gpio_state),
989 if (!gf->input_gpio_states)
991 for (i = 0; i < gf->num_input_gpios; i++) {
992 inp_state = &gf->input_gpio_states[i];
993 inp_state->desc = gf->input_gpios->desc[i];
995 inp_state->index = i;
996 inp_state->irq = gpiod_to_irq(inp_state->desc);
997 inp_state->active_low = gpiod_is_active_low(inp_state->desc);
998 if (inp_state->irq >= 0)
999 ret = devm_request_irq(gf->dev, inp_state->irq,
1000 gpio_fsm_gpio_irq_handler,
1005 ret = inp_state->irq;
1009 "failed to get IRQ for input gpio - %d\n",
1015 gf->output_gpios = devm_gpiod_get_array_optional(dev, "output",
1017 if (IS_ERR(gf->output_gpios)) {
1018 ret = PTR_ERR(gf->output_gpios);
1019 dev_err(dev, "failed to get output gpios from DT - %d\n", ret);
1022 gf->num_output_gpios = (gf->output_gpios ? gf->output_gpios->ndescs :
1025 num_states = of_get_child_count(np);
1027 dev_err(dev, "no states declared\n");
1030 gf->states = devm_kcalloc(dev, num_states,
1031 sizeof(struct fsm_state), GFP_KERNEL);
1035 // add reserved words to the symbol table
1036 for (i = 0; i < ARRAY_SIZE(reserved_symbols); i++) {
1037 if (reserved_symbols[i])
1038 add_symbol(&gf->symtab, reserved_symbols[i],
1039 (void *)(uintptr_t)i);
1043 for_each_child_of_node(np, cp) {
1044 struct fsm_state *state = &gf->states[gf->num_states];
1046 ret = gpio_fsm_parse_state(gf, state, cp);
1052 if (!gf->start_state) {
1053 dev_err(gf->dev, "no start state defined\n");
1057 // resolve symbol pointers into state pointers
1058 for (i = 0; !ret && i < gf->num_states; i++) {
1059 struct fsm_state *state = &gf->states[i];
1062 for (j = 0; !ret && j < state->num_gpio_events; j++) {
1063 struct gpio_event *ev = &state->gpio_events[j];
1065 ret = resolve_sym_to_state(gf, &ev->target);
1068 for (j = 0; !ret && j < state->num_soft_events; j++) {
1069 struct gpio_event *ev = &state->soft_events[j];
1071 ret = resolve_sym_to_state(gf, &ev->target);
1075 resolve_sym_to_state(gf, &state->delay_target);
1076 if (state->shutdown_target != state)
1077 resolve_sym_to_state(gf,
1078 &state->shutdown_target);
1082 if (!ret && gf->debug > 1)
1085 free_symbols(&gf->symtab);
1090 gf->gc.parent = dev;
1091 gf->gc.label = np->name;
1092 gf->gc.owner = THIS_MODULE;
1094 gf->gc.ngpio = num_soft_gpios;
1096 gf->gc.get_direction = gpio_fsm_get_direction;
1097 gf->gc.direction_input = gpio_fsm_direction_input;
1098 gf->gc.direction_output = gpio_fsm_direction_output;
1099 gf->gc.get = gpio_fsm_get;
1100 gf->gc.set = gpio_fsm_set;
1101 gf->gc.can_sleep = true;
1102 spin_lock_init(&gf->spinlock);
1103 INIT_WORK(&gf->work, gpio_fsm_work);
1104 timer_setup(&gf->timer, gpio_fsm_timer, 0);
1105 init_waitqueue_head(&gf->shutdown_event);
1107 platform_set_drvdata(pdev, gf);
1109 sysfs_dev = device_create_with_groups(&gpio_fsm_class, dev,
1113 if (IS_ERR(sysfs_dev))
1114 dev_err(gf->dev, "Error creating sysfs entry\n");
1117 dev_info(gf->dev, "Start -> %s\n", gf->start_state->name);
1119 gpio_fsm_enter_state(gf, gf->start_state);
1121 return devm_gpiochip_add_data(dev, &gf->gc, gf);
1124 static int gpio_fsm_remove(struct platform_device *pdev)
1126 struct gpio_fsm *gf = platform_get_drvdata(pdev);
1129 if (gf->shutdown_state) {
1131 dev_info(gf->dev, "Shutting down...\n");
1133 spin_lock(&gf->spinlock);
1134 gf->shutting_down = true;
1135 if (gf->current_state->shutdown_target &&
1136 gf->current_state->shutdown_target != gf->current_state) {
1137 gf->delay_target_state =
1138 gf->current_state->shutdown_target;
1139 mod_timer(&gf->timer, gf->shutdown_jiffies);
1141 spin_unlock(&gf->spinlock);
1143 wait_event_timeout(gf->shutdown_event,
1144 gf->current_state->shutdown_target ==
1146 msecs_to_jiffies(gf->shutdown_timeout_ms));
1147 /* On failure to reach a shutdown state, jump to one */
1148 if (gf->current_state->shutdown_target != gf->current_state)
1149 gpio_fsm_enter_state(gf, gf->shutdown_state);
1151 cancel_work_sync(&gf->work);
1152 del_timer_sync(&gf->timer);
1154 /* Events aren't allocated from managed storage */
1155 for (i = 0; i < gf->num_states; i++) {
1156 kfree(gf->states[i].gpio_events);
1157 kfree(gf->states[i].soft_events);
1160 dev_info(gf->dev, "Exiting\n");
1165 static void gpio_fsm_shutdown(struct platform_device *pdev)
1167 gpio_fsm_remove(pdev);
1170 static const struct of_device_id gpio_fsm_ids[] = {
1171 { .compatible = "rpi,gpio-fsm" },
1174 MODULE_DEVICE_TABLE(of, gpio_fsm_ids);
1176 static struct platform_driver gpio_fsm_driver = {
1178 .name = MODULE_NAME,
1179 .of_match_table = of_match_ptr(gpio_fsm_ids),
1181 .probe = gpio_fsm_probe,
1182 .remove = gpio_fsm_remove,
1183 .shutdown = gpio_fsm_shutdown,
1186 static int gpio_fsm_init(void)
1190 ret = class_register(&gpio_fsm_class);
1194 ret = platform_driver_register(&gpio_fsm_driver);
1196 class_unregister(&gpio_fsm_class);
1200 module_init(gpio_fsm_init);
1202 static void gpio_fsm_exit(void)
1204 platform_driver_unregister(&gpio_fsm_driver);
1205 class_unregister(&gpio_fsm_class);
1207 module_exit(gpio_fsm_exit);
1209 MODULE_LICENSE("GPL");
1210 MODULE_AUTHOR("Phil Elwell <phil@raspberrypi.com>");
1211 MODULE_DESCRIPTION("GPIO FSM driver");
1212 MODULE_ALIAS("platform:gpio-fsm");