/* Check if the frequency can be factorized */
rc = zl3073x_ref_freq_factorize(freq, NULL, NULL); if (rc) goto err_inv_freq;
} else {
u32 synth_freq;
u8 out, synth;
/* Get output pin synthesizer */
out = zl3073x_output_pin_out_get(id);
synth = zl3073x_out_synth_get(zldev, out);
/* Get synth frequency */
synth_freq = zl3073x_synth_freq_get(zldev, synth);
/* Check the frequency divides synth frequency */ if (synth_freq % (u32)freq) goto err_inv_freq;
}
returntrue;
err_inv_freq:
dev_warn(zldev->dev, "Unsupported frequency %llu Hz in firmware node\n", freq);
/* Get firmware node for the given pin */
rc = zl3073x_prop_pin_fwnode_get(zldev, props, dir, index); if (rc) return props; /* Return if it does not exist */
/* Look for label property and store the value as board label */
fwnode_property_read_string(props->fwnode, "label",
&props->dpll_props.board_label);
/* Look for pin type property and translate its value to DPLL *pintypeenumifitispresent.
*/ if (!fwnode_property_read_string(props->fwnode, "connection-type",
&type)) { if (!strcmp(type, "ext"))
props->dpll_props.type = DPLL_PIN_TYPE_EXT; elseif (!strcmp(type, "gnss"))
props->dpll_props.type = DPLL_PIN_TYPE_GNSS; elseif (!strcmp(type, "int"))
props->dpll_props.type = DPLL_PIN_TYPE_INT_OSCILLATOR; elseif (!strcmp(type, "synce"))
props->dpll_props.type = DPLL_PIN_TYPE_SYNCE_ETH_PORT; else
dev_warn(zldev->dev, "Unknown or unsupported pin type '%s'\n",
type);
}
/* Check if the pin supports embedded sync control */
props->esync_control = fwnode_property_read_bool(props->fwnode, "esync-control");
/* Read supported frequencies property if it is specified */
num_freqs = fwnode_property_count_u64(props->fwnode, "supported-frequencies-hz"); if (num_freqs <= 0) /* Return if the property does not exist or number is 0 */ return props;
/* The firmware node specifies list of supported frequencies while *DPLLcorepinpropertiesrequireslistoffrequencyranges. *Soreadthefrequencylistintotemporaryarray.
*/
freqs = kcalloc(num_freqs, sizeof(*freqs), GFP_KERNEL); if (!freqs) {
rc = -ENOMEM; goto err_alloc_freqs;
}
/* Read frequencies list from firmware node */
fwnode_property_read_u64_array(props->fwnode, "supported-frequencies-hz", freqs,
num_freqs);
/* Allocate frequency ranges list and fill it */
ranges = kcalloc(num_freqs, sizeof(*ranges), GFP_KERNEL); if (!ranges) {
rc = -ENOMEM; goto err_alloc_ranges;
}
/* Convert list of frequencies to list of frequency ranges but *filter-outfrequenciesthatarenotrepresentablebydevice
*/ for (i = 0, j = 0; i < num_freqs; i++) { struct dpll_pin_frequency freq = DPLL_PIN_FREQUENCY(freqs[i]);
/* Save number of freq ranges and pointer to them into pin properties */
props->dpll_props.freq_supported = ranges;
props->dpll_props.freq_supported_num = j;
/** *zl3073x_pin_props_put-releasepinproperties *@props:pinpropertiestofree * *Thefunctiondeallocatesgivenpinpropertiesstructure.
*/ void zl3073x_pin_props_put(struct zl3073x_pin_props *props)
{ /* Free supported frequency ranges list if it is present */
kfree(props->dpll_props.freq_supported);
/* Put firmware handle if it is present */ if (props->fwnode)
fwnode_handle_put(props->fwnode);
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.