@@ -92,6 +92,13 @@ static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id)
92
92
return IRQ_HANDLED ;
93
93
}
94
94
95
+ static void mcs_touchkey_poweroff (void * data )
96
+ {
97
+ struct mcs_touchkey_data * touchkey = data ;
98
+
99
+ touchkey -> poweron (false);
100
+ }
101
+
95
102
static int mcs_touchkey_probe (struct i2c_client * client )
96
103
{
97
104
const struct i2c_device_id * id = i2c_client_get_device_id (client );
@@ -109,13 +116,16 @@ static int mcs_touchkey_probe(struct i2c_client *client)
109
116
return - EINVAL ;
110
117
}
111
118
112
- data = kzalloc (struct_size (data , keycodes , pdata -> key_maxval + 1 ),
113
- GFP_KERNEL );
114
- input_dev = input_allocate_device ();
115
- if (!data || !input_dev ) {
116
- dev_err (& client -> dev , "Failed to allocate memory\n" );
117
- error = - ENOMEM ;
118
- goto err_free_mem ;
119
+ data = devm_kzalloc (& client -> dev ,
120
+ struct_size (data , keycodes , pdata -> key_maxval + 1 ),
121
+ GFP_KERNEL );
122
+ if (!data )
123
+ return - ENOMEM ;
124
+
125
+ input_dev = devm_input_allocate_device (& client -> dev );
126
+ if (!input_dev ) {
127
+ dev_err (& client -> dev , "Failed to allocate input device\n" );
128
+ return - ENOMEM ;
119
129
}
120
130
121
131
data -> client = client ;
@@ -136,15 +146,13 @@ static int mcs_touchkey_probe(struct i2c_client *client)
136
146
137
147
fw_ver = i2c_smbus_read_byte_data (client , fw_reg );
138
148
if (fw_ver < 0 ) {
139
- error = fw_ver ;
140
149
dev_err (& client -> dev , "i2c read error[%d]\n" , error );
141
- goto err_free_mem ;
150
+ return fw_ver ;
142
151
}
143
152
dev_info (& client -> dev , "Firmware version: %d\n" , fw_ver );
144
153
145
154
input_dev -> name = "MELFAS MCS Touchkey" ;
146
155
input_dev -> id .bustype = BUS_I2C ;
147
- input_dev -> dev .parent = & client -> dev ;
148
156
input_dev -> evbit [0 ] = BIT_MASK (EV_KEY );
149
157
if (!pdata -> no_autorepeat )
150
158
input_dev -> evbit [0 ] |= BIT_MASK (EV_REP );
@@ -169,40 +177,28 @@ static int mcs_touchkey_probe(struct i2c_client *client)
169
177
if (pdata -> poweron ) {
170
178
data -> poweron = pdata -> poweron ;
171
179
data -> poweron (true);
180
+
181
+ error = devm_add_action_or_reset (& client -> dev ,
182
+ mcs_touchkey_poweroff , data );
183
+ if (error )
184
+ return error ;
172
185
}
173
186
174
- error = request_threaded_irq (client -> irq , NULL , mcs_touchkey_interrupt ,
175
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
176
- client -> dev .driver -> name , data );
187
+ error = devm_request_threaded_irq (& client -> dev , client -> irq ,
188
+ NULL , mcs_touchkey_interrupt ,
189
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
190
+ client -> dev .driver -> name , data );
177
191
if (error ) {
178
192
dev_err (& client -> dev , "Failed to register interrupt\n" );
179
- goto err_free_mem ;
193
+ return error ;
180
194
}
181
195
182
196
error = input_register_device (input_dev );
183
197
if (error )
184
- goto err_free_irq ;
198
+ return error ;
185
199
186
200
i2c_set_clientdata (client , data );
187
201
return 0 ;
188
-
189
- err_free_irq :
190
- free_irq (client -> irq , data );
191
- err_free_mem :
192
- input_free_device (input_dev );
193
- kfree (data );
194
- return error ;
195
- }
196
-
197
- static void mcs_touchkey_remove (struct i2c_client * client )
198
- {
199
- struct mcs_touchkey_data * data = i2c_get_clientdata (client );
200
-
201
- free_irq (client -> irq , data );
202
- if (data -> poweron )
203
- data -> poweron (false);
204
- input_unregister_device (data -> input_dev );
205
- kfree (data );
206
202
}
207
203
208
204
static void mcs_touchkey_shutdown (struct i2c_client * client )
@@ -259,7 +255,6 @@ static struct i2c_driver mcs_touchkey_driver = {
259
255
.pm = pm_sleep_ptr (& mcs_touchkey_pm_ops ),
260
256
},
261
257
.probe = mcs_touchkey_probe ,
262
- .remove = mcs_touchkey_remove ,
263
258
.shutdown = mcs_touchkey_shutdown ,
264
259
.id_table = mcs_touchkey_id ,
265
260
};
0 commit comments