brintos

brintos / linux-shallow public Read only

0
0
Text · 1.3 KiB · 5d8e06b Raw
69 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* Copyright(c) 2023 Huawei. All rights reserved. */3 4#include <linux/device.h>5#include <linux/slab.h>6#include <linux/idr.h>7#include <cxlmem.h>8#include <pmu.h>9#include <cxl.h>10#include "core.h"11 12static void cxl_pmu_release(struct device *dev)13{14	struct cxl_pmu *pmu = to_cxl_pmu(dev);15 16	kfree(pmu);17}18 19const struct device_type cxl_pmu_type = {20	.name = "cxl_pmu",21	.release = cxl_pmu_release,22};23 24static void remove_dev(void *dev)25{26	device_unregister(dev);27}28 29int devm_cxl_pmu_add(struct device *parent, struct cxl_pmu_regs *regs,30		     int assoc_id, int index, enum cxl_pmu_type type)31{32	struct cxl_pmu *pmu;33	struct device *dev;34	int rc;35 36	pmu = kzalloc(sizeof(*pmu), GFP_KERNEL);37	if (!pmu)38		return -ENOMEM;39 40	pmu->assoc_id = assoc_id;41	pmu->index = index;42	pmu->type = type;43	pmu->base = regs->pmu;44	dev = &pmu->dev;45	device_initialize(dev);46	device_set_pm_not_required(dev);47	dev->parent = parent;48	dev->bus = &cxl_bus_type;49	dev->type = &cxl_pmu_type;50	switch (pmu->type) {51	case CXL_PMU_MEMDEV:52		rc = dev_set_name(dev, "pmu_mem%d.%d", assoc_id, index);53		break;54	}55	if (rc)56		goto err;57 58	rc = device_add(dev);59	if (rc)60		goto err;61 62	return devm_add_action_or_reset(parent, remove_dev, dev);63 64err:65	put_device(&pmu->dev);66	return rc;67}68EXPORT_SYMBOL_NS_GPL(devm_cxl_pmu_add, CXL);69