linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Joonyoung Shim <jy0922.shim@samsung.com>
To: Henrik Rydberg <rydberg@bitmath.se>
Cc: linux-input@vger.kernel.org, dmitry.torokhov@gmail.com,
	kyungmin.park@samsung.com
Subject: Re: [PATCH v4] input: Add MELFAS mms114 touchscreen driver
Date: Thu, 24 May 2012 10:32:04 +0900	[thread overview]
Message-ID: <4FBD8F94.70605@samsung.com> (raw)
In-Reply-To: <20120523115203.GA2506@polaris.bitmath.org>

Hi Henrik,

On 05/23/2012 08:52 PM, Henrik Rydberg wrote:
> Hi Joonyoung,
>
>> This is a initial driver for new touchscreen chip mms114 of MELFAS.
>> It uses I2C interface and supports 10 multi touch.
>>
>> Signed-off-by: Joonyoung Shim<jy0922.shim@samsung.com>
>> Signed-off-by: Kyungmin Park<kyungmin.park@samsung.com>
>> ---
> Look good overall, some minor comments below which may be
> ignored. Thank you,
>
>      Reviewed-by: Henrik Rydberg<rydberg@euromail.se>

I will update some codes with your comments. Thanks for review.

> Henrik
>
>> +static void mms114_proc_mt(struct mms114_data *data, u8 *buf)
>> +{
>> +	const struct mms114_platform_data *pdata = data->pdata;
>> +	struct i2c_client *client = data->client;
>> +	struct input_dev *input_dev = data->input_dev;
>> +	unsigned int id;
>> +	unsigned int type;
>> +	unsigned int pressed;
>> +	unsigned int x;
>> +	unsigned int y;
>> +	unsigned int width;
>> +	unsigned int strength;
>> +
>> +	id = (buf[0]&  MMS114_ID_MASK) - 1;
>> +	if (id>= MMS114_MAX_TOUCH) {
>> +		dev_dbg(&client->dev, "Wrong touch id (%d)\n", id);
>> +		return;
>> +	}
>> +
>> +	type = (buf[0]>>  MMS114_TYPE_OFFSET)&  MMS114_TYPE_MASK;
>> +	if (type != MMS114_TYPE_TOUCHSCREEN) {
>> +		dev_dbg(&client->dev, "Wrong touch type (%d)\n", type);
>> +		return;
>> +	}
>> +
>> +	x = buf[2] | (buf[1]&  0xf)<<  8;
>> +	y = buf[3] | ((buf[1]>>  4)&  0xf)<<  8;
>> +	if (x>  pdata->x_size || y>  pdata->y_size) {
>> +		dev_dbg(&client->dev, "Wrong touch coordinates (%d, %d)\n",
>> +				x, y);
>> +		return;
>> +	}
>> +
>> +	if (pdata->x_invert)
>> +		x = pdata->x_size - x;
>> +	if (pdata->y_invert)
>> +		y = pdata->y_size - y;
>> +
>> +	pressed = (buf[0]>>  MMS114_ACT_OFFSET)&  MMS114_ACT_MASK;
>> +	width = buf[4];
>> +	strength = buf[5];
> Why not pass a struct like this instead:
>
> struct mms114_touch {
>         u8 id : 4, type : 3, pressed : 1;
>         u8 x_hi : 4, y_hi : 4;
>         u8 x_lo;
>         u8 y_lo;
>         u8 width;
>         u8 strength;
> } __packed;
>
> Most of the code above would go away, together with some defines.

Yes, good idea.

>> +
>> +	dev_dbg(&client->dev, "id: %d, type: %d, pressed: %d\n",
>> +			id, type, pressed);
>> +	dev_dbg(&client->dev, "x: %d, y: %d, width: %d, strength: %d\n",
>> +			x, y, width, strength);
>> +
>> +	input_mt_slot(input_dev, id);
>> +	input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, pressed);
>> +
>> +	if (pressed) {
>> +		input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, width);
>> +		input_report_abs(input_dev, ABS_MT_POSITION_X, x);
>> +		input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
>> +		input_report_abs(input_dev, ABS_MT_PRESSURE, strength);
>> +	}
>> +}
>> +static int mms114_start(struct mms114_data *data)
>> +{
>> +	int error;
>> +
>> +	mutex_lock(&data->mutex);
>> +	if (!data->enabled) {
>> +		if (data->core_reg)
>> +			regulator_enable(data->core_reg);
>> +		if (data->io_reg)
>> +			regulator_enable(data->io_reg);
>> +		mdelay(MMS114_POWERON_DELAY);
>> +
>> +		error = mms114_setup_regs(data);
>> +		if (error<  0) {
>> +			mutex_unlock(&data->mutex);
>> +			return error;
>> +		}
>> +
>> +		data->enabled = true;
>> +	}
>> +	mutex_unlock(&data->mutex);
>> +	return 0;
>> +}
> A more canonical formulation of the above function would be:
>
>    int error = 0;
>
>    mutex_lock(&data->mutex);
>    if (data->enabled)
>            goto out;
>
>    if (data->core_reg)
>            regulator_enable(data->core_reg);
>    if (data->io_reg)
>            regulator_enable(data->io_reg);
>    mdelay(MMS114_POWERON_DELAY);
>
>    error = mms114_setup_regs(data);
>    if (error)
>            goto out;
>
>    data->enabled = true;
> out:
>    mutex_unlock(&data->mutex);
>    return error;
>

I don't want to return the variable of "error" name on error == 0 case,
just return 0, but i can use goto statement.

>> +static void mms114_stop(struct mms114_data *data)
>> +{
>> +	mutex_lock(&data->mutex);
>> +	if (data->enabled) {
>> +		if (data->io_reg)
>> +			regulator_disable(data->io_reg);
>> +		if (data->core_reg)
>> +			regulator_disable(data->core_reg);
>> +
>> +		data->enabled = false;
>> +	}
>> +	mutex_unlock(&data->mutex);
>> +}
> Ditto.
>
>> +static int mms114_suspend(struct device *dev)
>> +{
>> +	struct i2c_client *client = to_i2c_client(dev);
>> +	struct mms114_data *data = i2c_get_clientdata(client);
>> +	struct input_dev *input_dev = data->input_dev;
>> +	int id;
>> +
>> +	disable_irq(client->irq);
>> +
>> +	/* Release all touch */
>> +	for (id = 0; id<  MMS114_MAX_TOUCH; id++) {
>> +		input_mt_slot(input_dev, id);
>> +		input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false);
>> +	}
>> +
>> +	input_mt_report_pointer_emulation(input_dev, true);
>> +	input_sync(input_dev);
>> +
>> +	mutex_lock(&input_dev->mutex);
>> +	if (input_dev->users)
>> +		mms114_stop(data);
> It should really stop unconditionally here, but the above ought to
> yield the same result.

Right.

>> +	mutex_unlock(&input_dev->mutex);
>> +
>> +	if (data->pdata->cfg_pin)
>> +		data->pdata->cfg_pin(false);
>> +
>> +	return 0;
>> +}
>> +static int mms114_resume(struct device *dev)
>> +{
>> +	struct i2c_client *client = to_i2c_client(dev);
>> +	struct mms114_data *data = i2c_get_clientdata(client);
>> +	struct input_dev *input_dev = data->input_dev;
>> +	int error;
>> +
>> +	if (data->pdata->cfg_pin)
>> +		data->pdata->cfg_pin(true);
>> +
>> +	mutex_lock(&input_dev->mutex);
>> +	if (input_dev->users) {
>> +		error = mms114_start(data);
>> +		if (error<  0) {
>> +			mutex_unlock(&input_dev->mutex);
>> +			return error;
>> +		}
>> +	}
>> +	mutex_unlock(&input_dev->mutex);
>> +
>> +	enable_irq(client->irq);
>> +	return 0;
>> +}
> Could use more gotos here as well.
>
> Thanks,
> Henrik
> --
> To unsubscribe from this list: send the line "unsubscribe linux-input" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

      reply	other threads:[~2012-05-24  1:32 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-18  7:18 [PATCH v4] input: Add MELFAS mms114 touchscreen driver Joonyoung Shim
2012-05-23 11:52 ` Henrik Rydberg
2012-05-24  1:32   ` Joonyoung Shim [this message]

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=4FBD8F94.70605@samsung.com \
    --to=jy0922.shim@samsung.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=kyungmin.park@samsung.com \
    --cc=linux-input@vger.kernel.org \
    --cc=rydberg@bitmath.se \
    /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).