Re: [PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
On Mon, Dec 3, 2018 at 1:13 AM Darren Hart wrote: > On Fri, Nov 16, 2018 at 05:23:52PM +0100, Lubomir Rintel wrote: > > It's based off the driver from the OLPC kernel sources. Somewhat > > modernized and cleaned up, for better or worse. > > > > Modified to plug into the olpc-ec driver infrastructure (so that battery > > interface and debugfs could be reused) and the SPI slave framework. > > - Count the terminating NUL in LOG_BUF_SIZE > > - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 > > on error > > - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages > > - Use a #define for PM wakeup processing time > > - Log a message on unknown event > > - Escape logging payload with %*pE > > - Replace an open-coded min() > > - Correct an error code on short read > > - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS > > and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS > > - dev_get_drvdata() instead of a round-trip through platform device > > - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() > > - Use GENMASK() instead of 0x for the event mask > > - Replace cmd tx/resp rx buffers with structures > > - Turned suspend hint arguments into a struct, and tidied up the comment > > Just from these comments, each of these could be a separate patch. You > can group related things together, or those that change the same line or > function for example. Order them with cleanups / non-functional-changes > first, followed by functional changes. > > > > > Basically all of the above is based on the review by Andy Shevchenko. > > Andy, what was your intent for Lubomir here? From the above, this looks > like it should be several patches to me. This is a new module, I don't see why it can't be one patch. For the existing code I agree with you. -- With Best Regards, Andy Shevchenko
Re: [PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
On Mon, Dec 3, 2018 at 1:13 AM Darren Hart wrote: > On Fri, Nov 16, 2018 at 05:23:52PM +0100, Lubomir Rintel wrote: > > It's based off the driver from the OLPC kernel sources. Somewhat > > modernized and cleaned up, for better or worse. > > > > Modified to plug into the olpc-ec driver infrastructure (so that battery > > interface and debugfs could be reused) and the SPI slave framework. > > - Count the terminating NUL in LOG_BUF_SIZE > > - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 > > on error > > - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages > > - Use a #define for PM wakeup processing time > > - Log a message on unknown event > > - Escape logging payload with %*pE > > - Replace an open-coded min() > > - Correct an error code on short read > > - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS > > and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS > > - dev_get_drvdata() instead of a round-trip through platform device > > - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() > > - Use GENMASK() instead of 0x for the event mask > > - Replace cmd tx/resp rx buffers with structures > > - Turned suspend hint arguments into a struct, and tidied up the comment > > Just from these comments, each of these could be a separate patch. You > can group related things together, or those that change the same line or > function for example. Order them with cleanups / non-functional-changes > first, followed by functional changes. > > > > > Basically all of the above is based on the review by Andy Shevchenko. > > Andy, what was your intent for Lubomir here? From the above, this looks > like it should be several patches to me. This is a new module, I don't see why it can't be one patch. For the existing code I agree with you. -- With Best Regards, Andy Shevchenko
Re: [PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
On Fri, Nov 16, 2018 at 05:23:52PM +0100, Lubomir Rintel wrote: > It's based off the driver from the OLPC kernel sources. Somewhat > modernized and cleaned up, for better or worse. > > Modified to plug into the olpc-ec driver infrastructure (so that battery > interface and debugfs could be reused) and the SPI slave framework. > > Signed-off-by: Lubomir Rintel > Hi Lubomir, You asked for some tips on how to incorporate the changes in a patch series like this. Keep in mind that each patch should create an independent small functional change. This makes it easier to review the patch and verify that what you said you were going to do matches what the patch does. For example, if you separate out the style, whitespace, ordering of declarations into an initial first patch, then all that noise is removed when the reviewer goes to check to implementation of one of the features below. This is a large patch, and should most certainly be broken up into several smaller patches. Do cleanups first, followed by functional changes. This ordering ensure that when a "git blame" is used in the future to understand why a given line is what it is, the first hit will be a functional change, and not a cleanup. > --- > Changes since v1: > - Cosmetic style changes; whitespace, ordering of declarations and > #includes, remoted extra comas from sentinels Please make this a separate change, possibly more than one, depending on how many of these there are. This will reduce the size of the subsequent patches, making them easier to review. > - Count the terminating NUL in LOG_BUF_SIZE > - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 > on error > - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages > - Use a #define for PM wakeup processing time > - Log a message on unknown event > - Escape logging payload with %*pE > - Replace an open-coded min() > - Correct an error code on short read > - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS > and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS > - dev_get_drvdata() instead of a round-trip through platform device > - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() > - Use GENMASK() instead of 0x for the event mask > - Replace cmd tx/resp rx buffers with structures > - Turned suspend hint arguments into a struct, and tidied up the comment Just from these comments, each of these could be a separate patch. You can group related things together, or those that change the same line or function for example. Order them with cleanups / non-functional-changes first, followed by functional changes. > > Basically all of the above is based on the review by Andy Shevchenko. Andy, what was your intent for Lubomir here? From the above, this looks like it should be several patches to me. Thanks, -- Darren Hart VMware Open Source Technology Center
Re: [PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
On Fri, Nov 16, 2018 at 05:23:52PM +0100, Lubomir Rintel wrote: > It's based off the driver from the OLPC kernel sources. Somewhat > modernized and cleaned up, for better or worse. > > Modified to plug into the olpc-ec driver infrastructure (so that battery > interface and debugfs could be reused) and the SPI slave framework. > > Signed-off-by: Lubomir Rintel > Hi Lubomir, You asked for some tips on how to incorporate the changes in a patch series like this. Keep in mind that each patch should create an independent small functional change. This makes it easier to review the patch and verify that what you said you were going to do matches what the patch does. For example, if you separate out the style, whitespace, ordering of declarations into an initial first patch, then all that noise is removed when the reviewer goes to check to implementation of one of the features below. This is a large patch, and should most certainly be broken up into several smaller patches. Do cleanups first, followed by functional changes. This ordering ensure that when a "git blame" is used in the future to understand why a given line is what it is, the first hit will be a functional change, and not a cleanup. > --- > Changes since v1: > - Cosmetic style changes; whitespace, ordering of declarations and > #includes, remoted extra comas from sentinels Please make this a separate change, possibly more than one, depending on how many of these there are. This will reduce the size of the subsequent patches, making them easier to review. > - Count the terminating NUL in LOG_BUF_SIZE > - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 > on error > - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages > - Use a #define for PM wakeup processing time > - Log a message on unknown event > - Escape logging payload with %*pE > - Replace an open-coded min() > - Correct an error code on short read > - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS > and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS > - dev_get_drvdata() instead of a round-trip through platform device > - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() > - Use GENMASK() instead of 0x for the event mask > - Replace cmd tx/resp rx buffers with structures > - Turned suspend hint arguments into a struct, and tidied up the comment Just from these comments, each of these could be a separate patch. You can group related things together, or those that change the same line or function for example. Order them with cleanups / non-functional-changes first, followed by functional changes. > > Basically all of the above is based on the review by Andy Shevchenko. Andy, what was your intent for Lubomir here? From the above, this looks like it should be several patches to me. Thanks, -- Darren Hart VMware Open Source Technology Center
[PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
It's based off the driver from the OLPC kernel sources. Somewhat modernized and cleaned up, for better or worse. Modified to plug into the olpc-ec driver infrastructure (so that battery interface and debugfs could be reused) and the SPI slave framework. Signed-off-by: Lubomir Rintel --- Changes since v1: - Cosmetic style changes; whitespace, ordering of declarations and #includes, remoted extra comas from sentinels - Count the terminating NUL in LOG_BUF_SIZE - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 on error - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages - Use a #define for PM wakeup processing time - Log a message on unknown event - Escape logging payload with %*pE - Replace an open-coded min() - Correct an error code on short read - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS - dev_get_drvdata() instead of a round-trip through platform device - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() - Use GENMASK() instead of 0x for the event mask - Replace cmd tx/resp rx buffers with structures - Turned suspend hint arguments into a struct, and tidied up the comment Basically all of the above is based on the review by Andy Shevchenko. drivers/platform/olpc/Kconfig | 15 + drivers/platform/olpc/Makefile| 1 + drivers/platform/olpc/olpc-xo175-ec.c | 763 ++ 3 files changed, 779 insertions(+) create mode 100644 drivers/platform/olpc/olpc-xo175-ec.c diff --git a/drivers/platform/olpc/Kconfig b/drivers/platform/olpc/Kconfig index 7b736c9e67ac..7c643d24ad0f 100644 --- a/drivers/platform/olpc/Kconfig +++ b/drivers/platform/olpc/Kconfig @@ -9,3 +9,18 @@ config OLPC help Add support for detecting the unique features of the OLPC XO hardware. + +if OLPC + +config OLPC_XO175_EC + tristate "OLPC XO 1.75 Embedded Controller" + depends on ARCH_MMP || COMPILE_TEST + select SPI_SLAVE + help + Include support for the OLPC XO Embedded Controller (EC). The EC + provides various platform services, including support for the power, + button, restart, shutdown and battery charging status. + + Unless you have an OLPC XO laptop, you will want to say N. + +endif diff --git a/drivers/platform/olpc/Makefile b/drivers/platform/olpc/Makefile index dc8b26bc7209..5b43f383289e 100644 --- a/drivers/platform/olpc/Makefile +++ b/drivers/platform/olpc/Makefile @@ -2,3 +2,4 @@ # OLPC XO platform-specific drivers # obj-$(CONFIG_OLPC) += olpc-ec.o +obj-$(CONFIG_OLPC_XO175_EC)+= olpc-xo175-ec.o diff --git a/drivers/platform/olpc/olpc-xo175-ec.c b/drivers/platform/olpc/olpc-xo175-ec.c new file mode 100644 index ..74db06bacc44 --- /dev/null +++ b/drivers/platform/olpc/olpc-xo175-ec.c @@ -0,0 +1,763 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Driver for the OLPC XO-1.75 Embedded Controller. + * + * The EC protocol is documented at: + * http://wiki.laptop.org/go/XO_1.75_HOST_to_EC_Protocol + * + * Copyright (C) 2010 One Laptop per Child Foundation. + * Copyright (C) 2018 Lubomir Rintel + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct ec_cmd_t { + u8 cmd; + u8 bytes_returned; +}; + +enum ec_chan_t { + CHAN_NONE = 0, + CHAN_SWITCH, + CHAN_CMD_RESP, + CHAN_KEYBOARD, + CHAN_TOUCHPAD, + CHAN_EVENT, + CHAN_DEBUG, + CHAN_CMD_ERROR, +}; + +/* + * EC events + */ +#define EVENT_AC_CHANGE1 /* AC plugged/unplugged */ +#define EVENT_BATTERY_STATUS 2 /* Battery low/full/error/gone */ +#define EVENT_BATTERY_CRITICAL 3 /* Battery critical voltage */ +#define EVENT_BATTERY_SOC_CHANGE 4 /* 1% SOC Change */ +#define EVENT_BATTERY_ERROR5 /* Abnormal error, query for cause */ +#define EVENT_POWER_PRESSED6 /* Power button was pressed */ +#define EVENT_POWER_PRESS_WAKE 7 /* Woken up with a power button */ +#define EVENT_TIMED_HOST_WAKE 8 /* Host wake timer */ +#define EVENT_OLS_HIGH_LIMIT 9 /* OLS crossed dark threshold */ +#define EVENT_OLS_LOW_LIMIT10 /* OLS crossed light threshold */ + +/* + * EC commands + * (from http://dev.laptop.org/git/users/rsmith/ec-1.75/tree/ec_cmd.h) + */ +#define CMD_GET_API_VERSION0x08 /* out: u8 */ +#define CMD_READ_VOLTAGE 0x10 /* out: u16, *9.76/32, mV */ +#define CMD_READ_CURRENT 0x11 /* out: s16, *15.625/120, mA */ +#define CMD_READ_ACR 0x12 /* out: s16, *6250/15, uAh */ +#define CMD_READ_BATT_TEMPERATURE 0x13 /* out: u16, *100/256, deg C */ +#define CMD_READ_AMBIENT_TEMPERATURE 0x14 /* unimplemented, no hardware */ +#define CMD_READ_BATTERY_STATUS0x15 /* out: u8,
[PATCH v2 06/17] Platform: OLPC: Add XO-1.75 EC driver
It's based off the driver from the OLPC kernel sources. Somewhat modernized and cleaned up, for better or worse. Modified to plug into the olpc-ec driver infrastructure (so that battery interface and debugfs could be reused) and the SPI slave framework. Signed-off-by: Lubomir Rintel --- Changes since v1: - Cosmetic style changes; whitespace, ordering of declarations and #includes, remoted extra comas from sentinels - Count the terminating NUL in LOG_BUF_SIZE - Make olpc_xo175_ec_is_valid_cmd() return -EINVAL instead of -1 on error - Spell keyboard/touchpad in full for CHAN_KEYBOARD/TOUCHPAD messages - Use a #define for PM wakeup processing time - Log a message on unknown event - Escape logging payload with %*pE - Replace an open-coded min() - Correct an error code on short read - replaced PM callback #ifdefs with __maybe_unusedm SET_RUNTIME_PM_OPS and SET_NOIRQ_SYSTEM_SLEEP_PM_OPS - dev_get_drvdata() instead of a round-trip through platform device - s/unsigned char x/u8 x/ in olpc_xo175_ec_resume() - Use GENMASK() instead of 0x for the event mask - Replace cmd tx/resp rx buffers with structures - Turned suspend hint arguments into a struct, and tidied up the comment Basically all of the above is based on the review by Andy Shevchenko. drivers/platform/olpc/Kconfig | 15 + drivers/platform/olpc/Makefile| 1 + drivers/platform/olpc/olpc-xo175-ec.c | 763 ++ 3 files changed, 779 insertions(+) create mode 100644 drivers/platform/olpc/olpc-xo175-ec.c diff --git a/drivers/platform/olpc/Kconfig b/drivers/platform/olpc/Kconfig index 7b736c9e67ac..7c643d24ad0f 100644 --- a/drivers/platform/olpc/Kconfig +++ b/drivers/platform/olpc/Kconfig @@ -9,3 +9,18 @@ config OLPC help Add support for detecting the unique features of the OLPC XO hardware. + +if OLPC + +config OLPC_XO175_EC + tristate "OLPC XO 1.75 Embedded Controller" + depends on ARCH_MMP || COMPILE_TEST + select SPI_SLAVE + help + Include support for the OLPC XO Embedded Controller (EC). The EC + provides various platform services, including support for the power, + button, restart, shutdown and battery charging status. + + Unless you have an OLPC XO laptop, you will want to say N. + +endif diff --git a/drivers/platform/olpc/Makefile b/drivers/platform/olpc/Makefile index dc8b26bc7209..5b43f383289e 100644 --- a/drivers/platform/olpc/Makefile +++ b/drivers/platform/olpc/Makefile @@ -2,3 +2,4 @@ # OLPC XO platform-specific drivers # obj-$(CONFIG_OLPC) += olpc-ec.o +obj-$(CONFIG_OLPC_XO175_EC)+= olpc-xo175-ec.o diff --git a/drivers/platform/olpc/olpc-xo175-ec.c b/drivers/platform/olpc/olpc-xo175-ec.c new file mode 100644 index ..74db06bacc44 --- /dev/null +++ b/drivers/platform/olpc/olpc-xo175-ec.c @@ -0,0 +1,763 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Driver for the OLPC XO-1.75 Embedded Controller. + * + * The EC protocol is documented at: + * http://wiki.laptop.org/go/XO_1.75_HOST_to_EC_Protocol + * + * Copyright (C) 2010 One Laptop per Child Foundation. + * Copyright (C) 2018 Lubomir Rintel + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct ec_cmd_t { + u8 cmd; + u8 bytes_returned; +}; + +enum ec_chan_t { + CHAN_NONE = 0, + CHAN_SWITCH, + CHAN_CMD_RESP, + CHAN_KEYBOARD, + CHAN_TOUCHPAD, + CHAN_EVENT, + CHAN_DEBUG, + CHAN_CMD_ERROR, +}; + +/* + * EC events + */ +#define EVENT_AC_CHANGE1 /* AC plugged/unplugged */ +#define EVENT_BATTERY_STATUS 2 /* Battery low/full/error/gone */ +#define EVENT_BATTERY_CRITICAL 3 /* Battery critical voltage */ +#define EVENT_BATTERY_SOC_CHANGE 4 /* 1% SOC Change */ +#define EVENT_BATTERY_ERROR5 /* Abnormal error, query for cause */ +#define EVENT_POWER_PRESSED6 /* Power button was pressed */ +#define EVENT_POWER_PRESS_WAKE 7 /* Woken up with a power button */ +#define EVENT_TIMED_HOST_WAKE 8 /* Host wake timer */ +#define EVENT_OLS_HIGH_LIMIT 9 /* OLS crossed dark threshold */ +#define EVENT_OLS_LOW_LIMIT10 /* OLS crossed light threshold */ + +/* + * EC commands + * (from http://dev.laptop.org/git/users/rsmith/ec-1.75/tree/ec_cmd.h) + */ +#define CMD_GET_API_VERSION0x08 /* out: u8 */ +#define CMD_READ_VOLTAGE 0x10 /* out: u16, *9.76/32, mV */ +#define CMD_READ_CURRENT 0x11 /* out: s16, *15.625/120, mA */ +#define CMD_READ_ACR 0x12 /* out: s16, *6250/15, uAh */ +#define CMD_READ_BATT_TEMPERATURE 0x13 /* out: u16, *100/256, deg C */ +#define CMD_READ_AMBIENT_TEMPERATURE 0x14 /* unimplemented, no hardware */ +#define CMD_READ_BATTERY_STATUS0x15 /* out: u8,