summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/autoport/bd82x6x.go45
1 files changed, 35 insertions, 10 deletions
diff --git a/util/autoport/bd82x6x.go b/util/autoport/bd82x6x.go
index e23262c375..ee7e207d25 100644
--- a/util/autoport/bd82x6x.go
+++ b/util/autoport/bd82x6x.go
@@ -11,7 +11,7 @@ type bd82x6x struct {
}
func (b bd82x6x) writeGPIOSet(ctx Context, sb *os.File,
- val uint32, set uint, partno int) {
+ val uint32, set uint, partno int, constraint uint32) {
max := uint(32)
if set == 3 {
@@ -28,22 +28,24 @@ func (b bd82x6x) writeGPIOSet(ctx Context, sb *os.File,
}
for i := uint(0); i < max; i++ {
- fmt.Fprintf(sb, " .gpio%d = %s,\n",
- (set-1)*32+i,
- bits[partno][(val>>i)&1])
+ if ((constraint>>i)&1 == 1) {
+ fmt.Fprintf(sb, " .gpio%d = %s,\n",
+ (set-1)*32+i,
+ bits[partno][(val>>i)&1])
+ }
}
}
func (b bd82x6x) GPIO(ctx Context, inteltool InteltoolData) {
+ var constraint uint32
gpio := Create(ctx, "gpio.c")
defer gpio.Close()
AddROMStageFile("gpio.c", "")
- gpio.WriteString(`#include <southbridge/intel/common/gpio.h>
-`)
+ gpio.WriteString("#include <southbridge/intel/common/gpio.h>\n\n")
- adresses := [3][6]int{
+ addresses := [3][6]int{
{0x00, 0x04, 0x0c, 0x60, 0x2c, 0x18},
{0x30, 0x34, 0x38, 0x64, -1, -1},
{0x40, 0x44, 0x48, 0x68, -1, -1},
@@ -51,14 +53,37 @@ func (b bd82x6x) GPIO(ctx Context, inteltool InteltoolData) {
for set := 1; set <= 3; set++ {
for partno, part := range []string{"mode", "direction", "level", "reset", "invert", "blink"} {
- addr := adresses[set-1][partno]
+ addr := addresses[set-1][partno]
if addr < 0 {
continue
}
- fmt.Fprintf(gpio, "const struct pch_gpio_set%d pch_gpio_set%d_%s = {\n",
+ fmt.Fprintf(gpio, "static const struct pch_gpio_set%d pch_gpio_set%d_%s = {\n",
set, set, part)
- b.writeGPIOSet(ctx, gpio, inteltool.GPIO[uint16(addr)], uint(set), partno)
+ constraint = 0xffffffff
+ switch part {
+ case "direction":
+ /* Ignored on native mode */
+ constraint = inteltool.GPIO[uint16(addresses[set-1][0])]
+ case "level":
+ /* Level doesn't matter for input */
+ constraint = inteltool.GPIO[uint16(addresses[set-1][0])]
+ constraint &^= inteltool.GPIO[uint16(addresses[set-1][1])]
+ case "reset":
+ /* Only show reset */
+ constraint = inteltool.GPIO[uint16(addresses[set-1][3])]
+ case "invert":
+ /* Only on input and only show inverted GPIO */
+ constraint = inteltool.GPIO[uint16(addresses[set-1][0])]
+ constraint &= inteltool.GPIO[uint16(addresses[set-1][1])]
+ constraint &= inteltool.GPIO[uint16(addresses[set-1][4])]
+ case "blink":
+ /* Only on output and only show blinking GPIO */
+ constraint = inteltool.GPIO[uint16(addresses[set-1][0])]
+ constraint &^= inteltool.GPIO[uint16(addresses[set-1][1])]
+ constraint &= inteltool.GPIO[uint16(addresses[set-1][5])]
+ }
+ b.writeGPIOSet(ctx, gpio, inteltool.GPIO[uint16(addr)], uint(set), partno, constraint)
gpio.WriteString("};\n\n")
}
}