Skip to content

Commit 867e882

Browse files
committed
Input: mma8450 - switch to using polled mode of input devices
We have added polled mode to the normal input devices with the intent of retiring input_polled_dev. This converts mma8450 driver to use the polling mode of standard input devices and removes dependency on INPUT_POLLDEV. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent ff68cf0 commit 867e882

File tree

2 files changed

+46
-56
lines changed

2 files changed

+46
-56
lines changed

drivers/input/misc/Kconfig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@ config INPUT_MC13783_PWRBUTTON
246246
config INPUT_MMA8450
247247
tristate "MMA8450 - Freescale's 3-Axis, 8/12-bit Digital Accelerometer"
248248
depends on I2C
249-
select INPUT_POLLDEV
250249
help
251250
Say Y here if you want to support Freescale's MMA8450 Accelerometer
252251
through I2C interface.

drivers/input/misc/mma8450.c

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include <linux/slab.h>
1111
#include <linux/delay.h>
1212
#include <linux/i2c.h>
13-
#include <linux/input-polldev.h>
13+
#include <linux/input.h>
1414
#include <linux/of_device.h>
1515

1616
#define MMA8450_DRV_NAME "mma8450"
@@ -39,15 +39,8 @@
3939
#define MMA8450_CTRL_REG1 0x38
4040
#define MMA8450_CTRL_REG2 0x39
4141

42-
/* mma8450 status */
43-
struct mma8450 {
44-
struct i2c_client *client;
45-
struct input_polled_dev *idev;
46-
};
47-
48-
static int mma8450_read(struct mma8450 *m, unsigned off)
42+
static int mma8450_read(struct i2c_client *c, unsigned int off)
4943
{
50-
struct i2c_client *c = m->client;
5144
int ret;
5245

5346
ret = i2c_smbus_read_byte_data(c, off);
@@ -59,9 +52,8 @@ static int mma8450_read(struct mma8450 *m, unsigned off)
5952
return ret;
6053
}
6154

62-
static int mma8450_write(struct mma8450 *m, unsigned off, u8 v)
55+
static int mma8450_write(struct i2c_client *c, unsigned int off, u8 v)
6356
{
64-
struct i2c_client *c = m->client;
6557
int error;
6658

6759
error = i2c_smbus_write_byte_data(c, off, v);
@@ -75,10 +67,9 @@ static int mma8450_write(struct mma8450 *m, unsigned off, u8 v)
7567
return 0;
7668
}
7769

78-
static int mma8450_read_block(struct mma8450 *m, unsigned off,
70+
static int mma8450_read_block(struct i2c_client *c, unsigned int off,
7971
u8 *buf, size_t size)
8072
{
81-
struct i2c_client *c = m->client;
8273
int err;
8374

8475
err = i2c_smbus_read_i2c_block_data(c, off, size, buf);
@@ -92,63 +83,64 @@ static int mma8450_read_block(struct mma8450 *m, unsigned off,
9283
return 0;
9384
}
9485

95-
static void mma8450_poll(struct input_polled_dev *dev)
86+
static void mma8450_poll(struct input_dev *input)
9687
{
97-
struct mma8450 *m = dev->private;
88+
struct i2c_client *c = input_get_drvdata(input);
9889
int x, y, z;
9990
int ret;
10091
u8 buf[6];
10192

102-
ret = mma8450_read(m, MMA8450_STATUS);
93+
ret = mma8450_read(c, MMA8450_STATUS);
10394
if (ret < 0)
10495
return;
10596

10697
if (!(ret & MMA8450_STATUS_ZXYDR))
10798
return;
10899

109-
ret = mma8450_read_block(m, MMA8450_OUT_X_LSB, buf, sizeof(buf));
100+
ret = mma8450_read_block(c, MMA8450_OUT_X_LSB, buf, sizeof(buf));
110101
if (ret < 0)
111102
return;
112103

113104
x = ((int)(s8)buf[1] << 4) | (buf[0] & 0xf);
114105
y = ((int)(s8)buf[3] << 4) | (buf[2] & 0xf);
115106
z = ((int)(s8)buf[5] << 4) | (buf[4] & 0xf);
116107

117-
input_report_abs(dev->input, ABS_X, x);
118-
input_report_abs(dev->input, ABS_Y, y);
119-
input_report_abs(dev->input, ABS_Z, z);
120-
input_sync(dev->input);
108+
input_report_abs(input, ABS_X, x);
109+
input_report_abs(input, ABS_Y, y);
110+
input_report_abs(input, ABS_Z, z);
111+
input_sync(input);
121112
}
122113

123114
/* Initialize the MMA8450 chip */
124-
static void mma8450_open(struct input_polled_dev *dev)
115+
static int mma8450_open(struct input_dev *input)
125116
{
126-
struct mma8450 *m = dev->private;
117+
struct i2c_client *c = input_get_drvdata(input);
127118
int err;
128119

129120
/* enable all events from X/Y/Z, no FIFO */
130-
err = mma8450_write(m, MMA8450_XYZ_DATA_CFG, 0x07);
121+
err = mma8450_write(c, MMA8450_XYZ_DATA_CFG, 0x07);
131122
if (err)
132-
return;
123+
return err;
133124

134125
/*
135126
* Sleep mode poll rate - 50Hz
136127
* System output data rate - 400Hz
137128
* Full scale selection - Active, +/- 2G
138129
*/
139-
err = mma8450_write(m, MMA8450_CTRL_REG1, 0x01);
140-
if (err < 0)
141-
return;
130+
err = mma8450_write(c, MMA8450_CTRL_REG1, 0x01);
131+
if (err)
132+
return err;
142133

143134
msleep(MODE_CHANGE_DELAY_MS);
135+
return 0;
144136
}
145137

146-
static void mma8450_close(struct input_polled_dev *dev)
138+
static void mma8450_close(struct input_dev *input)
147139
{
148-
struct mma8450 *m = dev->private;
140+
struct i2c_client *c = input_get_drvdata(input);
149141

150-
mma8450_write(m, MMA8450_CTRL_REG1, 0x00);
151-
mma8450_write(m, MMA8450_CTRL_REG2, 0x01);
142+
mma8450_write(c, MMA8450_CTRL_REG1, 0x00);
143+
mma8450_write(c, MMA8450_CTRL_REG2, 0x01);
152144
}
153145

154146
/*
@@ -157,38 +149,37 @@ static void mma8450_close(struct input_polled_dev *dev)
157149
static int mma8450_probe(struct i2c_client *c,
158150
const struct i2c_device_id *id)
159151
{
160-
struct input_polled_dev *idev;
161-
struct mma8450 *m;
152+
struct input_dev *input;
162153
int err;
163154

164-
m = devm_kzalloc(&c->dev, sizeof(*m), GFP_KERNEL);
165-
if (!m)
155+
input = devm_input_allocate_device(&c->dev);
156+
if (!input)
166157
return -ENOMEM;
167158

168-
idev = devm_input_allocate_polled_device(&c->dev);
169-
if (!idev)
170-
return -ENOMEM;
159+
input_set_drvdata(input, c);
160+
161+
input->name = MMA8450_DRV_NAME;
162+
input->id.bustype = BUS_I2C;
163+
164+
input->open = mma8450_open;
165+
input->close = mma8450_close;
171166

172-
m->client = c;
173-
m->idev = idev;
167+
input_set_abs_params(input, ABS_X, -2048, 2047, 32, 32);
168+
input_set_abs_params(input, ABS_Y, -2048, 2047, 32, 32);
169+
input_set_abs_params(input, ABS_Z, -2048, 2047, 32, 32);
174170

175-
idev->private = m;
176-
idev->input->name = MMA8450_DRV_NAME;
177-
idev->input->id.bustype = BUS_I2C;
178-
idev->poll = mma8450_poll;
179-
idev->poll_interval = POLL_INTERVAL;
180-
idev->poll_interval_max = POLL_INTERVAL_MAX;
181-
idev->open = mma8450_open;
182-
idev->close = mma8450_close;
171+
err = input_setup_polling(input, mma8450_poll);
172+
if (err) {
173+
dev_err(&c->dev, "failed to set up polling\n");
174+
return err;
175+
}
183176

184-
__set_bit(EV_ABS, idev->input->evbit);
185-
input_set_abs_params(idev->input, ABS_X, -2048, 2047, 32, 32);
186-
input_set_abs_params(idev->input, ABS_Y, -2048, 2047, 32, 32);
187-
input_set_abs_params(idev->input, ABS_Z, -2048, 2047, 32, 32);
177+
input_set_poll_interval(input, POLL_INTERVAL);
178+
input_set_max_poll_interval(input, POLL_INTERVAL_MAX);
188179

189-
err = input_register_polled_device(idev);
180+
err = input_register_device(input);
190181
if (err) {
191-
dev_err(&c->dev, "failed to register polled input device\n");
182+
dev_err(&c->dev, "failed to register input device\n");
192183
return err;
193184
}
194185

0 commit comments

Comments
 (0)