/** * sun7i_a20_gmac_clk_setup - Setup function for A20/A31 GMAC clock module * @node: &struct device_node for the clock * * This clock looks something like this * ________________________ * MII TX clock from PHY >-----|___________ _________|----> to GMAC core * GMAC Int. RGMII TX clk >----|___________\__/__gate---|----> to PHY * Ext. 125MHz RGMII TX clk >--|__divider__/ | * |________________________| * * The external 125 MHz reference is optional, i.e. GMAC can use its * internal TX clock just fine. The A31 GMAC clock module does not have * the divider controls for the external reference. * * To keep it simple, let the GMAC use either the MII TX clock for MII mode, * and its internal TX clock for GMII and RGMII modes. The GMAC driver should * select the appropriate source and gate/ungate the output to the PHY. * * Only the GMAC should use this clock. Altering the clock so that it doesn't * match the GMAC's operation parameters will result in the GMAC not being * able to send traffic out. The GMAC driver should set the clock rate and * enable/disable this clock to configure the required state. The clock * driver then responds by auto-reparenting the clock.
*/ staticvoid __init sun7i_a20_gmac_clk_setup(struct device_node *node)
{ struct clk *clk; struct clk_mux *mux; struct clk_gate *gate; constchar *clk_name = node->name; constchar *parents[SUN7I_A20_GMAC_PARENTS]; void __iomem *reg;
if (of_property_read_string(node, "clock-output-names", &clk_name)) return;
/* allocate mux and gate clock structs */
mux = kzalloc(sizeof(struct clk_mux), GFP_KERNEL); if (!mux) return;
gate = kzalloc(sizeof(struct clk_gate), GFP_KERNEL); if (!gate) goto free_mux;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.