21
21
#define DA9062_REG_EVENT_B_OFFSET 1
22
22
#define DA9062_REG_EVENT_C_OFFSET 2
23
23
24
+ #define DA9062_IRQ_LOW 0
25
+ #define DA9062_IRQ_HIGH 1
26
+
24
27
static struct regmap_irq da9061_irqs [] = {
25
28
/* EVENT A */
26
29
[DA9061_IRQ_ONKEY ] = {
@@ -369,6 +372,33 @@ static int da9062_get_device_type(struct da9062 *chip)
369
372
return ret ;
370
373
}
371
374
375
+ static u32 da9062_configure_irq_type (struct da9062 * chip , int irq , u32 * trigger )
376
+ {
377
+ u32 irq_type = 0 ;
378
+ struct irq_data * irq_data = irq_get_irq_data (irq );
379
+
380
+ if (!irq_data ) {
381
+ dev_err (chip -> dev , "Invalid IRQ: %d\n" , irq );
382
+ return - EINVAL ;
383
+ }
384
+ * trigger = irqd_get_trigger_type (irq_data );
385
+
386
+ switch (* trigger ) {
387
+ case IRQ_TYPE_LEVEL_HIGH :
388
+ irq_type = DA9062_IRQ_HIGH ;
389
+ break ;
390
+ case IRQ_TYPE_LEVEL_LOW :
391
+ irq_type = DA9062_IRQ_LOW ;
392
+ break ;
393
+ default :
394
+ dev_warn (chip -> dev , "Unsupported IRQ type: %d\n" , * trigger );
395
+ return - EINVAL ;
396
+ }
397
+ return regmap_update_bits (chip -> regmap , DA9062AA_CONFIG_A ,
398
+ DA9062AA_IRQ_TYPE_MASK ,
399
+ irq_type << DA9062AA_IRQ_TYPE_SHIFT );
400
+ }
401
+
372
402
static const struct regmap_range da9061_aa_readable_ranges [] = {
373
403
regmap_reg_range (DA9062AA_PAGE_CON , DA9062AA_STATUS_B ),
374
404
regmap_reg_range (DA9062AA_STATUS_D , DA9062AA_EVENT_C ),
@@ -388,6 +418,7 @@ static const struct regmap_range da9061_aa_readable_ranges[] = {
388
418
regmap_reg_range (DA9062AA_VBUCK1_A , DA9062AA_VBUCK4_A ),
389
419
regmap_reg_range (DA9062AA_VBUCK3_A , DA9062AA_VBUCK3_A ),
390
420
regmap_reg_range (DA9062AA_VLDO1_A , DA9062AA_VLDO4_A ),
421
+ regmap_reg_range (DA9062AA_CONFIG_A , DA9062AA_CONFIG_A ),
391
422
regmap_reg_range (DA9062AA_VBUCK1_B , DA9062AA_VBUCK4_B ),
392
423
regmap_reg_range (DA9062AA_VBUCK3_B , DA9062AA_VBUCK3_B ),
393
424
regmap_reg_range (DA9062AA_VLDO1_B , DA9062AA_VLDO4_B ),
@@ -417,6 +448,7 @@ static const struct regmap_range da9061_aa_writeable_ranges[] = {
417
448
regmap_reg_range (DA9062AA_VBUCK1_A , DA9062AA_VBUCK4_A ),
418
449
regmap_reg_range (DA9062AA_VBUCK3_A , DA9062AA_VBUCK3_A ),
419
450
regmap_reg_range (DA9062AA_VLDO1_A , DA9062AA_VLDO4_A ),
451
+ regmap_reg_range (DA9062AA_CONFIG_A , DA9062AA_CONFIG_A ),
420
452
regmap_reg_range (DA9062AA_VBUCK1_B , DA9062AA_VBUCK4_B ),
421
453
regmap_reg_range (DA9062AA_VBUCK3_B , DA9062AA_VBUCK3_B ),
422
454
regmap_reg_range (DA9062AA_VLDO1_B , DA9062AA_VLDO4_B ),
@@ -596,6 +628,7 @@ static int da9062_i2c_probe(struct i2c_client *i2c,
596
628
const struct regmap_irq_chip * irq_chip ;
597
629
const struct regmap_config * config ;
598
630
int cell_num ;
631
+ u32 trigger_type = 0 ;
599
632
int ret ;
600
633
601
634
chip = devm_kzalloc (& i2c -> dev , sizeof (* chip ), GFP_KERNEL );
@@ -654,10 +687,15 @@ static int da9062_i2c_probe(struct i2c_client *i2c,
654
687
if (ret )
655
688
return ret ;
656
689
690
+ ret = da9062_configure_irq_type (chip , i2c -> irq , & trigger_type );
691
+ if (ret < 0 ) {
692
+ dev_err (chip -> dev , "Failed to configure IRQ type\n" );
693
+ return ret ;
694
+ }
695
+
657
696
ret = regmap_add_irq_chip (chip -> regmap , i2c -> irq ,
658
- IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED ,
659
- -1 , irq_chip ,
660
- & chip -> regmap_irq );
697
+ trigger_type | IRQF_SHARED | IRQF_ONESHOT ,
698
+ -1 , irq_chip , & chip -> regmap_irq );
661
699
if (ret ) {
662
700
dev_err (chip -> dev , "Failed to request IRQ %d: %d\n" ,
663
701
i2c -> irq , ret );
0 commit comments