static void rk30_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) { //#if 0 int i; for (i = 0; i < chip->ngpio; i++) { unsigned pin = chip->base + i; struct gpio_chip *chip = pin_to_gpio_chip(pin); u32 bit = gpio_to_bit(pin); //pin_to_bit const char *gpio_label; if(!chip ||!bit) return; gpio_label = gpiochip_is_requested(chip, i); if (gpio_label) { //seq_printf(s, "[%s] GPIO%s%d: ",gpio_label, chip->label, i); printk("[%s] GPIO%s%d: ", gpio_label, chip->label, i); if (!chip || !bit) { //seq_printf(s, "!chip || !bit\t"); printk("!chip || !bit\t"); return; } GPIOSetPinDirection(chip,bit,GPIO_IN); //seq_printf(s, "pin=%d,level=%d\t", pin,GPIOGetPinLevel(chip,bit)); //seq_printf(s, "\t"); printk("pin=%d,level=%d\t", pin, GPIOGetPinLevel(chip,bit)); printk("\t"); } } //#endif }
static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { struct byt_gpio *vg = to_byt_gpio(chip); int i; unsigned long flags; u32 conf0, val, offs; spin_lock_irqsave(&vg->lock, flags); for (i = 0; i < vg->chip.ngpio; i++) { const char *label; offs = vg->range->pins[i] * 16; conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG); val = readl(vg->reg_base + offs + BYT_VAL_REG); label = gpiochip_is_requested(chip, i); if (!label) label = "Unrequested"; seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s\n", i, label, val & BYT_INPUT_EN ? " " : "in", val & BYT_OUTPUT_EN ? " " : "out", val & BYT_LEVEL ? "hi" : "lo", vg->range->pins[i], offs, conf0 & 0x7, conf0 & BYT_TRIG_NEG ? " fall" : "", conf0 & BYT_TRIG_POS ? " rise" : "", conf0 & BYT_TRIG_LVL ? " level" : ""); } spin_unlock_irqrestore(&vg->lock, flags); }
static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip) { int i; for (i = 0; i < chip->ngpio; i++) { unsigned pin = chip->base + i; void __iomem *pio = pin_to_controller(pin); unsigned mask = pin_to_mask(pin); const char *gpio_label; gpio_label = gpiochip_is_requested(chip, i); if (gpio_label) { seq_printf(s, "[%s] GPIO%s%d: ", gpio_label, chip->label, i); if (__raw_readl(pio + PIO_PSR) & mask) seq_printf(s, "[gpio] %s\n", at91_get_gpio_value(pin) ? "set" : "clear"); else seq_printf(s, "[periph %s]\n", __raw_readl(pio + PIO_ABSR) & mask ? "B" : "A"); } } }
static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { int mode; unsigned i; unsigned gpio = chip->base; int is_out; struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip); const char *modes[] = { [NMK_GPIO_ALT_GPIO] = "gpio", [NMK_GPIO_ALT_A] = "altA", [NMK_GPIO_ALT_B] = "altB", [NMK_GPIO_ALT_C] = "altC", }; for (i = 0; i < chip->ngpio; i++, gpio++) { const char *label = gpiochip_is_requested(chip, i); bool pull; u32 bit = 1 << i; is_out = readl(nmk_chip->addr + NMK_GPIO_DIR) & bit; pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit); mode = nmk_gpio_get_mode(gpio); seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s", gpio, label ?: "(none)", is_out ? "out" : "in ", chip->get ? (chip->get(chip, i) ? "hi" : "lo") : "? ", (mode < 0) ? "unknown" : modes[mode], pull ? "pull" : "none"); if (label && !is_out) { int irq = gpio_to_irq(gpio); struct irq_desc *desc = irq_to_desc(irq); /* This races with request_irq(), set_irq_type(), * and set_irq_wake() ... but those are "rare". */ if (irq >= 0 && desc->action) { char *trigger; u32 bitmask = nmk_gpio_get_bitmask(gpio); if (nmk_chip->edge_rising & bitmask) trigger = "edge-rising"; else if (nmk_chip->edge_falling & bitmask) trigger = "edge-falling"; else trigger = "edge-undefined"; seq_printf(s, " irq-%d %s%s", irq, trigger, irqd_is_wakeup_set(&desc->irq_data) ? " wakeup" : ""); } } seq_printf(s, "\n"); } }
static void wm8994_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { struct wm8994_gpio *wm8994_gpio = gpiochip_get_data(chip); struct wm8994 *wm8994 = wm8994_gpio->wm8994; int i; for (i = 0; i < chip->ngpio; i++) { int gpio = i + chip->base; int reg; const char *label; /* We report the GPIO even if it's not requested since * we're also reporting things like alternate * functions which apply even when the GPIO is not in * use as a GPIO. */ label = gpiochip_is_requested(chip, i); if (!label) label = "Unrequested"; seq_printf(s, " gpio-%-3d (%-20.20s) ", gpio, label); reg = wm8994_reg_read(wm8994, WM8994_GPIO_1 + i); if (reg < 0) { dev_err(wm8994->dev, "GPIO control %d read failed: %d\n", gpio, reg); seq_printf(s, "\n"); continue; } if (reg & WM8994_GPN_DIR) seq_printf(s, "in "); else seq_printf(s, "out "); if (reg & WM8994_GPN_PU) seq_printf(s, "pull up "); if (reg & WM8994_GPN_PD) seq_printf(s, "pull down "); if (reg & WM8994_GPN_POL) seq_printf(s, "inverted "); else seq_printf(s, "noninverted "); if (reg & WM8994_GPN_OP_CFG) seq_printf(s, "open drain "); else seq_printf(s, "push-pull "); seq_printf(s, "%s (%x)\n", wm8994_gpio_fn(reg & WM8994_GPN_FN_MASK), reg); } }
int pm8058_dump_mpp(struct seq_file *m, int curr_len, char *gpio_buffer) { static const char *ctype[] = { "d_in", "d_out", "bi_dir", "a_in", "a_out", "sink", "dtest_sink", "dtest_out" }; struct pm8058_chip *pm_chip; u8 type, state, ctrl; const char *label; int i, len; char gpio_buf[128]; char *title_msg = "---------- PMIC 8058 MPP ----------"; if (m) { seq_printf(m, "%s\n", title_msg); } else { pr_info("%s\n", title_msg); curr_len += sprintf(gpio_buffer + curr_len, "%s\n", title_msg); } pm_chip = dev_get_drvdata(pm8058_mpp_chip.dev); for (i = 0; i < PM8058_MPPS; i++) { memset(gpio_buf, 0, sizeof(gpio_buf)); len = 0; pm8058_read(pm_chip, SSBI_MPP_CNTRL(i), &ctrl, 1); label = gpiochip_is_requested(&pm8058_mpp_chip, i); type = (ctrl & PM8058_MPP_TYPE_MASK) >> PM8058_MPP_TYPE_SHIFT; state = pm8058_mpp_get(&pm8058_mpp_chip, i); len += sprintf(gpio_buf + len, "GPIO[%2d]: ", i); len += sprintf(gpio_buf + len, "[TYPE]%10s, ", ctype[type]); len += sprintf(gpio_buf + len, "[VAL]%s, ", state? "HIGH" : " LOW"); len += sprintf(gpio_buf + len, "[CTRL][0x%02x]", ctrl); gpio_buf[127] = '\0'; pr_info("%s\n", gpio_buf); if (m) { seq_printf(m, "%s\n", gpio_buf); } else { pr_info("%s\n", gpio_buf); curr_len += sprintf(gpio_buffer + curr_len, "%s\n", gpio_buf); } } return curr_len; }
static void pm8xxx_gpio_rpc_dbg_show(struct seq_file *s, struct gpio_chip *gpio_chip) { struct pm8xxx_gpio_rpc_chip *pmxx_gpio_chip = dev_get_drvdata(gpio_chip->dev); u8 state, mode; const char *label; int i; for (i = 0; i < gpio_chip->ngpio; i++) { label = gpiochip_is_requested(gpio_chip, i); state = pm8xxx_gpio_rpc_get(pmxx_gpio_chip, i); mode = pmic_gpio_get_direction(i); seq_printf(s, "gpio-%-3d (%-12.12s) %s %s", gpio_chip->base + i, label ? label : " ", mode ? "out" : "in", state ? "hi" : "lo"); seq_printf(s, "\n"); } }
static void nmk_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { int mode; unsigned i; unsigned gpio = chip->base; int is_out; struct nmk_gpio_chip *nmk_chip = container_of(chip, struct nmk_gpio_chip, chip); const char *modes[] = { [NMK_GPIO_ALT_GPIO] = "gpio", [NMK_GPIO_ALT_A] = "altA", [NMK_GPIO_ALT_B] = "altB", [NMK_GPIO_ALT_C] = "altC", }; for (i = 0; i < chip->ngpio; i++, gpio++) { const char *label = gpiochip_is_requested(chip, i); bool pull; u32 bit = 1 << i; if (!label) continue; is_out = readl(nmk_chip->addr + NMK_GPIO_DIR) & bit; pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit); mode = nmk_gpio_get_mode(gpio); seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s", gpio, label, is_out ? "out" : "in ", chip->get ? (chip->get(chip, i) ? "hi" : "lo") : "? ", (mode < 0) ? "unknown" : modes[mode], pull ? "pull" : "none"); seq_printf(s, "\n"); } }
static void pm8058_mpp_dbg_show(struct seq_file *s, struct gpio_chip *chip) { static const char *ctype[] = { "d_in", "d_out", "bi_dir", "a_in", "a_out", "sink", "dtest_sink", "dtest_out" }; struct pm8058_chip *pm_chip = dev_get_drvdata(chip->dev); u8 type, state, ctrl; const char *label; int i; for (i = 0; i < PM8058_MPPS; i++) { pm8058_read(pm_chip, SSBI_MPP_CNTRL(i), &ctrl, 1); label = gpiochip_is_requested(chip, i); type = (ctrl & PM8058_MPP_TYPE_MASK) >> PM8058_MPP_TYPE_SHIFT; state = pm8058_mpp_get(chip, i); seq_printf(s, "gpio-%-3d (%-12.12s) %-10.10s" " %s 0x%02x\n", chip->base + i, label ? label : "--", ctype[type], state ? "hi" : "lo", ctrl); } }
static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { struct wm831x_gpio *wm831x_gpio = gpiochip_get_data(chip); struct wm831x *wm831x = wm831x_gpio->wm831x; int i, tristated; for (i = 0; i < chip->ngpio; i++) { int gpio = i + chip->base; int reg; const char *label, *pull, *powerdomain; /* We report the GPIO even if it's not requested since * we're also reporting things like alternate * functions which apply even when the GPIO is not in * use as a GPIO. */ label = gpiochip_is_requested(chip, i); if (!label) label = "Unrequested"; seq_printf(s, " gpio-%-3d (%-20.20s) ", gpio, label); reg = wm831x_reg_read(wm831x, WM831X_GPIO1_CONTROL + i); if (reg < 0) { dev_err(wm831x->dev, "GPIO control %d read failed: %d\n", gpio, reg); seq_printf(s, "\n"); continue; } switch (reg & WM831X_GPN_PULL_MASK) { case WM831X_GPIO_PULL_NONE: pull = "nopull"; break; case WM831X_GPIO_PULL_DOWN: pull = "pulldown"; break; case WM831X_GPIO_PULL_UP: pull = "pullup"; break; default: pull = "INVALID PULL"; break; } switch (i + 1) { case 1 ... 3: case 7 ... 9: if (reg & WM831X_GPN_PWR_DOM) powerdomain = "VPMIC"; else powerdomain = "DBVDD"; break; case 4 ... 6: case 10 ... 12: if (reg & WM831X_GPN_PWR_DOM) powerdomain = "SYSVDD"; else powerdomain = "DBVDD"; break; case 13 ... 16: powerdomain = "TPVDD"; break; default: BUG(); break; } tristated = reg & WM831X_GPN_TRI; if (wm831x->has_gpio_ena) tristated = !tristated; seq_printf(s, " %s %s %s %s%s\n" " %s%s (0x%4x)\n", reg & WM831X_GPN_DIR ? "in" : "out", wm831x_gpio_get(chip, i) ? "high" : "low", pull, powerdomain, reg & WM831X_GPN_POL ? "" : " inverted", reg & WM831X_GPN_OD ? "open-drain" : "push-pull", tristated ? " tristated" : "", reg); } }
static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { struct byt_gpio *vg = to_byt_gpio(chip); int i; unsigned long flags; u32 conf0, val, offs; spin_lock_irqsave(&vg->lock, flags); for (i = 0; i < vg->chip.ngpio; i++) { const char *pull_str = NULL; const char *pull = NULL; const char *label; offs = vg->range->pins[i] * 16; conf0 = readl(vg->reg_base + offs + BYT_CONF0_REG); val = readl(vg->reg_base + offs + BYT_VAL_REG); label = gpiochip_is_requested(chip, i); if (!label) label = "Unrequested"; switch (conf0 & BYT_PULL_ASSIGN_MASK) { case BYT_PULL_ASSIGN_UP: pull = "up"; break; case BYT_PULL_ASSIGN_DOWN: pull = "down"; break; } switch (conf0 & BYT_PULL_STR_MASK) { case BYT_PULL_STR_2K: pull_str = "2k"; break; case BYT_PULL_STR_10K: pull_str = "10k"; break; case BYT_PULL_STR_20K: pull_str = "20k"; break; case BYT_PULL_STR_40K: pull_str = "40k"; break; } seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s pad-%-3d offset:0x%03x mux:%d %s%s%s", i, label, val & BYT_INPUT_EN ? " " : "in", val & BYT_OUTPUT_EN ? " " : "out", val & BYT_LEVEL ? "hi" : "lo", vg->range->pins[i], offs, conf0 & 0x7, conf0 & BYT_TRIG_NEG ? " fall" : " ", conf0 & BYT_TRIG_POS ? " rise" : " ", conf0 & BYT_TRIG_LVL ? " level" : " "); if (pull && pull_str) seq_printf(s, " %-4s %-3s", pull, pull_str); else seq_puts(s, " "); if (conf0 & BYT_IODEN) seq_puts(s, " open-drain"); seq_puts(s, "\n"); } spin_unlock_irqrestore(&vg->lock, flags); }
static void stm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) { struct stm_gpio_port *port = to_stm_gpio_port(chip); int port_no = chip->base / STM_GPIO_PINS_PER_PORT; int pin_no; for (pin_no = 0; pin_no < STM_GPIO_PINS_PER_PORT; pin_no++) { unsigned gpio = stm_gpio(port_no, pin_no); const char *owner, *direction; seq_printf(s, " %-3d: PIO%d.%d: ", gpio, port_no, pin_no); switch (get__PIO_PCx(port->base, pin_no)) { case value__PIO_PCx__INPUT_WEAK_PULL_UP(): direction = "input (weak pull up)"; break; case value__PIO_PCx__BIDIR_OPEN_DRAIN(): case value__PIO_PCx__BIDIR_OPEN_DRAIN__alt(): direction = "bidirectional (open drain)"; break; case value__PIO_PCx__OUTPUT_PUSH_PULL(): direction = "output (push-pull)"; break; case value__PIO_PCx__INPUT_HIGH_IMPEDANCE(): case value__PIO_PCx__INPUT_HIGH_IMPEDANCE__alt(): direction = "input (high impedance)"; break; case value__PIO_PCx__ALTERNATIVE_OUTPUT_PUSH_PULL(): direction = "alternative function output " "(push-pull)"; break; case value__PIO_PCx__ALTERNATIVE_BIDIR_OPEN_DRAIN(): direction = "alternative function bidirectional " "(open drain)"; break; default: /* Should never get here... */ __WARN(); direction = "unknown configuration"; break; } seq_printf(s, "%s, ", direction); owner = gpiochip_is_requested(chip, pin_no); if (owner) { unsigned irq = gpio_to_irq(gpio); struct irq_desc *desc = irq_desc + irq; seq_printf(s, "allocated by GPIO to '%s'", owner); /* This races with request_irq(), set_irq_type(), * and set_irq_wake() ... but those are "rare". * * More significantly, trigger type flags aren't * currently maintained by genirq. */ if (desc->action) { char *trigger; switch (desc->status & IRQ_TYPE_SENSE_MASK) { case IRQ_TYPE_NONE: trigger = "default"; break; case IRQ_TYPE_EDGE_FALLING: trigger = "edge-falling"; break; case IRQ_TYPE_EDGE_RISING: trigger = "edge-rising"; break; case IRQ_TYPE_EDGE_BOTH: trigger = "edge-both"; break; case IRQ_TYPE_LEVEL_HIGH: trigger = "level-high"; break; case IRQ_TYPE_LEVEL_LOW: trigger = "level-low"; break; default: __WARN(); trigger = "unknown"; break; } seq_printf(s, " and IRQ %d (%s trigger%s)", irq, trigger, (desc->status & IRQ_WAKEUP) ? " wakeup" : ""); } seq_printf(s, "\n"); } else { owner = stm_pad_get_gpio_owner(stm_gpio(port_no, pin_no)); if (owner) { seq_printf(s, "allocated by pad manager " "to '%s'\n", owner); } else { seq_printf(s, "unused\n"); } } } }