
Hi Stephen,
Subject: [PATCH v1 2/2] clk: at91: Add .ops callback for clk_generic
To avoid the wild pointer as NULL->of_xlate, add an empty .ops callback for the clk_generic driver.
This shouldn't be needed. If this driver isn't a clock provider, and it cannot be a clock provider without implementing and clock ops, then nothing should be calling of_xlate through its ops pointer, and the driver shouldn't be a UCLASS_CLK.
The Atmel clock tree structure has some difference, take the following spi0 node as an example. The 'spi0' node use the 'clocks' phandle to refer to the 'spi0_clk' node to enable its clock.
The 'spi0_clk' doesn't provide .ops->enable(), only its peripheral ID via 'reg' property. It uses its parent node (i.e. periph32ck) .ops->enable(), shared with other sibling nodes.
These nodes as 'spi0_clk' don't have .compatible, which is bound with the 'clk_generic' driver. If not provide .ops for the 'clk_generic' driver, it will produce the wild pointer as NULL->of_xlate when call clk_get_by_index() in the spi driver.
periph32ck { compatible = "atmel,at91sam9x5-clk-peripheral"; #address-cells = <1>; #size-cells = <0>; clocks = <&h32ck>;
[snip]
twi0_clk: twi0_clk { reg = <29>; #clock-cells = <0>; atmel,clk-output-range = <0 83000000>; };
[snip]
spi0_clk: spi0_clk { #clock-cells = <0>; reg = <33>; atmel,clk-output-range = <0 83000000>; };
[snip]
};
[snip] spi0: spi@f8000000 { compatible = "atmel,at91rm9200-spi"; reg = <0xf8000000 0x100>; clocks = <&spi0_clk>; clock-names = "spi_clk"; };
Thanks.
Best Regards, Wenyou Yang