From: Dmitry Torokhov <dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: Bastien Nocera <hadess-0MeiytkfxGOsTnJN9+BGXg@public.gmane.org>,
Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>,
Ian Campbell
<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
Kumar Gala <galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
Octavian Purdila
<octavian.purdila-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH v2 5/8] input: goodix: write configuration data to device
Date: Tue, 9 Jun 2015 11:14:06 -0700 [thread overview]
Message-ID: <20150609181406.GJ6338@dtor-ws> (raw)
In-Reply-To: <1433774273-23103-6-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Hi Irina,
On Mon, Jun 08, 2015 at 05:37:50PM +0300, Irina Tirdea wrote:
> Goodix devices can be configured by writing custom data to the device at
> init. The configuration data is read with request_firmware from
> "goodix_<id>_cfg.bin", where <id> is the product id read from the device
> (e.g.: goodix_911_cfg.bin for Goodix GT911, goodix_9271_cfg.bin for
> GT9271).
>
> The configuration information has a specific format described in the Goodix
> datasheet. It includes X/Y resolution, maximum supported touch points,
> interrupt flags, various sesitivity factors and settings for advanced
> features (like gesture recognition).
>
> This is based on Goodix datasheets for GT911 and GT9271 and on Goodix
> driver gt9xx.c for Android (publicly available in Android kernel
> trees for various devices).
I am afraid that just using request_firmware() in probe() is not the
best option as it may cause either errors or delays in
initialization of the driver is compiled into the kernel and tries to
initialize before filesystem with configuration file is mounted (and
firmware is not built into the kernel). We can either try switch to
request_firmware_nowait() or at least document that we need firmware at
boot.
>
> Signed-off-by: Octavian Purdila <octavian.purdila-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
> drivers/input/touchscreen/goodix.c | 128 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 128 insertions(+)
>
> diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
> index c345eb7..1ce9278 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -24,6 +24,7 @@
> #include <linux/interrupt.h>
> #include <linux/slab.h>
> #include <linux/acpi.h>
> +#include <linux/firmware.h>
> #include <linux/gpio.h>
> #include <linux/of.h>
> #include <asm/unaligned.h>
> @@ -95,6 +96,39 @@ static int goodix_i2c_read(struct i2c_client *client,
> return ret < 0 ? ret : (ret != ARRAY_SIZE(msgs) ? -EIO : 0);
> }
>
> +/**
> + * goodix_i2c_write - write data to a register of the i2c slave device.
> + *
> + * @client: i2c device.
> + * @reg: the register to write to.
> + * @buf: raw data buffer to write.
> + * @len: length of the buffer to write
> + */
> +static int goodix_i2c_write(struct i2c_client *client, u16 reg, const u8 *buf,
> + unsigned len)
> +{
> + u8 *addr_buf;
> + struct i2c_msg msg;
> + int ret;
> +
> + addr_buf = kmalloc(len + 2, GFP_KERNEL);
> + if (!addr_buf)
> + return -ENOMEM;
> +
> + addr_buf[0] = reg >> 8;
> + addr_buf[1] = reg & 0xFF;
> + memcpy(&addr_buf[2], buf, len);
> +
> + msg.flags = 0;
> + msg.addr = client->addr;
> + msg.buf = addr_buf;
> + msg.len = len + 2;
> +
> + ret = i2c_transfer(client->adapter, &msg, 1);
> + kfree(addr_buf);
> + return ret < 0 ? ret : (ret != 1 ? -EIO : 0);
> +}
> +
> static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8 *data)
> {
> int touch_num;
> @@ -192,6 +226,95 @@ static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> +/**
> + * goodix_check_cfg - Checks if config buffer is valid
> + *
> + * @ts: goodix_ts_data pointer
> + * @fw: firmware config data
> + */
> +static int goodix_check_cfg(struct goodix_ts_data *ts,
> + const struct firmware *fw)
> +{
> + int i, raw_cfg_len;
> + u8 check_sum = 0;
> +
> + if (fw->size > GOODIX_CONFIG_MAX_LENGTH) {
> + dev_err(&ts->client->dev,
> + "The length of the config buffer array is not correct");
> + return -EINVAL;
> + }
> +
> + raw_cfg_len = fw->size - 2;
> + for (i = 0; i < raw_cfg_len; i++)
> + check_sum += fw->data[i];
> + check_sum = (~check_sum) + 1;
> + if (check_sum != fw->data[raw_cfg_len]) {
> + dev_err(&ts->client->dev,
> + "The checksum of the config buffer array is not correct");
> + return -EINVAL;
> + }
> +
> + if (fw->data[raw_cfg_len + 1] != 1) {
> + dev_err(&ts->client->dev,
> + "The Config_Fresh register needs to be set");
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +/**
> + * goodix_send_cfg - Write device config
> + *
> + * @ts: goodix_ts_data pointer
> + * @id: product id read from device
> + */
> +static int goodix_send_cfg(struct goodix_ts_data *ts, u16 id)
> +{
> + const struct firmware *fw = NULL;
> + char *fw_name;
> + int ret;
> +
> + fw_name = kasprintf(GFP_KERNEL, "goodix_%d_cfg.bin", id);
> + if (!fw_name)
> + return -ENOMEM;
> +
> + ret = request_firmware(&fw, fw_name, &ts->client->dev);
> + if (ret) {
> + dev_err(&ts->client->dev, "Unable to open firmware %s\n",
> + fw_name);
> + goto err_free_fw_name;
That I think will cause driver to abort binding if config is not there.
Do we always need to load the config? Is configuration stored in NVRAM?
Maybe configuration should be only loaded when userspace requests it?
Thanks.
--
Dmitry
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2015-06-09 18:14 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-08 14:37 [PATCH v2 0/8] Goodix touchscreen enhancements Irina Tirdea
2015-06-08 14:37 ` [PATCH v2 2/8] input: goodix: fix variable length array warning Irina Tirdea
2015-06-09 15:35 ` Bastien Nocera
2015-06-08 14:37 ` [PATCH v2 3/8] input: goodix: export id and version read from device Irina Tirdea
2015-06-09 15:36 ` Bastien Nocera
[not found] ` <1433774273-23103-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-06-08 14:37 ` [PATCH v2 1/8] input: goodix: fix alignment issues Irina Tirdea
2015-06-08 14:37 ` [PATCH v2 4/8] input: goodix: reset device at init Irina Tirdea
2015-06-09 15:34 ` Bastien Nocera
2015-06-09 15:53 ` Bastien Nocera
2015-06-23 13:23 ` Tirdea, Irina
2015-06-23 14:12 ` Bastien Nocera
2015-06-23 14:50 ` Octavian Purdila
2015-06-29 16:04 ` Tirdea, Irina
2015-06-09 17:57 ` Dmitry Torokhov
2015-06-23 13:20 ` Tirdea, Irina
2015-06-08 14:37 ` [PATCH v2 6/8] input: goodix: add power management support Irina Tirdea
2015-06-09 18:15 ` Dmitry Torokhov
2015-06-23 13:28 ` Tirdea, Irina
2015-06-08 14:37 ` [PATCH v2 5/8] input: goodix: write configuration data to device Irina Tirdea
[not found] ` <1433774273-23103-6-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-06-09 18:14 ` Dmitry Torokhov [this message]
2015-06-23 13:27 ` Tirdea, Irina
[not found] ` <1F3AC3675D538145B1661F571FE1805F2F06166E-pww93C2UFcwu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-06-23 18:59 ` Dmitry Torokhov
2015-06-29 16:01 ` Tirdea, Irina
2015-06-08 14:37 ` [PATCH v2 7/8] input: goodix: use goodix_i2c_write_u8 instead of i2c_master_send Irina Tirdea
2015-06-08 14:37 ` [PATCH v2 8/8] input: goodix: add support for ESD Irina Tirdea
2015-06-09 18:17 ` [PATCH v2 0/8] Goodix touchscreen enhancements Dmitry Torokhov
2015-06-23 13:18 ` Tirdea, Irina
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=20150609181406.GJ6338@dtor-ws \
--to=dmitry.torokhov-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=galak-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=hadess-0MeiytkfxGOsTnJN9+BGXg@public.gmane.org \
--cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
--cc=irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-input-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
--cc=octavian.purdila-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=pawel.moll-5wv7dgnIgG8@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
/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).