Lines Matching full:mcu
3 * CZ.NIC's Turris Omnia MCU driver
19 #include <linux/turris-omnia-mcu-interface.h>
20 #include "turris-omnia-mcu.h"
57 static int omnia_get_version_hash(struct omnia_mcu *mcu, bool bootloader, in omnia_get_version_hash() argument
64 err = omnia_cmd_read(mcu->client, in omnia_get_version_hash()
80 struct omnia_mcu *mcu = dev_get_drvdata(dev); in fw_version_hash_show() local
84 err = omnia_get_version_hash(mcu, bootloader, version); in fw_version_hash_show()
110 struct omnia_mcu *mcu = dev_get_drvdata(dev); in fw_features_show() local
112 return sysfs_emit(buf, "0x%x\n", mcu->features); in fw_features_show()
119 struct omnia_mcu *mcu = dev_get_drvdata(dev); in mcu_type_show() local
121 return sysfs_emit(buf, "%s\n", mcu->type); in mcu_type_show()
143 struct omnia_mcu *mcu = dev_get_drvdata(dev); in serial_number_show() local
145 return sysfs_emit(buf, "%016llX\n", mcu->board_serial_number); in serial_number_show()
152 struct omnia_mcu *mcu = dev_get_drvdata(dev); in first_mac_address_show() local
154 return sysfs_emit(buf, "%pM\n", mcu->board_first_mac); in first_mac_address_show()
161 struct omnia_mcu *mcu = dev_get_drvdata(dev); in board_revision_show() local
163 return sysfs_emit(buf, "%u\n", mcu->board_revision); in board_revision_show()
183 struct omnia_mcu *mcu = dev_get_drvdata(dev); in omnia_mcu_base_attrs_visible() local
188 !(mcu->features & OMNIA_FEAT_BOARD_INFO)) in omnia_mcu_base_attrs_visible()
210 static void omnia_mcu_print_version_hash(struct omnia_mcu *mcu, bool bootloader) in omnia_mcu_print_version_hash() argument
213 struct device *dev = &mcu->client->dev; in omnia_mcu_print_version_hash()
217 err = omnia_get_version_hash(mcu, bootloader, version); in omnia_mcu_print_version_hash()
219 dev_err(dev, "Cannot read MCU %s firmware version: %d\n", in omnia_mcu_print_version_hash()
224 dev_info(dev, "MCU %s firmware version hash: %s\n", type, version); in omnia_mcu_print_version_hash()
244 "Your board's MCU firmware does not support the %s feature.\n", in omnia_info_missing_feature()
248 static int omnia_mcu_read_features(struct omnia_mcu *mcu) in omnia_mcu_read_features() argument
265 struct i2c_client *client = mcu->client; in omnia_mcu_read_features()
271 /* status word holds MCU type, which we need below */ in omnia_mcu_read_features()
277 * Check whether MCU firmware supports the OMNIA_CMD_GET_FEATURES in omnia_mcu_read_features()
283 &mcu->features); in omnia_mcu_read_features()
293 mcu->features = features16; in omnia_mcu_read_features()
295 if (mcu->features & OMNIA_FEAT_FROM_BIT_16_INVALID) in omnia_mcu_read_features()
296 mcu->features &= GENMASK(15, 0); in omnia_mcu_read_features()
300 "Your board's MCU firmware does not support feature reading.\n"); in omnia_mcu_read_features()
304 mcu->type = omnia_status_to_mcu_type(status); in omnia_mcu_read_features()
305 dev_info(dev, "MCU type %s%s\n", mcu->type, in omnia_mcu_read_features()
306 (mcu->features & OMNIA_FEAT_PERIPH_MCU) ? in omnia_mcu_read_features()
309 omnia_mcu_print_version_hash(mcu, true); in omnia_mcu_read_features()
311 if (mcu->features & OMNIA_FEAT_BOOTLOADER) in omnia_mcu_read_features()
313 "MCU is running bootloader firmware. Was firmware upgrade interrupted?\n"); in omnia_mcu_read_features()
315 omnia_mcu_print_version_hash(mcu, false); in omnia_mcu_read_features()
318 if (mcu->features & features[i].mask) in omnia_mcu_read_features()
327 "Consider upgrading MCU firmware with the omnia-mcutool utility.\n"); in omnia_mcu_read_features()
332 static int omnia_mcu_read_board_info(struct omnia_mcu *mcu) in omnia_mcu_read_board_info() argument
337 err = omnia_cmd_read(mcu->client, OMNIA_CMD_BOARD_INFO_GET, reply, in omnia_mcu_read_board_info()
345 mcu->board_serial_number = get_unaligned_le64(&reply[1]); in omnia_mcu_read_board_info()
348 memcpy(mcu->board_first_mac, &reply[9], sizeof(mcu->board_first_mac)); in omnia_mcu_read_board_info()
350 mcu->board_revision = reply[15]; in omnia_mcu_read_board_info()
358 struct omnia_mcu *mcu; in omnia_mcu_probe() local
364 mcu = devm_kzalloc(dev, sizeof(*mcu), GFP_KERNEL); in omnia_mcu_probe()
365 if (!mcu) in omnia_mcu_probe()
368 mcu->client = client; in omnia_mcu_probe()
369 i2c_set_clientdata(client, mcu); in omnia_mcu_probe()
371 err = omnia_mcu_read_features(mcu); in omnia_mcu_probe()
374 "Cannot determine MCU supported features\n"); in omnia_mcu_probe()
376 if (mcu->features & OMNIA_FEAT_BOARD_INFO) { in omnia_mcu_probe()
377 err = omnia_mcu_read_board_info(mcu); in omnia_mcu_probe()
383 err = omnia_mcu_register_sys_off_and_wakeup(mcu); in omnia_mcu_probe()
387 err = omnia_mcu_register_watchdog(mcu); in omnia_mcu_probe()
391 err = omnia_mcu_register_gpiochip(mcu); in omnia_mcu_probe()
395 return omnia_mcu_register_trng(mcu); in omnia_mcu_probe()
399 { .compatible = "cznic,turris-omnia-mcu" },
406 .name = "turris-omnia-mcu",
414 MODULE_DESCRIPTION("CZ.NIC's Turris Omnia MCU");