public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Eric Piel <eric.piel@tremplin-utc.net>
Cc: linux-kernel@vger.kernel.org, pavel@suse.cz,
	burman.yan@gmail.com, pau@eslack.org
Subject: Re: [PATCH] LIS3LV02Dx Accelerometer driver (take 4)
Date: Tue, 21 Oct 2008 11:41:21 -0700	[thread overview]
Message-ID: <20081021114121.5144841c.akpm@linux-foundation.org> (raw)
In-Reply-To: <48FA3368.1040605@tremplin-utc.net>

On Sat, 18 Oct 2008 21:05:12 +0200
Eric Piel <eric.piel@tremplin-utc.net> wrote:

>
> ...
>
> LIS3LV02Dx Accelerometer driver
> 
> This adds a driver to the accelerometer sensor found in several HP laptops
> (under the commercial names of "HP Mobile Data Protection System 3D" and
> "HP 3D driveguard"). It tries to have more or less the same interfaces
> as the hdaps and other accelerometer drivers: in sysfs and as a
> joystick. 
> 
> This driver was first written by Yan Burman. Eric Piel has updated it
> and slimed it up (including the removal of an interface to access to the
> free-fall feature of the sensor because it is not reliable enough for
> now).  Several people have contributed to the database of the axes.
>
> ...
>
> +struct acpi_lis3lv02d {
> +	struct acpi_device	*device;   /* The ACPI device */
> +	struct input_dev	*idev;     /* input device */
> +	struct task_struct	*kthread;  /* kthread for input */
> +	struct timer_list	poff_timer; /* for automatic power off */
> +	struct semaphore	poff_sem;  /* lock to handle on/off timer */

OK, this can't be a mutex because it's upped from a timer handler
(which seems a bit odd, but I assume you know what you're doing ;))

> +	struct platform_device	*pdev;     /* platform device */
> +	atomic_t		count;     /* interrupt count after last read */
> +	int			xcalib;    /* calibrated null value for x */
> +	int			ycalib;    /* calibrated null value for y */
> +	int			zcalib;    /* calibrated null value for z */
> +	unsigned char		is_on;     /* whether the device is on or off */
> +	unsigned char		usage;     /* usage counter */
> +	struct axis_conversion	ac;        /* hw -> logical axis */
> +};
> +
> +static struct acpi_lis3lv02d adev = {
> +	.poff_sem   = __SEMAPHORE_INITIALIZER(adev.poff_sem, 1),
> +	.usage       = 0,

the .foo=0 isn't strictly needed.  It can be retained if you believe it
has documentary value.

> +};
> +
> +static int lis3lv02d_remove_fs(void);
> +static int lis3lv02d_add_fs(struct acpi_device *device);
> +
> +/* For automatic insertion of the module */
> +static struct acpi_device_id lis3lv02d_device_ids[] = {
> +	{"HPQ0004", 0}, /* HP Mobile Data Protection System PNP */
> +	{"", 0},
> +};
> +MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids);
> +
> +/**
> + * acpi_init() - ACPI _INI method: initialize the device.

Should be "lis3lv02d_acpi_init"

> + * @handle: the handle of the device
> + *
> + * Returns AE_OK on success.
> + */
> +static inline acpi_status lis3lv02d_acpi_init(acpi_handle handle)
> +{
> +	return acpi_evaluate_object(handle, METHOD_NAME__INI, NULL, NULL);
> +}
> +
> +/**
> + * lis3lv02d_acpi_read() - ACPI ALRD method: read a register

All the kerneldoc comments include the () after the function name. 
That is unconventional and I do not know what effect it will have upon
kerneldoc processing and output.

> + * @handle: the handle of the device
> + * @reg:    the register to read
> + * @ret:    result of the operation
> + *
> + * Returns AE_OK on success.
> + */
> +static acpi_status lis3lv02d_acpi_read(acpi_handle handle, int reg, u8 *ret)
> +{
> +	union acpi_object arg0 = { ACPI_TYPE_INTEGER };
> +	struct acpi_object_list args = { 1, &arg0 };
> +	unsigned long lret;
> +	acpi_status status;
> +
> +	arg0.integer.value = reg;
> +
> +	status = acpi_evaluate_integer(handle, "ALRD", &args, &lret);
> +	*ret = lret;
> +	return status;
> +}
> +
>
> ...
>
> +static int lis3lv02d_resume(struct acpi_device *device)
> +{
> +	/* put back the device in the right state (ACPI might turn it on) */
> +	down(&adev.poff_sem);
> +	if (adev.usage > 0)
> +		lis3lv02d_poweron(device->handle);
> +	else
> +		lis3lv02d_poweroff(device->handle);
> +	up(&adev.poff_sem);
> +	return 0;
> +}

This function is unused if CONFIG_PM=n.

Please move this inside the ifdef then add

#else
#define lis3lv02d_suspend NULL
#define lis3lv02d_resume NULL
#endif

and remove the ifdefs in the lis3lv02d_driver definition.  Standard
stuff.


>
> ...
>
> +static void lis3lv02d_poweroff_timeout(unsigned long data)
> +{
> +	struct acpi_lis3lv02d *dev = (void *)data;
> +
> +	up(&dev->poff_sem);
> +	lis3lv02d_poweroff(dev->device->handle);
> +	down(&dev->poff_sem);

eek, no, we cannot down a semaphore from a timer handler!  It will lead
to might_sleep() warnings, scheduling-in-atomic warnings and kernel
deadlocks.

> +}
> +
>
> ...
>
> +static int lis3lv02d_remove(struct acpi_device *device, int type)
> +{
> +	if (!device)
> +		return -EINVAL;
> +
> +	lis3lv02d_joystick_disable();
> +	del_timer(&adev.poff_timer);

Should this be del_timer_sync()?

Bear in mind that the timer handler might be running on another CPU
after del_timer() returns...

> +	lis3lv02d_poweroff(device->handle);
> +
> +	return lis3lv02d_remove_fs();

so the above things can occur in parallel with the execution of the
timer handler.

>
> ...
>


  parent reply	other threads:[~2008-10-21 18:42 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-18 19:05 [PATCH] LIS3LV02Dx Accelerometer driver (take 4) Eric Piel
2008-10-19 16:34 ` Jonathan Cameron
2008-10-19 23:07   ` Eric Piel
2008-10-20 13:32     ` Jonathan Cameron
2008-10-21  8:38 ` Pavel Machek
2008-10-21 18:42   ` Andrew Morton
2008-10-22 10:27     ` Pavel Machek
2008-10-22 11:34       ` Eric Piel
2008-10-22 11:58         ` Pavel Machek
2008-10-21 18:41 ` Andrew Morton [this message]
2008-10-21 18:53   ` Randy Dunlap
2008-10-21 20:48     ` Eric Piel
2008-10-21 22:13   ` Eric Piel
2008-10-21 22:21     ` Andrew Morton
2008-10-22 15:20 ` Pavel Machek
2008-10-22 18:51   ` Len Brown
2008-10-23  8:11     ` Eric Piel
2008-10-23  8:24       ` Pavel Machek

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=20081021114121.5144841c.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=burman.yan@gmail.com \
    --cc=eric.piel@tremplin-utc.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pau@eslack.org \
    --cc=pavel@suse.cz \
    /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