the following patch was just integrated into master:
commit 7ca9b8ae5014a745855296903682ae803235cb35
Author: Jonathan Neuschäfer <j.neuschaefer(a)gmx.net>
Date: Sat Oct 29 21:48:18 2016 +0200
mb/lowrisc/nexys4ddr: Actually fix the UART clock setup
Ron's code calculated the DLL and DLM registers of the 8250 UART, but
that's the job of the UART driver. uart_input_clock_divider isn't needed
anymore because the default value of 16 works.
As a bonus, the baud rate can now be selected in Kconfig, instead of
being hardcoded at 115200.
TEST=Booted the board at 9600 and 115200 baud.
Change-Id: I3d5e49568b798a6a6d944db1161def7d0a2d3b48
Signed-off-by: Jonathan Neuschäfer <j.neuschaefer(a)gmx.net>
Reviewed-on: https://review.coreboot.org/17188
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter(a)users.sourceforge.net>
Reviewed-by: Martin Roth <martinroth(a)google.com>
Reviewed-by: Ronald G. Minnich <rminnich(a)gmail.com>
See https://review.coreboot.org/17188 for details.
-gerrit
Nicola Corna (nicola(a)corna.info) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17252
-gerrit
commit 923d461064494bb470ba6bb49a4cdc92660eec8f
Author: Nicola Corna <nicola(a)corna.info>
Date: Sat Nov 5 16:06:59 2016 +0100
ec/lenovo/h8: Add USB Always On
USB AO is the internal name for the dedicated charging port on
ThinkPads when in S3 or lower.
AOEN (bit 0) is internal name for enabling this feature while AOCF
(bits 2 and 3) is the configuration field. According to Peter Stuge,
AOCF can be configured in this way:
00 => AC S3 S4 S4 USB on, battery S3 USB on, battery S4 S5 off
11 => AC S3 S4 S4 USB on, battery S3 S4 S5 USB off
10, 01 => equivalent to 00
This commit also adds a new configuration field in the CMOS of the
X220 and the X201 to activate this feature. It probably can be also
added to all the Thinkpads that support this functionality.
With this functionality USB devices are able to negotiate full power
from the dedicated port (usually the yellow one) even in S3.
Tested on a X201 and X220 with an Android smartphone: with this
feature enabled it shows "Charging" when connected during S3, without
it it shows "Charging slowly" (or it doesn't charge at all on the
X201).
Change-Id: Ie1269a4357e2fbd608ad8b7b8262275914730f6e
Signed-off-by: Nicola Corna <nicola(a)corna.info>
---
src/ec/lenovo/h8/Makefile.inc | 1 +
src/ec/lenovo/h8/h8.c | 1 +
src/ec/lenovo/h8/h8.h | 5 ++++
src/ec/lenovo/h8/smm.c | 43 ++++++++++++++++++++++++++++++++++
src/ec/lenovo/h8/smm.h | 17 ++++++++++++++
src/mainboard/lenovo/x201/cmos.default | 1 +
src/mainboard/lenovo/x201/cmos.layout | 6 +++--
src/mainboard/lenovo/x201/smihandler.c | 4 ++++
src/mainboard/lenovo/x220/cmos.default | 1 +
src/mainboard/lenovo/x220/cmos.layout | 5 +++-
src/mainboard/lenovo/x220/smihandler.c | 4 ++++
11 files changed, 85 insertions(+), 3 deletions(-)
diff --git a/src/ec/lenovo/h8/Makefile.inc b/src/ec/lenovo/h8/Makefile.inc
index 4829e7b..da9cee1 100644
--- a/src/ec/lenovo/h8/Makefile.inc
+++ b/src/ec/lenovo/h8/Makefile.inc
@@ -1,5 +1,6 @@
ifeq ($(CONFIG_EC_LENOVO_H8),y)
ramstage-y += h8.c
+smm-y += smm.c
endif
diff --git a/src/ec/lenovo/h8/h8.c b/src/ec/lenovo/h8/h8.c
index 703acad..c703a6e 100644
--- a/src/ec/lenovo/h8/h8.c
+++ b/src/ec/lenovo/h8/h8.c
@@ -313,6 +313,7 @@ static void h8_enable(struct device *dev)
ec_write(0x1f, conf->eventf_enable);
ec_write(H8_FAN_CONTROL, H8_FAN_CONTROL_AUTO);
+ ec_write(H8_USB_ALWAYS_ON, ec_read(H8_USB_ALWAYS_ON) & ~(0x0d));
h8_trackpoint_enable(1);
h8_usb_power_enable(1);
diff --git a/src/ec/lenovo/h8/h8.h b/src/ec/lenovo/h8/h8.h
index d3803c0..c893396 100644
--- a/src/ec/lenovo/h8/h8.h
+++ b/src/ec/lenovo/h8/h8.h
@@ -64,6 +64,11 @@ void h8_mainboard_init_dock (void);
#define H8_LED_CONTROL_ON 0x80
#define H8_LED_CONTROL_BLINK 0xc0
+#define H8_USB_ALWAYS_ON 0x0d
+#define H8_USB_ALWAYS_ON_DISABLE 0x00
+#define H8_USB_ALWAYS_ON_AC_ONLY 0x0d
+#define H8_USB_ALWAYS_ON_AC_BAT 0x01
+
#define H8_LED_CONTROL_POWER_LED 0x00
#define H8_LED_CONTROL_BAT0_LED 0x01
#define H8_LED_CONTROL_BAT1_LED 0x02
diff --git a/src/ec/lenovo/h8/smm.c b/src/ec/lenovo/h8/smm.c
new file mode 100644
index 0000000..7d7967b
--- /dev/null
+++ b/src/ec/lenovo/h8/smm.c
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <ec/lenovo/h8/h8.h>
+#include <ec/acpi/ec.h>
+#include <pc80/mc146818rtc.h>
+
+#include "smm.h"
+
+void h8_usb_always_on(void)
+{
+ u8 val;
+ u8 reg;
+
+ if (get_option(&val, "usb_always_on") != CB_SUCCESS)
+ val = 0;
+
+ reg = ec_read(H8_USB_ALWAYS_ON);
+
+ if (val == 2)
+ {
+ reg &= ~(0x0c);
+ reg |= 0x01;
+ }
+ else if (val == 1)
+ reg |= 0x0d;
+ else
+ reg &= ~(0x0d);
+
+ ec_write(H8_USB_ALWAYS_ON, reg);
+}
diff --git a/src/ec/lenovo/h8/smm.h b/src/ec/lenovo/h8/smm.h
new file mode 100644
index 0000000..5b02450
--- /dev/null
+++ b/src/ec/lenovo/h8/smm.h
@@ -0,0 +1,17 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+void h8_usb_always_on(void);
+
diff --git a/src/mainboard/lenovo/x201/cmos.default b/src/mainboard/lenovo/x201/cmos.default
index 50d17ae..9f1e31d 100644
--- a/src/mainboard/lenovo/x201/cmos.default
+++ b/src/mainboard/lenovo/x201/cmos.default
@@ -15,3 +15,4 @@ sticky_fn=Disable
power_management_beeps=Enable
low_battery_beep=Enable
sata_mode=AHCI
+usb_always_on=Disable
diff --git a/src/mainboard/lenovo/x201/cmos.layout b/src/mainboard/lenovo/x201/cmos.layout
index 2a91eb7..36b09f2 100644
--- a/src/mainboard/lenovo/x201/cmos.layout
+++ b/src/mainboard/lenovo/x201/cmos.layout
@@ -70,8 +70,7 @@ entries
419 1 e 1 power_management_beeps
420 1 e 1 low_battery_beep
421 1 e 9 sata_mode
-
-#422 2 r 0 unused
+422 2 e 11 usb_always_on
# coreboot config options: northbridge
424 3 e 10 gfx_uma_size
@@ -123,6 +122,9 @@ enumerations
10 3 128M
10 5 96M
10 6 160M
+11 0 Disable
+11 1 AC only
+11 2 AC and battery
# -----------------------------------------------------------------
checksums
diff --git a/src/mainboard/lenovo/x201/smihandler.c b/src/mainboard/lenovo/x201/smihandler.c
index 591a521..538ca00 100644
--- a/src/mainboard/lenovo/x201/smihandler.c
+++ b/src/mainboard/lenovo/x201/smihandler.c
@@ -2,6 +2,7 @@
* This file is part of the coreboot project.
*
* Copyright (C) 2008-2009 coresystems GmbH
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -25,6 +26,7 @@
#include <ec/acpi/ec.h>
#include <pc80/mc146818rtc.h>
#include <ec/lenovo/h8/h8.h>
+#include <ec/lenovo/h8/smm.h>
#include <delay.h>
#include "dock.h"
#include "smi.h"
@@ -178,6 +180,8 @@ int mainboard_smi_apmc(u8 data)
void mainboard_smi_sleep(u8 slp_typ)
{
+ h8_usb_always_on();
+
if (slp_typ == 3) {
u8 ec_wake = ec_read(0x32);
/* If EC wake events are enabled, enable wake on EC WAKE GPE. */
diff --git a/src/mainboard/lenovo/x220/cmos.default b/src/mainboard/lenovo/x220/cmos.default
index 1b8e212..91331ab 100644
--- a/src/mainboard/lenovo/x220/cmos.default
+++ b/src/mainboard/lenovo/x220/cmos.default
@@ -10,6 +10,7 @@ wwan=Enable
wlan=Enable
touchpad=Enable
sata_mode=AHCI
+usb_always_on=Disable
fn_ctrl_swap=Disable
sticky_fn=Disable
trackpoint=Enable
diff --git a/src/mainboard/lenovo/x220/cmos.layout b/src/mainboard/lenovo/x220/cmos.layout
index 143ee80..bc506f1 100644
--- a/src/mainboard/lenovo/x220/cmos.layout
+++ b/src/mainboard/lenovo/x220/cmos.layout
@@ -69,7 +69,7 @@ entries
418 1 e 1 sticky_fn
419 1 e 1 power_management_beeps
421 1 e 9 sata_mode
-#422 2 r 1 unused
+422 2 e 12 usb_always_on
# coreboot config options: cpu
424 1 e 2 hyper_threading
@@ -134,6 +134,9 @@ enumerations
11 4 160M
11 5 192M
11 6 224M
+12 0 Disable
+12 1 AC only
+12 2 AC and battery
# -----------------------------------------------------------------
checksums
diff --git a/src/mainboard/lenovo/x220/smihandler.c b/src/mainboard/lenovo/x220/smihandler.c
index 08554c9..a98cd82 100644
--- a/src/mainboard/lenovo/x220/smihandler.c
+++ b/src/mainboard/lenovo/x220/smihandler.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2008-2009 coresystems GmbH
* Copyright (C) 2014 Vladimir Serbinenko
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -21,6 +22,7 @@
#include <ec/acpi/ec.h>
#include <pc80/mc146818rtc.h>
#include <ec/lenovo/h8/h8.h>
+#include <ec/lenovo/h8/smm.h>
#include <delay.h>
#include <southbridge/intel/bd82x6x/nvs.h>
#include <southbridge/intel/bd82x6x/pch.h>
@@ -133,6 +135,8 @@ int mainboard_smi_apmc(u8 data)
void mainboard_smi_sleep(u8 slp_typ)
{
+ h8_usb_always_on();
+
if (slp_typ == 3) {
u8 ec_wake = ec_read(0x32);
/* If EC wake events are enabled, enable wake on EC WAKE GPE. */
Nicola Corna (nicola(a)corna.info) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/17252
-gerrit
commit 92a0feba53cadc6b3c75005f42ce18fad7e4338c
Author: Nicola Corna <nicola(a)corna.info>
Date: Sat Nov 5 16:06:59 2016 +0100
ec/lenovo/h8: Add USB Always On
USB AO is the internal name for the dedicated charging port on ThinkPads
when in S3 or lower.
AOEN (bit 0) is internal name for enabling this feature while AOCF (bits 2
and 3) is the configuration field. According to Peter Stuge, AOCF can be
configured in this way:
00 => AC S3 S4 S4 USB on, battery S3 USB on, battery S4 S5 off
11 => AC S3 S4 S4 USB on, battery S3 S4 S5 USB off
10, 01 => equivalent to 00
This commit also adds a new configuration field in the CMOS of the X220
and the X201 to activate this feature. It probably can be also added to
all the Thinkpads that support this functionality.
With this functionality USB devices are able to negotiate full power from
the dedicated port (usually the yellow one) even in S3.
Tested on a X201 and X220 with an Android smartphone: with this feature
enabled it shows "Charging" when connected during S3, without it it shows
"Charging slowly" (or it doesn't charge at all on the X201).
Change-Id: Ie1269a4357e2fbd608ad8b7b8262275914730f6e
Signed-off-by: Nicola Corna <nicola(a)corna.info>
---
src/ec/lenovo/h8/Makefile.inc | 1 +
src/ec/lenovo/h8/h8.c | 1 +
src/ec/lenovo/h8/h8.h | 5 ++++
src/ec/lenovo/h8/smm.c | 43 ++++++++++++++++++++++++++++++++++
src/ec/lenovo/h8/smm.h | 17 ++++++++++++++
src/mainboard/lenovo/x201/cmos.default | 1 +
src/mainboard/lenovo/x201/cmos.layout | 6 +++--
src/mainboard/lenovo/x201/smihandler.c | 3 +++
src/mainboard/lenovo/x220/cmos.default | 1 +
src/mainboard/lenovo/x220/cmos.layout | 5 +++-
src/mainboard/lenovo/x220/smihandler.c | 4 ++++
11 files changed, 84 insertions(+), 3 deletions(-)
diff --git a/src/ec/lenovo/h8/Makefile.inc b/src/ec/lenovo/h8/Makefile.inc
index 4829e7b..da9cee1 100644
--- a/src/ec/lenovo/h8/Makefile.inc
+++ b/src/ec/lenovo/h8/Makefile.inc
@@ -1,5 +1,6 @@
ifeq ($(CONFIG_EC_LENOVO_H8),y)
ramstage-y += h8.c
+smm-y += smm.c
endif
diff --git a/src/ec/lenovo/h8/h8.c b/src/ec/lenovo/h8/h8.c
index 703acad..c703a6e 100644
--- a/src/ec/lenovo/h8/h8.c
+++ b/src/ec/lenovo/h8/h8.c
@@ -313,6 +313,7 @@ static void h8_enable(struct device *dev)
ec_write(0x1f, conf->eventf_enable);
ec_write(H8_FAN_CONTROL, H8_FAN_CONTROL_AUTO);
+ ec_write(H8_USB_ALWAYS_ON, ec_read(H8_USB_ALWAYS_ON) & ~(0x0d));
h8_trackpoint_enable(1);
h8_usb_power_enable(1);
diff --git a/src/ec/lenovo/h8/h8.h b/src/ec/lenovo/h8/h8.h
index d3803c0..c893396 100644
--- a/src/ec/lenovo/h8/h8.h
+++ b/src/ec/lenovo/h8/h8.h
@@ -64,6 +64,11 @@ void h8_mainboard_init_dock (void);
#define H8_LED_CONTROL_ON 0x80
#define H8_LED_CONTROL_BLINK 0xc0
+#define H8_USB_ALWAYS_ON 0x0d
+#define H8_USB_ALWAYS_ON_DISABLE 0x00
+#define H8_USB_ALWAYS_ON_AC_ONLY 0x0d
+#define H8_USB_ALWAYS_ON_AC_BAT 0x01
+
#define H8_LED_CONTROL_POWER_LED 0x00
#define H8_LED_CONTROL_BAT0_LED 0x01
#define H8_LED_CONTROL_BAT1_LED 0x02
diff --git a/src/ec/lenovo/h8/smm.c b/src/ec/lenovo/h8/smm.c
new file mode 100644
index 0000000..7d7967b
--- /dev/null
+++ b/src/ec/lenovo/h8/smm.c
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <ec/lenovo/h8/h8.h>
+#include <ec/acpi/ec.h>
+#include <pc80/mc146818rtc.h>
+
+#include "smm.h"
+
+void h8_usb_always_on(void)
+{
+ u8 val;
+ u8 reg;
+
+ if (get_option(&val, "usb_always_on") != CB_SUCCESS)
+ val = 0;
+
+ reg = ec_read(H8_USB_ALWAYS_ON);
+
+ if (val == 2)
+ {
+ reg &= ~(0x0c);
+ reg |= 0x01;
+ }
+ else if (val == 1)
+ reg |= 0x0d;
+ else
+ reg &= ~(0x0d);
+
+ ec_write(H8_USB_ALWAYS_ON, reg);
+}
diff --git a/src/ec/lenovo/h8/smm.h b/src/ec/lenovo/h8/smm.h
new file mode 100644
index 0000000..5b02450
--- /dev/null
+++ b/src/ec/lenovo/h8/smm.h
@@ -0,0 +1,17 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+void h8_usb_always_on(void);
+
diff --git a/src/mainboard/lenovo/x201/cmos.default b/src/mainboard/lenovo/x201/cmos.default
index 50d17ae..9f1e31d 100644
--- a/src/mainboard/lenovo/x201/cmos.default
+++ b/src/mainboard/lenovo/x201/cmos.default
@@ -15,3 +15,4 @@ sticky_fn=Disable
power_management_beeps=Enable
low_battery_beep=Enable
sata_mode=AHCI
+usb_always_on=Disable
diff --git a/src/mainboard/lenovo/x201/cmos.layout b/src/mainboard/lenovo/x201/cmos.layout
index 2a91eb7..36b09f2 100644
--- a/src/mainboard/lenovo/x201/cmos.layout
+++ b/src/mainboard/lenovo/x201/cmos.layout
@@ -70,8 +70,7 @@ entries
419 1 e 1 power_management_beeps
420 1 e 1 low_battery_beep
421 1 e 9 sata_mode
-
-#422 2 r 0 unused
+422 2 e 11 usb_always_on
# coreboot config options: northbridge
424 3 e 10 gfx_uma_size
@@ -123,6 +122,9 @@ enumerations
10 3 128M
10 5 96M
10 6 160M
+11 0 Disable
+11 1 AC only
+11 2 AC and battery
# -----------------------------------------------------------------
checksums
diff --git a/src/mainboard/lenovo/x201/smihandler.c b/src/mainboard/lenovo/x201/smihandler.c
index 591a521..9ff391d 100644
--- a/src/mainboard/lenovo/x201/smihandler.c
+++ b/src/mainboard/lenovo/x201/smihandler.c
@@ -2,6 +2,7 @@
* This file is part of the coreboot project.
*
* Copyright (C) 2008-2009 coresystems GmbH
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -178,6 +179,8 @@ int mainboard_smi_apmc(u8 data)
void mainboard_smi_sleep(u8 slp_typ)
{
+ h8_usb_always_on();
+
if (slp_typ == 3) {
u8 ec_wake = ec_read(0x32);
/* If EC wake events are enabled, enable wake on EC WAKE GPE. */
diff --git a/src/mainboard/lenovo/x220/cmos.default b/src/mainboard/lenovo/x220/cmos.default
index 1b8e212..91331ab 100644
--- a/src/mainboard/lenovo/x220/cmos.default
+++ b/src/mainboard/lenovo/x220/cmos.default
@@ -10,6 +10,7 @@ wwan=Enable
wlan=Enable
touchpad=Enable
sata_mode=AHCI
+usb_always_on=Disable
fn_ctrl_swap=Disable
sticky_fn=Disable
trackpoint=Enable
diff --git a/src/mainboard/lenovo/x220/cmos.layout b/src/mainboard/lenovo/x220/cmos.layout
index 143ee80..bc506f1 100644
--- a/src/mainboard/lenovo/x220/cmos.layout
+++ b/src/mainboard/lenovo/x220/cmos.layout
@@ -69,7 +69,7 @@ entries
418 1 e 1 sticky_fn
419 1 e 1 power_management_beeps
421 1 e 9 sata_mode
-#422 2 r 1 unused
+422 2 e 12 usb_always_on
# coreboot config options: cpu
424 1 e 2 hyper_threading
@@ -134,6 +134,9 @@ enumerations
11 4 160M
11 5 192M
11 6 224M
+12 0 Disable
+12 1 AC only
+12 2 AC and battery
# -----------------------------------------------------------------
checksums
diff --git a/src/mainboard/lenovo/x220/smihandler.c b/src/mainboard/lenovo/x220/smihandler.c
index 08554c9..a98cd82 100644
--- a/src/mainboard/lenovo/x220/smihandler.c
+++ b/src/mainboard/lenovo/x220/smihandler.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2008-2009 coresystems GmbH
* Copyright (C) 2014 Vladimir Serbinenko
+ * Copyright (C) 2016 Nicola Corna <nicola(a)corna.info>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -21,6 +22,7 @@
#include <ec/acpi/ec.h>
#include <pc80/mc146818rtc.h>
#include <ec/lenovo/h8/h8.h>
+#include <ec/lenovo/h8/smm.h>
#include <delay.h>
#include <southbridge/intel/bd82x6x/nvs.h>
#include <southbridge/intel/bd82x6x/pch.h>
@@ -133,6 +135,8 @@ int mainboard_smi_apmc(u8 data)
void mainboard_smi_sleep(u8 slp_typ)
{
+ h8_usb_always_on();
+
if (slp_typ == 3) {
u8 ec_wake = ec_read(0x32);
/* If EC wake events are enabled, enable wake on EC WAKE GPE. */