diff options
Diffstat (limited to 'drivers/rtc/rtc-opal.c')
| -rw-r--r-- | drivers/rtc/rtc-opal.c | 37 | 
1 files changed, 23 insertions, 14 deletions
diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c index 304e891e35fc..60f2250fd96b 100644 --- a/drivers/rtc/rtc-opal.c +++ b/drivers/rtc/rtc-opal.c @@ -57,7 +57,7 @@ static void tm_to_opal(struct rtc_time *tm, u32 *y_m_d, u64 *h_m_s_ms)  static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)  { -	long rc = OPAL_BUSY; +	s64 rc = OPAL_BUSY;  	int retries = 10;  	u32 y_m_d;  	u64 h_m_s_ms; @@ -66,13 +66,17 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)  	while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {  		rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); -		if (rc == OPAL_BUSY_EVENT) +		if (rc == OPAL_BUSY_EVENT) { +			msleep(OPAL_BUSY_DELAY_MS);  			opal_poll_events(NULL); -		else if (retries-- && (rc == OPAL_HARDWARE -				       || rc == OPAL_INTERNAL_ERROR)) -			msleep(10); -		else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) -			break; +		} else if (rc == OPAL_BUSY) { +			msleep(OPAL_BUSY_DELAY_MS); +		} else if (rc == OPAL_HARDWARE || rc == OPAL_INTERNAL_ERROR) { +			if (retries--) { +				msleep(10); /* Wait 10ms before retry */ +				rc = OPAL_BUSY; /* go around again */ +			} +		}  	}  	if (rc != OPAL_SUCCESS) @@ -87,21 +91,26 @@ static int opal_get_rtc_time(struct device *dev, struct rtc_time *tm)  static int opal_set_rtc_time(struct device *dev, struct rtc_time *tm)  { -	long rc = OPAL_BUSY; +	s64 rc = OPAL_BUSY;  	int retries = 10;  	u32 y_m_d = 0;  	u64 h_m_s_ms = 0;  	tm_to_opal(tm, &y_m_d, &h_m_s_ms); +  	while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {  		rc = opal_rtc_write(y_m_d, h_m_s_ms); -		if (rc == OPAL_BUSY_EVENT) +		if (rc == OPAL_BUSY_EVENT) { +			msleep(OPAL_BUSY_DELAY_MS);  			opal_poll_events(NULL); -		else if (retries-- && (rc == OPAL_HARDWARE -				       || rc == OPAL_INTERNAL_ERROR)) -			msleep(10); -		else if (rc != OPAL_BUSY && rc != OPAL_BUSY_EVENT) -			break; +		} else if (rc == OPAL_BUSY) { +			msleep(OPAL_BUSY_DELAY_MS); +		} else if (rc == OPAL_HARDWARE || rc == OPAL_INTERNAL_ERROR) { +			if (retries--) { +				msleep(10); /* Wait 10ms before retry */ +				rc = OPAL_BUSY; /* go around again */ +			} +		}  	}  	return rc == OPAL_SUCCESS ? 0 : -EIO;  | 
