xref: /openbmc/linux/drivers/mfd/rsmu_core.c (revision a1867f85)
1*a1867f85SMin Li // SPDX-License-Identifier: GPL-2.0+
2*a1867f85SMin Li /*
3*a1867f85SMin Li  * Core driver for Renesas Synchronization Management Unit (SMU) devices.
4*a1867f85SMin Li  *
5*a1867f85SMin Li  * Copyright (C) 2021 Integrated Device Technology, Inc., a Renesas Company.
6*a1867f85SMin Li  */
7*a1867f85SMin Li 
8*a1867f85SMin Li #include <linux/init.h>
9*a1867f85SMin Li #include <linux/kernel.h>
10*a1867f85SMin Li #include <linux/mfd/core.h>
11*a1867f85SMin Li #include <linux/mfd/rsmu.h>
12*a1867f85SMin Li #include <linux/module.h>
13*a1867f85SMin Li #include <linux/of.h>
14*a1867f85SMin Li #include <linux/regmap.h>
15*a1867f85SMin Li #include <linux/slab.h>
16*a1867f85SMin Li 
17*a1867f85SMin Li #include "rsmu.h"
18*a1867f85SMin Li 
19*a1867f85SMin Li enum {
20*a1867f85SMin Li 	RSMU_PHC = 0,
21*a1867f85SMin Li 	RSMU_CDEV = 1,
22*a1867f85SMin Li 	RSMU_N_DEVS = 2,
23*a1867f85SMin Li };
24*a1867f85SMin Li 
25*a1867f85SMin Li static struct mfd_cell rsmu_cm_devs[] = {
26*a1867f85SMin Li 	[RSMU_PHC] = {
27*a1867f85SMin Li 		.name = "8a3400x-phc",
28*a1867f85SMin Li 	},
29*a1867f85SMin Li 	[RSMU_CDEV] = {
30*a1867f85SMin Li 		.name = "8a3400x-cdev",
31*a1867f85SMin Li 	},
32*a1867f85SMin Li };
33*a1867f85SMin Li 
34*a1867f85SMin Li static struct mfd_cell rsmu_sabre_devs[] = {
35*a1867f85SMin Li 	[RSMU_PHC] = {
36*a1867f85SMin Li 		.name = "82p33x1x-phc",
37*a1867f85SMin Li 	},
38*a1867f85SMin Li 	[RSMU_CDEV] = {
39*a1867f85SMin Li 		.name = "82p33x1x-cdev",
40*a1867f85SMin Li 	},
41*a1867f85SMin Li };
42*a1867f85SMin Li 
43*a1867f85SMin Li static struct mfd_cell rsmu_sl_devs[] = {
44*a1867f85SMin Li 	[RSMU_PHC] = {
45*a1867f85SMin Li 		.name = "8v19n85x-phc",
46*a1867f85SMin Li 	},
47*a1867f85SMin Li 	[RSMU_CDEV] = {
48*a1867f85SMin Li 		.name = "8v19n85x-cdev",
49*a1867f85SMin Li 	},
50*a1867f85SMin Li };
51*a1867f85SMin Li 
rsmu_core_init(struct rsmu_ddata * rsmu)52*a1867f85SMin Li int rsmu_core_init(struct rsmu_ddata *rsmu)
53*a1867f85SMin Li {
54*a1867f85SMin Li 	struct mfd_cell *cells;
55*a1867f85SMin Li 	int ret;
56*a1867f85SMin Li 
57*a1867f85SMin Li 	switch (rsmu->type) {
58*a1867f85SMin Li 	case RSMU_CM:
59*a1867f85SMin Li 		cells = rsmu_cm_devs;
60*a1867f85SMin Li 		break;
61*a1867f85SMin Li 	case RSMU_SABRE:
62*a1867f85SMin Li 		cells = rsmu_sabre_devs;
63*a1867f85SMin Li 		break;
64*a1867f85SMin Li 	case RSMU_SL:
65*a1867f85SMin Li 		cells = rsmu_sl_devs;
66*a1867f85SMin Li 		break;
67*a1867f85SMin Li 	default:
68*a1867f85SMin Li 		dev_err(rsmu->dev, "Unsupported RSMU device type: %d\n", rsmu->type);
69*a1867f85SMin Li 		return -ENODEV;
70*a1867f85SMin Li 	}
71*a1867f85SMin Li 
72*a1867f85SMin Li 	mutex_init(&rsmu->lock);
73*a1867f85SMin Li 
74*a1867f85SMin Li 	ret = devm_mfd_add_devices(rsmu->dev, PLATFORM_DEVID_AUTO, cells,
75*a1867f85SMin Li 				   RSMU_N_DEVS, NULL, 0, NULL);
76*a1867f85SMin Li 	if (ret < 0)
77*a1867f85SMin Li 		dev_err(rsmu->dev, "Failed to register sub-devices: %d\n", ret);
78*a1867f85SMin Li 
79*a1867f85SMin Li 	return ret;
80*a1867f85SMin Li }
81*a1867f85SMin Li 
rsmu_core_exit(struct rsmu_ddata * rsmu)82*a1867f85SMin Li void rsmu_core_exit(struct rsmu_ddata *rsmu)
83*a1867f85SMin Li {
84*a1867f85SMin Li 	mutex_destroy(&rsmu->lock);
85*a1867f85SMin Li }
86*a1867f85SMin Li 
87*a1867f85SMin Li MODULE_DESCRIPTION("Renesas SMU core driver");
88*a1867f85SMin Li MODULE_LICENSE("GPL");
89