Merge tag 'tag-chrome-platform-for-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux
Pull chrome platform changes from Benson Leung: "CrOS EC / MFD / IIO: - Contains tag-ib-chrome-mfd-iio-input-5.5, which is the first part of a series from Gwendal to refactor sensor code between MFD, CrOS EC, iio and input in order to add a new sensorhub driver and FIFO processing Wilco EC: - Add support for Dell's USB PowerShare policy control, keyboard backlight LED driver, and a new test_event file. - Fixes use after free in wilco_ec's telemetry driver. Misc: - bugfix in cros_usbpd_logger (missing destroy workqueue)" * tag 'tag-chrome-platform-for-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux: platform/chrome: wilco_ec: fix use after free issue platform/chrome: cros_ec: Add Kconfig default for cros-ec-sensorhub Revert "Input: cros_ec_keyb: mask out extra flags in event_type" Revert "Input: cros_ec_keyb - add back missing mask for event_type" platform/chrome: cros_ec: handle MKBP more events flag platform/chrome: cros_ec: Do not attempt to register a non-positive IRQ number platform/chrome: cros-ec: Record event timestamp in the hard irq mfd / platform / iio: cros_ec: Register sensor through sensorhub iio / platform: cros_ec: Add cros-ec-sensorhub driver mfd / platform: cros_ec: Add sensor_count and make check_features public platform/chrome: cros_ec: Put docs with the code platform/chrome: cros_usbpd_logger: add missed destroy_workqueue in remove platform/chrome: cros_ec: Fix Kconfig indentation platform/chrome: wilco_ec: Add keyboard backlight LED support platform/chrome: wilco_ec: Add charging config driver platform/chrome: wilco_ec: Add Dell's USB PowerShare Policy control platform/chrome: wilco_ec: Add debugfs test_event file
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
#include <linux/mfd/cros_ec.h>
|
||||
#include <linux/platform_data/cros_ec_commands.h>
|
||||
|
||||
#define CROS_EC_DEV_NAME "cros_ec"
|
||||
@@ -115,12 +116,16 @@ struct cros_ec_command {
|
||||
* code.
|
||||
* @pkt_xfer: Send packet to EC and get response.
|
||||
* @lock: One transaction at a time.
|
||||
* @mkbp_event_supported: True if this EC supports the MKBP event protocol.
|
||||
* @mkbp_event_supported: 0 if MKBP not supported. Otherwise its value is
|
||||
* the maximum supported version of the MKBP host event
|
||||
* command + 1.
|
||||
* @host_sleep_v1: True if this EC supports the sleep v1 command.
|
||||
* @event_notifier: Interrupt event notifier for transport devices.
|
||||
* @event_data: Raw payload transferred with the MKBP event.
|
||||
* @event_size: Size in bytes of the event data.
|
||||
* @host_event_wake_mask: Mask of host events that cause wake from suspend.
|
||||
* @last_event_time: exact time from the hard irq when we got notified of
|
||||
* a new event.
|
||||
* @ec: The platform_device used by the mfd driver to interface with the
|
||||
* main EC.
|
||||
* @pd: The platform_device used by the mfd driver to interface with the
|
||||
@@ -153,7 +158,7 @@ struct cros_ec_device {
|
||||
int (*pkt_xfer)(struct cros_ec_device *ec,
|
||||
struct cros_ec_command *msg);
|
||||
struct mutex lock;
|
||||
bool mkbp_event_supported;
|
||||
u8 mkbp_event_supported;
|
||||
bool host_sleep_v1;
|
||||
struct blocking_notifier_head event_notifier;
|
||||
|
||||
@@ -161,20 +166,13 @@ struct cros_ec_device {
|
||||
int event_size;
|
||||
u32 host_event_wake_mask;
|
||||
u32 last_resume_result;
|
||||
ktime_t last_event_time;
|
||||
|
||||
/* The platform devices used by the mfd driver */
|
||||
struct platform_device *ec;
|
||||
struct platform_device *pd;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cros_ec_sensor_platform - ChromeOS EC sensor platform information.
|
||||
* @sensor_num: Id of the sensor, as reported by the EC.
|
||||
*/
|
||||
struct cros_ec_sensor_platform {
|
||||
u8 sensor_num;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cros_ec_platform - ChromeOS EC platform information.
|
||||
* @ec_name: Name of EC device (e.g. 'cros-ec', 'cros-pd', ...)
|
||||
@@ -187,133 +185,51 @@ struct cros_ec_platform {
|
||||
u16 cmd_offset;
|
||||
};
|
||||
|
||||
/**
|
||||
* cros_ec_suspend() - Handle a suspend operation for the ChromeOS EC device.
|
||||
* @ec_dev: Device to suspend.
|
||||
*
|
||||
* This can be called by drivers to handle a suspend event.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_suspend(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_resume() - Handle a resume operation for the ChromeOS EC device.
|
||||
* @ec_dev: Device to resume.
|
||||
*
|
||||
* This can be called by drivers to handle a resume event.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_resume(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer.
|
||||
* @ec_dev: Device to register.
|
||||
* @msg: Message to write.
|
||||
*
|
||||
* This is intended to be used by all ChromeOS EC drivers, but at present
|
||||
* only SPI uses it. Once LPC uses the same protocol it can start using it.
|
||||
* I2C could use it now, with a refactor of the existing code.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_prepare_tx(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_check_result() - Check ec_msg->result.
|
||||
* @ec_dev: EC device.
|
||||
* @msg: Message to check.
|
||||
*
|
||||
* This is used by ChromeOS EC drivers to check the ec_msg->result for
|
||||
* errors and to warn about them.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_check_result(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_cmd_xfer() - Send a command to the ChromeOS EC.
|
||||
* @ec_dev: EC device.
|
||||
* @msg: Message to write.
|
||||
*
|
||||
* Call this to send a command to the ChromeOS EC. This should be used
|
||||
* instead of calling the EC's cmd_xfer() callback directly.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_cmd_xfer_status() - Send a command to the ChromeOS EC.
|
||||
* @ec_dev: EC device.
|
||||
* @msg: Message to write.
|
||||
*
|
||||
* This function is identical to cros_ec_cmd_xfer, except it returns success
|
||||
* status only if both the command was transmitted successfully and the EC
|
||||
* replied with success status. It's not necessary to check msg->result when
|
||||
* using this function.
|
||||
*
|
||||
* Return: The number of bytes transferred on success or negative error code.
|
||||
*/
|
||||
int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev,
|
||||
struct cros_ec_command *msg);
|
||||
|
||||
/**
|
||||
* cros_ec_register() - Register a new ChromeOS EC, using the provided info.
|
||||
* @ec_dev: Device to register.
|
||||
*
|
||||
* Before calling this, allocate a pointer to a new device and then fill
|
||||
* in all the fields up to the --private-- marker.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_register(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_unregister() - Remove a ChromeOS EC.
|
||||
* @ec_dev: Device to unregister.
|
||||
*
|
||||
* Call this to deregister a ChromeOS EC, then clean up any private data.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_unregister(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_query_all() - Query the protocol version supported by the
|
||||
* ChromeOS EC.
|
||||
* @ec_dev: Device to register.
|
||||
*
|
||||
* Return: 0 on success or negative error code.
|
||||
*/
|
||||
int cros_ec_query_all(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_get_next_event() - Fetch next event from the ChromeOS EC.
|
||||
* @ec_dev: Device to fetch event from.
|
||||
* @wake_event: Pointer to a bool set to true upon return if the event might be
|
||||
* treated as a wake event. Ignored if null.
|
||||
*
|
||||
* Return: negative error code on errors; 0 for no data; or else number of
|
||||
* bytes received (i.e., an event was retrieved successfully). Event types are
|
||||
* written out to @ec_dev->event_data.event_type on success.
|
||||
*/
|
||||
int cros_ec_get_next_event(struct cros_ec_device *ec_dev, bool *wake_event);
|
||||
int cros_ec_get_next_event(struct cros_ec_device *ec_dev,
|
||||
bool *wake_event,
|
||||
bool *has_more_events);
|
||||
|
||||
/**
|
||||
* cros_ec_get_host_event() - Return a mask of event set by the ChromeOS EC.
|
||||
* @ec_dev: Device to fetch event from.
|
||||
*
|
||||
* When MKBP is supported, when the EC raises an interrupt, we collect the
|
||||
* events raised and call the functions in the ec notifier. This function
|
||||
* is a helper to know which events are raised.
|
||||
*
|
||||
* Return: 0 on error or non-zero bitmask of one or more EC_HOST_EVENT_*.
|
||||
*/
|
||||
u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev);
|
||||
|
||||
int cros_ec_check_features(struct cros_ec_dev *ec, int feature);
|
||||
|
||||
int cros_ec_get_sensor_count(struct cros_ec_dev *ec);
|
||||
|
||||
bool cros_ec_handle_event(struct cros_ec_device *ec_dev);
|
||||
|
||||
/**
|
||||
* cros_ec_get_time_ns() - Return time in ns.
|
||||
*
|
||||
* This is the function used to record the time for last_event_time in struct
|
||||
* cros_ec_device during the hard irq.
|
||||
*
|
||||
* Return: ktime_t format since boot.
|
||||
*/
|
||||
static inline ktime_t cros_ec_get_time_ns(void)
|
||||
{
|
||||
return ktime_get_boottime_ns();
|
||||
}
|
||||
|
||||
#endif /* __LINUX_CROS_EC_PROTO_H */
|
||||
|
30
include/linux/platform_data/cros_ec_sensorhub.h
Normal file
30
include/linux/platform_data/cros_ec_sensorhub.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Chrome OS EC MEMS Sensor Hub driver.
|
||||
*
|
||||
* Copyright 2019 Google LLC
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_PLATFORM_DATA_CROS_EC_SENSORHUB_H
|
||||
#define __LINUX_PLATFORM_DATA_CROS_EC_SENSORHUB_H
|
||||
|
||||
#include <linux/platform_data/cros_ec_commands.h>
|
||||
|
||||
/**
|
||||
* struct cros_ec_sensor_platform - ChromeOS EC sensor platform information.
|
||||
* @sensor_num: Id of the sensor, as reported by the EC.
|
||||
*/
|
||||
struct cros_ec_sensor_platform {
|
||||
u8 sensor_num;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cros_ec_sensorhub - Sensor Hub device data.
|
||||
*
|
||||
* @ec: Embedded Controller where the hub is located.
|
||||
*/
|
||||
struct cros_ec_sensorhub {
|
||||
struct cros_ec_dev *ec;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_PLATFORM_DATA_CROS_EC_SENSORHUB_H */
|
@@ -29,6 +29,7 @@
|
||||
* @data_size: Size of the data buffer used for EC communication.
|
||||
* @debugfs_pdev: The child platform_device used by the debugfs sub-driver.
|
||||
* @rtc_pdev: The child platform_device used by the RTC sub-driver.
|
||||
* @charger_pdev: Child platform_device used by the charger config sub-driver.
|
||||
* @telem_pdev: The child platform_device used by the telemetry sub-driver.
|
||||
*/
|
||||
struct wilco_ec_device {
|
||||
@@ -41,6 +42,7 @@ struct wilco_ec_device {
|
||||
size_t data_size;
|
||||
struct platform_device *debugfs_pdev;
|
||||
struct platform_device *rtc_pdev;
|
||||
struct platform_device *charger_pdev;
|
||||
struct platform_device *telem_pdev;
|
||||
};
|
||||
|
||||
@@ -120,6 +122,19 @@ struct wilco_ec_message {
|
||||
*/
|
||||
int wilco_ec_mailbox(struct wilco_ec_device *ec, struct wilco_ec_message *msg);
|
||||
|
||||
/**
|
||||
* wilco_keyboard_leds_init() - Set up the keyboard backlight LEDs.
|
||||
* @ec: EC device to query.
|
||||
*
|
||||
* After this call, the keyboard backlight will be exposed through a an LED
|
||||
* device at /sys/class/leds.
|
||||
*
|
||||
* This may sleep because it uses wilco_ec_mailbox().
|
||||
*
|
||||
* Return: 0 on success, negative error code on failure.
|
||||
*/
|
||||
int wilco_keyboard_leds_init(struct wilco_ec_device *ec);
|
||||
|
||||
/*
|
||||
* A Property is typically a data item that is stored to NVRAM
|
||||
* by the EC. Each of these data items has an index associated
|
||||
|
Reference in New Issue
Block a user