/** * struct cros_feature_to_name - CrOS feature id to name/short description. * @id: The feature identifier. * @name: Device name associated with the feature id. * @desc: Short name that will be displayed.
*/ struct cros_feature_to_name { unsignedint id; constchar *name; constchar *desc;
};
/** * struct cros_feature_to_cells - CrOS feature id to mfd cells association. * @id: The feature identifier. * @mfd_cells: Pointer to the array of mfd cells that needs to be added. * @num_cells: Number of mfd cells into the array.
*/ struct cros_feature_to_cells { unsignedint id; conststruct mfd_cell *mfd_cells; unsignedint num_cells;
};
for (i = 0; i < ARRAY_SIZE(cros_mcu_devices); i++) { /* * Check whether this is actually a dedicated MCU rather * than an standard EC.
*/ if (cros_ec_check_features(ec, cros_mcu_devices[i].id)) {
dev_info(dev, "CrOS %s MCU detected\n",
cros_mcu_devices[i].desc); /* * Help userspace differentiating ECs from other MCU, * regardless of the probing order.
*/
ec_platform->ec_name = cros_mcu_devices[i].name; break;
}
}
/* * Add the class device
*/
ec->class_dev.class = &cros_class;
ec->class_dev.parent = dev;
ec->class_dev.release = cros_ec_class_release;
retval = device_add(&ec->class_dev); if (retval) goto failed;
/* check whether this EC is a sensor hub. */ if (cros_ec_get_sensor_count(ec) > 0) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_ec_sensorhub_cells,
ARRAY_SIZE(cros_ec_sensorhub_cells)); if (retval)
dev_err(ec->dev, "failed to add %s subdevice: %d\n",
cros_ec_sensorhub_cells->name, retval);
}
/* * The following subdevices can be detected by sending the * EC_FEATURE_GET_CMD Embedded Controller device.
*/ for (i = 0; i < ARRAY_SIZE(cros_subdevices); i++) { if (cros_ec_check_features(ec, cros_subdevices[i].id)) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_subdevices[i].mfd_cells,
cros_subdevices[i].num_cells); if (retval)
dev_err(ec->dev, "failed to add %s subdevice: %d\n",
cros_subdevices[i].mfd_cells->name,
retval);
}
}
/* * UCSI provides power supply information so we don't need to separately * load the cros_usbpd_charger driver.
*/ if (cros_ec_check_features(ec, EC_FEATURE_USB_PD) &&
!cros_ec_check_features(ec, EC_FEATURE_UCSI_PPM)) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_usbpd_charger_cells,
ARRAY_SIZE(cros_usbpd_charger_cells));
if (retval)
dev_warn(ec->dev, "failed to add usbpd-charger: %d\n",
retval);
}
/* * Lightbar is a special case. Newer devices support autodetection, * but older ones do not.
*/ if (cros_ec_check_features(ec, EC_FEATURE_LIGHTBAR) ||
dmi_match(DMI_PRODUCT_NAME, "Link")) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_ec_lightbar_cells,
ARRAY_SIZE(cros_ec_lightbar_cells)); if (retval)
dev_warn(ec->dev, "failed to add lightbar: %d\n",
retval);
}
/* * The PD notifier driver cell is separate since it only needs to be * explicitly added on platforms that don't have the PD notifier ACPI * device entry defined.
*/ if (IS_ENABLED(CONFIG_OF) && ec->ec_dev->dev->of_node) { if (cros_ec_check_features(ec, EC_FEATURE_USB_PD)) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_usbpd_notify_cells,
ARRAY_SIZE(cros_usbpd_notify_cells)); if (retval)
dev_err(ec->dev, "failed to add PD notify devices: %d\n",
retval);
}
}
/* * The PCHG device cannot be detected by sending EC_FEATURE_GET_CMD, but * it can be detected by querying the number of peripheral chargers.
*/
retval = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_PCHG_COUNT, NULL, 0,
&pchg_count, sizeof(pchg_count)); if (retval >= 0 && pchg_count.port_count) {
retval = mfd_add_hotplug_devices(ec->dev,
cros_ec_pchg_cells,
ARRAY_SIZE(cros_ec_pchg_cells)); if (retval)
dev_warn(ec->dev, "failed to add pchg: %d\n",
retval);
}
/* * The following subdevices cannot be detected by sending the * EC_FEATURE_GET_CMD to the Embedded Controller device.
*/
retval = mfd_add_hotplug_devices(ec->dev, cros_ec_platform_cells,
ARRAY_SIZE(cros_ec_platform_cells)); if (retval)
dev_warn(ec->dev, "failed to add cros-ec platform devices: %d\n",
retval);
/* Check whether this EC instance has a VBC NVRAM */
node = ec->ec_dev->dev->of_node; if (of_property_read_bool(node, "google,has-vbc-nvram")) {
retval = mfd_add_hotplug_devices(ec->dev, cros_ec_vbc_cells,
ARRAY_SIZE(cros_ec_vbc_cells)); if (retval)
dev_warn(ec->dev, "failed to add VBC devices: %d\n",
retval);
}
¤ 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.0.10Bemerkung:
(vorverarbeitet)
¤
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.