31
31
#include <linux/i2c.h>
32
32
#include <linux/gpio.h>
33
33
34
+ #include <linux/input/touchscreen.h>
34
35
#include <linux/platform_data/ad7879.h>
35
36
#include <linux/module.h>
36
37
#include "ad7879.h"
@@ -126,7 +127,6 @@ struct ad7879 {
126
127
u8 pen_down_acc_interval ;
127
128
u8 median ;
128
129
u16 x_plate_ohms ;
129
- u16 pressure_max ;
130
130
u16 cmd_crtl1 ;
131
131
u16 cmd_crtl2 ;
132
132
u16 cmd_crtl3 ;
@@ -186,7 +186,7 @@ static int ad7879_report(struct ad7879 *ts)
186
186
* Sample found inconsistent, pressure is beyond
187
187
* the maximum. Don't report it to user space.
188
188
*/
189
- if (Rt > ts -> pressure_max )
189
+ if (Rt > input_abs_get_max ( input_dev , ABS_PRESSURE ) )
190
190
return - EINVAL ;
191
191
192
192
/*
@@ -469,7 +469,7 @@ static void ad7879_gpio_remove(struct ad7879 *ts)
469
469
{
470
470
const struct ad7879_platform_data * pdata = dev_get_platdata (ts -> dev );
471
471
472
- if (pdata -> gpio_export )
472
+ if (pdata && pdata -> gpio_export )
473
473
gpiochip_remove (& ts -> gc );
474
474
475
475
}
@@ -485,6 +485,32 @@ static inline void ad7879_gpio_remove(struct ad7879 *ts)
485
485
}
486
486
#endif
487
487
488
+ static int ad7879_parse_dt (struct device * dev , struct ad7879 * ts )
489
+ {
490
+ int err ;
491
+ u32 tmp ;
492
+
493
+ err = device_property_read_u32 (dev , "adi,resistance-plate-x" , & tmp );
494
+ if (err ) {
495
+ dev_err (dev , "failed to get resistance-plate-x property\n" );
496
+ return err ;
497
+ }
498
+ ts -> x_plate_ohms = (u16 )tmp ;
499
+
500
+ device_property_read_u8 (dev , "adi,first-conversion-delay" ,
501
+ & ts -> first_conversion_delay );
502
+ device_property_read_u8 (dev , "adi,acquisition-time" ,
503
+ & ts -> acquisition_time );
504
+ device_property_read_u8 (dev , "adi,median-filter-size" , & ts -> median );
505
+ device_property_read_u8 (dev , "adi,averaging" , & ts -> averaging );
506
+ device_property_read_u8 (dev , "adi,conversion-interval" ,
507
+ & ts -> pen_down_acc_interval );
508
+
509
+ ts -> swap_xy = device_property_read_bool (dev , "touchscreen-swapped-x-y" );
510
+
511
+ return 0 ;
512
+ }
513
+
488
514
struct ad7879 * ad7879_probe (struct device * dev , u8 devid , unsigned int irq ,
489
515
const struct ad7879_bus_ops * bops )
490
516
{
@@ -495,43 +521,44 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
495
521
u16 revid ;
496
522
497
523
if (!irq ) {
498
- dev_err (dev , "no IRQ?\n" );
499
- err = - EINVAL ;
500
- goto err_out ;
524
+ dev_err (dev , "No IRQ specified\n" );
525
+ return ERR_PTR (- EINVAL );
501
526
}
502
527
503
- if (!pdata ) {
504
- dev_err (dev , "no platform data?\n" );
505
- err = - EINVAL ;
506
- goto err_out ;
528
+ ts = devm_kzalloc (dev , sizeof (* ts ), GFP_KERNEL );
529
+ if (!ts )
530
+ return ERR_PTR (- ENOMEM );
531
+
532
+ if (pdata ) {
533
+ /* Platform data use swapped axis (backward compatibility) */
534
+ ts -> swap_xy = !pdata -> swap_xy ;
535
+
536
+ ts -> x_plate_ohms = pdata -> x_plate_ohms ? : 400 ;
537
+
538
+ ts -> first_conversion_delay = pdata -> first_conversion_delay ;
539
+ ts -> acquisition_time = pdata -> acquisition_time ;
540
+ ts -> averaging = pdata -> averaging ;
541
+ ts -> pen_down_acc_interval = pdata -> pen_down_acc_interval ;
542
+ ts -> median = pdata -> median ;
543
+ } else if (dev -> of_node ) {
544
+ ad7879_parse_dt (dev , ts );
545
+ } else {
546
+ dev_err (dev , "No platform data\n" );
547
+ return ERR_PTR (- EINVAL );
507
548
}
508
549
509
- ts = kzalloc (sizeof (* ts ), GFP_KERNEL );
510
- input_dev = input_allocate_device ();
511
- if (!ts || !input_dev ) {
512
- err = - ENOMEM ;
513
- goto err_free_mem ;
550
+ input_dev = devm_input_allocate_device (dev );
551
+ if (!input_dev ) {
552
+ dev_err (dev , "Failed to allocate input device\n" );
553
+ return ERR_PTR (- ENOMEM );
514
554
}
515
555
516
556
ts -> bops = bops ;
517
557
ts -> dev = dev ;
518
558
ts -> input = input_dev ;
519
559
ts -> irq = irq ;
520
560
521
- /* Use swapped axis by default (backward compatibility) */
522
- ts -> swap_xy = !pdata -> swap_xy ;
523
-
524
561
setup_timer (& ts -> timer , ad7879_timer , (unsigned long ) ts );
525
-
526
- ts -> x_plate_ohms = pdata -> x_plate_ohms ? : 400 ;
527
- ts -> pressure_max = pdata -> pressure_max ? : ~0 ;
528
-
529
- ts -> first_conversion_delay = pdata -> first_conversion_delay ;
530
- ts -> acquisition_time = pdata -> acquisition_time ;
531
- ts -> averaging = pdata -> averaging ;
532
- ts -> pen_down_acc_interval = pdata -> pen_down_acc_interval ;
533
- ts -> median = pdata -> median ;
534
-
535
562
snprintf (ts -> phys , sizeof (ts -> phys ), "%s/input0" , dev_name (dev ));
536
563
537
564
input_dev -> name = "AD7879 Touchscreen" ;
@@ -552,21 +579,33 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
552
579
__set_bit (EV_KEY , input_dev -> evbit );
553
580
__set_bit (BTN_TOUCH , input_dev -> keybit );
554
581
555
- input_set_abs_params (input_dev , ABS_X ,
556
- pdata -> x_min ? : 0 ,
557
- pdata -> x_max ? : MAX_12BIT ,
558
- 0 , 0 );
559
- input_set_abs_params (input_dev , ABS_Y ,
560
- pdata -> y_min ? : 0 ,
561
- pdata -> y_max ? : MAX_12BIT ,
562
- 0 , 0 );
563
- input_set_abs_params (input_dev , ABS_PRESSURE ,
564
- pdata -> pressure_min , pdata -> pressure_max , 0 , 0 );
582
+ if (pdata ) {
583
+ input_set_abs_params (input_dev , ABS_X ,
584
+ pdata -> x_min ? : 0 ,
585
+ pdata -> x_max ? : MAX_12BIT ,
586
+ 0 , 0 );
587
+ input_set_abs_params (input_dev , ABS_Y ,
588
+ pdata -> y_min ? : 0 ,
589
+ pdata -> y_max ? : MAX_12BIT ,
590
+ 0 , 0 );
591
+ input_set_abs_params (input_dev , ABS_PRESSURE ,
592
+ pdata -> pressure_min ,
593
+ pdata -> pressure_max ? : ~0 ,
594
+ 0 , 0 );
595
+ } else {
596
+ input_set_abs_params (input_dev , ABS_X , 0 , MAX_12BIT , 0 , 0 );
597
+ input_set_abs_params (input_dev , ABS_Y , 0 , MAX_12BIT , 0 , 0 );
598
+ touchscreen_parse_properties (input_dev , false);
599
+ if (!input_abs_get_max (input_dev , ABS_PRESSURE )) {
600
+ dev_err (dev , "Touchscreen pressure is not specified\n" );
601
+ return ERR_PTR (- EINVAL );
602
+ }
603
+ }
565
604
566
605
err = ad7879_write (ts , AD7879_REG_CTRL2 , AD7879_RESET );
567
606
if (err < 0 ) {
568
607
dev_err (dev , "Failed to write %s\n" , input_dev -> name );
569
- goto err_free_mem ;
608
+ return ERR_PTR ( err ) ;
570
609
}
571
610
572
611
revid = ad7879_read (ts , AD7879_REG_REVID );
@@ -575,8 +614,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
575
614
if (input_dev -> id .product != devid ) {
576
615
dev_err (dev , "Failed to probe %s (%x vs %x)\n" ,
577
616
input_dev -> name , devid , revid );
578
- err = - ENODEV ;
579
- goto err_free_mem ;
617
+ return ERR_PTR (- ENODEV );
580
618
}
581
619
582
620
ts -> cmd_crtl3 = AD7879_YPLUS_BIT |
@@ -596,23 +634,25 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
596
634
AD7879_ACQ (ts -> acquisition_time ) |
597
635
AD7879_TMR (ts -> pen_down_acc_interval );
598
636
599
- err = request_threaded_irq ( ts -> irq , NULL , ad7879_irq ,
600
- IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
601
- dev_name (dev ), ts );
637
+ err = devm_request_threaded_irq ( dev , ts -> irq , NULL , ad7879_irq ,
638
+ IRQF_TRIGGER_FALLING | IRQF_ONESHOT ,
639
+ dev_name (dev ), ts );
602
640
if (err ) {
603
- dev_err (dev , "irq %d busy? \n" , ts -> irq );
604
- goto err_free_mem ;
641
+ dev_err (dev , "Failed to request IRQ: %d \n" , err );
642
+ return ERR_PTR ( err ) ;
605
643
}
606
644
607
645
__ad7879_disable (ts );
608
646
609
647
err = sysfs_create_group (& dev -> kobj , & ad7879_attr_group );
610
648
if (err )
611
- goto err_free_irq ;
649
+ goto err_out ;
612
650
613
- err = ad7879_gpio_add (ts , pdata );
614
- if (err )
615
- goto err_remove_attr ;
651
+ if (pdata ) {
652
+ err = ad7879_gpio_add (ts , pdata );
653
+ if (err )
654
+ goto err_remove_attr ;
655
+ }
616
656
617
657
err = input_register_device (input_dev );
618
658
if (err )
@@ -624,11 +664,6 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
624
664
ad7879_gpio_remove (ts );
625
665
err_remove_attr :
626
666
sysfs_remove_group (& dev -> kobj , & ad7879_attr_group );
627
- err_free_irq :
628
- free_irq (ts -> irq , ts );
629
- err_free_mem :
630
- input_free_device (input_dev );
631
- kfree (ts );
632
667
err_out :
633
668
return ERR_PTR (err );
634
669
}
@@ -638,9 +673,6 @@ void ad7879_remove(struct ad7879 *ts)
638
673
{
639
674
ad7879_gpio_remove (ts );
640
675
sysfs_remove_group (& ts -> dev -> kobj , & ad7879_attr_group );
641
- free_irq (ts -> irq , ts );
642
- input_unregister_device (ts -> input );
643
- kfree (ts );
644
676
}
645
677
EXPORT_SYMBOL (ad7879_remove );
646
678
0 commit comments