Lines Matching refs:data

139 	void (*update)(struct aem_data *data);
236 static void aem_remove_sensors(struct aem_data *data);
237 static int aem1_find_sensors(struct aem_data *data);
238 static int aem2_find_sensors(struct aem_data *data);
239 static void update_aem1_sensors(struct aem_data *data);
240 static void update_aem2_sensors(struct aem_data *data);
257 static int aem_init_ipmi_data(struct aem_ipmi_data *data, int iface, in aem_init_ipmi_data() argument
262 init_completion(&data->read_complete); in aem_init_ipmi_data()
263 data->bmc_device = bmc; in aem_init_ipmi_data()
266 data->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; in aem_init_ipmi_data()
267 data->address.channel = IPMI_BMC_CHANNEL; in aem_init_ipmi_data()
268 data->address.data[0] = 0; in aem_init_ipmi_data()
269 data->interface = iface; in aem_init_ipmi_data()
272 data->tx_msgid = 0; in aem_init_ipmi_data()
273 data->tx_message.netfn = AEM_NETFN; in aem_init_ipmi_data()
276 err = ipmi_create_user(data->interface, &driver_data.ipmi_hndlrs, in aem_init_ipmi_data()
277 data, &data->user); in aem_init_ipmi_data()
281 data->interface); in aem_init_ipmi_data()
289 static int aem_send_message(struct aem_ipmi_data *data) in aem_send_message() argument
293 err = ipmi_validate_addr(&data->address, sizeof(data->address)); in aem_send_message()
297 data->tx_msgid++; in aem_send_message()
298 err = ipmi_request_settime(data->user, &data->address, data->tx_msgid, in aem_send_message()
299 &data->tx_message, data, 0, 0, 0); in aem_send_message()
305 dev_err(data->bmc_device, "request_settime=%x\n", err); in aem_send_message()
308 dev_err(data->bmc_device, "validate_addr=%x\n", err); in aem_send_message()
316 struct aem_ipmi_data *data = user_msg_data; in aem_msg_handler() local
318 if (msg->msgid != data->tx_msgid) { in aem_msg_handler()
319 dev_err(data->bmc_device, in aem_msg_handler()
322 (int)data->tx_msgid); in aem_msg_handler()
327 data->rx_recv_type = msg->recv_type; in aem_msg_handler()
329 data->rx_result = msg->msg.data[0]; in aem_msg_handler()
331 data->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; in aem_msg_handler()
335 if (data->rx_msg_len < rx_len) in aem_msg_handler()
336 rx_len = data->rx_msg_len; in aem_msg_handler()
337 data->rx_msg_len = rx_len; in aem_msg_handler()
338 memcpy(data->rx_msg_data, msg->msg.data + 1, data->rx_msg_len); in aem_msg_handler()
340 data->rx_msg_len = 0; in aem_msg_handler()
343 complete(&data->read_complete); in aem_msg_handler()
349 static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, in aem_read_sensor() argument
355 struct aem_read_sensor_resp *rs_resp = data->rs_resp; in aem_read_sensor()
356 struct aem_ipmi_data *ipmi = &data->ipmi; in aem_read_sensor()
370 rs_req.module_handle = data->module_handle; in aem_read_sensor()
377 ipmi->tx_message.data = (char *)&rs_req; in aem_read_sensor()
420 static void update_aem_energy_one(struct aem_data *data, int which) in update_aem_energy_one() argument
422 aem_read_sensor(data, AEM_ENERGY_ELEMENT, which, in update_aem_energy_one()
423 &data->energy[which], 8); in update_aem_energy_one()
426 static void update_aem_energy(struct aem_data *data) in update_aem_energy() argument
428 update_aem_energy_one(data, 0); in update_aem_energy()
429 if (data->ver_major < 2) in update_aem_energy()
431 update_aem_energy_one(data, 1); in update_aem_energy()
435 static void update_aem1_sensors(struct aem_data *data) in update_aem1_sensors() argument
437 mutex_lock(&data->lock); in update_aem1_sensors()
438 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in update_aem1_sensors()
439 data->valid) in update_aem1_sensors()
442 update_aem_energy(data); in update_aem1_sensors()
444 mutex_unlock(&data->lock); in update_aem1_sensors()
448 static void update_aem2_sensors(struct aem_data *data) in update_aem2_sensors() argument
452 mutex_lock(&data->lock); in update_aem2_sensors()
453 if (time_before(jiffies, data->last_updated + REFRESH_INTERVAL) && in update_aem2_sensors()
454 data->valid) in update_aem2_sensors()
457 update_aem_energy(data); in update_aem2_sensors()
458 aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 0, &data->temp[0], 1); in update_aem2_sensors()
459 aem_read_sensor(data, AEM_EXHAUST_ELEMENT, 1, &data->temp[1], 1); in update_aem2_sensors()
462 aem_read_sensor(data, AEM_POWER_CAP_ELEMENT, i, in update_aem2_sensors()
463 &data->pcap[i], 2); in update_aem2_sensors()
465 mutex_unlock(&data->lock); in update_aem2_sensors()
469 static void aem_delete(struct aem_data *data) in aem_delete() argument
471 list_del(&data->list); in aem_delete()
472 aem_remove_sensors(data); in aem_delete()
473 kfree(data->rs_resp); in aem_delete()
474 hwmon_device_unregister(data->hwmon_dev); in aem_delete()
475 ipmi_destroy_user(data->ipmi.user); in aem_delete()
476 platform_set_drvdata(data->pdev, NULL); in aem_delete()
477 platform_device_unregister(data->pdev); in aem_delete()
478 ida_free(&aem_ida, data->id); in aem_delete()
479 kfree(data); in aem_delete()
485 static int aem_find_aem1_count(struct aem_ipmi_data *data) in aem_find_aem1_count() argument
494 data->tx_message.cmd = AEM_FIND_FW_CMD; in aem_find_aem1_count()
495 data->tx_message.data = (char *)&ff_req; in aem_find_aem1_count()
496 data->tx_message.data_len = sizeof(ff_req); in aem_find_aem1_count()
498 data->rx_msg_data = &ff_resp; in aem_find_aem1_count()
499 data->rx_msg_len = sizeof(ff_resp); in aem_find_aem1_count()
501 aem_send_message(data); in aem_find_aem1_count()
503 if (!wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT)) in aem_find_aem1_count()
506 if (data->rx_result || data->rx_msg_len != sizeof(ff_resp) || in aem_find_aem1_count()
516 struct aem_data *data; in aem_init_aem1_inst() local
520 data = kzalloc_obj(*data); in aem_init_aem1_inst()
521 if (!data) in aem_init_aem1_inst()
523 mutex_init(&data->lock); in aem_init_aem1_inst()
526 data->ver_major = 1; in aem_init_aem1_inst()
527 data->ver_minor = 0; in aem_init_aem1_inst()
528 data->module_handle = module_handle; in aem_init_aem1_inst()
530 data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL; in aem_init_aem1_inst()
533 data->id = ida_alloc(&aem_ida, GFP_KERNEL); in aem_init_aem1_inst()
534 if (data->id < 0) in aem_init_aem1_inst()
537 data->pdev = platform_device_alloc(DRVNAME, data->id); in aem_init_aem1_inst()
538 if (!data->pdev) in aem_init_aem1_inst()
540 data->pdev->dev.driver = &aem_driver.driver; in aem_init_aem1_inst()
542 res = platform_device_add(data->pdev); in aem_init_aem1_inst()
546 platform_set_drvdata(data->pdev, data); in aem_init_aem1_inst()
549 res = aem_init_ipmi_data(&data->ipmi, probe->interface, in aem_init_aem1_inst()
555 data->hwmon_dev = hwmon_device_register(&data->pdev->dev); in aem_init_aem1_inst()
556 if (IS_ERR(data->hwmon_dev)) { in aem_init_aem1_inst()
557 dev_err(&data->pdev->dev, in aem_init_aem1_inst()
560 res = PTR_ERR(data->hwmon_dev); in aem_init_aem1_inst()
564 data->update = update_aem1_sensors; in aem_init_aem1_inst()
565 data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL); in aem_init_aem1_inst()
566 if (!data->rs_resp) { in aem_init_aem1_inst()
572 res = aem1_find_sensors(data); in aem_init_aem1_inst()
577 list_add_tail(&data->list, &driver_data.aem_devices); in aem_init_aem1_inst()
579 dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n", in aem_init_aem1_inst()
580 data->ver_major, data->ver_minor, in aem_init_aem1_inst()
581 data->module_handle); in aem_init_aem1_inst()
585 kfree(data->rs_resp); in aem_init_aem1_inst()
587 hwmon_device_unregister(data->hwmon_dev); in aem_init_aem1_inst()
589 ipmi_destroy_user(data->ipmi.user); in aem_init_aem1_inst()
591 platform_set_drvdata(data->pdev, NULL); in aem_init_aem1_inst()
592 platform_device_del(data->pdev); in aem_init_aem1_inst()
594 platform_device_put(data->pdev); in aem_init_aem1_inst()
596 ida_free(&aem_ida, data->id); in aem_init_aem1_inst()
598 kfree(data); in aem_init_aem1_inst()
622 static int aem_find_aem2(struct aem_ipmi_data *data, in aem_find_aem2() argument
632 data->tx_message.cmd = AEM_FW_INSTANCE_CMD; in aem_find_aem2()
633 data->tx_message.data = (char *)&fi_req; in aem_find_aem2()
634 data->tx_message.data_len = sizeof(fi_req); in aem_find_aem2()
636 data->rx_msg_data = fi_resp; in aem_find_aem2()
637 data->rx_msg_len = sizeof(*fi_resp); in aem_find_aem2()
639 aem_send_message(data); in aem_find_aem2()
641 if (!wait_for_completion_timeout(&data->read_complete, IPMI_TIMEOUT)) in aem_find_aem2()
644 if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || in aem_find_aem2()
656 struct aem_data *data; in aem_init_aem2_inst() local
660 data = kzalloc_obj(*data); in aem_init_aem2_inst()
661 if (!data) in aem_init_aem2_inst()
663 mutex_init(&data->lock); in aem_init_aem2_inst()
666 data->ver_major = fi_resp->major; in aem_init_aem2_inst()
667 data->ver_minor = fi_resp->minor; in aem_init_aem2_inst()
668 data->module_handle = fi_resp->module_handle; in aem_init_aem2_inst()
670 data->power_period[i] = AEM_DEFAULT_POWER_INTERVAL; in aem_init_aem2_inst()
673 data->id = ida_alloc(&aem_ida, GFP_KERNEL); in aem_init_aem2_inst()
674 if (data->id < 0) in aem_init_aem2_inst()
677 data->pdev = platform_device_alloc(DRVNAME, data->id); in aem_init_aem2_inst()
678 if (!data->pdev) in aem_init_aem2_inst()
680 data->pdev->dev.driver = &aem_driver.driver; in aem_init_aem2_inst()
682 res = platform_device_add(data->pdev); in aem_init_aem2_inst()
686 platform_set_drvdata(data->pdev, data); in aem_init_aem2_inst()
689 res = aem_init_ipmi_data(&data->ipmi, probe->interface, in aem_init_aem2_inst()
695 data->hwmon_dev = hwmon_device_register(&data->pdev->dev); in aem_init_aem2_inst()
696 if (IS_ERR(data->hwmon_dev)) { in aem_init_aem2_inst()
697 dev_err(&data->pdev->dev, in aem_init_aem2_inst()
700 res = PTR_ERR(data->hwmon_dev); in aem_init_aem2_inst()
704 data->update = update_aem2_sensors; in aem_init_aem2_inst()
705 data->rs_resp = kzalloc(sizeof(*(data->rs_resp)) + 8, GFP_KERNEL); in aem_init_aem2_inst()
706 if (!data->rs_resp) { in aem_init_aem2_inst()
712 res = aem2_find_sensors(data); in aem_init_aem2_inst()
717 list_add_tail(&data->list, &driver_data.aem_devices); in aem_init_aem2_inst()
719 dev_info(data->ipmi.bmc_device, "Found AEM v%d.%d at 0x%X\n", in aem_init_aem2_inst()
720 data->ver_major, data->ver_minor, in aem_init_aem2_inst()
721 data->module_handle); in aem_init_aem2_inst()
725 kfree(data->rs_resp); in aem_init_aem2_inst()
727 hwmon_device_unregister(data->hwmon_dev); in aem_init_aem2_inst()
729 ipmi_destroy_user(data->ipmi.user); in aem_init_aem2_inst()
731 platform_set_drvdata(data->pdev, NULL); in aem_init_aem2_inst()
732 platform_device_del(data->pdev); in aem_init_aem2_inst()
734 platform_device_put(data->pdev); in aem_init_aem2_inst()
736 ida_free(&aem_ida, data->id); in aem_init_aem2_inst()
738 kfree(data); in aem_init_aem2_inst()
799 struct aem_data *data = dev_get_drvdata(dev); in name_show() local
801 return sprintf(buf, "%s%d\n", DRVNAME, data->ver_major); in name_show()
809 struct aem_data *data = dev_get_drvdata(dev); in version_show() local
811 return sprintf(buf, "%d.%d\n", data->ver_major, data->ver_minor); in version_show()
821 struct aem_data *data = dev_get_drvdata(dev); in aem_show_power() local
825 mutex_lock(&data->lock); in aem_show_power()
826 update_aem_energy_one(data, attr->index); in aem_show_power()
828 before = data->energy[attr->index]; in aem_show_power()
831 msecs_to_jiffies(data->power_period[attr->index]) in aem_show_power()
834 mutex_unlock(&data->lock); in aem_show_power()
838 update_aem_energy_one(data, attr->index); in aem_show_power()
840 after = data->energy[attr->index]; in aem_show_power()
841 mutex_unlock(&data->lock); in aem_show_power()
901 static int aem_register_sensors(struct aem_data *data, in aem_register_sensors() argument
905 struct device *dev = &data->pdev->dev; in aem_register_sensors()
906 struct sensor_device_attribute *sensors = data->sensors; in aem_register_sensors()
951 aem_remove_sensors(data); in aem_register_sensors()
982 static void aem_remove_sensors(struct aem_data *data) in aem_remove_sensors() argument
987 if (!data->sensors[i].dev_attr.attr.name) in aem_remove_sensors()
989 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
990 &data->sensors[i].dev_attr); in aem_remove_sensors()
993 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
995 device_remove_file(&data->pdev->dev, in aem_remove_sensors()
1039 static int aem1_find_sensors(struct aem_data *data) in aem1_find_sensors() argument
1041 return aem_register_sensors(data, aem1_ro_sensors, aem1_rw_sensors); in aem1_find_sensors()
1045 static int aem2_find_sensors(struct aem_data *data) in aem2_find_sensors() argument
1047 return aem_register_sensors(data, aem2_ro_sensors, aem2_rw_sensors); in aem2_find_sensors()