33
33
#define PCF2127_BIT_CTRL2_TSIE BIT(2)
34
34
#define PCF2127_BIT_CTRL2_AF BIT(4)
35
35
#define PCF2127_BIT_CTRL2_TSF2 BIT(5)
36
+ #define PCF2127_BIT_CTRL2_WDTF BIT(6)
36
37
/* Control register 3 */
37
38
#define PCF2127_REG_CTRL3 0x02
38
39
#define PCF2127_BIT_CTRL3_BLIE BIT(0)
55
56
#define PCF2127_REG_ALARM_HR 0x0C
56
57
#define PCF2127_REG_ALARM_DM 0x0D
57
58
#define PCF2127_REG_ALARM_DW 0x0E
59
+ #define PCF2127_BIT_ALARM_AE BIT(7)
58
60
/* Watchdog registers */
59
61
#define PCF2127_REG_WD_CTL 0x10
60
62
#define PCF2127_BIT_WD_CTL_TF0 BIT(0)
@@ -360,7 +362,6 @@ static int pcf2127_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
360
362
alrm -> time .tm_min = bcd2bin (buf [1 ] & 0x7F );
361
363
alrm -> time .tm_hour = bcd2bin (buf [2 ] & 0x3F );
362
364
alrm -> time .tm_mday = bcd2bin (buf [3 ] & 0x3F );
363
- alrm -> time .tm_wday = buf [4 ] & 0x07 ;
364
365
365
366
return 0 ;
366
367
}
@@ -398,7 +399,7 @@ static int pcf2127_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
398
399
buf [1 ] = bin2bcd (alrm -> time .tm_min );
399
400
buf [2 ] = bin2bcd (alrm -> time .tm_hour );
400
401
buf [3 ] = bin2bcd (alrm -> time .tm_mday );
401
- buf [4 ] = ( alrm -> time . tm_wday & 0x07 );
402
+ buf [4 ] = PCF2127_BIT_ALARM_AE ; /* Do not match on week day */
402
403
403
404
ret = regmap_bulk_write (pcf2127 -> regmap , PCF2127_REG_ALARM_SC , buf ,
404
405
sizeof (buf ));
@@ -418,16 +419,15 @@ static irqreturn_t pcf2127_rtc_irq(int irq, void *dev)
418
419
if (ret )
419
420
return IRQ_NONE ;
420
421
421
- if (ctrl2 & PCF2127_BIT_CTRL2_AF ) {
422
- regmap_write (pcf2127 -> regmap , PCF2127_REG_CTRL2 ,
423
- ctrl2 & ~PCF2127_BIT_CTRL2_AF );
422
+ if (!(ctrl2 & PCF2127_BIT_CTRL2_AF ))
423
+ return IRQ_NONE ;
424
424
425
- rtc_update_irq (pcf2127 -> rtc , 1 , RTC_IRQF | RTC_AF );
426
- }
425
+ regmap_write (pcf2127 -> regmap , PCF2127_REG_CTRL2 ,
426
+ ctrl2 & ~( PCF2127_BIT_CTRL2_AF | PCF2127_BIT_CTRL2_WDTF ));
427
427
428
- ret = pcf2127_wdt_active_ping ( & pcf2127 -> wdd );
429
- if ( ret )
430
- return IRQ_NONE ;
428
+ rtc_update_irq ( pcf2127 -> rtc , 1 , RTC_IRQF | RTC_AF );
429
+
430
+ pcf2127_wdt_active_ping ( & pcf2127 -> wdd ) ;
431
431
432
432
return IRQ_HANDLED ;
433
433
}
@@ -533,10 +533,9 @@ static const struct attribute_group pcf2127_attr_group = {
533
533
};
534
534
535
535
static int pcf2127_probe (struct device * dev , struct regmap * regmap ,
536
- const char * name , bool has_nvmem )
536
+ int alarm_irq , const char * name , bool has_nvmem )
537
537
{
538
538
struct pcf2127 * pcf2127 ;
539
- int alarm_irq = 0 ;
540
539
u32 wdd_timeout ;
541
540
int ret = 0 ;
542
541
@@ -558,12 +557,13 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
558
557
pcf2127 -> rtc -> range_min = RTC_TIMESTAMP_BEGIN_2000 ;
559
558
pcf2127 -> rtc -> range_max = RTC_TIMESTAMP_END_2099 ;
560
559
pcf2127 -> rtc -> set_start_time = true; /* Sets actual start to 1970 */
560
+ pcf2127 -> rtc -> uie_unsupported = 1 ;
561
561
562
- alarm_irq = of_irq_get_byname (dev -> of_node , "alarm" );
563
562
if (alarm_irq >= 0 ) {
564
- ret = devm_request_irq (dev , alarm_irq , pcf2127_rtc_irq ,
565
- IRQF_TRIGGER_LOW | IRQF_ONESHOT ,
566
- dev_name (dev ), dev );
563
+ ret = devm_request_threaded_irq (dev , alarm_irq , NULL ,
564
+ pcf2127_rtc_irq ,
565
+ IRQF_TRIGGER_LOW | IRQF_ONESHOT ,
566
+ dev_name (dev ), dev );
567
567
if (ret ) {
568
568
dev_err (dev , "failed to request alarm irq\n" );
569
569
return ret ;
@@ -792,7 +792,7 @@ static int pcf2127_i2c_probe(struct i2c_client *client,
792
792
return PTR_ERR (regmap );
793
793
}
794
794
795
- return pcf2127_probe (& client -> dev , regmap ,
795
+ return pcf2127_probe (& client -> dev , regmap , client -> irq ,
796
796
pcf2127_i2c_driver .driver .name , id -> driver_data );
797
797
}
798
798
@@ -858,7 +858,8 @@ static int pcf2127_spi_probe(struct spi_device *spi)
858
858
return PTR_ERR (regmap );
859
859
}
860
860
861
- return pcf2127_probe (& spi -> dev , regmap , pcf2127_spi_driver .driver .name ,
861
+ return pcf2127_probe (& spi -> dev , regmap , spi -> irq ,
862
+ pcf2127_spi_driver .driver .name ,
862
863
spi_get_device_id (spi )-> driver_data );
863
864
}
864
865
0 commit comments