// SPDX-License-Identifier: GPL-2.0+ // Expose an I2C passthrough to the ChromeOS EC. // // Copyright (C) 2013 Google, Inc. #include <linux/acpi.h> #include <linux/module.h> #include <linux/i2c.h> #include <linux/platform_data/cros_ec_commands.h> #include <linux/platform_data/cros_ec_proto.h> #include <linux/platform_device.h> #include <linux/slab.h> #define I2C_MAX_RETRIES … /** * struct ec_i2c_device - Driver data for I2C tunnel * * @dev: Device node * @adap: I2C adapter * @ec: Pointer to EC device * @remote_bus: The EC bus number we tunnel to on the other side. * @request_buf: Buffer for transmitting data; we expect most transfers to fit. * @response_buf: Buffer for receiving data; we expect most transfers to fit. */ struct ec_i2c_device { … }; /** * ec_i2c_count_message - Count bytes needed for ec_i2c_construct_message * * @i2c_msgs: The i2c messages to read * @num: The number of i2c messages. * * Returns the number of bytes the messages will take up. */ static int ec_i2c_count_message(const struct i2c_msg i2c_msgs[], int num) { … } /** * ec_i2c_construct_message - construct a message to go to the EC * * This function effectively stuffs the standard i2c_msg format of Linux into * a format that the EC understands. * * @buf: The buffer to fill. We assume that the buffer is big enough. * @i2c_msgs: The i2c messages to read. * @num: The number of i2c messages. * @bus_num: The remote bus number we want to talk to. * * Returns 0 or a negative error number. */ static int ec_i2c_construct_message(u8 *buf, const struct i2c_msg i2c_msgs[], int num, u16 bus_num) { … } /** * ec_i2c_count_response - Count bytes needed for ec_i2c_parse_response * * @i2c_msgs: The i2c messages to fill up. * @num: The number of i2c messages expected. * * Returns the number of response bytes expeced. */ static int ec_i2c_count_response(struct i2c_msg i2c_msgs[], int num) { … } /** * ec_i2c_parse_response - Parse a response from the EC * * We'll take the EC's response and copy it back into msgs. * * @buf: The buffer to parse. * @i2c_msgs: The i2c messages to fill up. * @num: The number of i2c messages; will be modified to include the actual * number received. * * Returns 0 or a negative error number. */ static int ec_i2c_parse_response(const u8 *buf, struct i2c_msg i2c_msgs[], int *num) { … } static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[], int num) { … } static u32 ec_i2c_functionality(struct i2c_adapter *adap) { … } static const struct i2c_algorithm ec_i2c_algorithm = …; static int ec_i2c_probe(struct platform_device *pdev) { … } static void ec_i2c_remove(struct platform_device *dev) { … } static const struct of_device_id cros_ec_i2c_of_match[] __maybe_unused = …; MODULE_DEVICE_TABLE(of, cros_ec_i2c_of_match); static const struct acpi_device_id cros_ec_i2c_tunnel_acpi_id[] __maybe_unused = …; MODULE_DEVICE_TABLE(acpi, cros_ec_i2c_tunnel_acpi_id); static struct platform_driver ec_i2c_tunnel_driver = …; module_platform_driver(…) …; MODULE_LICENSE(…) …; MODULE_DESCRIPTION(…) …; MODULE_ALIAS(…) …;