1*110e6e02SM Chetan Kumar // SPDX-License-Identifier: GPL-2.0-only 2*110e6e02SM Chetan Kumar /* 3*110e6e02SM Chetan Kumar * Copyright (C) 2020-21 Intel Corporation. 4*110e6e02SM Chetan Kumar */ 5*110e6e02SM Chetan Kumar 6*110e6e02SM Chetan Kumar #include <linux/device.h> 7*110e6e02SM Chetan Kumar #include <linux/kobject.h> 8*110e6e02SM Chetan Kumar #include <linux/slab.h> 9*110e6e02SM Chetan Kumar 10*110e6e02SM Chetan Kumar #include "iosm_ipc_uevent.h" 11*110e6e02SM Chetan Kumar 12*110e6e02SM Chetan Kumar /* Update the uevent in work queue context */ 13*110e6e02SM Chetan Kumar static void ipc_uevent_work(struct work_struct *data) 14*110e6e02SM Chetan Kumar { 15*110e6e02SM Chetan Kumar struct ipc_uevent_info *info; 16*110e6e02SM Chetan Kumar char *envp[2] = { NULL, NULL }; 17*110e6e02SM Chetan Kumar 18*110e6e02SM Chetan Kumar info = container_of(data, struct ipc_uevent_info, work); 19*110e6e02SM Chetan Kumar 20*110e6e02SM Chetan Kumar envp[0] = info->uevent; 21*110e6e02SM Chetan Kumar 22*110e6e02SM Chetan Kumar if (kobject_uevent_env(&info->dev->kobj, KOBJ_CHANGE, envp)) 23*110e6e02SM Chetan Kumar pr_err("uevent %s failed to sent", info->uevent); 24*110e6e02SM Chetan Kumar 25*110e6e02SM Chetan Kumar kfree(info); 26*110e6e02SM Chetan Kumar } 27*110e6e02SM Chetan Kumar 28*110e6e02SM Chetan Kumar void ipc_uevent_send(struct device *dev, char *uevent) 29*110e6e02SM Chetan Kumar { 30*110e6e02SM Chetan Kumar struct ipc_uevent_info *info = kzalloc(sizeof(*info), GFP_ATOMIC); 31*110e6e02SM Chetan Kumar 32*110e6e02SM Chetan Kumar if (!info) 33*110e6e02SM Chetan Kumar return; 34*110e6e02SM Chetan Kumar 35*110e6e02SM Chetan Kumar /* Initialize the kernel work queue */ 36*110e6e02SM Chetan Kumar INIT_WORK(&info->work, ipc_uevent_work); 37*110e6e02SM Chetan Kumar 38*110e6e02SM Chetan Kumar /* Store the device and event information */ 39*110e6e02SM Chetan Kumar info->dev = dev; 40*110e6e02SM Chetan Kumar snprintf(info->uevent, MAX_UEVENT_LEN, "%s: %s", dev_name(dev), uevent); 41*110e6e02SM Chetan Kumar 42*110e6e02SM Chetan Kumar /* Schedule uevent in process context using work queue */ 43*110e6e02SM Chetan Kumar schedule_work(&info->work); 44*110e6e02SM Chetan Kumar } 45