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