34
34
#include "esp_api.h"
35
35
36
36
#define ESP_SERIAL_MAJOR 221
37
- #define ESP_SERIAL_MINOR_MAX 2
37
+ #define ESP_SERIAL_MINOR_MAX 1
38
38
#define ESP_RX_RB_SIZE 4096
39
39
#define ESP_SERIAL_MAX_TX 4096
40
40
41
41
static struct esp_serial_devs {
42
+ struct device * dev ;
42
43
struct cdev cdev ;
43
44
int dev_index ;
44
45
esp_rb_t rb ;
@@ -55,6 +56,7 @@ static ssize_t esp_serial_read(struct file *file, char __user *user_buffer, size
55
56
dev = (struct esp_serial_devs * ) file -> private_data ;
56
57
ret_size = esp_rb_read_by_user (& dev -> rb , user_buffer , size , !(file -> f_flags & O_NONBLOCK ));
57
58
if (ret_size == 0 ) {
59
+ esp_verbose ("%u err: EAGAIN\n" , __LINE__ );
58
60
return - EAGAIN ;
59
61
}
60
62
return ret_size ;
@@ -188,6 +190,8 @@ int esp_serial_data_received(int dev_index, const char *data, size_t len)
188
190
{
189
191
int ret = 0 , ret_len = 0 ;
190
192
if (dev_index >= ESP_SERIAL_MINOR_MAX ) {
193
+ esp_err ("%u ERR: serial_dev_idx[%d] >= minor_max[%d]\n" ,
194
+ __LINE__ , dev_index , ESP_SERIAL_MINOR_MAX );
191
195
return - EINVAL ;
192
196
}
193
197
@@ -209,25 +213,41 @@ int esp_serial_data_received(int dev_index, const char *data, size_t len)
209
213
return ret_len ;
210
214
}
211
215
216
+ static dev_t dev_first ;
217
+ static struct class * cl ;
218
+
212
219
int esp_serial_init (void * priv )
213
220
{
214
- int err = 0 , i = 0 ;
221
+ int err = - EINVAL , i = 0 ;
215
222
216
223
if (!priv ) {
217
224
esp_err ("failed. NULL adapter\n" );
218
- return -1 ;
225
+ goto err ;
219
226
}
220
227
221
- err = register_chrdev_region (MKDEV (ESP_SERIAL_MAJOR , 0 ), ESP_SERIAL_MINOR_MAX , "esp_serial_driver" );
228
+ /* already in correct state, ignore */
229
+ if (serial_init_done )
230
+ return 0 ;
231
+
232
+ err = alloc_chrdev_region (& dev_first , 0 , ESP_SERIAL_MINOR_MAX , "esp_serial_driver" );
222
233
if (err ) {
223
- esp_err ("Error registering chrdev region %d\n" , err );
224
- return -1 ;
234
+ esp_err ("Error alloc chrdev region %d\n" , err );
235
+ goto err ;
236
+ }
237
+
238
+ cl = class_create (THIS_MODULE , "esp_serial_chardrv" );
239
+ if (IS_ERR (cl )) {
240
+ esp_err ("Class create err[%d]\n" , err );
241
+ err = PTR_ERR (cl );
242
+ goto err_class_create ;
225
243
}
226
244
227
245
for (i = 0 ; i < ESP_SERIAL_MINOR_MAX ; i ++ ) {
228
- cdev_init ( & devs [ i ]. cdev , & esp_serial_fops ) ;
246
+ dev_t dev_num = dev_first + i ;
229
247
devs [i ].dev_index = i ;
230
- cdev_add (& devs [i ].cdev , MKDEV (ESP_SERIAL_MAJOR , i ), 1 );
248
+ devs [i ].dev = device_create (cl , NULL , dev_num , NULL , "esps%d" , i );
249
+ cdev_init (& devs [i ].cdev , & esp_serial_fops );
250
+ cdev_add (& devs [i ].cdev , dev_num , 1 );
231
251
esp_rb_init (& devs [i ].rb , ESP_RX_RB_SIZE );
232
252
devs [i ].priv = priv ;
233
253
mutex_init (& devs [i ].lock );
@@ -236,32 +256,40 @@ int esp_serial_init(void *priv)
236
256
serial_init_done = 1 ;
237
257
esp_verbose ("\n" );
238
258
return 0 ;
259
+
260
+ err_class_create :
261
+ unregister_chrdev_region (dev_first , ESP_SERIAL_MINOR_MAX );
262
+ err :
263
+ return err ;
239
264
}
240
265
241
266
void esp_serial_cleanup (void )
242
267
{
243
268
int i = 0 ;
244
269
245
270
for (i = 0 ; serial_init_done && i < ESP_SERIAL_MINOR_MAX ; i ++ ) {
271
+ dev_t dev_num = dev_first + i ;
272
+ device_destroy (cl , dev_num );
246
273
if (!devs [i ].cdev .ops )
247
274
cdev_del (& devs [i ].cdev );
248
275
249
276
esp_rb_cleanup (& devs [i ].rb );
250
277
mutex_destroy (& devs [i ].lock );
251
278
}
252
279
253
- unregister_chrdev_region (MKDEV (ESP_SERIAL_MAJOR , 0 ), ESP_SERIAL_MINOR_MAX );
280
+ class_destroy (cl );
281
+ unregister_chrdev_region (dev_first , ESP_SERIAL_MINOR_MAX );
254
282
255
283
serial_init_done = 0 ;
256
- esp_verbose ("\n" );
284
+ esp_info ("\n" );
257
285
return ;
258
286
}
259
287
260
288
int esp_serial_reinit (void * priv )
261
289
{
262
- esp_verbose ( "\n" );
263
- if ( serial_init_done )
264
- esp_serial_cleanup ();
290
+ if ( serial_init_done ) {
291
+ return 0 ;
292
+ }
265
293
266
294
return esp_serial_init (priv );
267
295
}
0 commit comments