root/drivers/bus/fsl-mc/dpmcp.c
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright 2013-2016 Freescale Semiconductor Inc.
 *
 */
#include <linux/kernel.h>
#include <linux/fsl/mc.h>

#include "fsl-mc-private.h"

/**
 * dpmcp_open() - Open a control session for the specified object.
 * @mc_io:      Pointer to MC portal's I/O object
 * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
 * @dpmcp_id:   DPMCP unique ID
 * @token:      Returned token; use in subsequent API calls
 *
 * This function can be used to open a control session for an
 * already created object; an object may have been declared in
 * the DPL or by calling the dpmcp_create function.
 * This function returns a unique authentication token,
 * associated with the specific object ID and the specific MC
 * portal; this token must be used in all subsequent commands for
 * this specific object
 *
 * Return:      '0' on Success; Error code otherwise.
 */
int dpmcp_open(struct fsl_mc_io *mc_io,
               u32 cmd_flags,
               int dpmcp_id,
               u16 *token)
{
        struct fsl_mc_command cmd = { 0 };
        struct dpmcp_cmd_open *cmd_params;
        int err;

        /* prepare command */
        cmd.header = mc_encode_cmd_header(DPMCP_CMDID_OPEN,
                                          cmd_flags, 0);
        cmd_params = (struct dpmcp_cmd_open *)cmd.params;
        cmd_params->dpmcp_id = cpu_to_le32(dpmcp_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;
}

/**
 * dpmcp_close() - Close the control session of the object
 * @mc_io:      Pointer to MC portal's I/O object
 * @cmd_flags:  Command flags; one or more of 'MC_CMD_FLAG_'
 * @token:      Token of DPMCP object
 *
 * After this function is called, no further operations are
 * allowed on the object without opening a new control session.
 *
 * Return:      '0' on Success; Error code otherwise.
 */
int dpmcp_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(DPMCP_CMDID_CLOSE,
                                          cmd_flags, token);

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