2015-03-19 9 views
1

Я пишу драйвер Линукс и нужно определить следующие часы-дерево в виде дерева устройства файла:Как определить мультиплексор часов в дереве устройств в ядре Linux

linux, common clock framework, clock tree

Примечание: Выбор генератор в мультиплексоре осуществляется путем вытягивания выходного сигнала высокого или низкого уровня. Генератор тактовых импульсов запрограммирован через I2C.

Вот пример того, что я до сих пор:

clocks { 
    /* fixed clock oscillators */ 
    osc22: oscillator22 { 
     compatible = "fixed-clock"; 
     #clock-cells = <0>; 
     clock-frequency = <22579200>; 
    }; 

    osc24: oscillator24 { 
     compatible = "fixed-clock"; 
     #clock-cells = <0>; 
     clock-frequency = <24576000>; 
    }; 

    /* clock multiplexer 
    * I'm afraid the following is not going to work :(? 
    */ 
    mux: multiplexer { 
     compatible = "mux-clock";  /* <-------- ??? */ 
     clocks = <&osc22>, <&osc24>; /* parent clocks */ 
    }; 
}; 

i2c1 { 
    /* clock generator */ 
    si5351: [email protected] { 
     #address-cells = <1>; 
     #size-cells = <0>; 
     #clock-cells = <1>; 
     compatible = "silabs,si5351c"; 
     reg = <0x60>; 
     clocks = <0>, <&mux>; 
     clock-names = "xtal", "clkin"; 
     status = "okay"; 

     clkout0 { 
      reg = <0>; 
      silabs,disable-state = <2>; 
      silabs,clock-source = <3>; 
     }; 
    }; 
}; 

Ссылки:

Как определить простой тактовый мультиплексор gpio- в дереве устройств?

ответ

1

Как правильно указал @ h3n, во время запроса этого вопроса ядро ​​не обеспечивало поддержку мультиплексоров с контролем частоты gpio. Итак, я должен был добавить общий тактовый драйвер для таких устройств.

Этот водитель (drivers/clk/clk-gpio.c) находится на главной линии с 4.3-rc1.

Дерево устройства для связывания указанных выше потребительных случае может выглядеть следующим образом:

clocks { 
    /* fixed clock oscillators */ 
    osc22: oscillator22 { 
     compatible = "fixed-clock"; 
     #clock-cells = <0>; 
     clock-frequency = <22579200>; 
    }; 

    osc24: oscillator24 { 
     compatible = "fixed-clock"; 
     #clock-cells = <0>; 
     clock-frequency = <24576000>; 
    }; 

    /* gpio-controlled clock multiplexer */ 
    mux: multiplexer { 
     compatible = "gpio-mux-clock"; 
     clocks = <&osc22>, <&osc24>; /* parent clocks */ 
     #clock-cells = <0>; 
     select-gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; 
    }; 
}; 
1

Простой ответ: вам не нужно иметь поддержку дерева устройств для мультиплексирования часов. Идея, насколько я могу судить, - предоставить API, который может использовать ваш драйвер часов, чтобы выбрать родительские часы.

Если вы видите код драйвера Silicon Labs si5351c (drivers/clk/clk-si5351.c), у него есть поддержка дерева устройств. Documentation/devicetree/bindings/clock/silabs,si5351.txt - подробное описание разрешенных полей. Думаю, вам нужно определить как можно больше clkin.

+0

Спасибо за ваш ответ. Si5351c имеет две ссылки на часы, xtal и clkin. Первые часы из списка часов DT используются как xtal ref, второй - как clkin ref, другие будут проигнорированы. Изменение родительских часов для clkin во время выполнения с использованием 'clk_set_parent()' не выполняется. – sergej

+0

Функция 'si5351_pll_set_parent' делает фактическое повторение. Я не знаю конкретного случая использования, с которым вы боретесь, хотя из драйвера я могу сказать, что поставщик часов для точного устройства может вызывать 'clk_set_parent()' для повторения часов. – 0andriy

1

Текущее ядро ​​не поддерживает это. Вы должны написать свой собственный модуль ядра.

1

Мультиплексор может использоваться для выбора одного из родительских часов: osc22 или osc24. НО вам нужно написать собственное привязку для свойства «mux-clock» в вашем драйвере.

Я не знаю, если ниже ссылка может помочь вам напрямую, но посмотрите на него: https://www.kernel.org/doc/Documentation/devicetree/bindings/clock/ti/mux.txt

Выше ссылка определяет мультиплексор связывания для использования в DT

Здесь Мультиплексор связывания " ti, mux-clock "определяется в драйвере согласно общей структуре clk: http://lxr.free-electrons.com/source/drivers/clk/ti/mux.c

Может быть, вы можете получить представление о том, как реализовать привязку.