Наконец дошли руки доковырять борду от стартеркита c at91sam9m10g45ek и портануть на нее распоследнее ядро.
Проблема возникла с фпга, которая сидит на smc шине: по неведомым причинам в моей ревизии платы вместо внешнего тактового генератора используется сигнал с at91 с pck0.
С помощью записи регистров AT91 напрямую удалось запустить клок на фпга и поморгать диодом, поэтому сейчас хочется причесать все это дело.
В ядре 3.19+ АТ91 был неплохо переработан, а вся система клоков заново расписана в device tree, поэтому решил использовать ее. Ок, создаем ноду:
fpga0: fpga@0x10000000 {
compatible = "sk,at91-xc6slx";
status = "okay";
clocks = <&pck0>;
clock-names = "mclk";
};
mclk = devm_clk_get(&pdev->dev, "mclk");
if (IS_ERR(mclk)) {
dev_err(&pdev->dev, "Failed to get MCLK\n");
return ret;
}
unsigned int mclk_rate = clk_get_rate(mclk);
if (!mclk_rate) {
dev_err(&pdev->dev, "Invalid slow clock rate\n");
return -EINVAL;
}
ret = clk_prepare_enable(mclk);
if (ret) {
dev_err(&pdev->dev, "Could not enable mclk clock\n");
return ret;
}
1) pck0 может иметь несколько клок соурсов или делителей, хз как они правильно называются. Определены в родительской ноде:
prog: progck {
compatible = "atmel,at91sam9g45-clk-programmable";
#address-cells = <1>;
#size-cells = <0>;
interrupt-parent = <&pmc>;
clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>;
prog0: prog0 {
#clock-cells = <0>;
reg = <0>;
interrupts = <AT91_PMC_PCKRDY(0)>;
};
prog1: prog1 {
#clock-cells = <0>;
reg = <1>;
interrupts = <AT91_PMC_PCKRDY(1)>;
};
};
2) Кроме того для того, чтобы клок доходил до фпга, необходимо выставить ножку в аутпут режим и periph b. Я так понимаю, это можно сделать с помощью
fpga0 {
pinctrl_fpga_clock: fpga-clk {
atmel,pins = <AT91_PIOE 0 AT91_PERIPH_B AT91_PINCTRL_PULL_UP>;
};
};
...
fpga0: fpga@0x10000000 {
compatible = "sk,at91-xc6slx";
status = "okay";
clocks = <&pck0>;
clock-names = "mclk";
pinctrl-0 = <&pinctrl_fpga_clock>;
};