Re: [PATCH] rtc: sun6i: Always export the internal oscillator

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andre,

On 12/29/22 17:17, Andre Przywara wrote:
> On Thu, 29 Dec 2022 15:53:19 -0600
> Samuel Holland <samuel@xxxxxxxxxxxx> wrote:
> 
> Hi Samuel,
> 
>> On all variants of the hardware, the internal oscillator is one possible
>> parent for the AR100 clock. It needs to be exported so we can model that
>> relationship correctly in the devicetree.
> 
> So do you plan to use this third clock on any SoCs that don't export it
> yet, like the R40 or V3s, or the older SoCs? This would then create a

I am targeting A31 and A23/A33 with this change, so I can correct those
devicetrees. Currently A31 has the wrong fourth parent for its AR100
clock, and A23/A33 models it completely wrong as a fixed-factor clock.

I have ported Crust to A23/A33, and it sets the AR100 parent to IOSC at
boot (just like on other SoCs), so it doesn't have to change the parent
during suspend/resume. But because the AR100 clock is modeled wrong in
Linux, Linux thinks the APB0 clock is running much faster than it really
is, and sets a totally wrong divider in the RSB controller, which breaks
the RSB bus.

> non-compatible DT change, wouldn't it? Since existing/older kernels
> cannot resolve clock index 2?

With the current patch contents, I expect this change to be backported
as far as 5.4. If I set ".export_iosc = 1" for A31 and A23/A33 instead
of entirely removing the flag, it could be backported further. So that
somewhat mitigates the issue.

The other option would be to add IOSC as a fixed clock in the DT, and
use that as the AR100 parent. We would still want to make this change
now, so we could eventually clean up the DT.

> Or would that not be used by kernels, or would not be fatal?

It might not be fatal if the AR100 clock isn't set to its IOSC parent. I
would have to test this.

Regards,
Samuel

> 
> Cheers,
> Andre
> 
>> Fixes: c56afc1844d6 ("rtc: sun6i: Expose internal oscillator through device tree")
>> Signed-off-by: Samuel Holland <samuel@xxxxxxxxxxxx>
>> ---
>> This patch should be applied before [1] so this patch can be backported.
>> [1]: https://lore.kernel.org/linux-rtc/20221229184011.62925-2-samuel@xxxxxxxxxxxx/
>>
>>  drivers/rtc/rtc-sun6i.c | 16 ++++------------
>>  1 file changed, 4 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
>> index ed5516089e9a..7038f47d77ff 100644
>> --- a/drivers/rtc/rtc-sun6i.c
>> +++ b/drivers/rtc/rtc-sun6i.c
>> @@ -136,7 +136,6 @@ struct sun6i_rtc_clk_data {
>>  	unsigned int fixed_prescaler : 16;
>>  	unsigned int has_prescaler : 1;
>>  	unsigned int has_out_clk : 1;
>> -	unsigned int export_iosc : 1;
>>  	unsigned int has_losc_en : 1;
>>  	unsigned int has_auto_swt : 1;
>>  };
>> @@ -271,10 +270,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
>>  	/* Yes, I know, this is ugly. */
>>  	sun6i_rtc = rtc;
>>  
>> -	/* Only read IOSC name from device tree if it is exported */
>> -	if (rtc->data->export_iosc)
>> -		of_property_read_string_index(node, "clock-output-names", 2,
>> -					      &iosc_name);
>> +	of_property_read_string_index(node, "clock-output-names", 2,
>> +				      &iosc_name);
>>  
>>  	rtc->int_osc = clk_hw_register_fixed_rate_with_accuracy(NULL,
>>  								iosc_name,
>> @@ -315,13 +312,10 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
>>  		goto err_register;
>>  	}
>>  
>> -	clk_data->num = 2;
>> +	clk_data->num = 3;
>>  	clk_data->hws[0] = &rtc->hw;
>>  	clk_data->hws[1] = __clk_get_hw(rtc->ext_losc);
>> -	if (rtc->data->export_iosc) {
>> -		clk_data->hws[2] = rtc->int_osc;
>> -		clk_data->num = 3;
>> -	}
>> +	clk_data->hws[2] = rtc->int_osc;
>>  	of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
>>  	return;
>>  
>> @@ -361,7 +355,6 @@ static const struct sun6i_rtc_clk_data sun8i_h3_rtc_data = {
>>  	.fixed_prescaler = 32,
>>  	.has_prescaler = 1,
>>  	.has_out_clk = 1,
>> -	.export_iosc = 1,
>>  };
>>  
>>  static void __init sun8i_h3_rtc_clk_init(struct device_node *node)
>> @@ -379,7 +372,6 @@ static const struct sun6i_rtc_clk_data sun50i_h6_rtc_data = {
>>  	.fixed_prescaler = 32,
>>  	.has_prescaler = 1,
>>  	.has_out_clk = 1,
>> -	.export_iosc = 1,
>>  	.has_losc_en = 1,
>>  	.has_auto_swt = 1,
>>  };
> 




[Index of Archives]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux