162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2020-21 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/device.h> 762306a36Sopenharmony_ci#include <linux/kobject.h> 862306a36Sopenharmony_ci#include <linux/slab.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "iosm_ipc_uevent.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* Update the uevent in work queue context */ 1362306a36Sopenharmony_cistatic void ipc_uevent_work(struct work_struct *data) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci struct ipc_uevent_info *info; 1662306a36Sopenharmony_ci char *envp[2] = { NULL, NULL }; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci info = container_of(data, struct ipc_uevent_info, work); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci envp[0] = info->uevent; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci if (kobject_uevent_env(&info->dev->kobj, KOBJ_CHANGE, envp)) 2362306a36Sopenharmony_ci pr_err("uevent %s failed to sent", info->uevent); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci kfree(info); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_civoid ipc_uevent_send(struct device *dev, char *uevent) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct ipc_uevent_info *info = kzalloc(sizeof(*info), GFP_ATOMIC); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (!info) 3362306a36Sopenharmony_ci return; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci /* Initialize the kernel work queue */ 3662306a36Sopenharmony_ci INIT_WORK(&info->work, ipc_uevent_work); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci /* Store the device and event information */ 3962306a36Sopenharmony_ci info->dev = dev; 4062306a36Sopenharmony_ci snprintf(info->uevent, MAX_UEVENT_LEN, "IOSM_EVENT=%s", uevent); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci /* Schedule uevent in process context using work queue */ 4362306a36Sopenharmony_ci schedule_work(&info->work); 4462306a36Sopenharmony_ci} 45