162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2021 NXP 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_cistatic int fsl_mc_get_open_cmd_id(const char *type) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci static const struct { 1462306a36Sopenharmony_ci int cmd_id; 1562306a36Sopenharmony_ci const char *type; 1662306a36Sopenharmony_ci } dev_ids[] = { 1762306a36Sopenharmony_ci { DPRTC_CMDID_OPEN, "dprtc" }, 1862306a36Sopenharmony_ci { DPRC_CMDID_OPEN, "dprc" }, 1962306a36Sopenharmony_ci { DPNI_CMDID_OPEN, "dpni" }, 2062306a36Sopenharmony_ci { DPIO_CMDID_OPEN, "dpio" }, 2162306a36Sopenharmony_ci { DPSW_CMDID_OPEN, "dpsw" }, 2262306a36Sopenharmony_ci { DPBP_CMDID_OPEN, "dpbp" }, 2362306a36Sopenharmony_ci { DPCON_CMDID_OPEN, "dpcon" }, 2462306a36Sopenharmony_ci { DPMCP_CMDID_OPEN, "dpmcp" }, 2562306a36Sopenharmony_ci { DPMAC_CMDID_OPEN, "dpmac" }, 2662306a36Sopenharmony_ci { DPSECI_CMDID_OPEN, "dpseci" }, 2762306a36Sopenharmony_ci { DPDMUX_CMDID_OPEN, "dpdmux" }, 2862306a36Sopenharmony_ci { DPDCEI_CMDID_OPEN, "dpdcei" }, 2962306a36Sopenharmony_ci { DPAIOP_CMDID_OPEN, "dpaiop" }, 3062306a36Sopenharmony_ci { DPCI_CMDID_OPEN, "dpci" }, 3162306a36Sopenharmony_ci { DPDMAI_CMDID_OPEN, "dpdmai" }, 3262306a36Sopenharmony_ci { DPDBG_CMDID_OPEN, "dpdbg" }, 3362306a36Sopenharmony_ci { 0, NULL } 3462306a36Sopenharmony_ci }; 3562306a36Sopenharmony_ci int i; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci for (i = 0; dev_ids[i].type; i++) 3862306a36Sopenharmony_ci if (!strcmp(dev_ids[i].type, type)) 3962306a36Sopenharmony_ci return dev_ids[i].cmd_id; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return -1; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciint fsl_mc_obj_open(struct fsl_mc_io *mc_io, 4562306a36Sopenharmony_ci u32 cmd_flags, 4662306a36Sopenharmony_ci int obj_id, 4762306a36Sopenharmony_ci char *obj_type, 4862306a36Sopenharmony_ci u16 *token) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 5162306a36Sopenharmony_ci struct fsl_mc_obj_cmd_open *cmd_params; 5262306a36Sopenharmony_ci int err = 0; 5362306a36Sopenharmony_ci int cmd_id = fsl_mc_get_open_cmd_id(obj_type); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci if (cmd_id == -1) 5662306a36Sopenharmony_ci return -ENODEV; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci /* prepare command */ 5962306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(cmd_id, cmd_flags, 0); 6062306a36Sopenharmony_ci cmd_params = (struct fsl_mc_obj_cmd_open *)cmd.params; 6162306a36Sopenharmony_ci cmd_params->obj_id = cpu_to_le32(obj_id); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /* send command to mc*/ 6462306a36Sopenharmony_ci err = mc_send_command(mc_io, &cmd); 6562306a36Sopenharmony_ci if (err) 6662306a36Sopenharmony_ci return err; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* retrieve response parameters */ 6962306a36Sopenharmony_ci *token = mc_cmd_hdr_read_token(&cmd); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci return err; 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(fsl_mc_obj_open); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ciint fsl_mc_obj_close(struct fsl_mc_io *mc_io, 7662306a36Sopenharmony_ci u32 cmd_flags, 7762306a36Sopenharmony_ci u16 token) 7862306a36Sopenharmony_ci{ 7962306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci /* prepare command */ 8262306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(OBJ_CMDID_CLOSE, cmd_flags, 8362306a36Sopenharmony_ci token); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci /* send command to mc*/ 8662306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(fsl_mc_obj_close); 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciint fsl_mc_obj_reset(struct fsl_mc_io *mc_io, 9162306a36Sopenharmony_ci u32 cmd_flags, 9262306a36Sopenharmony_ci u16 token) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci struct fsl_mc_command cmd = { 0 }; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci /* prepare command */ 9762306a36Sopenharmony_ci cmd.header = mc_encode_cmd_header(OBJ_CMDID_RESET, cmd_flags, 9862306a36Sopenharmony_ci token); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci /* send command to mc*/ 10162306a36Sopenharmony_ci return mc_send_command(mc_io, &cmd); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(fsl_mc_obj_reset); 104