1 /*- 2 * Copyright (c) 2016 Jared McNeill <jmcneill@invisible.ca> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 21 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 22 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29 /* 30 * X-Powers AXP813/818 PMU for Allwinner SoCs 31 */ 32 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD$"); 35 36 #include <sys/param.h> 37 #include <sys/systm.h> 38 #include <sys/eventhandler.h> 39 #include <sys/bus.h> 40 #include <sys/rman.h> 41 #include <sys/kernel.h> 42 #include <sys/reboot.h> 43 #include <sys/gpio.h> 44 #include <sys/module.h> 45 #include <machine/bus.h> 46 47 #include <dev/iicbus/iicbus.h> 48 #include <dev/iicbus/iiconf.h> 49 50 #include <dev/gpio/gpiobusvar.h> 51 52 #include <dev/ofw/ofw_bus.h> 53 #include <dev/ofw/ofw_bus_subr.h> 54 55 #include <dev/extres/regulator/regulator.h> 56 57 #include "gpio_if.h" 58 #include "iicbus_if.h" 59 #include "regdev_if.h" 60 61 MALLOC_DEFINE(M_AXP81X_REG, "AXP81x regulator", "AXP81x power regulator"); 62 63 #define AXP_ICTYPE 0x03 64 #define AXP_POWERCTL1 0x10 65 #define AXP_POWERCTL1_DCDC2 (1 << 1) 66 #define AXP_POWERCTL2 0x12 67 #define AXP_POWERCTL2_DC1SW (1 << 7) 68 #define AXP_VOLTCTL_DCDC2 0x21 69 #define AXP_VOLTCTL_STATUS (1 << 7) 70 #define AXP_VOLTCTL_MASK 0x7f 71 #define AXP_POWERBAT 0x32 72 #define AXP_POWERBAT_SHUTDOWN (1 << 7) 73 #define AXP_IRQEN1 0x40 74 #define AXP_IRQEN2 0x41 75 #define AXP_IRQEN3 0x42 76 #define AXP_IRQEN4 0x43 77 #define AXP_IRQEN5 0x44 78 #define AXP_IRQEN5_POKSIRQ (1 << 4) 79 #define AXP_IRQEN6 0x45 80 #define AXP_IRQSTAT5 0x4c 81 #define AXP_IRQSTAT5_POKSIRQ (1 << 4) 82 #define AXP_GPIO0_CTRL 0x90 83 #define AXP_GPIO1_CTRL 0x92 84 #define AXP_GPIO_FUNC (0x7 << 0) 85 #define AXP_GPIO_FUNC_SHIFT 0 86 #define AXP_GPIO_FUNC_DRVLO 0 87 #define AXP_GPIO_FUNC_DRVHI 1 88 #define AXP_GPIO_FUNC_INPUT 2 89 #define AXP_GPIO_SIGBIT 0x94 90 #define AXP_GPIO_PD 0x97 91 92 static const struct { 93 const char *name; 94 uint8_t ctrl_reg; 95 } axp81x_pins[] = { 96 { "GPIO0", AXP_GPIO0_CTRL }, 97 { "GPIO1", AXP_GPIO1_CTRL }, 98 }; 99 100 static struct ofw_compat_data compat_data[] = { 101 { "x-powers,axp813", 1 }, 102 { "x-powers,axp818", 1 }, 103 { NULL, 0 } 104 }; 105 106 static struct resource_spec axp81x_spec[] = { 107 { SYS_RES_IRQ, 0, RF_ACTIVE }, 108 { -1, 0 } 109 }; 110 111 struct axp81x_regdef { 112 intptr_t id; 113 char *name; 114 char *supply_name; 115 uint8_t enable_reg; 116 uint8_t enable_mask; 117 uint8_t voltage_reg; 118 int voltage_min; 119 int voltage_max; 120 int voltage_step1; 121 int voltage_nstep1; 122 int voltage_step2; 123 int voltage_nstep2; 124 }; 125 126 enum axp81x_reg_id { 127 AXP81X_REG_ID_DC1SW, 128 AXP81X_REG_ID_DCDC2, 129 }; 130 131 static struct axp81x_regdef axp81x_regdefs[] = { 132 { 133 .id = AXP81X_REG_ID_DC1SW, 134 .name = "dc1sw", 135 .enable_reg = AXP_POWERCTL2, 136 .enable_mask = AXP_POWERCTL2_DC1SW, 137 }, 138 { 139 .id = AXP81X_REG_ID_DCDC2, 140 .name = "dcdc2", 141 .enable_reg = AXP_POWERCTL1, 142 .enable_mask = AXP_POWERCTL1_DCDC2, 143 .voltage_reg = AXP_VOLTCTL_DCDC2, 144 .voltage_min = 500, 145 .voltage_max = 1300, 146 .voltage_step1 = 10, 147 .voltage_nstep1 = 70, 148 .voltage_step2 = 20, 149 .voltage_nstep2 = 5, 150 }, 151 }; 152 153 struct axp81x_softc; 154 155 struct axp81x_reg_sc { 156 struct regnode *regnode; 157 device_t base_dev; 158 struct axp81x_regdef *def; 159 phandle_t xref; 160 struct regnode_std_param *param; 161 }; 162 163 struct axp81x_softc { 164 struct resource *res; 165 uint16_t addr; 166 void *ih; 167 device_t gpiodev; 168 struct mtx mtx; 169 int busy; 170 171 /* Regulators */ 172 struct axp81x_reg_sc **regs; 173 int nregs; 174 }; 175 176 #define AXP_LOCK(sc) mtx_lock(&(sc)->mtx) 177 #define AXP_UNLOCK(sc) mtx_unlock(&(sc)->mtx) 178 179 static int 180 axp81x_read(device_t dev, uint8_t reg, uint8_t *data, uint8_t size) 181 { 182 struct axp81x_softc *sc; 183 struct iic_msg msg[2]; 184 185 sc = device_get_softc(dev); 186 187 msg[0].slave = sc->addr; 188 msg[0].flags = IIC_M_WR; 189 msg[0].len = 1; 190 msg[0].buf = ® 191 192 msg[1].slave = sc->addr; 193 msg[1].flags = IIC_M_RD; 194 msg[1].len = size; 195 msg[1].buf = data; 196 197 return (iicbus_transfer(dev, msg, 2)); 198 } 199 200 static int 201 axp81x_write(device_t dev, uint8_t reg, uint8_t val) 202 { 203 struct axp81x_softc *sc; 204 struct iic_msg msg[2]; 205 206 sc = device_get_softc(dev); 207 208 msg[0].slave = sc->addr; 209 msg[0].flags = IIC_M_WR; 210 msg[0].len = 1; 211 msg[0].buf = ® 212 213 msg[1].slave = sc->addr; 214 msg[1].flags = IIC_M_WR; 215 msg[1].len = 1; 216 msg[1].buf = &val; 217 218 return (iicbus_transfer(dev, msg, 2)); 219 } 220 221 static int 222 axp81x_regnode_init(struct regnode *regnode) 223 { 224 return (0); 225 } 226 227 static int 228 axp81x_regnode_enable(struct regnode *regnode, bool enable, int *udelay) 229 { 230 struct axp81x_reg_sc *sc; 231 uint8_t val; 232 233 sc = regnode_get_softc(regnode); 234 235 axp81x_read(sc->base_dev, sc->def->enable_reg, &val, 1); 236 if (enable) 237 val |= sc->def->enable_mask; 238 else 239 val &= ~sc->def->enable_mask; 240 axp81x_write(sc->base_dev, sc->def->enable_reg, val); 241 242 *udelay = 0; 243 244 return (0); 245 } 246 247 static void 248 axp81x_regnode_reg_to_voltage(struct axp81x_reg_sc *sc, uint8_t val, int *uv) 249 { 250 if (val < sc->def->voltage_nstep1) 251 *uv = sc->def->voltage_min + val * sc->def->voltage_step1; 252 else 253 *uv = sc->def->voltage_min + 254 (sc->def->voltage_nstep1 * sc->def->voltage_step1) + 255 ((val - sc->def->voltage_nstep1) * sc->def->voltage_step2); 256 *uv *= 1000; 257 } 258 259 static int 260 axp81x_regnode_voltage_to_reg(struct axp81x_reg_sc *sc, int min_uvolt, 261 int max_uvolt, uint8_t *val) 262 { 263 uint8_t nval; 264 int nstep, uvolt; 265 266 nval = 0; 267 uvolt = sc->def->voltage_min * 1000; 268 269 for (nstep = 0; nstep < sc->def->voltage_nstep1 && uvolt < min_uvolt; 270 nstep++) { 271 ++nval; 272 uvolt += (sc->def->voltage_step1 * 1000); 273 } 274 for (nstep = 0; nstep < sc->def->voltage_nstep2 && uvolt < min_uvolt; 275 nstep++) { 276 ++nval; 277 uvolt += (sc->def->voltage_step2 * 1000); 278 } 279 if (uvolt > max_uvolt) 280 return (EINVAL); 281 282 *val = nval; 283 return (0); 284 } 285 286 static int 287 axp81x_regnode_set_voltage(struct regnode *regnode, int min_uvolt, 288 int max_uvolt, int *udelay) 289 { 290 struct axp81x_reg_sc *sc; 291 uint8_t val; 292 293 sc = regnode_get_softc(regnode); 294 295 if (!sc->def->voltage_step1 || !sc->def->voltage_step2) 296 return (ENXIO); 297 298 if (axp81x_regnode_voltage_to_reg(sc, min_uvolt, max_uvolt, &val) != 0) 299 return (ERANGE); 300 301 axp81x_write(sc->base_dev, sc->def->voltage_reg, val); 302 303 *udelay = 0; 304 305 return (0); 306 } 307 308 static int 309 axp81x_regnode_get_voltage(struct regnode *regnode, int *uvolt) 310 { 311 struct axp81x_reg_sc *sc; 312 uint8_t val; 313 314 sc = regnode_get_softc(regnode); 315 316 if (!sc->def->voltage_step1 || !sc->def->voltage_step2) 317 return (ENXIO); 318 319 axp81x_read(sc->base_dev, sc->def->voltage_reg, &val, 1); 320 axp81x_regnode_reg_to_voltage(sc, val & AXP_VOLTCTL_MASK, uvolt); 321 322 return (0); 323 } 324 325 static regnode_method_t axp81x_regnode_methods[] = { 326 /* Regulator interface */ 327 REGNODEMETHOD(regnode_init, axp81x_regnode_init), 328 REGNODEMETHOD(regnode_enable, axp81x_regnode_enable), 329 REGNODEMETHOD(regnode_set_voltage, axp81x_regnode_set_voltage), 330 REGNODEMETHOD(regnode_get_voltage, axp81x_regnode_get_voltage), 331 REGNODEMETHOD_END 332 }; 333 DEFINE_CLASS_1(axp81x_regnode, axp81x_regnode_class, axp81x_regnode_methods, 334 sizeof(struct axp81x_reg_sc), regnode_class); 335 336 static void 337 axp81x_shutdown(void *devp, int howto) 338 { 339 device_t dev; 340 341 if ((howto & RB_POWEROFF) == 0) 342 return; 343 344 dev = devp; 345 346 if (bootverbose) 347 device_printf(dev, "Shutdown AXP81x\n"); 348 349 axp81x_write(dev, AXP_POWERBAT, AXP_POWERBAT_SHUTDOWN); 350 } 351 352 static void 353 axp81x_intr(void *arg) 354 { 355 struct axp81x_softc *sc; 356 device_t dev; 357 uint8_t val; 358 int error; 359 360 dev = arg; 361 sc = device_get_softc(dev); 362 363 error = axp81x_read(dev, AXP_IRQSTAT5, &val, 1); 364 if (error != 0) 365 return; 366 367 if (val != 0) { 368 if ((val & AXP_IRQSTAT5_POKSIRQ) != 0) { 369 if (bootverbose) 370 device_printf(dev, "Power button pressed\n"); 371 shutdown_nice(RB_POWEROFF); 372 } 373 /* Acknowledge */ 374 axp81x_write(dev, AXP_IRQSTAT5, val); 375 } 376 } 377 378 static device_t 379 axp81x_gpio_get_bus(device_t dev) 380 { 381 struct axp81x_softc *sc; 382 383 sc = device_get_softc(dev); 384 385 return (sc->gpiodev); 386 } 387 388 static int 389 axp81x_gpio_pin_max(device_t dev, int *maxpin) 390 { 391 *maxpin = nitems(axp81x_pins) - 1; 392 393 return (0); 394 } 395 396 static int 397 axp81x_gpio_pin_getname(device_t dev, uint32_t pin, char *name) 398 { 399 if (pin >= nitems(axp81x_pins)) 400 return (EINVAL); 401 402 snprintf(name, GPIOMAXNAME, "%s", axp81x_pins[pin].name); 403 404 return (0); 405 } 406 407 static int 408 axp81x_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps) 409 { 410 if (pin >= nitems(axp81x_pins)) 411 return (EINVAL); 412 413 *caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT; 414 415 return (0); 416 } 417 418 static int 419 axp81x_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags) 420 { 421 struct axp81x_softc *sc; 422 uint8_t data, func; 423 int error; 424 425 if (pin >= nitems(axp81x_pins)) 426 return (EINVAL); 427 428 sc = device_get_softc(dev); 429 430 AXP_LOCK(sc); 431 error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1); 432 if (error == 0) { 433 func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT; 434 if (func == AXP_GPIO_FUNC_INPUT) 435 *flags = GPIO_PIN_INPUT; 436 else if (func == AXP_GPIO_FUNC_DRVLO || 437 func == AXP_GPIO_FUNC_DRVHI) 438 *flags = GPIO_PIN_OUTPUT; 439 else 440 *flags = 0; 441 } 442 AXP_UNLOCK(sc); 443 444 return (error); 445 } 446 447 static int 448 axp81x_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags) 449 { 450 struct axp81x_softc *sc; 451 uint8_t data; 452 int error; 453 454 if (pin >= nitems(axp81x_pins)) 455 return (EINVAL); 456 457 sc = device_get_softc(dev); 458 459 AXP_LOCK(sc); 460 error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1); 461 if (error == 0) { 462 data &= ~AXP_GPIO_FUNC; 463 if ((flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) != 0) { 464 if ((flags & GPIO_PIN_OUTPUT) == 0) 465 data |= AXP_GPIO_FUNC_INPUT; 466 } 467 error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data); 468 } 469 AXP_UNLOCK(sc); 470 471 return (error); 472 } 473 474 static int 475 axp81x_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) 476 { 477 struct axp81x_softc *sc; 478 uint8_t data, func; 479 int error; 480 481 if (pin >= nitems(axp81x_pins)) 482 return (EINVAL); 483 484 sc = device_get_softc(dev); 485 486 AXP_LOCK(sc); 487 error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1); 488 if (error == 0) { 489 func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT; 490 switch (func) { 491 case AXP_GPIO_FUNC_DRVLO: 492 *val = 0; 493 break; 494 case AXP_GPIO_FUNC_DRVHI: 495 *val = 1; 496 break; 497 case AXP_GPIO_FUNC_INPUT: 498 error = axp81x_read(dev, AXP_GPIO_SIGBIT, &data, 1); 499 if (error == 0) 500 *val = (data & (1 << pin)) ? 1 : 0; 501 break; 502 default: 503 error = EIO; 504 break; 505 } 506 } 507 AXP_UNLOCK(sc); 508 509 return (error); 510 } 511 512 static int 513 axp81x_gpio_pin_set(device_t dev, uint32_t pin, unsigned int val) 514 { 515 struct axp81x_softc *sc; 516 uint8_t data, func; 517 int error; 518 519 if (pin >= nitems(axp81x_pins)) 520 return (EINVAL); 521 522 sc = device_get_softc(dev); 523 524 AXP_LOCK(sc); 525 error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1); 526 if (error == 0) { 527 func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT; 528 switch (func) { 529 case AXP_GPIO_FUNC_DRVLO: 530 case AXP_GPIO_FUNC_DRVHI: 531 data &= ~AXP_GPIO_FUNC; 532 data |= (val << AXP_GPIO_FUNC_SHIFT); 533 break; 534 default: 535 error = EIO; 536 break; 537 } 538 } 539 if (error == 0) 540 error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data); 541 AXP_UNLOCK(sc); 542 543 return (error); 544 } 545 546 547 static int 548 axp81x_gpio_pin_toggle(device_t dev, uint32_t pin) 549 { 550 struct axp81x_softc *sc; 551 uint8_t data, func; 552 int error; 553 554 if (pin >= nitems(axp81x_pins)) 555 return (EINVAL); 556 557 sc = device_get_softc(dev); 558 559 AXP_LOCK(sc); 560 error = axp81x_read(dev, axp81x_pins[pin].ctrl_reg, &data, 1); 561 if (error == 0) { 562 func = (data & AXP_GPIO_FUNC) >> AXP_GPIO_FUNC_SHIFT; 563 switch (func) { 564 case AXP_GPIO_FUNC_DRVLO: 565 data &= ~AXP_GPIO_FUNC; 566 data |= (AXP_GPIO_FUNC_DRVHI << AXP_GPIO_FUNC_SHIFT); 567 break; 568 case AXP_GPIO_FUNC_DRVHI: 569 data &= ~AXP_GPIO_FUNC; 570 data |= (AXP_GPIO_FUNC_DRVLO << AXP_GPIO_FUNC_SHIFT); 571 break; 572 default: 573 error = EIO; 574 break; 575 } 576 } 577 if (error == 0) 578 error = axp81x_write(dev, axp81x_pins[pin].ctrl_reg, data); 579 AXP_UNLOCK(sc); 580 581 return (error); 582 } 583 584 static int 585 axp81x_gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent, 586 int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags) 587 { 588 if (gpios[0] >= nitems(axp81x_pins)) 589 return (EINVAL); 590 591 *pin = gpios[0]; 592 *flags = gpios[1]; 593 594 return (0); 595 } 596 597 static phandle_t 598 axp81x_get_node(device_t dev, device_t bus) 599 { 600 return (ofw_bus_get_node(dev)); 601 } 602 603 static struct axp81x_reg_sc * 604 axp81x_reg_attach(device_t dev, phandle_t node, 605 struct axp81x_regdef *def) 606 { 607 struct axp81x_reg_sc *reg_sc; 608 struct regnode_init_def initdef; 609 struct regnode *regnode; 610 611 memset(&initdef, 0, sizeof(initdef)); 612 regulator_parse_ofw_stdparam(dev, node, &initdef); 613 if (initdef.std_param.min_uvolt == 0) 614 initdef.std_param.min_uvolt = def->voltage_min * 1000; 615 if (initdef.std_param.max_uvolt == 0) 616 initdef.std_param.max_uvolt = def->voltage_max * 1000; 617 initdef.id = def->id; 618 initdef.ofw_node = node; 619 regnode = regnode_create(dev, &axp81x_regnode_class, &initdef); 620 if (regnode == NULL) { 621 device_printf(dev, "cannot create regulator\n"); 622 return (NULL); 623 } 624 625 reg_sc = regnode_get_softc(regnode); 626 reg_sc->regnode = regnode; 627 reg_sc->base_dev = dev; 628 reg_sc->def = def; 629 reg_sc->xref = OF_xref_from_node(node); 630 reg_sc->param = regnode_get_stdparam(regnode); 631 632 regnode_register(regnode); 633 634 return (reg_sc); 635 } 636 637 static int 638 axp81x_regdev_map(device_t dev, phandle_t xref, int ncells, pcell_t *cells, 639 intptr_t *num) 640 { 641 struct axp81x_softc *sc; 642 int i; 643 644 sc = device_get_softc(dev); 645 for (i = 0; i < sc->nregs; i++) { 646 if (sc->regs[i] == NULL) 647 continue; 648 if (sc->regs[i]->xref == xref) { 649 *num = sc->regs[i]->def->id; 650 return (0); 651 } 652 } 653 654 return (ENXIO); 655 } 656 657 static int 658 axp81x_probe(device_t dev) 659 { 660 if (!ofw_bus_status_okay(dev)) 661 return (ENXIO); 662 663 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) 664 return (ENXIO); 665 666 device_set_desc(dev, "X-Powers AXP81x Power Management Unit"); 667 668 return (BUS_PROBE_DEFAULT); 669 } 670 671 static int 672 axp81x_attach(device_t dev) 673 { 674 struct axp81x_softc *sc; 675 struct axp81x_reg_sc *reg; 676 uint8_t chip_id; 677 phandle_t rnode, child; 678 int error, i; 679 680 sc = device_get_softc(dev); 681 682 sc->addr = iicbus_get_addr(dev); 683 mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF); 684 685 error = bus_alloc_resources(dev, axp81x_spec, &sc->res); 686 if (error != 0) { 687 device_printf(dev, "cannot allocate resources for device\n"); 688 return (error); 689 } 690 691 if (bootverbose) { 692 axp81x_read(dev, AXP_ICTYPE, &chip_id, 1); 693 device_printf(dev, "chip ID 0x%02x\n", chip_id); 694 } 695 696 sc->nregs = nitems(axp81x_regdefs); 697 sc->regs = malloc(sizeof(struct axp81x_reg_sc *) * sc->nregs, 698 M_AXP81X_REG, M_WAITOK | M_ZERO); 699 700 /* Attach known regulators that exist in the DT */ 701 rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators"); 702 if (rnode > 0) { 703 for (i = 0; i < sc->nregs; i++) { 704 child = ofw_bus_find_child(rnode, 705 axp81x_regdefs[i].name); 706 if (child == 0) 707 continue; 708 reg = axp81x_reg_attach(dev, child, &axp81x_regdefs[i]); 709 if (reg == NULL) { 710 device_printf(dev, 711 "cannot attach regulator %s\n", 712 axp81x_regdefs[i].name); 713 return (ENXIO); 714 } 715 sc->regs[i] = reg; 716 } 717 } 718 719 /* Enable IRQ on short power key press */ 720 axp81x_write(dev, AXP_IRQEN1, 0); 721 axp81x_write(dev, AXP_IRQEN2, 0); 722 axp81x_write(dev, AXP_IRQEN3, 0); 723 axp81x_write(dev, AXP_IRQEN4, 0); 724 axp81x_write(dev, AXP_IRQEN5, AXP_IRQEN5_POKSIRQ); 725 axp81x_write(dev, AXP_IRQEN6, 0); 726 727 /* Install interrupt handler */ 728 error = bus_setup_intr(dev, sc->res, INTR_TYPE_MISC | INTR_MPSAFE, 729 NULL, axp81x_intr, dev, &sc->ih); 730 if (error != 0) { 731 device_printf(dev, "cannot setup interrupt handler\n"); 732 return (error); 733 } 734 735 EVENTHANDLER_REGISTER(shutdown_final, axp81x_shutdown, dev, 736 SHUTDOWN_PRI_LAST); 737 738 sc->gpiodev = gpiobus_attach_bus(dev); 739 740 return (0); 741 } 742 743 static device_method_t axp81x_methods[] = { 744 /* Device interface */ 745 DEVMETHOD(device_probe, axp81x_probe), 746 DEVMETHOD(device_attach, axp81x_attach), 747 748 /* GPIO interface */ 749 DEVMETHOD(gpio_get_bus, axp81x_gpio_get_bus), 750 DEVMETHOD(gpio_pin_max, axp81x_gpio_pin_max), 751 DEVMETHOD(gpio_pin_getname, axp81x_gpio_pin_getname), 752 DEVMETHOD(gpio_pin_getcaps, axp81x_gpio_pin_getcaps), 753 DEVMETHOD(gpio_pin_getflags, axp81x_gpio_pin_getflags), 754 DEVMETHOD(gpio_pin_setflags, axp81x_gpio_pin_setflags), 755 DEVMETHOD(gpio_pin_get, axp81x_gpio_pin_get), 756 DEVMETHOD(gpio_pin_set, axp81x_gpio_pin_set), 757 DEVMETHOD(gpio_pin_toggle, axp81x_gpio_pin_toggle), 758 DEVMETHOD(gpio_map_gpios, axp81x_gpio_map_gpios), 759 760 /* Regdev interface */ 761 DEVMETHOD(regdev_map, axp81x_regdev_map), 762 763 /* OFW bus interface */ 764 DEVMETHOD(ofw_bus_get_node, axp81x_get_node), 765 766 DEVMETHOD_END 767 }; 768 769 static driver_t axp81x_driver = { 770 "axp81x_pmu", 771 axp81x_methods, 772 sizeof(struct axp81x_softc), 773 }; 774 775 static devclass_t axp81x_devclass; 776 extern devclass_t ofwgpiobus_devclass, gpioc_devclass; 777 extern driver_t ofw_gpiobus_driver, gpioc_driver; 778 779 EARLY_DRIVER_MODULE(axp81x, iicbus, axp81x_driver, axp81x_devclass, 0, 0, 780 BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST); 781 EARLY_DRIVER_MODULE(ofw_gpiobus, axp81x_pmu, ofw_gpiobus_driver, 782 ofwgpiobus_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST); 783 DRIVER_MODULE(gpioc, axp81x_pmu, gpioc_driver, gpioc_devclass, 0, 0); 784 MODULE_VERSION(axp81x, 1); 785 MODULE_DEPEND(axp81x, iicbus, 1, 1, 1); 786