root/drivers/bus/fsl-mc/obj-api.c
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright 2021 NXP
 *
 */
#include <linux/kernel.h>
#include <linux/fsl/mc.h>

#include "fsl-mc-private.h"

static int fsl_mc_get_open_cmd_id(const char *type)
{
        static const struct {
                int cmd_id;
                const char *type;
        } dev_ids[] = {
                { DPRTC_CMDID_OPEN, "dprtc" },
                { DPRC_CMDID_OPEN, "dprc" },
                { DPNI_CMDID_OPEN, "dpni" },
                { DPIO_CMDID_OPEN, "dpio" },
                { DPSW_CMDID_OPEN, "dpsw" },
                { DPBP_CMDID_OPEN, "dpbp" },
                { DPCON_CMDID_OPEN, "dpcon" },
                { DPMCP_CMDID_OPEN, "dpmcp" },
                { DPMAC_CMDID_OPEN, "dpmac" },
                { DPSECI_CMDID_OPEN, "dpseci" },
                { DPDMUX_CMDID_OPEN, "dpdmux" },
                { DPDCEI_CMDID_OPEN, "dpdcei" },
                { DPAIOP_CMDID_OPEN, "dpaiop" },
                { DPCI_CMDID_OPEN, "dpci" },
                { DPDMAI_CMDID_OPEN, "dpdmai" },
                { DPDBG_CMDID_OPEN, "dpdbg" },
                { 0, NULL }
        };
        int i;

        for (i = 0; dev_ids[i].type; i++)
                if (!strcmp(dev_ids[i].type, type))
                        return dev_ids[i].cmd_id;

        return -1;
}

int fsl_mc_obj_open(struct fsl_mc_io *mc_io,
                    u32 cmd_flags,
                    int obj_id,
                    char *obj_type,
                    u16 *token)
{
        struct fsl_mc_command cmd = { 0 };
        struct fsl_mc_obj_cmd_open *cmd_params;
        int err = 0;
        int cmd_id = fsl_mc_get_open_cmd_id(obj_type);

        if (cmd_id == -1)
                return -ENODEV;

        /* prepare command */
        cmd.header = mc_encode_cmd_header(cmd_id, cmd_flags, 0);
        cmd_params = (struct fsl_mc_obj_cmd_open *)cmd.params;
        cmd_params->obj_id = cpu_to_le32(obj_id);

        /* send command to mc*/
        err = mc_send_command(mc_io, &cmd);
        if (err)
                return err;

        /* retrieve response parameters */
        *token = mc_cmd_hdr_read_token(&cmd);

        return err;
}
EXPORT_SYMBOL_GPL(fsl_mc_obj_open);

int fsl_mc_obj_close(struct fsl_mc_io *mc_io,
                     u32 cmd_flags,
                     u16 token)
{
        struct fsl_mc_command cmd = { 0 };

        /* prepare command */
        cmd.header = mc_encode_cmd_header(OBJ_CMDID_CLOSE, cmd_flags,
                                          token);

        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
}
EXPORT_SYMBOL_GPL(fsl_mc_obj_close);

int fsl_mc_obj_reset(struct fsl_mc_io *mc_io,
                     u32 cmd_flags,
                     u16 token)
{
        struct fsl_mc_command cmd = { 0 };

        /* prepare command */
        cmd.header = mc_encode_cmd_header(OBJ_CMDID_RESET, cmd_flags,
                                          token);

        /* send command to mc*/
        return mc_send_command(mc_io, &cmd);
}
EXPORT_SYMBOL_GPL(fsl_mc_obj_reset);