/* Number of CTI signals in the v8 architecturally defined connection */ #define NR_V8PE_IN_SIGS 2 #define NR_V8PE_OUT_SIGS 3 #define NR_V8ETM_INOUT_SIGS 4
root_fwnode = dev_fwnode(dev); if (IS_ERR_OR_NULL(root_fwnode)) return -EINVAL;
/* Can optionally have an etm node - return if not */
cs_fwnode = fwnode_find_reference(root_fwnode, CTI_DT_CSDEV_ASSOC, 0); if (IS_ERR(cs_fwnode)) return0;
/* allocate an array according to number of signals in connection */
nr_sigs = tgrp->nr_sigs; if (!nr_sigs) return0;
/* see if any types have been included in the device description */
items = cti_plat_count_sig_elements(fwnode, type_name); if (items > nr_sigs) return -EINVAL;
/* need an array to store the values iff there are any */ if (items) {
values = kcalloc(items, sizeof(u32), GFP_KERNEL); if (!values) return -ENOMEM;
/* look to see how many in and out signals we have */
nr_sigs_in = cti_plat_count_sig_elements(fwnode, CTI_DT_TRIGIN_SIGS);
nr_sigs_out = cti_plat_count_sig_elements(fwnode, CTI_DT_TRIGOUT_SIGS);
if ((nr_sigs_in > drvdata->config.nr_trig_max) ||
(nr_sigs_out > drvdata->config.nr_trig_max)) return -EINVAL;
tc = cti_allocate_trig_con(dev, nr_sigs_in, nr_sigs_out); if (!tc) return -ENOMEM;
/* look for the signals properties. */
err = cti_plat_read_trig_group(tc->con_in, fwnode,
CTI_DT_TRIGIN_SIGS); if (err) goto create_con_err;
err = cti_plat_read_trig_types(tc->con_in, fwnode,
CTI_DT_TRIGIN_TYPES); if (err) goto create_con_err;
err = cti_plat_read_trig_group(tc->con_out, fwnode,
CTI_DT_TRIGOUT_SIGS); if (err) goto create_con_err;
err = cti_plat_read_trig_types(tc->con_out, fwnode,
CTI_DT_TRIGOUT_TYPES); if (err) goto create_con_err;
err = cti_plat_process_filter_sigs(drvdata, fwnode); if (err) goto create_con_err;
/* read the connection name if set - may be overridden by later */
fwnode_property_read_string(fwnode, CTI_DT_CONN_NAME, &assoc_name);
if (IS_ERR_OR_NULL(dev_fwnode(dev))) return -EINVAL;
device_for_each_child_node_scoped(dev, child) { if (cti_plat_node_name_eq(child, CTI_DT_CONNS))
rc = cti_plat_create_connection(dev, drvdata, child); if (rc != 0) break;
}
return rc;
}
/* get the hardware configuration & connection data. */ staticint cti_plat_get_hw_data(struct device *dev, struct cti_drvdata *drvdata)
{ int rc = 0; struct cti_device *cti_dev = &drvdata->ctidev;
/* get any CTM ID - defaults to 0 */
device_property_read_u32(dev, CTI_DT_CTM_ID, &cti_dev->ctm_id);
/* check for a v8 architectural CTI device */ if (cti_plat_check_v8_arch_compatible(dev))
rc = cti_plat_create_v8_connections(dev, drvdata); else
rc = cti_plat_create_impdef_connections(dev, drvdata); if (rc) return rc;
/* if no connections, just add a single default based on max IN-OUT */ if (cti_dev->nr_trig_con == 0)
rc = cti_add_default_connection(dev, drvdata); return rc;
}
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.