@@ -2693,9 +2693,9 @@ static int pmbus_init_common(struct i2c_client *client, struct pmbus_data *data,
26932693 return 0 ;
26942694}
26952695
2696- /* A PMBus status flag and the corresponding REGULATOR_ERROR_* flag */
2696+ /* A PMBus status flag and the corresponding REGULATOR_ERROR_* and REGULATOR_EVENTS_* flag */
26972697struct pmbus_status_assoc {
2698- int pflag , rflag ;
2698+ int pflag , rflag , eflag ;
26992699};
27002700
27012701/* PMBus->regulator bit mappings for a PMBus status register */
@@ -2710,27 +2710,36 @@ static const struct pmbus_status_category __maybe_unused pmbus_status_flag_map[]
27102710 .func = PMBUS_HAVE_STATUS_VOUT ,
27112711 .reg = PMBUS_STATUS_VOUT ,
27122712 .bits = (const struct pmbus_status_assoc []) {
2713- { PB_VOLTAGE_UV_WARNING , REGULATOR_ERROR_UNDER_VOLTAGE_WARN },
2714- { PB_VOLTAGE_UV_FAULT , REGULATOR_ERROR_UNDER_VOLTAGE },
2715- { PB_VOLTAGE_OV_WARNING , REGULATOR_ERROR_OVER_VOLTAGE_WARN },
2716- { PB_VOLTAGE_OV_FAULT , REGULATOR_ERROR_REGULATION_OUT },
2713+ { PB_VOLTAGE_UV_WARNING , REGULATOR_ERROR_UNDER_VOLTAGE_WARN ,
2714+ REGULATOR_EVENT_UNDER_VOLTAGE_WARN },
2715+ { PB_VOLTAGE_UV_FAULT , REGULATOR_ERROR_UNDER_VOLTAGE ,
2716+ REGULATOR_EVENT_UNDER_VOLTAGE },
2717+ { PB_VOLTAGE_OV_WARNING , REGULATOR_ERROR_OVER_VOLTAGE_WARN ,
2718+ REGULATOR_EVENT_OVER_VOLTAGE_WARN },
2719+ { PB_VOLTAGE_OV_FAULT , REGULATOR_ERROR_REGULATION_OUT ,
2720+ REGULATOR_EVENT_OVER_VOLTAGE_WARN },
27172721 { },
27182722 },
27192723 }, {
27202724 .func = PMBUS_HAVE_STATUS_IOUT ,
27212725 .reg = PMBUS_STATUS_IOUT ,
27222726 .bits = (const struct pmbus_status_assoc []) {
2723- { PB_IOUT_OC_WARNING , REGULATOR_ERROR_OVER_CURRENT_WARN },
2724- { PB_IOUT_OC_FAULT , REGULATOR_ERROR_OVER_CURRENT },
2725- { PB_IOUT_OC_LV_FAULT , REGULATOR_ERROR_OVER_CURRENT },
2727+ { PB_IOUT_OC_WARNING , REGULATOR_ERROR_OVER_CURRENT_WARN ,
2728+ REGULATOR_EVENT_OVER_CURRENT_WARN },
2729+ { PB_IOUT_OC_FAULT , REGULATOR_ERROR_OVER_CURRENT ,
2730+ REGULATOR_EVENT_OVER_CURRENT },
2731+ { PB_IOUT_OC_LV_FAULT , REGULATOR_ERROR_OVER_CURRENT ,
2732+ REGULATOR_EVENT_OVER_CURRENT },
27262733 { },
27272734 },
27282735 }, {
27292736 .func = PMBUS_HAVE_STATUS_TEMP ,
27302737 .reg = PMBUS_STATUS_TEMPERATURE ,
27312738 .bits = (const struct pmbus_status_assoc []) {
2732- { PB_TEMP_OT_WARNING , REGULATOR_ERROR_OVER_TEMP_WARN },
2733- { PB_TEMP_OT_FAULT , REGULATOR_ERROR_OVER_TEMP },
2739+ { PB_TEMP_OT_WARNING , REGULATOR_ERROR_OVER_TEMP_WARN ,
2740+ REGULATOR_EVENT_OVER_TEMP_WARN },
2741+ { PB_TEMP_OT_FAULT , REGULATOR_ERROR_OVER_TEMP ,
2742+ REGULATOR_EVENT_OVER_TEMP },
27342743 { },
27352744 },
27362745 },
@@ -2790,7 +2799,7 @@ static void pmbus_notify(struct pmbus_data *data, int page, int reg, int flags)
27902799}
27912800
27922801static int _pmbus_get_flags (struct pmbus_data * data , u8 page , unsigned int * flags ,
2793- bool notify )
2802+ unsigned int * event , bool notify )
27942803{
27952804 int i , status ;
27962805 const struct pmbus_status_category * cat ;
@@ -2800,6 +2809,7 @@ static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flag
28002809 int func = data -> info -> func [page ];
28012810
28022811 * flags = 0 ;
2812+ * event = 0 ;
28032813
28042814 for (i = 0 ; i < ARRAY_SIZE (pmbus_status_flag_map ); i ++ ) {
28052815 cat = & pmbus_status_flag_map [i ];
@@ -2810,10 +2820,11 @@ static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flag
28102820 if (status < 0 )
28112821 return status ;
28122822
2813- for (bit = cat -> bits ; bit -> pflag ; bit ++ ) {
2814- if (status & bit -> pflag )
2823+ for (bit = cat -> bits ; bit -> pflag ; bit ++ )
2824+ if (status & bit -> pflag ) {
28152825 * flags |= bit -> rflag ;
2816- }
2826+ * event |= bit -> eflag ;
2827+ }
28172828
28182829 if (notify && status )
28192830 pmbus_notify (data , page , cat -> reg , status );
@@ -2834,40 +2845,51 @@ static int _pmbus_get_flags(struct pmbus_data *data, u8 page, unsigned int *flag
28342845 return status ;
28352846
28362847 if (_pmbus_is_enabled (dev , page )) {
2837- if (status & PB_STATUS_OFF )
2848+ if (status & PB_STATUS_OFF ) {
28382849 * flags |= REGULATOR_ERROR_FAIL ;
2850+ * event |= REGULATOR_EVENT_FAIL ;
2851+ }
28392852
2840- if (status & PB_STATUS_POWER_GOOD_N )
2853+ if (status & PB_STATUS_POWER_GOOD_N ) {
28412854 * flags |= REGULATOR_ERROR_REGULATION_OUT ;
2855+ * event |= REGULATOR_EVENT_REGULATION_OUT ;
2856+ }
28422857 }
28432858 /*
28442859 * Unlike most other status bits, PB_STATUS_{IOUT_OC,VOUT_OV} are
28452860 * defined strictly as fault indicators (not warnings).
28462861 */
2847- if (status & PB_STATUS_IOUT_OC )
2862+ if (status & PB_STATUS_IOUT_OC ) {
28482863 * flags |= REGULATOR_ERROR_OVER_CURRENT ;
2849- if (status & PB_STATUS_VOUT_OV )
2864+ * event |= REGULATOR_EVENT_OVER_CURRENT ;
2865+ }
2866+ if (status & PB_STATUS_VOUT_OV ) {
28502867 * flags |= REGULATOR_ERROR_REGULATION_OUT ;
2868+ * event |= REGULATOR_EVENT_FAIL ;
2869+ }
28512870
28522871 /*
28532872 * If we haven't discovered any thermal faults or warnings via
28542873 * PMBUS_STATUS_TEMPERATURE, map PB_STATUS_TEMPERATURE to a warning as
28552874 * a (conservative) best-effort interpretation.
28562875 */
28572876 if (!(* flags & (REGULATOR_ERROR_OVER_TEMP | REGULATOR_ERROR_OVER_TEMP_WARN )) &&
2858- (status & PB_STATUS_TEMPERATURE ))
2877+ (status & PB_STATUS_TEMPERATURE )) {
28592878 * flags |= REGULATOR_ERROR_OVER_TEMP_WARN ;
2879+ * event |= REGULATOR_EVENT_OVER_TEMP_WARN ;
2880+ }
2881+
28602882
28612883 return 0 ;
28622884}
28632885
28642886static int __maybe_unused pmbus_get_flags (struct pmbus_data * data , u8 page , unsigned int * flags ,
2865- bool notify )
2887+ unsigned int * event , bool notify )
28662888{
28672889 int ret ;
28682890
28692891 mutex_lock (& data -> update_lock );
2870- ret = _pmbus_get_flags (data , page , flags , notify );
2892+ ret = _pmbus_get_flags (data , page , flags , event , notify );
28712893 mutex_unlock (& data -> update_lock );
28722894
28732895 return ret ;
@@ -2911,8 +2933,9 @@ static int pmbus_regulator_get_error_flags(struct regulator_dev *rdev, unsigned
29112933 struct device * dev = rdev_get_dev (rdev );
29122934 struct i2c_client * client = to_i2c_client (dev -> parent );
29132935 struct pmbus_data * data = i2c_get_clientdata (client );
2936+ int event ;
29142937
2915- return pmbus_get_flags (data , rdev_get_id (rdev ), flags , false);
2938+ return pmbus_get_flags (data , rdev_get_id (rdev ), flags , & event , false);
29162939}
29172940
29182941static int pmbus_regulator_get_status (struct regulator_dev * rdev )
@@ -3152,10 +3175,11 @@ static irqreturn_t pmbus_fault_handler(int irq, void *pdata)
31523175{
31533176 struct pmbus_data * data = pdata ;
31543177 struct i2c_client * client = to_i2c_client (data -> dev );
3155- int i , status ;
3178+
3179+ int i , status , event ;
31563180 mutex_lock (& data -> update_lock );
31573181 for (i = 0 ; i < data -> info -> pages ; i ++ )
3158- _pmbus_get_flags (data , i , & status , true);
3182+ _pmbus_get_flags (data , i , & status , & event , true);
31593183
31603184 pmbus_clear_faults (client );
31613185 mutex_unlock (& data -> update_lock );
0 commit comments