Lines Matching refs:data
152 void (*update)(struct aem_data *data);
249 static void aem_remove_sensors(struct aem_data *data);
250 static int aem1_find_sensors(struct aem_data *data);
251 static int aem2_find_sensors(struct aem_data *data);
252 static void update_aem1_sensors(struct aem_data *data);
253 static void update_aem2_sensors(struct aem_data *data);
270 static int aem_init_ipmi_data(struct aem_ipmi_data *data, int iface, in aem_init_ipmi_data() argument
275 init_completion(&data->read_complete); in aem_init_ipmi_data()
276 data->bmc_device = bmc; in aem_init_ipmi_data()
279 data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in aem_init_ipmi_data()
280 data->address.channel = IPMI_BMC_CHANNEL; in aem_init_ipmi_data()
281 data->address.data[0] = 0; in aem_init_ipmi_data()
282 data->interface = iface; in aem_init_ipmi_data()
285 data->tx_msgid = 0; in aem_init_ipmi_data()
286 data->tx_message.netfn = AEM_NETFN; in aem_init_ipmi_data()
289 err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs, in aem_init_ipmi_data()
290 data, &data->user); in aem_init_ipmi_data()
294 data->interface); in aem_init_ipmi_data()
302 static int aem_send_message(struct aem_ipmi_data *data) in aem_send_message() argument
306 err = ipmi_validate_addr(&data->address, sizeof(data->address)); in aem_send_message()
310 data->tx_msgid++; in aem_send_message()
311 err = ipmi_request_settime(data->user, &data->address, data->tx_msgid, in aem_send_message()
312 &data->tx_message, data, 0, 0, 0); in aem_send_message()
318 dev_err(data->bmc_device, "request_settime=%x\n", err); in aem_send_message()
321 dev_err(data->bmc_device, "validate_addr=%x\n", err); in aem_send_message()
329 struct aem_ipmi_data *data = user_msg_data; in aem_msg_handler() local
331 if (msg->msgid != data->tx_msgid) { in aem_msg_handler()
332 dev_err(data->bmc_device, in aem_msg_handler()
335 (int)data->tx_msgid); in aem_msg_handler()
340 data->rx_recv_type = msg->recv_type; in aem_msg_handler()
342 data->rx_result = msg->msg.data[0]; in aem_msg_handler()
344 data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; in aem_msg_handler()
348 if (data->rx_msg_len < rx_len) in aem_msg_handler()
349 rx_len = data->rx_msg_len; in aem_msg_handler()
350 data->rx_msg_len = rx_len; in aem_msg_handler()
351 memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len); in aem_msg_handler()
353 data->rx_msg_len = 0; in aem_msg_handler()
356 complete(&data->read_complete); in aem_msg_handler()
362 static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, in aem_read_sensor() argument
368 struct aem_read_sensor_resp *rs_resp = data->rs_resp; in aem_read_sensor()
369 struct aem_ipmi_data *ipmi = &data->ipmi; in aem_read_sensor()
383 rs_req.module_handle = data->module_handle; in aem_read_sensor()
390 ipmi->tx_message.data = (char *)&rs_req; in aem_read_sensor()
440 static void update_aem_energy_one(struct aem_data *data, int which) in update_aem_energy_one() argument
442 aem_read_sensor(data, AEM_ENERGY_ELEMENT, which, in update_aem_energy_one()
443 &data->energy[which], 8); in update_aem_energy_one()
446 static void update_aem_energy(struct aem_data *data) in update_aem_energy() argument
448 update_aem_energy_one(data, 0); in update_aem_energy()
449 if (data->ver_major < 2) in update_aem_energy()
451 update_aem_energy_one(data, 1); in update_aem_energy()
455 static void update_aem1_sensors(struct aem_data *data) in update_aem1_sensors() argument
457 mutex_lock(&data->lock); in update_aem1_sensors()
458 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in update_aem1_sensors()
459 data->valid) in update_aem1_sensors()
462 update_aem_energy(data); in update_aem1_sensors()
464 mutex_unlock(&data->lock); in update_aem1_sensors()
468 static void update_aem2_sensors(struct aem_data *data) in update_aem2_sensors() argument
472 mutex_lock(&data->lock); in update_aem2_sensors()
473 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in update_aem2_sensors()
474 data->valid) in update_aem2_sensors()
477 update_aem_energy(data); in update_aem2_sensors()
478 aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 0, &data->temp[0], 1); in update_aem2_sensors()
479 aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 1, &data->temp[1], 1); in update_aem2_sensors()
482 aem_read_sensor(data, AEM_POWER_CAP_ELEMENT, i, in update_aem2_sensors()
483 &data->pcap[i], 2); in update_aem2_sensors()
485 mutex_unlock(&data->lock); in update_aem2_sensors()
489 static void aem_delete(struct aem_data *data) in aem_delete() argument
491 list_del(&data->list); in aem_delete()
492 aem_remove_sensors(data); in aem_delete()
493 kfree(data->rs_resp); in aem_delete()
494 hwmon_device_unregister(data->hwmon_dev); in aem_delete()
495 ipmi_destroy_user(data->ipmi.user); in aem_delete()
496 platform_set_drvdata(data->pdev, NULL); in aem_delete()
497 platform_device_unregister(data->pdev); in aem_delete()
498 ida_simple_remove(&aem_ida, data->id); in aem_delete()
499 kfree(data); in aem_delete()
505 static int aem_find_aem1_count(struct aem_ipmi_data *data) in aem_find_aem1_count() argument
515 data->tx_message.cmd = AEM_FIND_FW_CMD; in aem_find_aem1_count()
516 data->tx_message.data = (char *)&ff_req; in aem_find_aem1_count()
517 data->tx_message.data_len = sizeof(ff_req); in aem_find_aem1_count()
519 data->rx_msg_data = &ff_resp; in aem_find_aem1_count()
520 data->rx_msg_len = sizeof(ff_resp); in aem_find_aem1_count()
522 aem_send_message(data); in aem_find_aem1_count()
524 res = wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT); in aem_find_aem1_count()
528 if (data->rx_result || data->rx_msg_len != sizeof(ff_resp) || in aem_find_aem1_count()
538 struct aem_data *data; in aem_init_aem1_inst() local
542 data = kzalloc(sizeof(*data), GFP_KERNEL); in aem_init_aem1_inst()
543 if (!data) in aem_init_aem1_inst()
545 mutex_init(&data->lock); in aem_init_aem1_inst()
548 data->ver_major = 1; in aem_init_aem1_inst()
549 data->ver_minor = 0; in aem_init_aem1_inst()
550 data->module_handle = module_handle; in aem_init_aem1_inst()
552 data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL; in aem_init_aem1_inst()
555 data->id = ida_simple_get(&aem_ida, 0, 0, GFP_KERNEL); in aem_init_aem1_inst()
556 if (data->id < 0) in aem_init_aem1_inst()
559 data->pdev = platform_device_alloc(DRVNAME, data->id); in aem_init_aem1_inst()
560 if (!data->pdev) in aem_init_aem1_inst()
562 data->pdev->dev.driver = &aem_driver.driver; in aem_init_aem1_inst()
564 res = platform_device_add(data->pdev); in aem_init_aem1_inst()
568 platform_set_drvdata(data->pdev, data); in aem_init_aem1_inst()
571 res = aem_init_ipmi_data(&data->ipmi, probe->interface, in aem_init_aem1_inst()
577 data->hwmon_dev = hwmon_device_register(&data->pdev->dev); in aem_init_aem1_inst()
578 if (IS_ERR(data->hwmon_dev)) { in aem_init_aem1_inst()
579 dev_err(&data->pdev->dev, in aem_init_aem1_inst()
582 res = PTR_ERR(data->hwmon_dev); in aem_init_aem1_inst()
586 data->update = update_aem1_sensors; in aem_init_aem1_inst()
587 data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL); in aem_init_aem1_inst()
588 if (!data->rs_resp) { in aem_init_aem1_inst()
594 res = aem1_find_sensors(data); in aem_init_aem1_inst()
599 list_add_tail(&data->list, &driver_data.aem_devices); in aem_init_aem1_inst()
601 dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n", in aem_init_aem1_inst()
602 data->ver_major, data->ver_minor, in aem_init_aem1_inst()
603 data->module_handle); in aem_init_aem1_inst()
607 kfree(data->rs_resp); in aem_init_aem1_inst()
609 hwmon_device_unregister(data->hwmon_dev); in aem_init_aem1_inst()
611 ipmi_destroy_user(data->ipmi.user); in aem_init_aem1_inst()
613 platform_set_drvdata(data->pdev, NULL); in aem_init_aem1_inst()
614 platform_device_unregister(data->pdev); in aem_init_aem1_inst()
616 ida_simple_remove(&aem_ida, data->id); in aem_init_aem1_inst()
618 kfree(data); in aem_init_aem1_inst()
642 static int aem_find_aem2(struct aem_ipmi_data *data, in aem_find_aem2() argument
653 data->tx_message.cmd = AEM_FW_INSTANCE_CMD; in aem_find_aem2()
654 data->tx_message.data = (char *)&fi_req; in aem_find_aem2()
655 data->tx_message.data_len = sizeof(fi_req); in aem_find_aem2()
657 data->rx_msg_data = fi_resp; in aem_find_aem2()
658 data->rx_msg_len = sizeof(*fi_resp); in aem_find_aem2()
660 aem_send_message(data); in aem_find_aem2()
662 res = wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT); in aem_find_aem2()
666 if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || in aem_find_aem2()
678 struct aem_data *data; in aem_init_aem2_inst() local
682 data = kzalloc(sizeof(*data), GFP_KERNEL); in aem_init_aem2_inst()
683 if (!data) in aem_init_aem2_inst()
685 mutex_init(&data->lock); in aem_init_aem2_inst()
688 data->ver_major = fi_resp->major; in aem_init_aem2_inst()
689 data->ver_minor = fi_resp->minor; in aem_init_aem2_inst()
690 data->module_handle = fi_resp->module_handle; in aem_init_aem2_inst()
692 data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL; in aem_init_aem2_inst()
695 data->id = ida_simple_get(&aem_ida, 0, 0, GFP_KERNEL); in aem_init_aem2_inst()
696 if (data->id < 0) in aem_init_aem2_inst()
699 data->pdev = platform_device_alloc(DRVNAME, data->id); in aem_init_aem2_inst()
700 if (!data->pdev) in aem_init_aem2_inst()
702 data->pdev->dev.driver = &aem_driver.driver; in aem_init_aem2_inst()
704 res = platform_device_add(data->pdev); in aem_init_aem2_inst()
708 platform_set_drvdata(data->pdev, data); in aem_init_aem2_inst()
711 res = aem_init_ipmi_data(&data->ipmi, probe->interface, in aem_init_aem2_inst()
717 data->hwmon_dev = hwmon_device_register(&data->pdev->dev); in aem_init_aem2_inst()
718 if (IS_ERR(data->hwmon_dev)) { in aem_init_aem2_inst()
719 dev_err(&data->pdev->dev, in aem_init_aem2_inst()
722 res = PTR_ERR(data->hwmon_dev); in aem_init_aem2_inst()
726 data->update = update_aem2_sensors; in aem_init_aem2_inst()
727 data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL); in aem_init_aem2_inst()
728 if (!data->rs_resp) { in aem_init_aem2_inst()
734 res = aem2_find_sensors(data); in aem_init_aem2_inst()
739 list_add_tail(&data->list, &driver_data.aem_devices); in aem_init_aem2_inst()
741 dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n", in aem_init_aem2_inst()
742 data->ver_major, data->ver_minor, in aem_init_aem2_inst()
743 data->module_handle); in aem_init_aem2_inst()
747 kfree(data->rs_resp); in aem_init_aem2_inst()
749 hwmon_device_unregister(data->hwmon_dev); in aem_init_aem2_inst()
751 ipmi_destroy_user(data->ipmi.user); in aem_init_aem2_inst()
753 platform_set_drvdata(data->pdev, NULL); in aem_init_aem2_inst()
754 platform_device_unregister(data->pdev); in aem_init_aem2_inst()
756 ida_simple_remove(&aem_ida, data->id); in aem_init_aem2_inst()
758 kfree(data); in aem_init_aem2_inst()
819 struct aem_data *data = dev_get_drvdata(dev); in show_name() local
821 return sprintf(buf, "%s%d\n", DRVNAME, data->ver_major); in show_name()
830 struct aem_data *data = dev_get_drvdata(dev); in show_version() local
832 return sprintf(buf, "%d.%d\n", data->ver_major, data->ver_minor); in show_version()
842 struct aem_data *data = dev_get_drvdata(dev); in aem_show_power() local
846 mutex_lock(&data->lock); in aem_show_power()
847 update_aem_energy_one(data, attr->index); in aem_show_power()
849 before = data->energy[attr->index]; in aem_show_power()
852 msecs_to_jiffies(data->power_period[attr->index]) in aem_show_power()
855 mutex_unlock(&data->lock); in aem_show_power()
859 update_aem_energy_one(data, attr->index); in aem_show_power()
861 after = data->energy[attr->index]; in aem_show_power()
862 mutex_unlock(&data->lock); in aem_show_power()
922 static int aem_register_sensors(struct aem_data *data, in aem_register_sensors() argument
926 struct device *dev = &data->pdev->dev; in aem_register_sensors()
927 struct sensor_device_attribute *sensors = data->sensors; in aem_register_sensors()
972 aem_remove_sensors(data); in aem_register_sensors()
1003 static void aem_remove_sensors(struct aem_data *data) in aem_remove_sensors() argument
1008 if (!data->sensors[i].dev_attr.attr.name) in aem_remove_sensors()
1010 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
1011 &data->sensors[i].dev_attr); in aem_remove_sensors()
1014 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
1016 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
1060 static int aem1_find_sensors(struct aem_data *data) in aem1_find_sensors() argument
1062 return aem_register_sensors(data, aem1_ro_sensors, aem1_rw_sensors); in aem1_find_sensors()
1066 static int aem2_find_sensors(struct aem_data *data) in aem2_find_sensors() argument
1068 return aem_register_sensors(data, aem2_ro_sensors, aem2_rw_sensors); in aem2_find_sensors()