162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include <linux/kernel.h> 762306a36Sopenharmony_ci#include <linux/fsl/mc.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "fsl-mc-private.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/** 1262306a36Sopenharmony_ci * dpmcp_open() - Open a control session for the specified object. 1362306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 1462306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 1562306a36Sopenharmony_ci * @dpmcp_id: DPMCP unique ID 1662306a36Sopenharmony_ci * @token: Returned token; use in subsequent API calls 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * This function can be used to open a control session for an 1962306a36Sopenharmony_ci * already created object; an object may have been declared in 2062306a36Sopenharmony_ci * the DPL or by calling the dpmcp_create function. 2162306a36Sopenharmony_ci * This function returns a unique authentication token, 2262306a36Sopenharmony_ci * associated with the specific object ID and the specific MC 2362306a36Sopenharmony_ci * portal; this token must be used in all subsequent commands for 2462306a36Sopenharmony_ci * this specific object 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ciint dpmcp_open(struct fsl_mc_io *mc_io, 2962306a36Sopenharmony_ci u32 cmd_flags, 3062306a36Sopenharmony_ci int dpmcp_id, 3162306a36Sopenharmony_ci u16 *token) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 3462306a36Sopenharmony_ci struct dpmcp_cmd_open *cmd_params; 3562306a36Sopenharmony_ci int err; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci /* prepare command */ 3862306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPMCP_CMDID_OPEN, 3962306a36Sopenharmony_ci cmd_flags, 0); 4062306a36Sopenharmony_ci cmd_params = (struct dpmcp_cmd_open *)cmd.params; 4162306a36Sopenharmony_ci cmd_params->dpmcp_id = cpu_to_le32(dpmcp_id); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci /* send command to mc*/ 4462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 4562306a36Sopenharmony_ci if (err) 4662306a36Sopenharmony_ci return err; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci /* retrieve response parameters */ 4962306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci return err; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/** 5562306a36Sopenharmony_ci * dpmcp_close() - Close the control session of the object 5662306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 5762306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 5862306a36Sopenharmony_ci * @token: Token of DPMCP object 5962306a36Sopenharmony_ci * 6062306a36Sopenharmony_ci * After this function is called, no further operations are 6162306a36Sopenharmony_ci * allowed on the object without opening a new control session. 6262306a36Sopenharmony_ci * 6362306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ciint dpmcp_close(struct fsl_mc_io *mc_io, 6662306a36Sopenharmony_ci u32 cmd_flags, 6762306a36Sopenharmony_ci u16 token) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* prepare command */ 7262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLOSE, 7362306a36Sopenharmony_ci cmd_flags, token); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* send command to mc*/ 7662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/** 8062306a36Sopenharmony_ci * dpmcp_reset() - Reset the DPMCP, returns the object to initial state. 8162306a36Sopenharmony_ci * @mc_io: Pointer to MC portal's I/O object 8262306a36Sopenharmony_ci * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 8362306a36Sopenharmony_ci * @token: Token of DPMCP object 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * Return: '0' on Success; Error code otherwise. 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ciint dpmcp_reset(struct fsl_mc_io *mc_io, 8862306a36Sopenharmony_ci u32 cmd_flags, 8962306a36Sopenharmony_ci u16 token) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci /* prepare command */ 9462306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(DPMCP_CMDID_RESET, 9562306a36Sopenharmony_ci cmd_flags, token); 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci /* send command to mc*/ 9862306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 9962306a36Sopenharmony_ci} 100