From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Lan Tianyu <tianyu.lan@intel.com>
Cc: wsa@the-dreams.de, rjw@rjwysocki.net, awilliam@redhat.com,
lenb@kernel.org, linux-i2c@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org
Subject: Re: [Resend Patch 7/9] I2C/ACPI: Add i2c ACPI operation region support
Date: Tue, 22 Apr 2014 14:36:38 +0300 [thread overview]
Message-ID: <20140422113638.GK30677@intel.com> (raw)
In-Reply-To: <1398147855-9868-8-git-send-email-tianyu.lan@intel.com>
On Tue, Apr 22, 2014 at 02:24:13PM +0800, Lan Tianyu wrote:
> diff --git a/drivers/i2c/i2c-acpi.c b/drivers/i2c/i2c-acpi.c
> new file mode 100644
> index 0000000..942abdf
> --- /dev/null
> +++ b/drivers/i2c/i2c-acpi.c
> @@ -0,0 +1,282 @@
> +/*
> + * I2C ACPI code
> + *
> + * Copyright (C) 2014 Intel Corp
> + *
> + * Author: Lan Tianyu <tianyu.lan@intel.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * 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.
> + */
> +#define pr_fmt(fmt) "I2C/ACPI : " fmt
> +
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/acpi.h>
> +
> +struct acpi_i2c_handler_data {
> + struct acpi_connection_info info;
> + struct i2c_adapter *adapter;
> +} __packed;
Why __packed?
> +
> +struct gsb_buffer {
> + u8 status;
> + u8 len;
> + union {
> + u16 wdata;
> + u8 bdata;
> + u8 data[0];
> + };
> +} __packed;
> +
> +static int acpi_gsb_i2c_read_bytes(struct i2c_client *client,
> + u8 cmd, u8 *data, u8 data_len)
> +{
> +
> + struct i2c_msg msgs[2];
> + int ret;
> + u8 *buffer;
You seem to have two spaces here.
> +
> + buffer = kzalloc(data_len, GFP_KERNEL);
> + if (!buffer)
> + return AE_NO_MEMORY;
> +
> + msgs[0].addr = client->addr;
> + msgs[0].flags = client->flags;
> + msgs[0].len = 1;
> + msgs[0].buf = &cmd;
> +
> + msgs[1].addr = client->addr;
> + msgs[1].flags = client->flags | I2C_M_RD;
> + msgs[1].len = data_len;
> + msgs[1].buf = buffer;
> +
> + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
> + if (ret < 0)
> + pr_err("i2c read failed\n");
> + else
> + memcpy(data, buffer, data_len);
> +
> + kfree(buffer);
> + return ret;
> +}
> +
> +static int acpi_gsb_i2c_write_bytes(struct i2c_client *client,
> + u8 cmd, u8 *data, u8 data_len)
> +{
> +
> + struct i2c_msg msgs[1];
> + u8 *buffer;
Ditto.
> + int ret = AE_OK;
> +
> + buffer = kzalloc(data_len + 1, GFP_KERNEL);
> + if (!buffer)
> + return AE_NO_MEMORY;
> +
> + buffer[0] = cmd;
> + memcpy(buffer + 1, data, data_len);
> +
> + msgs[0].addr = client->addr;
> + msgs[0].flags = client->flags;
> + msgs[0].len = data_len + 1;
> + msgs[0].buf = buffer;
> +
> + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
> + if (ret < 0)
> + pr_err("i2c write failed\n");
Since you have pointer to the adapter, can't you use dev_err() instead?
> +
> + kfree(buffer);
> + return ret;
> +}
> +
> +static acpi_status
> +acpi_i2c_space_handler(u32 function, acpi_physical_address command,
> + u32 bits, u64 *value64,
> + void *handler_context, void *region_context)
> +{
> + struct gsb_buffer *gsb = (struct gsb_buffer *)value64;
> + struct acpi_i2c_handler_data *data = handler_context;
> + struct acpi_connection_info *info = &data->info;
> + struct acpi_resource_i2c_serialbus *sb;
> + struct i2c_adapter *adapter = data->adapter;
> + struct i2c_client client;
> + struct acpi_resource *ares;
> + u32 accessor_type = function >> 16;
> + u8 action = function & ACPI_IO_MASK;
> + int status;
> +
> + acpi_buffer_to_resource(info->connection, info->length, &ares);
> + if (!value64 || ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS)
> + return AE_BAD_PARAMETER;
> +
> + sb = &ares->data.i2c_serial_bus;
> + if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_I2C)
> + return AE_BAD_PARAMETER;
Do you leak the resource buffer here?
> +
> + client.adapter = adapter;
> + client.addr = sb->slave_address;
> + client.flags = 0;
I'm not sure if this is the correct way to use struct i2c_client
(allocating it from stack and passing forward to functions that might
expect a real i2c_client structure). It has ->dev and all.
I'm wondering if you can use i2c_transfer() and i2c_smbus_xfer() here
instead, passing just the adapter pointer?
> +
> + if (sb->access_mode == ACPI_I2C_10BIT_MODE)
> + client.flags |= I2C_CLIENT_TEN;
> +
> + switch (accessor_type) {
> + case ACPI_GSB_ACCESS_ATTRIB_QUICK:
> + if (action == ACPI_READ)
> + status = i2c_smbus_quick_read(&client);
> + else
> + status = i2c_smbus_quick_write(&client);
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_SEND_RCV:
> + if (action == ACPI_READ) {
> + status = i2c_smbus_read_byte(&client);
> + if (status >= 0) {
> + gsb->bdata = status;
> + status = 0;
> + }
> + } else {
> + status = i2c_smbus_write_byte(&client, gsb->bdata);
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_BYTE:
> + if (action == ACPI_READ) {
> + status = i2c_smbus_read_byte_data(&client, command);
> + if (status >= 0) {
> + gsb->bdata = status;
> + status = 0;
> + }
> + } else {
> + status = i2c_smbus_write_byte_data(&client, command,
> + gsb->bdata);
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_WORD:
> + if (action == ACPI_READ) {
> + status = i2c_smbus_read_word_data(&client, command);
> + if (status >= 0) {
> + gsb->wdata = status;
> + status = 0;
> + }
> + } else {
> + status = i2c_smbus_write_word_data(&client, command,
> + gsb->wdata);
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_BLOCK:
> + if (action == ACPI_READ) {
> + status = i2c_smbus_read_block_data(&client, command,
> + gsb->data);
> + if (status >= 0) {
> + gsb->len = status;
> + status = 0;
> + }
> + } else {
> + status = i2c_smbus_write_block_data(&client, command,
> + gsb->len, gsb->data);
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_MULTIBYTE:
> + if (action == ACPI_READ) {
> + status = acpi_gsb_i2c_read_bytes(&client, command,
> + gsb->data, info->access_length);
> + if (status > 0)
> + status = 0;
> + } else {
> + status = acpi_gsb_i2c_write_bytes(&client, command,
> + gsb->data, info->access_length);
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_WORD_CALL:
> + status = i2c_smbus_word_proc_call(&client, command, gsb->wdata);
> + if (status >= 0) {
> + gsb->wdata = status;
> + status = 0;
> + }
> + break;
> +
> + case ACPI_GSB_ACCESS_ATTRIB_BLOCK_CALL:
> + status = i2c_smbus_block_proc_call(&client, command, gsb->len,
> + gsb->data);
> + if (status > 0) {
> + gsb->len = status;
> + status = 0;
> + }
> + break;
> +
> + default:
> + pr_info("protocl(0x%02x) is not supported.\n", accessor_type);
protocl -> protocol
> + return AE_BAD_PARAMETER;
> + }
> +
> + gsb->status = status;
> + return AE_OK;
> +}
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-04-22 11:36 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-16 13:24 [PATCH 0/9] I2C ACPI operation region handler support Lan Tianyu
[not found] ` <1397654682-7094-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-16 13:24 ` [PATCH 1/9] ACPICA: Executer: Fix buffer allocation issue for generic_serial_bus region field accesses Lan Tianyu
2014-04-21 21:38 ` Rafael J. Wysocki
2014-04-22 1:14 ` Lan Tianyu
2014-04-16 13:24 ` [PATCH 2/9] ACPICA: Export acpi_buffer_to_resource symbol Lan Tianyu
2014-04-16 13:24 ` [PATCH 3/9] ACPI: Add acpi_bus_attach_private_data() to facilitate to attach data to ACPI handle Lan Tianyu
2014-04-16 13:24 ` [PATCH 4/9] ACPI/Thermal: Use acpi_bus_attach_private_data() to attach private data Lan Tianyu
2014-04-16 13:24 ` [PATCH 5/9] I2C: Add smbus quick read/write helper function Lan Tianyu
2014-04-16 13:24 ` [PATCH 6/9] I2C: Add smbus word/block process call " Lan Tianyu
2014-04-16 13:24 ` [PATCH 7/9] I2C/ACPI: Add i2c ACPI operation region support Lan Tianyu
2014-04-16 13:24 ` [PATCH 8/9] I2C/ACPI: Move ACPI related code to i2c-acpi.c Lan Tianyu
2014-04-16 13:24 ` [PATCH 9/9] I2C/ACPI: Add CONFIG_I2C_ACPI config Lan Tianyu
2014-04-16 13:33 ` [PATCH 0/9] I2C ACPI operation region handler support Lan Tianyu
2014-04-16 16:35 ` Adam Williamson
2014-04-22 6:24 ` [Resend Patch " Lan Tianyu
2014-04-22 6:24 ` [Resend Patch 1/9] ACPICA: Executer: Fix buffer allocation issue for generic_serial_bus region field accesses Lan Tianyu
[not found] ` <1398147855-9868-2-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:21 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 2/9] ACPICA: Export acpi_buffer_to_resource symbol Lan Tianyu
[not found] ` <1398147855-9868-3-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:21 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 3/9] ACPI: Add acpi_bus_attach_private_data() to facilitate to attach data to ACPI handle Lan Tianyu
[not found] ` <1398147855-9868-4-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:23 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 4/9] ACPI/Thermal: Use acpi_bus_attach_private_data() to attach private data Lan Tianyu
[not found] ` <1398147855-9868-5-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:24 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 5/9] I2C: Add smbus quick read/write helper function Lan Tianyu
[not found] ` <1398147855-9868-6-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:24 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 6/9] I2C: Add smbus word/block process call " Lan Tianyu
2014-04-22 11:26 ` Mika Westerberg
[not found] ` <1398147855-9868-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 6:24 ` [Resend Patch 7/9] I2C/ACPI: Add i2c ACPI operation region support Lan Tianyu
2014-04-22 11:36 ` Mika Westerberg [this message]
2014-04-23 1:53 ` Lan Tianyu
2014-04-23 7:28 ` Mika Westerberg
2014-04-23 7:17 ` Lan Tianyu
2014-04-22 6:24 ` [Resend Patch 8/9] I2C/ACPI: Move ACPI related code to i2c-acpi.c Lan Tianyu
[not found] ` <1398147855-9868-9-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-22 11:38 ` Mika Westerberg
2014-04-22 6:24 ` [Resend Patch 9/9] I2C/ACPI: Add CONFIG_I2C_ACPI config Lan Tianyu
2014-04-22 11:45 ` Mika Westerberg
[not found] ` <20140422114510.GM30677-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-23 5:39 ` Lan Tianyu
[not found] ` <53575227.7080407-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-23 6:47 ` Zheng, Lv
2014-04-23 7:40 ` Mika Westerberg
2014-04-23 23:03 ` [Resend Patch 0/9] I2C ACPI operation region handler support Adam Williamson
2014-04-28 14:27 ` [Patch V2 " Lan Tianyu
2014-04-28 14:27 ` [Patch V2 1/9] ACPICA: Executer: Fix buffer allocation issue for generic_serial_bus region field accesses Lan Tianyu
2014-04-28 17:52 ` Adam Williamson
2014-04-28 18:08 ` Adam Williamson
2014-04-28 22:50 ` Rafael J. Wysocki
2014-04-29 11:31 ` Wolfram Sang
2014-04-29 21:37 ` Rafael J. Wysocki
2014-04-28 14:27 ` [Patch V2 2/9] ACPICA: Export acpi_buffer_to_resource symbol Lan Tianyu
2014-04-28 14:27 ` [Patch V2 3/9] ACPI: Add acpi_bus_attach_private_data() to facilitate to attach data to ACPI handle Lan Tianyu
2014-04-28 14:27 ` [Patch V2 4/9] ACPI/Thermal: Use acpi_bus_attach_private_data() to attach private data Lan Tianyu
2014-04-28 14:27 ` [Patch V2 5/9] I2C: Add smbus quick read/write helper function Lan Tianyu
[not found] ` <1398695268-28645-6-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-17 9:41 ` Wolfram Sang
2014-05-17 13:13 ` Lan Tianyu
2014-05-17 17:15 ` Wolfram Sang
2014-04-28 14:27 ` [Patch V2 6/9] I2C: Add smbus word/block process call " Lan Tianyu
2014-05-17 10:21 ` Wolfram Sang
2014-05-17 13:59 ` Lan Tianyu
[not found] ` <53776B32.8010400-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-17 17:17 ` Wolfram Sang
2014-05-19 9:23 ` Lan Tianyu
2014-04-28 14:27 ` [Patch V2 7/9] I2C/ACPI: Add i2c ACPI operation region support Lan Tianyu
2014-04-29 8:02 ` Mika Westerberg
[not found] ` <1398695268-28645-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-04-28 14:27 ` [Patch V2 8/9] I2C/ACPI: Move ACPI related code to i2c-acpi.c Lan Tianyu
2014-04-28 22:51 ` [Patch V2 0/9] I2C ACPI operation region handler support Rafael J. Wysocki
[not found] ` <43726986.W0L99n76oE-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2014-04-29 1:54 ` Lan Tianyu
2014-04-29 15:47 ` Rafael J. Wysocki
2014-05-13 13:09 ` Rolf Eike Beer
2014-05-13 14:06 ` Lan Tianyu
[not found] ` <53722700.6010001-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-15 7:50 ` Rolf Eike Beer
2014-05-15 14:49 ` Lan Tianyu
[not found] ` <5374D401.2010608-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-16 8:43 ` Rolf Eike Beer
2014-05-20 14:17 ` Rolf Eike Beer
2014-05-22 15:14 ` Lan Tianyu
[not found] ` <537E143F.7060701-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-23 6:55 ` Rolf Eike Beer
2014-04-28 14:27 ` [Patch V2 9/9] I2C/ACPI: Add CONFIG_I2C_ACPI config Lan Tianyu
2014-04-29 8:16 ` Mika Westerberg
2014-05-17 17:48 ` Wolfram Sang
2014-05-19 8:49 ` Mika Westerberg
[not found] ` <20140519084944.GH2067-3PARRvDOhMZrdx17CPfAsdBPR1lH4CV8@public.gmane.org>
2014-05-19 9:44 ` Lan Tianyu
[not found] ` <5379D28F.1020200-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-05-19 20:23 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140422113638.GK30677@intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=awilliam@redhat.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=tianyu.lan@intel.com \
--cc=wsa@the-dreams.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).