diff options
Diffstat (limited to 'drivers/rtc/rtc-ac100.c')
| -rw-r--r-- | drivers/rtc/rtc-ac100.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-ac100.c b/drivers/rtc/rtc-ac100.c index 8ff9dc3fe5bf..3fe576fdd45e 100644 --- a/drivers/rtc/rtc-ac100.c +++ b/drivers/rtc/rtc-ac100.c @@ -183,7 +183,29 @@ static int ac100_clkout_determine_rate(struct clk_hw *hw,  	for (i = 0; i < num_parents; i++) {  		struct clk_hw *parent = clk_hw_get_parent_by_index(hw, i); -		unsigned long tmp, prate = clk_hw_get_rate(parent); +		unsigned long tmp, prate; + +		/* +		 * The clock has two parents, one is a fixed clock which is +		 * internally registered by the ac100 driver. The other parent +		 * is a clock from the codec side of the chip, which we +		 * properly declare and reference in the devicetree and is +		 * not implemented in any driver right now. +		 * If the clock core looks for the parent of that second +		 * missing clock, it can't find one that is registered and +		 * returns NULL. +		 * So we end up in a situation where clk_hw_get_num_parents +		 * returns the amount of clocks we can be parented to, but +		 * clk_hw_get_parent_by_index will not return the orphan +		 * clocks. +		 * Thus we need to check if the parent exists before +		 * we get the parent rate, so we could use the RTC +		 * without waiting for the codec to be supported. +		 */ +		if (!parent) +			continue; + +		prate = clk_hw_get_rate(parent);  		tmp = ac100_clkout_round_rate(hw, req->rate, prate); @@ -387,7 +409,7 @@ static int ac100_rtc_get_time(struct device *dev, struct rtc_time *rtc_tm)  	rtc_tm->tm_year = bcd2bin(reg[6] & AC100_RTC_YEA_MASK) +  			  AC100_YEAR_OFF; -	return rtc_valid_tm(rtc_tm); +	return 0;  }  static int ac100_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm)  | 
