Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 217098
b: refs/heads/master
c: 2ee3214
h: refs/heads/master
v: v3
  • Loading branch information
Takashi Iwai authored and Guenter Roeck committed Oct 25, 2010
1 parent 0406cf6 commit 671938c
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 37394050b5be0fe87f96ed8848f11c3c2cd4d556
refs/heads/master: 2ee321440e3a594dcdd9981e68e5e302447047a2
30 changes: 18 additions & 12 deletions trunk/drivers/hwmon/hp_accel.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,24 +146,27 @@ int lis3lv02d_acpi_write(struct lis3lv02d *lis3, int reg, u8 val)

static int lis3lv02d_dmi_matched(const struct dmi_system_id *dmi)
{
lis3_dev.ac = *((struct axis_conversion *)dmi->driver_data);
lis3_dev.ac = *((union axis_conversion *)dmi->driver_data);
printk(KERN_INFO DRIVER_NAME ": hardware type %s found.\n", dmi->ident);

return 1;
}

/* Represents, for each axis seen by userspace, the corresponding hw axis (+1).
* If the value is negative, the opposite of the hw value is used. */
static struct axis_conversion lis3lv02d_axis_normal = {1, 2, 3};
static struct axis_conversion lis3lv02d_axis_y_inverted = {1, -2, 3};
static struct axis_conversion lis3lv02d_axis_x_inverted = {-1, 2, 3};
static struct axis_conversion lis3lv02d_axis_z_inverted = {1, 2, -3};
static struct axis_conversion lis3lv02d_axis_xy_swap = {2, 1, 3};
static struct axis_conversion lis3lv02d_axis_xy_rotated_left = {-2, 1, 3};
static struct axis_conversion lis3lv02d_axis_xy_rotated_left_usd = {-2, 1, -3};
static struct axis_conversion lis3lv02d_axis_xy_swap_inverted = {-2, -1, 3};
static struct axis_conversion lis3lv02d_axis_xy_rotated_right = {2, -1, 3};
static struct axis_conversion lis3lv02d_axis_xy_swap_yz_inverted = {2, -1, -3};
#define DEFINE_CONV(name, x, y, z) \
static union axis_conversion lis3lv02d_axis_##name = \
{ .as_array = { x, y, z } }
DEFINE_CONV(normal, 1, 2, 3);
DEFINE_CONV(y_inverted, 1, -2, 3);
DEFINE_CONV(x_inverted, -1, 2, 3);
DEFINE_CONV(z_inverted, 1, 2, -3);
DEFINE_CONV(xy_swap, 2, 1, 3);
DEFINE_CONV(xy_rotated_left, -2, 1, 3);
DEFINE_CONV(xy_rotated_left_usd, -2, 1, -3);
DEFINE_CONV(xy_swap_inverted, -2, -1, 3);
DEFINE_CONV(xy_rotated_right, 2, -1, 3);
DEFINE_CONV(xy_swap_yz_inverted, 2, -1, -3);

#define AXIS_DMI_MATCH(_ident, _name, _axis) { \
.ident = _ident, \
Expand Down Expand Up @@ -299,7 +302,10 @@ static int lis3lv02d_add(struct acpi_device *device)
lis3lv02d_enum_resources(device);

/* If possible use a "standard" axes order */
if (dmi_check_system(lis3lv02d_dmi_ids) == 0) {
if (lis3_dev.ac.x && lis3_dev.ac.y && lis3_dev.ac.z) {
printk(KERN_INFO DRIVER_NAME ": Using custom axes %d,%d,%d\n",
lis3_dev.ac.x, lis3_dev.ac.y, lis3_dev.ac.z);
} else if (dmi_check_system(lis3lv02d_dmi_ids) == 0) {
printk(KERN_INFO DRIVER_NAME ": laptop model unknown, "
"using default axes configuration\n");
lis3_dev.ac = lis3lv02d_axis_normal;
Expand Down
24 changes: 24 additions & 0 deletions trunk/drivers/hwmon/lis3lv02d.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,30 @@ struct lis3lv02d lis3_dev = {

EXPORT_SYMBOL_GPL(lis3_dev);

/* 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");

static s16 lis3lv02d_read_8(struct lis3lv02d *lis3, int reg)
{
s8 lo;
Expand Down
11 changes: 6 additions & 5 deletions trunk/drivers/hwmon/lis3lv02d.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,11 @@ enum lis3lv02d_click_src_8b {
CLICK_IA = 0x40,
};

struct axis_conversion {
s8 x;
s8 y;
s8 z;
union axis_conversion {
struct {
int x, y, z;
};
int as_array[3];
};

struct lis3lv02d {
Expand All @@ -249,7 +250,7 @@ struct lis3lv02d {
struct input_polled_dev *idev; /* input device */
struct platform_device *pdev; /* platform device */
atomic_t count; /* interrupt count after last read */
struct axis_conversion ac; /* hw -> logical axis */
union axis_conversion ac; /* hw -> logical axis */
int mapped_btns[3];

u32 irq; /* IRQ number */
Expand Down
5 changes: 2 additions & 3 deletions trunk/drivers/hwmon/lis3lv02d_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,8 @@ static int lis3_i2c_init(struct lis3lv02d *lis3)
}

/* Default axis mapping but it can be overwritten by platform data */
static struct axis_conversion lis3lv02d_axis_map = { LIS3_DEV_X,
LIS3_DEV_Y,
LIS3_DEV_Z };
static union axis_conversion lis3lv02d_axis_map =
{ .as_array = { LIS3_DEV_X, LIS3_DEV_Y, LIS3_DEV_Z } };

static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/hwmon/lis3lv02d_spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ static int lis3_spi_init(struct lis3lv02d *lis3)
return lis3->write(lis3, CTRL_REG1, reg);
}

static struct axis_conversion lis3lv02d_axis_normal = { 1, 2, 3 };
static union axis_conversion lis3lv02d_axis_normal =
{ .as_array = { 1, 2, 3 } };

static int __devinit lis302dl_spi_probe(struct spi_device *spi)
{
Expand Down

0 comments on commit 671938c

Please sign in to comment.