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