// SPDX-License-Identifier: GPL-2.0+ /* * Core driver for Renesas Synchronization Management Unit (SMU) devices. * * Copyright (C) 2021 Integrated Device Technology, Inc., a Renesas Company. */ #include <linux/init.h> #include <linux/kernel.h> #include <linux/mfd/core.h> #include <linux/mfd/rsmu.h> #include <linux/module.h> #include <linux/of.h> #include <linux/regmap.h> #include <linux/slab.h> #include "rsmu.h" enum { RSMU_PHC = 0, RSMU_CDEV = 1, RSMU_N_DEVS = 2, }; static struct mfd_cell rsmu_cm_devs[] = { [RSMU_PHC] = { .name = "8a3400x-phc", }, [RSMU_CDEV] = { .name = "8a3400x-cdev", }, }; static struct mfd_cell rsmu_sabre_devs[] = { [RSMU_PHC] = { .name = "82p33x1x-phc", }, [RSMU_CDEV] = { .name = "82p33x1x-cdev", }, }; static struct mfd_cell rsmu_sl_devs[] = { [RSMU_PHC] = { .name = "8v19n85x-phc", }, [RSMU_CDEV] = { .name = "8v19n85x-cdev", }, }; int rsmu_core_init(struct rsmu_ddata *rsmu) { struct mfd_cell *cells; int ret; switch (rsmu->type) { case RSMU_CM: cells = rsmu_cm_devs; break; case RSMU_SABRE: cells = rsmu_sabre_devs; break; case RSMU_SL: cells = rsmu_sl_devs; break; default: dev_err(rsmu->dev, "Unsupported RSMU device type: %d\n", rsmu->type); return -ENODEV; } mutex_init(&rsmu->lock); ret = devm_mfd_add_devices(rsmu->dev, PLATFORM_DEVID_AUTO, cells, RSMU_N_DEVS, NULL, 0, NULL); if (ret < 0) dev_err(rsmu->dev, "Failed to register sub-devices: %d\n", ret); return ret; } EXPORT_SYMBOL_GPL(rsmu_core_init); void rsmu_core_exit(struct rsmu_ddata *rsmu) { mutex_destroy(&rsmu->lock); } EXPORT_SYMBOL_GPL(rsmu_core_exit); MODULE_DESCRIPTION("Renesas SMU core driver"); MODULE_LICENSE("GPL");