Lines 117-124
set_controller(ig4iic_softc_t *sc, uint32_t ctl)
Link Here
|
117 |
reg_write(sc, IG4_REG_INTR_MASK, IG4_INTR_STOP_DET | |
117 |
reg_write(sc, IG4_REG_INTR_MASK, IG4_INTR_STOP_DET | |
118 |
IG4_INTR_RX_FULL); |
118 |
IG4_INTR_RX_FULL); |
119 |
reg_read(sc, IG4_REG_CLR_INTR); |
119 |
reg_read(sc, IG4_REG_CLR_INTR); |
120 |
} else |
120 |
} else { |
121 |
reg_write(sc, IG4_REG_INTR_MASK, 0); |
121 |
reg_write(sc, IG4_REG_INTR_MASK, 0); |
|
|
122 |
} |
122 |
|
123 |
|
123 |
reg_write(sc, IG4_REG_I2C_EN, ctl); |
124 |
reg_write(sc, IG4_REG_I2C_EN, ctl); |
124 |
error = IIC_ETIMEOUT; |
125 |
error = IIC_ETIMEOUT; |
Lines 134-139
set_controller(ig4iic_softc_t *sc, uint32_t ctl)
Link Here
|
134 |
else |
135 |
else |
135 |
mtx_sleep(sc, &sc->io_lock, 0, "i2cslv", 1); |
136 |
mtx_sleep(sc, &sc->io_lock, 0, "i2cslv", 1); |
136 |
} |
137 |
} |
|
|
138 |
|
139 |
|
137 |
return (error); |
140 |
return (error); |
138 |
} |
141 |
} |
139 |
|
142 |
|
Lines 525-547
ig4iic_attach(ig4iic_softc_t *sc)
Link Here
|
525 |
mtx_init(&sc->io_lock, "IG4 I/O lock", NULL, MTX_DEF); |
528 |
mtx_init(&sc->io_lock, "IG4 I/O lock", NULL, MTX_DEF); |
526 |
sx_init(&sc->call_lock, "IG4 call lock"); |
529 |
sx_init(&sc->call_lock, "IG4 call lock"); |
527 |
|
530 |
|
|
|
531 |
v = reg_read(sc, IG4_REG_DEVIDLE_CTRL); |
532 |
if (sc->version == IG4_SKYLAKE && (v & IG4_RESTORE_REQUIRED) ) { |
533 |
reg_write(sc, IG4_REG_DEVIDLE_CTRL, IG4_DEVICE_IDLE | IG4_RESTORE_REQUIRED); |
534 |
reg_write(sc, IG4_REG_DEVIDLE_CTRL, 0); |
535 |
|
536 |
reg_write(sc, IG4_REG_RESETS_SKL, IG4_RESETS_ASSERT_SKL); |
537 |
reg_write(sc, IG4_REG_RESETS_SKL, IG4_RESETS_DEASSERT_SKL); |
538 |
DELAY(1000); |
539 |
} |
540 |
|
528 |
v = reg_read(sc, IG4_REG_COMP_TYPE); |
541 |
v = reg_read(sc, IG4_REG_COMP_TYPE); |
529 |
v = reg_read(sc, IG4_REG_COMP_PARAM1); |
542 |
v = reg_read(sc, IG4_REG_COMP_PARAM1); |
530 |
v = reg_read(sc, IG4_REG_GENERAL); |
543 |
v = reg_read(sc, IG4_REG_GENERAL); |
531 |
if ((v & IG4_GENERAL_SWMODE) == 0) { |
544 |
if (sc->version == IG4_ATOM) { |
532 |
v |= IG4_GENERAL_SWMODE; |
545 |
v = reg_read(sc, IG4_REG_COMP_TYPE); |
533 |
reg_write(sc, IG4_REG_GENERAL, v); |
546 |
} |
534 |
v = reg_read(sc, IG4_REG_GENERAL); |
547 |
if (sc->version == IG4_HASWELL || sc->version == IG4_ATOM) { |
|
|
548 |
v = reg_read(sc, IG4_REG_COMP_PARAM1); |
549 |
v = reg_read(sc, IG4_REG_GENERAL); |
550 |
/* |
551 |
* The content of IG4_REG_GENERAL is different for each |
552 |
* controller version. |
553 |
*/ |
554 |
if (sc->version == IG4_HASWELL && |
555 |
(v & IG4_GENERAL_SWMODE) == 0) { |
556 |
v |= IG4_GENERAL_SWMODE; |
557 |
reg_write(sc, IG4_REG_GENERAL, v); |
558 |
v = reg_read(sc, IG4_REG_GENERAL); |
559 |
} |
535 |
} |
560 |
} |
536 |
|
561 |
|
537 |
v = reg_read(sc, IG4_REG_SW_LTR_VALUE); |
562 |
if (sc->version == IG4_HASWELL) { |
538 |
v = reg_read(sc, IG4_REG_AUTO_LTR_VALUE); |
563 |
v = reg_read(sc, IG4_REG_SW_LTR_VALUE); |
|
|
564 |
v = reg_read(sc, IG4_REG_AUTO_LTR_VALUE); |
565 |
} else if (sc->version == IG4_SKYLAKE) { |
566 |
v = reg_read(sc, IG4_REG_ACTIVE_LTR_VALUE); |
567 |
v = reg_read(sc, IG4_REG_IDLE_LTR_VALUE); |
568 |
} |
539 |
|
569 |
|
540 |
v = reg_read(sc, IG4_REG_COMP_VER); |
570 |
if (sc->version == IG4_HASWELL || sc->version == IG4_ATOM) { |
541 |
if (v != IG4_COMP_VER) { |
571 |
v = reg_read(sc, IG4_REG_COMP_VER); |
542 |
error = ENXIO; |
572 |
if (v != IG4_COMP_VER) { |
543 |
goto done; |
573 |
error = ENXIO; |
|
|
574 |
goto done; |
575 |
} |
544 |
} |
576 |
} |
|
|
577 |
|
545 |
v = reg_read(sc, IG4_REG_SS_SCL_HCNT); |
578 |
v = reg_read(sc, IG4_REG_SS_SCL_HCNT); |
546 |
v = reg_read(sc, IG4_REG_SS_SCL_LCNT); |
579 |
v = reg_read(sc, IG4_REG_SS_SCL_LCNT); |
547 |
v = reg_read(sc, IG4_REG_FS_SCL_HCNT); |
580 |
v = reg_read(sc, IG4_REG_FS_SCL_HCNT); |
Lines 591-598
ig4iic_attach(ig4iic_softc_t *sc)
Link Here
|
591 |
/* |
624 |
/* |
592 |
* Don't do this, it blows up the PCI config |
625 |
* Don't do this, it blows up the PCI config |
593 |
*/ |
626 |
*/ |
594 |
reg_write(sc, IG4_REG_RESETS, IG4_RESETS_ASSERT); |
627 |
if (sc->version == IG4_HASWELL || sc->version == IG4_ATOM) { |
595 |
reg_write(sc, IG4_REG_RESETS, IG4_RESETS_DEASSERT); |
628 |
reg_write(sc, IG4_REG_RESETS_HSW, IG4_RESETS_ASSERT_HSW); |
|
|
629 |
reg_write(sc, IG4_REG_RESETS_HSW, IG4_RESETS_DEASSERT_HSW); |
630 |
} |
596 |
#endif |
631 |
#endif |
597 |
|
632 |
|
598 |
mtx_lock(&sc->io_lock); |
633 |
mtx_lock(&sc->io_lock); |
Lines 727-740
ig4iic_dump(ig4iic_softc_t *sc)
Link Here
|
727 |
REGDUMP(sc, IG4_REG_DMA_RDLR); |
762 |
REGDUMP(sc, IG4_REG_DMA_RDLR); |
728 |
REGDUMP(sc, IG4_REG_SDA_SETUP); |
763 |
REGDUMP(sc, IG4_REG_SDA_SETUP); |
729 |
REGDUMP(sc, IG4_REG_ENABLE_STATUS); |
764 |
REGDUMP(sc, IG4_REG_ENABLE_STATUS); |
730 |
REGDUMP(sc, IG4_REG_COMP_PARAM1); |
765 |
if (sc->version == IG4_HASWELL || sc->version == IG4_ATOM) { |
731 |
REGDUMP(sc, IG4_REG_COMP_VER); |
766 |
REGDUMP(sc, IG4_REG_COMP_PARAM1); |
732 |
REGDUMP(sc, IG4_REG_COMP_TYPE); |
767 |
REGDUMP(sc, IG4_REG_COMP_VER); |
733 |
REGDUMP(sc, IG4_REG_CLK_PARMS); |
768 |
} |
734 |
REGDUMP(sc, IG4_REG_RESETS); |
769 |
if (sc->version == IG4_ATOM) { |
735 |
REGDUMP(sc, IG4_REG_GENERAL); |
770 |
REGDUMP(sc, IG4_REG_COMP_TYPE); |
736 |
REGDUMP(sc, IG4_REG_SW_LTR_VALUE); |
771 |
REGDUMP(sc, IG4_REG_CLK_PARMS); |
737 |
REGDUMP(sc, IG4_REG_AUTO_LTR_VALUE); |
772 |
} |
|
|
773 |
if (sc->version == IG4_HASWELL || sc->version == IG4_ATOM) { |
774 |
REGDUMP(sc, IG4_REG_RESETS_HSW); |
775 |
REGDUMP(sc, IG4_REG_GENERAL); |
776 |
} else if (sc->version == IG4_SKYLAKE) { |
777 |
REGDUMP(sc, IG4_REG_RESETS_SKL); |
778 |
} |
779 |
if (sc->version == IG4_HASWELL) { |
780 |
REGDUMP(sc, IG4_REG_SW_LTR_VALUE); |
781 |
REGDUMP(sc, IG4_REG_AUTO_LTR_VALUE); |
782 |
} else if (sc->version == IG4_SKYLAKE) { |
783 |
REGDUMP(sc, IG4_REG_ACTIVE_LTR_VALUE); |
784 |
REGDUMP(sc, IG4_REG_IDLE_LTR_VALUE); |
785 |
} |
738 |
} |
786 |
} |
739 |
#undef REGDUMP |
787 |
#undef REGDUMP |
740 |
|
788 |
|