3333#define PCF2127_BIT_CTRL2_TSIE BIT(2)
3434#define PCF2127_BIT_CTRL2_AF BIT(4)
3535#define PCF2127_BIT_CTRL2_TSF2 BIT(5)
36+ #define PCF2127_BIT_CTRL2_WDTF BIT(6)
3637/* Control register 3 */
3738#define PCF2127_REG_CTRL3 0x02
3839#define PCF2127_BIT_CTRL3_BLIE BIT(0)
5556#define PCF2127_REG_ALARM_HR 0x0C
5657#define PCF2127_REG_ALARM_DM 0x0D
5758#define PCF2127_REG_ALARM_DW 0x0E
59+ #define PCF2127_BIT_ALARM_AE BIT(7)
5860/* Watchdog registers */
5961#define PCF2127_REG_WD_CTL 0x10
6062#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)
360362 alrm -> time .tm_min = bcd2bin (buf [1 ] & 0x7F );
361363 alrm -> time .tm_hour = bcd2bin (buf [2 ] & 0x3F );
362364 alrm -> time .tm_mday = bcd2bin (buf [3 ] & 0x3F );
363- alrm -> time .tm_wday = buf [4 ] & 0x07 ;
364365
365366 return 0 ;
366367}
@@ -398,7 +399,7 @@ static int pcf2127_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
398399 buf [1 ] = bin2bcd (alrm -> time .tm_min );
399400 buf [2 ] = bin2bcd (alrm -> time .tm_hour );
400401 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 */
402403
403404 ret = regmap_bulk_write (pcf2127 -> regmap , PCF2127_REG_ALARM_SC , buf ,
404405 sizeof (buf ));
@@ -418,16 +419,15 @@ static irqreturn_t pcf2127_rtc_irq(int irq, void *dev)
418419 if (ret )
419420 return IRQ_NONE ;
420421
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 ;
424424
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 ));
427427
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 ) ;
431431
432432 return IRQ_HANDLED ;
433433}
@@ -533,10 +533,9 @@ static const struct attribute_group pcf2127_attr_group = {
533533};
534534
535535static 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 )
537537{
538538 struct pcf2127 * pcf2127 ;
539- int alarm_irq = 0 ;
540539 u32 wdd_timeout ;
541540 int ret = 0 ;
542541
@@ -558,12 +557,13 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,
558557 pcf2127 -> rtc -> range_min = RTC_TIMESTAMP_BEGIN_2000 ;
559558 pcf2127 -> rtc -> range_max = RTC_TIMESTAMP_END_2099 ;
560559 pcf2127 -> rtc -> set_start_time = true; /* Sets actual start to 1970 */
560+ pcf2127 -> rtc -> uie_unsupported = 1 ;
561561
562- alarm_irq = of_irq_get_byname (dev -> of_node , "alarm" );
563562 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 );
567567 if (ret ) {
568568 dev_err (dev , "failed to request alarm irq\n" );
569569 return ret ;
@@ -792,7 +792,7 @@ static int pcf2127_i2c_probe(struct i2c_client *client,
792792 return PTR_ERR (regmap );
793793 }
794794
795- return pcf2127_probe (& client -> dev , regmap ,
795+ return pcf2127_probe (& client -> dev , regmap , client -> irq ,
796796 pcf2127_i2c_driver .driver .name , id -> driver_data );
797797}
798798
@@ -858,7 +858,8 @@ static int pcf2127_spi_probe(struct spi_device *spi)
858858 return PTR_ERR (regmap );
859859 }
860860
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 ,
862863 spi_get_device_id (spi )-> driver_data );
863864}
864865
0 commit comments