1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2/*
3 * Copyright 2021 NXP
4 *
5 */
6#include <linux/kernel.h>
7#include <linux/fsl/mc.h>
8
9#include "fsl-mc-private.h"
10
11static int fsl_mc_get_open_cmd_id(const char *type)
12{
13	static const struct {
14		int cmd_id;
15		const char *type;
16	} dev_ids[] = {
17		{ DPRTC_CMDID_OPEN, "dprtc" },
18		{ DPRC_CMDID_OPEN, "dprc" },
19		{ DPNI_CMDID_OPEN, "dpni" },
20		{ DPIO_CMDID_OPEN, "dpio" },
21		{ DPSW_CMDID_OPEN, "dpsw" },
22		{ DPBP_CMDID_OPEN, "dpbp" },
23		{ DPCON_CMDID_OPEN, "dpcon" },
24		{ DPMCP_CMDID_OPEN, "dpmcp" },
25		{ DPMAC_CMDID_OPEN, "dpmac" },
26		{ DPSECI_CMDID_OPEN, "dpseci" },
27		{ DPDMUX_CMDID_OPEN, "dpdmux" },
28		{ DPDCEI_CMDID_OPEN, "dpdcei" },
29		{ DPAIOP_CMDID_OPEN, "dpaiop" },
30		{ DPCI_CMDID_OPEN, "dpci" },
31		{ DPDMAI_CMDID_OPEN, "dpdmai" },
32		{ DPDBG_CMDID_OPEN, "dpdbg" },
33		{ 0, NULL }
34	};
35	int i;
36
37	for (i = 0; dev_ids[i].type; i++)
38		if (!strcmp(dev_ids[i].type, type))
39			return dev_ids[i].cmd_id;
40
41	return -1;
42}
43
44int fsl_mc_obj_open(struct fsl_mc_io *mc_io,
45		    u32 cmd_flags,
46		    int obj_id,
47		    char *obj_type,
48		    u16 *token)
49{
50	struct fsl_mc_command cmd = { 0 };
51	struct fsl_mc_obj_cmd_open *cmd_params;
52	int err = 0;
53	int cmd_id = fsl_mc_get_open_cmd_id(obj_type);
54
55	if (cmd_id == -1)
56		return -ENODEV;
57
58	/* prepare command */
59	cmd.header = mc_encode_cmd_header(cmd_id, cmd_flags, 0);
60	cmd_params = (struct fsl_mc_obj_cmd_open *)cmd.params;
61	cmd_params->obj_id = cpu_to_le32(obj_id);
62
63	/* send command to mc*/
64	err = mc_send_command(mc_io, &cmd);
65	if (err)
66		return err;
67
68	/* retrieve response parameters */
69	*token = mc_cmd_hdr_read_token(&cmd);
70
71	return err;
72}
73EXPORT_SYMBOL_GPL(fsl_mc_obj_open);
74
75int fsl_mc_obj_close(struct fsl_mc_io *mc_io,
76		     u32 cmd_flags,
77		     u16 token)
78{
79	struct fsl_mc_command cmd = { 0 };
80
81	/* prepare command */
82	cmd.header = mc_encode_cmd_header(OBJ_CMDID_CLOSE, cmd_flags,
83					  token);
84
85	/* send command to mc*/
86	return mc_send_command(mc_io, &cmd);
87}
88EXPORT_SYMBOL_GPL(fsl_mc_obj_close);
89
90int fsl_mc_obj_reset(struct fsl_mc_io *mc_io,
91		     u32 cmd_flags,
92		     u16 token)
93{
94	struct fsl_mc_command cmd = { 0 };
95
96	/* prepare command */
97	cmd.header = mc_encode_cmd_header(OBJ_CMDID_RESET, cmd_flags,
98					  token);
99
100	/* send command to mc*/
101	return mc_send_command(mc_io, &cmd);
102}
103EXPORT_SYMBOL_GPL(fsl_mc_obj_reset);
104