lis3lv02d.c 26.1 KB
Newer Older
P
Pavel Machek 已提交
1 2 3 4 5
/*
 *  lis3lv02d.c - ST LIS3LV02DL accelerometer driver
 *
 *  Copyright (C) 2007-2008 Yan Burman
 *  Copyright (C) 2008 Eric Piel
6
 *  Copyright (C) 2008-2009 Pavel Machek
P
Pavel Machek 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

23 24
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

P
Pavel Machek 已提交
25 26 27 28 29 30 31
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/dmi.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
E
Eric Piel 已提交
32
#include <linux/input-polldev.h>
P
Pavel Machek 已提交
33 34 35
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/poll.h>
S
Samu Onkalo 已提交
36
#include <linux/slab.h>
P
Pavel Machek 已提交
37 38
#include <linux/freezer.h>
#include <linux/uaccess.h>
39
#include <linux/miscdevice.h>
S
Samu Onkalo 已提交
40
#include <linux/pm_runtime.h>
41
#include <linux/atomic.h>
P
Pavel Machek 已提交
42 43 44 45 46 47
#include "lis3lv02d.h"

#define DRIVER_NAME     "lis3lv02d"

/* joystick device poll interval in milliseconds */
#define MDPS_POLL_INTERVAL 50
S
Samu Onkalo 已提交
48 49
#define MDPS_POLL_MIN	   0
#define MDPS_POLL_MAX	   2000
S
Samu Onkalo 已提交
50 51 52

#define LIS3_SYSFS_POWERDOWN_DELAY 5000 /* In milliseconds */

53 54 55 56 57 58 59
#define SELFTEST_OK	       0
#define SELFTEST_FAIL	       -1
#define SELFTEST_IRQ	       -2

#define IRQ_LINE0	       0
#define IRQ_LINE1	       1

P
Pavel Machek 已提交
60 61
/*
 * The sensor can also generate interrupts (DRDY) but it's pretty pointless
62
 * because they are generated even if the data do not change. So it's better
P
Pavel Machek 已提交
63 64 65 66 67 68
 * to keep the interrupt for the free-fall event. The values are updated at
 * 40Hz (at the lowest frequency), but as it can be pretty time consuming on
 * some low processor, we poll the sensor only at 20Hz... enough for the
 * joystick.
 */

S
Samu Onkalo 已提交
69 70 71
#define LIS3_PWRON_DELAY_WAI_12B	(5000)
#define LIS3_PWRON_DELAY_WAI_8B		(3000)

S
Samu Onkalo 已提交
72 73 74 75 76 77 78 79 80 81 82
/*
 * LIS3LV02D spec says 1024 LSBs corresponds 1 G -> 1LSB is 1000/1024 mG
 * LIS302D spec says: 18 mG / digit
 * LIS3_ACCURACY is used to increase accuracy of the intermediate
 * calculation results.
 */
#define LIS3_ACCURACY			1024
/* Sensitivity values for -2G +2G scale */
#define LIS3_SENSITIVITY_12B		((LIS3_ACCURACY * 1000) / 1024)
#define LIS3_SENSITIVITY_8B		(18 * LIS3_ACCURACY)

83 84 85 86
#define LIS3_DEFAULT_FUZZ_12B		3
#define LIS3_DEFAULT_FLAT_12B		3
#define LIS3_DEFAULT_FUZZ_8B		1
#define LIS3_DEFAULT_FLAT_8B		1
S
Samu Onkalo 已提交
87

88
struct lis3lv02d lis3_dev = {
89
	.misc_wait   = __WAIT_QUEUE_HEAD_INITIALIZER(lis3_dev.misc_wait),
90
};
91
EXPORT_SYMBOL_GPL(lis3_dev);
P
Pavel Machek 已提交
92

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/* just like param_set_int() but does sanity-check so that it won't point
 * over the axis array size
 */
static int param_set_axis(const char *val, const struct kernel_param *kp)
{
	int ret = param_set_int(val, kp);
	if (!ret) {
		int val = *(int *)kp->arg;
		if (val < 0)
			val = -val;
		if (!val || val > 3)
			return -EINVAL;
	}
	return ret;
}

static struct kernel_param_ops param_ops_axis = {
	.set = param_set_axis,
	.get = param_get_int,
};

module_param_array_named(axes, lis3_dev.ac.as_array, axis, NULL, 0644);
MODULE_PARM_DESC(axes, "Axis-mapping for x,y,z directions");

117 118 119 120 121 122 123 124 125
static s16 lis3lv02d_read_8(struct lis3lv02d *lis3, int reg)
{
	s8 lo;
	if (lis3->read(lis3, reg, &lo) < 0)
		return 0;

	return lo;
}

126
static s16 lis3lv02d_read_12(struct lis3lv02d *lis3, int reg)
127 128 129
{
	u8 lo, hi;

130 131
	lis3->read(lis3, reg - 1, &lo);
	lis3->read(lis3, reg, &hi);
132 133 134 135
	/* In "12 bit right justified" mode, bit 6, bit 7, bit 8 = bit 5 */
	return (s16)((hi << 8) | lo);
}

P
Pavel Machek 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
/**
 * lis3lv02d_get_axis - For the given axis, give the value converted
 * @axis:      1,2,3 - can also be negative
 * @hw_values: raw values returned by the hardware
 *
 * Returns the converted value.
 */
static inline int lis3lv02d_get_axis(s8 axis, int hw_values[3])
{
	if (axis > 0)
		return hw_values[axis - 1];
	else
		return -hw_values[-axis - 1];
}

/**
 * lis3lv02d_get_xyz - Get X, Y and Z axis values from the accelerometer
153 154 155 156
 * @lis3: pointer to the device struct
 * @x:    where to store the X axis value
 * @y:    where to store the Y axis value
 * @z:    where to store the Z axis value
P
Pavel Machek 已提交
157 158 159
 *
 * Note that 40Hz input device can eat up about 10% CPU at 800MHZ
 */
160
static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z)
P
Pavel Machek 已提交
161 162
{
	int position[3];
S
Samu Onkalo 已提交
163
	int i;
P
Pavel Machek 已提交
164

165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
	if (lis3->blkread) {
		if (lis3_dev.whoami == WAI_12B) {
			u16 data[3];
			lis3->blkread(lis3, OUTX_L, 6, (u8 *)data);
			for (i = 0; i < 3; i++)
				position[i] = (s16)le16_to_cpu(data[i]);
		} else {
			u8 data[5];
			/* Data: x, dummy, y, dummy, z */
			lis3->blkread(lis3, OUTX, 5, data);
			for (i = 0; i < 3; i++)
				position[i] = (s8)data[i * 2];
		}
	} else {
		position[0] = lis3->read_data(lis3, OUTX);
		position[1] = lis3->read_data(lis3, OUTY);
		position[2] = lis3->read_data(lis3, OUTZ);
	}
P
Pavel Machek 已提交
183

S
Samu Onkalo 已提交
184 185 186
	for (i = 0; i < 3; i++)
		position[i] = (position[i] * lis3->scale) / LIS3_ACCURACY;

187 188 189
	*x = lis3lv02d_get_axis(lis3->ac.x, position);
	*y = lis3lv02d_get_axis(lis3->ac.y, position);
	*z = lis3lv02d_get_axis(lis3->ac.z, position);
P
Pavel Machek 已提交
190 191
}

S
Samu Onkalo 已提交
192 193 194
/* conversion btw sampling rate and the register values */
static int lis3_12_rates[4] = {40, 160, 640, 2560};
static int lis3_8_rates[2] = {100, 400};
195
static int lis3_3dc_rates[16] = {0, 1, 10, 25, 50, 100, 200, 400, 1600, 5000};
S
Samu Onkalo 已提交
196

197
/* ODR is Output Data Rate */
S
Samu Onkalo 已提交
198 199 200
static int lis3lv02d_get_odr(void)
{
	u8 ctrl;
201
	int shift;
S
Samu Onkalo 已提交
202 203

	lis3_dev.read(&lis3_dev, CTRL_REG1, &ctrl);
204 205 206 207
	ctrl &= lis3_dev.odr_mask;
	shift = ffs(lis3_dev.odr_mask) - 1;
	return lis3_dev.odrs[(ctrl >> shift)];
}
S
Samu Onkalo 已提交
208

209 210 211 212 213
static int lis3lv02d_set_odr(int rate)
{
	u8 ctrl;
	int i, len, shift;

214 215 216
	if (!rate)
		return -EINVAL;

217 218 219 220 221 222 223 224 225 226 227 228
	lis3_dev.read(&lis3_dev, CTRL_REG1, &ctrl);
	ctrl &= ~lis3_dev.odr_mask;
	len = 1 << hweight_long(lis3_dev.odr_mask); /* # of possible values */
	shift = ffs(lis3_dev.odr_mask) - 1;

	for (i = 0; i < len; i++)
		if (lis3_dev.odrs[i] == rate) {
			lis3_dev.write(&lis3_dev, CTRL_REG1,
					ctrl | (i << shift));
			return 0;
		}
	return -EINVAL;
S
Samu Onkalo 已提交
229 230
}

S
Samu Onkalo 已提交
231 232
static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
{
233
	u8 ctlreg, reg;
S
Samu Onkalo 已提交
234 235 236
	s16 x, y, z;
	u8 selftest;
	int ret;
237 238
	u8 ctrl_reg_data;
	unsigned char irq_cfg;
S
Samu Onkalo 已提交
239 240

	mutex_lock(&lis3->mutex);
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

	irq_cfg = lis3->irq_cfg;
	if (lis3_dev.whoami == WAI_8B) {
		lis3->data_ready_count[IRQ_LINE0] = 0;
		lis3->data_ready_count[IRQ_LINE1] = 0;

		/* Change interrupt cfg to data ready for selftest */
		atomic_inc(&lis3_dev.wake_thread);
		lis3->irq_cfg = LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY;
		lis3->read(lis3, CTRL_REG3, &ctrl_reg_data);
		lis3->write(lis3, CTRL_REG3, (ctrl_reg_data &
				~(LIS3_IRQ1_MASK | LIS3_IRQ2_MASK)) |
				(LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY));
	}

256 257 258 259 260 261 262 263 264 265
	if (lis3_dev.whoami == WAI_3DC) {
		ctlreg = CTRL_REG4;
		selftest = CTRL4_ST0;
	} else {
		ctlreg = CTRL_REG1;
		if (lis3_dev.whoami == WAI_12B)
			selftest = CTRL1_ST;
		else
			selftest = CTRL1_STP;
	}
S
Samu Onkalo 已提交
266

267 268
	lis3->read(lis3, ctlreg, &reg);
	lis3->write(lis3, ctlreg, (reg | selftest));
S
Samu Onkalo 已提交
269 270 271 272 273 274 275 276
	msleep(lis3->pwron_delay / lis3lv02d_get_odr());

	/* Read directly to avoid axis remap */
	x = lis3->read_data(lis3, OUTX);
	y = lis3->read_data(lis3, OUTY);
	z = lis3->read_data(lis3, OUTZ);

	/* back to normal settings */
277
	lis3->write(lis3, ctlreg, reg);
S
Samu Onkalo 已提交
278 279 280 281 282 283 284
	msleep(lis3->pwron_delay / lis3lv02d_get_odr());

	results[0] = x - lis3->read_data(lis3, OUTX);
	results[1] = y - lis3->read_data(lis3, OUTY);
	results[2] = z - lis3->read_data(lis3, OUTZ);

	ret = 0;
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304

	if (lis3_dev.whoami == WAI_8B) {
		/* Restore original interrupt configuration */
		atomic_dec(&lis3_dev.wake_thread);
		lis3->write(lis3, CTRL_REG3, ctrl_reg_data);
		lis3->irq_cfg = irq_cfg;

		if ((irq_cfg & LIS3_IRQ1_MASK) &&
			lis3->data_ready_count[IRQ_LINE0] < 2) {
			ret = SELFTEST_IRQ;
			goto fail;
		}

		if ((irq_cfg & LIS3_IRQ2_MASK) &&
			lis3->data_ready_count[IRQ_LINE1] < 2) {
			ret = SELFTEST_IRQ;
			goto fail;
		}
	}

S
Samu Onkalo 已提交
305 306 307 308 309 310
	if (lis3->pdata) {
		int i;
		for (i = 0; i < 3; i++) {
			/* Check against selftest acceptance limits */
			if ((results[i] < lis3->pdata->st_min_limits[i]) ||
			    (results[i] > lis3->pdata->st_max_limits[i])) {
311
				ret = SELFTEST_FAIL;
S
Samu Onkalo 已提交
312 313 314 315 316 317 318 319 320 321 322
				goto fail;
			}
		}
	}

	/* test passed */
fail:
	mutex_unlock(&lis3->mutex);
	return ret;
}

S
Samu Onkalo 已提交
323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
/*
 * Order of registers in the list affects to order of the restore process.
 * Perhaps it is a good idea to set interrupt enable register as a last one
 * after all other configurations
 */
static u8 lis3_wai8_regs[] = { FF_WU_CFG_1, FF_WU_THS_1, FF_WU_DURATION_1,
			       FF_WU_CFG_2, FF_WU_THS_2, FF_WU_DURATION_2,
			       CLICK_CFG, CLICK_SRC, CLICK_THSY_X, CLICK_THSZ,
			       CLICK_TIMELIMIT, CLICK_LATENCY, CLICK_WINDOW,
			       CTRL_REG1, CTRL_REG2, CTRL_REG3};

static u8 lis3_wai12_regs[] = {FF_WU_CFG, FF_WU_THS_L, FF_WU_THS_H,
			       FF_WU_DURATION, DD_CFG, DD_THSI_L, DD_THSI_H,
			       DD_THSE_L, DD_THSE_H,
			       CTRL_REG1, CTRL_REG3, CTRL_REG2};

static inline void lis3_context_save(struct lis3lv02d *lis3)
{
	int i;
	for (i = 0; i < lis3->regs_size; i++)
		lis3->read(lis3, lis3->regs[i], &lis3->reg_cache[i]);
	lis3->regs_stored = true;
}

static inline void lis3_context_restore(struct lis3lv02d *lis3)
{
	int i;
	if (lis3->regs_stored)
		for (i = 0; i < lis3->regs_size; i++)
			lis3->write(lis3, lis3->regs[i], lis3->reg_cache[i]);
}

355
void lis3lv02d_poweroff(struct lis3lv02d *lis3)
P
Pavel Machek 已提交
356
{
S
Samu Onkalo 已提交
357 358
	if (lis3->reg_ctrl)
		lis3_context_save(lis3);
359 360
	/* disable X,Y,Z axis and power down */
	lis3->write(lis3, CTRL_REG1, 0x00);
S
Samu Onkalo 已提交
361 362
	if (lis3->reg_ctrl)
		lis3->reg_ctrl(lis3, LIS3_REG_OFF);
P
Pavel Machek 已提交
363
}
364
EXPORT_SYMBOL_GPL(lis3lv02d_poweroff);
P
Pavel Machek 已提交
365

366
void lis3lv02d_poweron(struct lis3lv02d *lis3)
P
Pavel Machek 已提交
367
{
368
	u8 reg;
P
Pavel Machek 已提交
369

370
	lis3->init(lis3);
P
Pavel Machek 已提交
371

372 373
	/*
	 * Common configuration
É
Éric Piel 已提交
374 375
	 * BDU: (12 bits sensors only) LSB and MSB values are not updated until
	 *      both have been read. So the value read will always be correct.
S
Samu Onkalo 已提交
376
	 * Set BOOT bit to refresh factory tuning values.
377
	 */
S
Samu Onkalo 已提交
378 379 380 381 382 383 384 385 386 387
	lis3->read(lis3, CTRL_REG2, &reg);
	if (lis3->whoami ==  WAI_12B)
		reg |= CTRL2_BDU | CTRL2_BOOT;
	else
		reg |= CTRL2_BOOT_8B;
	lis3->write(lis3, CTRL_REG2, reg);

	/* LIS3 power on delay is quite long */
	msleep(lis3->pwron_delay / lis3lv02d_get_odr());

S
Samu Onkalo 已提交
388 389
	if (lis3->reg_ctrl)
		lis3_context_restore(lis3);
P
Pavel Machek 已提交
390
}
391 392
EXPORT_SYMBOL_GPL(lis3lv02d_poweron);

P
Pavel Machek 已提交
393

394 395 396 397 398 399 400 401 402 403 404 405 406
static void lis3lv02d_joystick_poll(struct input_polled_dev *pidev)
{
	int x, y, z;

	mutex_lock(&lis3_dev.mutex);
	lis3lv02d_get_xyz(&lis3_dev, &x, &y, &z);
	input_report_abs(pidev->input, ABS_X, x);
	input_report_abs(pidev->input, ABS_Y, y);
	input_report_abs(pidev->input, ABS_Z, z);
	input_sync(pidev->input);
	mutex_unlock(&lis3_dev.mutex);
}

S
Samu Onkalo 已提交
407 408 409 410
static void lis3lv02d_joystick_open(struct input_polled_dev *pidev)
{
	if (lis3_dev.pm_dev)
		pm_runtime_get_sync(lis3_dev.pm_dev);
411 412 413

	if (lis3_dev.pdata && lis3_dev.whoami == WAI_8B && lis3_dev.idev)
		atomic_set(&lis3_dev.wake_thread, 1);
414 415 416 417 418
	/*
	 * Update coordinates for the case where poll interval is 0 and
	 * the chip in running purely under interrupt control
	 */
	lis3lv02d_joystick_poll(pidev);
S
Samu Onkalo 已提交
419 420 421 422
}

static void lis3lv02d_joystick_close(struct input_polled_dev *pidev)
{
423
	atomic_set(&lis3_dev.wake_thread, 0);
S
Samu Onkalo 已提交
424 425 426 427
	if (lis3_dev.pm_dev)
		pm_runtime_put(lis3_dev.pm_dev);
}

428 429
static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
{
430 431 432
	if (!test_bit(0, &lis3_dev.misc_opened))
		goto out;

433 434 435 436 437
	/*
	 * Be careful: on some HP laptops the bios force DD when on battery and
	 * the lid is closed. This leads to interrupts as soon as a little move
	 * is done.
	 */
438
	atomic_inc(&lis3_dev.count);
439

440 441
	wake_up_interruptible(&lis3_dev.misc_wait);
	kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN);
442
out:
443
	if (atomic_read(&lis3_dev.wake_thread))
444
		return IRQ_WAKE_THREAD;
445 446 447
	return IRQ_HANDLED;
}

448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
{
	struct input_dev *dev = lis3->idev->input;
	u8 click_src;

	mutex_lock(&lis3->mutex);
	lis3->read(lis3, CLICK_SRC, &click_src);

	if (click_src & CLICK_SINGLE_X) {
		input_report_key(dev, lis3->mapped_btns[0], 1);
		input_report_key(dev, lis3->mapped_btns[0], 0);
	}

	if (click_src & CLICK_SINGLE_Y) {
		input_report_key(dev, lis3->mapped_btns[1], 1);
		input_report_key(dev, lis3->mapped_btns[1], 0);
	}

	if (click_src & CLICK_SINGLE_Z) {
		input_report_key(dev, lis3->mapped_btns[2], 1);
		input_report_key(dev, lis3->mapped_btns[2], 0);
	}
	input_sync(dev);
	mutex_unlock(&lis3->mutex);
}

474
static inline void lis302dl_data_ready(struct lis3lv02d *lis3, int index)
475
{
476 477 478 479 480 481
	int dummy;

	/* Dummy read to ack interrupt */
	lis3lv02d_get_xyz(lis3, &dummy, &dummy, &dummy);
	lis3->data_ready_count[index]++;
}
482

483 484
static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
{
485
	struct lis3lv02d *lis3 = data;
486
	u8 irq_cfg = lis3->irq_cfg & LIS3_IRQ1_MASK;
487

488
	if (irq_cfg == LIS3_IRQ1_CLICK)
489
		lis302dl_interrupt_handle_click(lis3);
490 491
	else if (unlikely(irq_cfg == LIS3_IRQ1_DATA_READY))
		lis302dl_data_ready(lis3, IRQ_LINE0);
492
	else
493
		lis3lv02d_joystick_poll(lis3->idev);
494

495 496
	return IRQ_HANDLED;
}
497

498 499
static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data)
{
500
	struct lis3lv02d *lis3 = data;
501
	u8 irq_cfg = lis3->irq_cfg & LIS3_IRQ2_MASK;
502

503
	if (irq_cfg == LIS3_IRQ2_CLICK)
504
		lis302dl_interrupt_handle_click(lis3);
505 506
	else if (unlikely(irq_cfg == LIS3_IRQ2_DATA_READY))
		lis302dl_data_ready(lis3, IRQ_LINE1);
507
	else
508
		lis3lv02d_joystick_poll(lis3->idev);
509

510 511 512 513 514
	return IRQ_HANDLED;
}

static int lis3lv02d_misc_open(struct inode *inode, struct file *file)
{
515
	if (test_and_set_bit(0, &lis3_dev.misc_opened))
516 517
		return -EBUSY; /* already open */

S
Samu Onkalo 已提交
518 519 520
	if (lis3_dev.pm_dev)
		pm_runtime_get_sync(lis3_dev.pm_dev);

521
	atomic_set(&lis3_dev.count, 0);
522 523 524 525 526
	return 0;
}

static int lis3lv02d_misc_release(struct inode *inode, struct file *file)
{
527 528
	fasync_helper(-1, file, 0, &lis3_dev.async_queue);
	clear_bit(0, &lis3_dev.misc_opened); /* release the device */
S
Samu Onkalo 已提交
529 530
	if (lis3_dev.pm_dev)
		pm_runtime_put(lis3_dev.pm_dev);
531 532 533 534 535 536 537 538 539 540 541 542 543 544
	return 0;
}

static ssize_t lis3lv02d_misc_read(struct file *file, char __user *buf,
				size_t count, loff_t *pos)
{
	DECLARE_WAITQUEUE(wait, current);
	u32 data;
	unsigned char byte_data;
	ssize_t retval = 1;

	if (count < 1)
		return -EINVAL;

545
	add_wait_queue(&lis3_dev.misc_wait, &wait);
546 547
	while (true) {
		set_current_state(TASK_INTERRUPTIBLE);
548
		data = atomic_xchg(&lis3_dev.count, 0);
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
		if (data)
			break;

		if (file->f_flags & O_NONBLOCK) {
			retval = -EAGAIN;
			goto out;
		}

		if (signal_pending(current)) {
			retval = -ERESTARTSYS;
			goto out;
		}

		schedule();
	}

	if (data < 255)
		byte_data = data;
	else
		byte_data = 255;

	/* make sure we are not going into copy_to_user() with
	 * TASK_INTERRUPTIBLE state */
	set_current_state(TASK_RUNNING);
	if (copy_to_user(buf, &byte_data, sizeof(byte_data)))
		retval = -EFAULT;

out:
	__set_current_state(TASK_RUNNING);
578
	remove_wait_queue(&lis3_dev.misc_wait, &wait);
579 580 581 582 583 584

	return retval;
}

static unsigned int lis3lv02d_misc_poll(struct file *file, poll_table *wait)
{
585 586
	poll_wait(file, &lis3_dev.misc_wait, wait);
	if (atomic_read(&lis3_dev.count))
587 588 589 590 591 592
		return POLLIN | POLLRDNORM;
	return 0;
}

static int lis3lv02d_misc_fasync(int fd, struct file *file, int on)
{
593
	return fasync_helper(fd, file, on, &lis3_dev.async_queue);
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
}

static const struct file_operations lis3lv02d_misc_fops = {
	.owner   = THIS_MODULE,
	.llseek  = no_llseek,
	.read    = lis3lv02d_misc_read,
	.open    = lis3lv02d_misc_open,
	.release = lis3lv02d_misc_release,
	.poll    = lis3lv02d_misc_poll,
	.fasync  = lis3lv02d_misc_fasync,
};

static struct miscdevice lis3lv02d_misc_device = {
	.minor   = MISC_DYNAMIC_MINOR,
	.name    = "freefall",
	.fops    = &lis3lv02d_misc_fops,
};

612
int lis3lv02d_joystick_enable(void)
P
Pavel Machek 已提交
613
{
E
Eric Piel 已提交
614
	struct input_dev *input_dev;
P
Pavel Machek 已提交
615
	int err;
S
Samu Onkalo 已提交
616
	int max_val, fuzz, flat;
617
	int btns[] = {BTN_X, BTN_Y, BTN_Z};
P
Pavel Machek 已提交
618

619
	if (lis3_dev.idev)
P
Pavel Machek 已提交
620 621
		return -EINVAL;

E
Eric Piel 已提交
622
	lis3_dev.idev = input_allocate_polled_device();
623
	if (!lis3_dev.idev)
P
Pavel Machek 已提交
624 625
		return -ENOMEM;

E
Eric Piel 已提交
626
	lis3_dev.idev->poll = lis3lv02d_joystick_poll;
S
Samu Onkalo 已提交
627 628
	lis3_dev.idev->open = lis3lv02d_joystick_open;
	lis3_dev.idev->close = lis3lv02d_joystick_close;
E
Eric Piel 已提交
629
	lis3_dev.idev->poll_interval = MDPS_POLL_INTERVAL;
S
Samu Onkalo 已提交
630 631
	lis3_dev.idev->poll_interval_min = MDPS_POLL_MIN;
	lis3_dev.idev->poll_interval_max = MDPS_POLL_MAX;
E
Eric Piel 已提交
632 633 634 635 636 637 638
	input_dev = lis3_dev.idev->input;

	input_dev->name       = "ST LIS3LV02DL Accelerometer";
	input_dev->phys       = DRIVER_NAME "/input0";
	input_dev->id.bustype = BUS_HOST;
	input_dev->id.vendor  = 0;
	input_dev->dev.parent = &lis3_dev.pdev->dev;
P
Pavel Machek 已提交
639

E
Eric Piel 已提交
640
	set_bit(EV_ABS, input_dev->evbit);
S
Samu Onkalo 已提交
641
	max_val = (lis3_dev.mdps_max_val * lis3_dev.scale) / LIS3_ACCURACY;
642 643 644 645 646 647 648 649 650 651
	if (lis3_dev.whoami == WAI_12B) {
		fuzz = LIS3_DEFAULT_FUZZ_12B;
		flat = LIS3_DEFAULT_FLAT_12B;
	} else {
		fuzz = LIS3_DEFAULT_FUZZ_8B;
		flat = LIS3_DEFAULT_FLAT_8B;
	}
	fuzz = (fuzz * lis3_dev.scale) / LIS3_ACCURACY;
	flat = (flat * lis3_dev.scale) / LIS3_ACCURACY;

S
Samu Onkalo 已提交
652 653 654
	input_set_abs_params(input_dev, ABS_X, -max_val, max_val, fuzz, flat);
	input_set_abs_params(input_dev, ABS_Y, -max_val, max_val, fuzz, flat);
	input_set_abs_params(input_dev, ABS_Z, -max_val, max_val, fuzz, flat);
P
Pavel Machek 已提交
655

656 657 658 659
	lis3_dev.mapped_btns[0] = lis3lv02d_get_axis(abs(lis3_dev.ac.x), btns);
	lis3_dev.mapped_btns[1] = lis3lv02d_get_axis(abs(lis3_dev.ac.y), btns);
	lis3_dev.mapped_btns[2] = lis3lv02d_get_axis(abs(lis3_dev.ac.z), btns);

E
Eric Piel 已提交
660
	err = input_register_polled_device(lis3_dev.idev);
P
Pavel Machek 已提交
661
	if (err) {
E
Eric Piel 已提交
662
		input_free_polled_device(lis3_dev.idev);
663
		lis3_dev.idev = NULL;
P
Pavel Machek 已提交
664 665 666 667
	}

	return err;
}
668
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_enable);
P
Pavel Machek 已提交
669

670
void lis3lv02d_joystick_disable(void)
P
Pavel Machek 已提交
671
{
672 673 674 675 676
	if (lis3_dev.irq)
		free_irq(lis3_dev.irq, &lis3_dev);
	if (lis3_dev.pdata && lis3_dev.pdata->irq2)
		free_irq(lis3_dev.pdata->irq2, &lis3_dev);

677
	if (!lis3_dev.idev)
P
Pavel Machek 已提交
678 679
		return;

680 681
	if (lis3_dev.irq)
		misc_deregister(&lis3lv02d_misc_device);
E
Eric Piel 已提交
682
	input_unregister_polled_device(lis3_dev.idev);
683
	input_free_polled_device(lis3_dev.idev);
684
	lis3_dev.idev = NULL;
P
Pavel Machek 已提交
685
}
686
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable);
P
Pavel Machek 已提交
687 688

/* Sysfs stuff */
S
Samu Onkalo 已提交
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
static void lis3lv02d_sysfs_poweron(struct lis3lv02d *lis3)
{
	/*
	 * SYSFS functions are fast visitors so put-call
	 * immediately after the get-call. However, keep
	 * chip running for a while and schedule delayed
	 * suspend. This way periodic sysfs calls doesn't
	 * suffer from relatively long power up time.
	 */

	if (lis3->pm_dev) {
		pm_runtime_get_sync(lis3->pm_dev);
		pm_runtime_put_noidle(lis3->pm_dev);
		pm_schedule_suspend(lis3->pm_dev, LIS3_SYSFS_POWERDOWN_DELAY);
	}
}

S
Samu Onkalo 已提交
706 707 708 709 710
static ssize_t lis3lv02d_selftest_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	s16 values[3];

711 712 713 714 715
	static const char ok[] = "OK";
	static const char fail[] = "FAIL";
	static const char irq[] = "FAIL_IRQ";
	const char *res;

S
Samu Onkalo 已提交
716
	lis3lv02d_sysfs_poweron(&lis3_dev);
717 718 719 720 721 722 723 724 725 726 727 728 729
	switch (lis3lv02d_selftest(&lis3_dev, values)) {
	case SELFTEST_FAIL:
		res = fail;
		break;
	case SELFTEST_IRQ:
		res = irq;
		break;
	case SELFTEST_OK:
	default:
		res = ok;
		break;
	}
	return sprintf(buf, "%s %d %d %d\n", res,
S
Samu Onkalo 已提交
730 731 732
		values[0], values[1], values[2]);
}

P
Pavel Machek 已提交
733 734 735 736 737
static ssize_t lis3lv02d_position_show(struct device *dev,
				struct device_attribute *attr, char *buf)
{
	int x, y, z;

S
Samu Onkalo 已提交
738
	lis3lv02d_sysfs_poweron(&lis3_dev);
739
	mutex_lock(&lis3_dev.mutex);
740
	lis3lv02d_get_xyz(&lis3_dev, &x, &y, &z);
741
	mutex_unlock(&lis3_dev.mutex);
P
Pavel Machek 已提交
742 743 744 745 746 747
	return sprintf(buf, "(%d,%d,%d)\n", x, y, z);
}

static ssize_t lis3lv02d_rate_show(struct device *dev,
			struct device_attribute *attr, char *buf)
{
S
Samu Onkalo 已提交
748
	lis3lv02d_sysfs_poweron(&lis3_dev);
S
Samu Onkalo 已提交
749
	return sprintf(buf, "%d\n", lis3lv02d_get_odr());
P
Pavel Machek 已提交
750 751
}

752 753 754 755 756 757 758 759 760
static ssize_t lis3lv02d_rate_set(struct device *dev,
				struct device_attribute *attr, const char *buf,
				size_t count)
{
	unsigned long rate;

	if (strict_strtoul(buf, 0, &rate))
		return -EINVAL;

S
Samu Onkalo 已提交
761
	lis3lv02d_sysfs_poweron(&lis3_dev);
762 763 764 765 766 767
	if (lis3lv02d_set_odr(rate))
		return -EINVAL;

	return count;
}

S
Samu Onkalo 已提交
768
static DEVICE_ATTR(selftest, S_IRUSR, lis3lv02d_selftest_show, NULL);
P
Pavel Machek 已提交
769
static DEVICE_ATTR(position, S_IRUGO, lis3lv02d_position_show, NULL);
770 771
static DEVICE_ATTR(rate, S_IRUGO | S_IWUSR, lis3lv02d_rate_show,
					    lis3lv02d_rate_set);
P
Pavel Machek 已提交
772 773

static struct attribute *lis3lv02d_attributes[] = {
S
Samu Onkalo 已提交
774
	&dev_attr_selftest.attr,
P
Pavel Machek 已提交
775 776 777 778 779 780 781 782 783
	&dev_attr_position.attr,
	&dev_attr_rate.attr,
	NULL
};

static struct attribute_group lis3lv02d_attribute_group = {
	.attrs = lis3lv02d_attributes
};

784

785
static int lis3lv02d_add_fs(struct lis3lv02d *lis3)
P
Pavel Machek 已提交
786
{
787 788 789
	lis3->pdev = platform_device_register_simple(DRIVER_NAME, -1, NULL, 0);
	if (IS_ERR(lis3->pdev))
		return PTR_ERR(lis3->pdev);
P
Pavel Machek 已提交
790

791
	return sysfs_create_group(&lis3->pdev->dev.kobj, &lis3lv02d_attribute_group);
P
Pavel Machek 已提交
792 793
}

794
int lis3lv02d_remove_fs(struct lis3lv02d *lis3)
P
Pavel Machek 已提交
795
{
796 797
	sysfs_remove_group(&lis3->pdev->dev.kobj, &lis3lv02d_attribute_group);
	platform_device_unregister(lis3->pdev);
S
Samu Onkalo 已提交
798 799 800 801 802 803 804 805 806 807 808
	if (lis3->pm_dev) {
		/* Barrier after the sysfs remove */
		pm_runtime_barrier(lis3->pm_dev);

		/* SYSFS may have left chip running. Turn off if necessary */
		if (!pm_runtime_suspended(lis3->pm_dev))
			lis3lv02d_poweroff(&lis3_dev);

		pm_runtime_disable(lis3->pm_dev);
		pm_runtime_set_suspended(lis3->pm_dev);
	}
S
Samu Onkalo 已提交
809
	kfree(lis3->reg_cache);
P
Pavel Machek 已提交
810 811
	return 0;
}
812
EXPORT_SYMBOL_GPL(lis3lv02d_remove_fs);
P
Pavel Machek 已提交
813

814 815 816
static void lis3lv02d_8b_configure(struct lis3lv02d *dev,
				struct lis3lv02d_platform_data *p)
{
817
	int err;
818 819
	int ctrl2 = p->hipass_ctrl;

820 821 822 823 824 825 826 827 828
	if (p->click_flags) {
		dev->write(dev, CLICK_CFG, p->click_flags);
		dev->write(dev, CLICK_TIMELIMIT, p->click_time_limit);
		dev->write(dev, CLICK_LATENCY, p->click_latency);
		dev->write(dev, CLICK_WINDOW, p->click_window);
		dev->write(dev, CLICK_THSZ, p->click_thresh_z & 0xf);
		dev->write(dev, CLICK_THSY_X,
			(p->click_thresh_x & 0xf) |
			(p->click_thresh_y << 4));
829 830 831 832 833 834 835

		if (dev->idev) {
			struct input_dev *input_dev = lis3_dev.idev->input;
			input_set_capability(input_dev, EV_KEY, BTN_X);
			input_set_capability(input_dev, EV_KEY, BTN_Y);
			input_set_capability(input_dev, EV_KEY, BTN_Z);
		}
836 837 838 839 840
	}

	if (p->wakeup_flags) {
		dev->write(dev, FF_WU_CFG_1, p->wakeup_flags);
		dev->write(dev, FF_WU_THS_1, p->wakeup_thresh & 0x7f);
841 842
		/* pdata value + 1 to keep this backward compatible*/
		dev->write(dev, FF_WU_DURATION_1, p->duration1 + 1);
843 844 845 846 847 848
		ctrl2 ^= HP_FF_WU1; /* Xor to keep compatible with old pdata*/
	}

	if (p->wakeup_flags2) {
		dev->write(dev, FF_WU_CFG_2, p->wakeup_flags2);
		dev->write(dev, FF_WU_THS_2, p->wakeup_thresh2 & 0x7f);
849 850
		/* pdata value + 1 to keep this backward compatible*/
		dev->write(dev, FF_WU_DURATION_2, p->duration2 + 1);
851
		ctrl2 ^= HP_FF_WU2; /* Xor to keep compatible with old pdata*/
852
	}
853 854
	/* Configure hipass filters */
	dev->write(dev, CTRL_REG2, ctrl2);
855 856 857 858 859

	if (p->irq2) {
		err = request_threaded_irq(p->irq2,
					NULL,
					lis302dl_interrupt_thread2_8b,
860 861
					IRQF_TRIGGER_RISING | IRQF_ONESHOT |
					(p->irq_flags2 & IRQF_TRIGGER_MASK),
862 863
					DRIVER_NAME, &lis3_dev);
		if (err < 0)
864
			pr_err("No second IRQ. Limited functionality\n");
865
	}
866 867
}

868 869
/*
 * Initialise the accelerometer and the various subsystems.
870
 * Should be rather independent of the bus system.
871
 */
872
int lis3lv02d_init_device(struct lis3lv02d *dev)
873
{
874 875
	int err;
	irq_handler_t thread_fn;
876
	int irq_flags = 0;
877

878 879 880
	dev->whoami = lis3lv02d_read_8(dev, WHO_AM_I);

	switch (dev->whoami) {
881
	case WAI_12B:
882
		pr_info("12 bits sensor found\n");
883
		dev->read_data = lis3lv02d_read_12;
884
		dev->mdps_max_val = 2048;
S
Samu Onkalo 已提交
885
		dev->pwron_delay = LIS3_PWRON_DELAY_WAI_12B;
886 887
		dev->odrs = lis3_12_rates;
		dev->odr_mask = CTRL1_DF0 | CTRL1_DF1;
S
Samu Onkalo 已提交
888
		dev->scale = LIS3_SENSITIVITY_12B;
S
Samu Onkalo 已提交
889 890
		dev->regs = lis3_wai12_regs;
		dev->regs_size = ARRAY_SIZE(lis3_wai12_regs);
891
		break;
892
	case WAI_8B:
893
		pr_info("8 bits sensor found\n");
894 895
		dev->read_data = lis3lv02d_read_8;
		dev->mdps_max_val = 128;
S
Samu Onkalo 已提交
896
		dev->pwron_delay = LIS3_PWRON_DELAY_WAI_8B;
897 898
		dev->odrs = lis3_8_rates;
		dev->odr_mask = CTRL1_DR;
S
Samu Onkalo 已提交
899
		dev->scale = LIS3_SENSITIVITY_8B;
S
Samu Onkalo 已提交
900 901
		dev->regs = lis3_wai8_regs;
		dev->regs_size = ARRAY_SIZE(lis3_wai8_regs);
902
		break;
903
	case WAI_3DC:
904
		pr_info("8 bits 3DC sensor found\n");
905 906 907 908 909 910 911
		dev->read_data = lis3lv02d_read_8;
		dev->mdps_max_val = 128;
		dev->pwron_delay = LIS3_PWRON_DELAY_WAI_8B;
		dev->odrs = lis3_3dc_rates;
		dev->odr_mask = CTRL1_ODR0|CTRL1_ODR1|CTRL1_ODR2|CTRL1_ODR3;
		dev->scale = LIS3_SENSITIVITY_8B;
		break;
912
	default:
913
		pr_err("unknown sensor type 0x%X\n", dev->whoami);
914 915 916
		return -EINVAL;
	}

S
Samu Onkalo 已提交
917 918 919 920 921 922 923 924
	dev->reg_cache = kzalloc(max(sizeof(lis3_wai8_regs),
				     sizeof(lis3_wai12_regs)), GFP_KERNEL);

	if (dev->reg_cache == NULL) {
		printk(KERN_ERR DRIVER_NAME "out of memory\n");
		return -ENOMEM;
	}

S
Samu Onkalo 已提交
925
	mutex_init(&dev->mutex);
926
	atomic_set(&dev->wake_thread, 0);
S
Samu Onkalo 已提交
927

928
	lis3lv02d_add_fs(dev);
929
	lis3lv02d_poweron(dev);
930

S
Samu Onkalo 已提交
931 932 933 934 935
	if (dev->pm_dev) {
		pm_runtime_set_active(dev->pm_dev);
		pm_runtime_enable(dev->pm_dev);
	}

936
	if (lis3lv02d_joystick_enable())
937
		pr_err("joystick initialization failed\n");
938

D
Daniel Mack 已提交
939 940 941 942 943
	/* passing in platform specific data is purely optional and only
	 * used by the SPI transport layer at the moment */
	if (dev->pdata) {
		struct lis3lv02d_platform_data *p = dev->pdata;

944 945
		if (dev->whoami == WAI_8B)
			lis3lv02d_8b_configure(dev, p);
946

947 948
		irq_flags = p->irq_flags1 & IRQF_TRIGGER_MASK;

949
		dev->irq_cfg = p->irq_cfg;
D
Daniel Mack 已提交
950 951
		if (p->irq_cfg)
			dev->write(dev, CTRL_REG3, p->irq_cfg);
952 953 954

		if (p->default_rate)
			lis3lv02d_set_odr(p->default_rate);
D
Daniel Mack 已提交
955 956
	}

957
	/* bail if we did not get an IRQ from the bus layer */
958
	if (!dev->irq) {
959
		pr_debug("No IRQ. Disabling /dev/freefall\n");
960 961 962
		goto out;
	}

963 964 965 966 967 968 969 970 971 972 973
	/*
	 * The sensor can generate interrupts for free-fall and direction
	 * detection (distinguishable with FF_WU_SRC and DD_SRC) but to keep
	 * the things simple and _fast_ we activate it only for free-fall, so
	 * no need to read register (very slow with ACPI). For the same reason,
	 * we forbid shared interrupts.
	 *
	 * IRQF_TRIGGER_RISING seems pointless on HP laptops because the
	 * io-apic is not configurable (and generates a warning) but I keep it
	 * in case of support for other hardware.
	 */
974
	if (dev->pdata && dev->whoami == WAI_8B)
975 976 977 978 979 980
		thread_fn = lis302dl_interrupt_thread1_8b;
	else
		thread_fn = NULL;

	err = request_threaded_irq(dev->irq, lis302dl_interrupt,
				thread_fn,
981 982
				IRQF_TRIGGER_RISING | IRQF_ONESHOT |
				irq_flags,
983 984 985
				DRIVER_NAME, &lis3_dev);

	if (err < 0) {
986
		pr_err("Cannot get IRQ\n");
987 988 989
		goto out;
	}

990
	if (misc_register(&lis3lv02d_misc_device))
991
		pr_err("misc_register failed\n");
992 993 994 995 996
out:
	return 0;
}
EXPORT_SYMBOL_GPL(lis3lv02d_init_device);

P
Pavel Machek 已提交
997
MODULE_DESCRIPTION("ST LIS3LV02Dx three-axis digital accelerometer driver");
998
MODULE_AUTHOR("Yan Burman, Eric Piel, Pavel Machek");
P
Pavel Machek 已提交
999
MODULE_LICENSE("GPL");