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; }
int pm8058_mpp_config(unsigned mpp, unsigned type, unsigned level, unsigned control) { u8 config; int rc; struct pm8058_chip *pm_chip; if (mpp >= PM8058_MPPS) return -EINVAL; pm_chip = dev_get_drvdata(pm8058_mpp_chip.chip.dev); config = (type << PM8058_MPP_TYPE_SHIFT) & PM8058_MPP_TYPE_MASK; config |= (level << PM8058_MPP_CONFIG_LVL_SHIFT) & PM8058_MPP_CONFIG_LVL_MASK; config |= control & PM8058_MPP_CONFIG_CTL_MASK; rc = pm8058_write(pm_chip, SSBI_MPP_CNTRL(mpp), &config, 1); if (rc) pr_err("%s: pm8058_write(): rc=%d\n", __func__, rc); return rc; }
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); } }