static int timer_config(struct simio_device *dev, const char *param, char **arg_text) { struct timer *tr = (struct timer *)dev; if (!strcasecmp(param, "base")) return config_addr(&tr->base_addr, arg_text); if (!strcasecmp(param, "iv")) return config_addr(&tr->iv_addr, arg_text); if (!strcasecmp(param, "irq0")) return config_irq(&tr->irq0, arg_text); if (!strcasecmp(param, "irq1")) return config_irq(&tr->irq1, arg_text); if (!strcasecmp(param, "set")) return config_channel(tr, arg_text); printc_err("timer: config: unknown parameter: %s\n", param); return -1; }
/* * pin: pin 0-9 * type: NULL/IN/OUT/IRQ * value: * IN: value=0 * OUT: value=0/1 reset value * IRQ: value={emun irq_trigger_type} */ static int config_pin(int n, enum pin_type type, int value) { int ret=-1; if(n<0 || n > 9 || type < 0 || type > 3 || value < 0 || value > 2) { printk("config pin params error\n"); return -1; } printk("config pin n=%d type=%d value=%d\n", n, type, value); if(type == PIN_TYPE_NULL) { if(pin_type[n] == PIN_TYPE_IRQ) { if(n == 2) { free_irq(irq1, vdev_dev); } else if(n == 7) { free_irq(irq2, vdev_dev); } else if (n == 90) { free_irq(irq3, vdev_dev); } } ret = pinctrl_select_state(pinctrl, pin_in[n]); if(ret<0) { printk("pinctrl select state pin null[%d] error \n", n); return -1; } gpio_direction_input(pin[n]); pin_type[n] = PIN_TYPE_NULL; return 0; } if(type == PIN_TYPE_IN) { ret = pinctrl_select_state(pinctrl, pin_in[n]); if(ret<0) { printk("pinctrl select state pin in[%d] error\n", n); return -1; } gpio_direction_input(pin[n]); pin_type[n] = PIN_TYPE_IN; return 0; } if(type == PIN_TYPE_OUT) { ret = pinctrl_select_state(pinctrl, pin_out[n]); if(ret<0) { printk("pinctrl select state pin out[%d] error \n", n); return -1; } gpio_direction_output(pin[n], value>0?1:0); pin_type[n] = PIN_TYPE_OUT; return 0; } if(type == PIN_TYPE_IRQ && (n == 2 || n == 7 || n == 9)) { config_irq(n, value); pin_type[n] = PIN_TYPE_IRQ; return 0; } return ret; }