static int nouveau_voltgpio_init(struct nouveau_device *device) { struct nouveau_volt *volt = &device->volt; struct dcb_gpio_func func; int i; /* check we have gpio function info for each vid bit. on some * boards (ie. nvs295) the vid mask has more bits than there * are valid gpio functions... from traces, nvidia appear to * just touch the existing ones, so let's mask off the invalid * bits and continue with life */ for (i = 0; i < 8; i++) { if (volt->vid_mask & (1 << i)) { int ret = nouveau_gpio_find(device, 0, tags[i], 0xff, &func); if (ret) { if (ret != -ENOENT) return ret; nv_debug(device, "VID bit %d has no GPIO\n", i); volt->vid_mask &= ~(1 << i); } } } return 0; }
static int nouveau_gpio_get(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line) { struct dcb_gpio_func func; int ret; ret = nouveau_gpio_find(gpio, idx, tag, line, &func); if (ret == 0) { ret = nouveau_gpio_sense(gpio, idx, func.line); if (ret >= 0) ret = (ret == (func.log[1] & 1)); } return ret; }
static int nouveau_gpio_set(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line, int state) { struct dcb_gpio_func func; int ret; ret = nouveau_gpio_find(gpio, idx, tag, line, &func); if (ret == 0) { int dir = !!(func.log[state] & 0x02); int out = !!(func.log[state] & 0x01); ret = nouveau_gpio_drive(gpio, idx, func.line, dir, out); } return ret; }