Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b39910c2 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman
Browse files

mei: bus: simplify how we build nfc bus name



Remove the dependency on struct ndev from the nfc device
name creation function so it is possible to use it
in a fixup routine

Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent dd070a16
Loading
Loading
Loading
Loading
+53 −62
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ struct mei_nfc_dev {
	u8 fw_ivn;
	u8 vendor_id;
	u8 radio_type;
	char *bus_name;
	const char *bus_name;
};

/* UUIDs for NFC F/W clients */
@@ -184,69 +184,30 @@ static void mei_nfc_free(struct mei_nfc_dev *ndev)
	kfree(ndev);
}

static int mei_nfc_build_bus_name(struct mei_nfc_dev *ndev)
{
	struct mei_device *bus;

	if (!ndev->cl)
		return -ENODEV;

	bus = ndev->cl->dev;

	switch (ndev->vendor_id) {
	case MEI_NFC_VENDOR_INSIDE:
		switch (ndev->radio_type) {
		case MEI_NFC_VENDOR_INSIDE_UREAD:
			ndev->bus_name = "microread";
			return 0;

		default:
			dev_err(bus->dev, "Unknown radio type 0x%x\n",
				ndev->radio_type);

			return -EINVAL;
		}

	case MEI_NFC_VENDOR_NXP:
		switch (ndev->radio_type) {
		case MEI_NFC_VENDOR_NXP_PN544:
			ndev->bus_name = "pn544";
			return 0;
		default:
			dev_err(bus->dev, "Unknown radio type 0x%x\n",
				ndev->radio_type);

			return -EINVAL;
		}

	default:
		dev_err(bus->dev, "Unknown vendor ID 0x%x\n",
			ndev->vendor_id);

		return -EINVAL;
	}

	return 0;
}

static int mei_nfc_if_version(struct mei_nfc_dev *ndev)
/**
 * mei_nfc_if_version - get NFC interface version
 *
 * @cl: host client (nfc info)
 * @ver: NFC interface version to be filled in
 *
 * Return: 0 on success; < 0 otherwise
 */
static int mei_nfc_if_version(struct mei_cl *cl,
			      struct mei_nfc_if_version *ver)
{
	struct mei_device *bus;
	struct mei_cl *cl;

	struct mei_nfc_cmd cmd;
	struct mei_nfc_cmd cmd = {
		.command = MEI_NFC_CMD_MAINTENANCE,
		.data_size = 1,
		.sub_command = MEI_NFC_SUBCMD_IF_VERSION,
	};
	struct mei_nfc_reply *reply = NULL;
	struct mei_nfc_if_version *version;
	size_t if_version_length;
	int bytes_recv, ret;

	cl = ndev->cl_info;
	bus = cl->dev;

	memset(&cmd, 0, sizeof(struct mei_nfc_cmd));
	cmd.command = MEI_NFC_CMD_MAINTENANCE;
	cmd.data_size = 1;
	cmd.sub_command = MEI_NFC_SUBCMD_IF_VERSION;
	WARN_ON(mutex_is_locked(&bus->device_lock));

	ret = __mei_cl_send(cl, (u8 *)&cmd, sizeof(struct mei_nfc_cmd), 1);
	if (ret < 0) {
@@ -262,6 +223,7 @@ static int mei_nfc_if_version(struct mei_nfc_dev *ndev)
	if (!reply)
		return -ENOMEM;

	ret = 0;
	bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length);
	if (bytes_recv < 0 || bytes_recv < sizeof(struct mei_nfc_reply)) {
		dev_err(bus->dev, "Could not read IF version\n");
@@ -269,17 +231,39 @@ static int mei_nfc_if_version(struct mei_nfc_dev *ndev)
		goto err;
	}

	version = (struct mei_nfc_if_version *)reply->data;
	memcpy(ver, reply->data, sizeof(struct mei_nfc_if_version));

	ndev->fw_ivn = version->fw_ivn;
	ndev->vendor_id = version->vendor_id;
	ndev->radio_type = version->radio_type;
	dev_info(bus->dev, "NFC MEI VERSION: IVN 0x%x Vendor ID 0x%x Type 0x%x\n",
		ver->fw_ivn, ver->vendor_id, ver->radio_type);

err:
	kfree(reply);
	return ret;
}

/**
 * mei_nfc_radio_name - derive nfc radio name from the interface version
 *
 * @ver: NFC radio version
 *
 * Return: radio name string
 */
static const char *mei_nfc_radio_name(struct mei_nfc_if_version *ver)
{

	if (ver->vendor_id == MEI_NFC_VENDOR_INSIDE) {
		if (ver->radio_type == MEI_NFC_VENDOR_INSIDE_UREAD)
			return "microread";
	}

	if (ver->vendor_id == MEI_NFC_VENDOR_NXP) {
		if (ver->radio_type == MEI_NFC_VENDOR_NXP_PN544)
			return "pn544";
	}

	return NULL;
}

static void mei_nfc_init(struct work_struct *work)
{
	struct mei_device *bus;
@@ -287,6 +271,7 @@ static void mei_nfc_init(struct work_struct *work)
	struct mei_nfc_dev *ndev;
	struct mei_cl *cl_info;
	struct mei_me_client *me_cl_info;
	struct mei_nfc_if_version version;

	ndev = container_of(work, struct mei_nfc_dev, init_work);

@@ -313,12 +298,16 @@ static void mei_nfc_init(struct work_struct *work)
	mei_me_cl_put(me_cl_info);
	mutex_unlock(&bus->device_lock);

	if (mei_nfc_if_version(ndev) < 0) {
	if (mei_nfc_if_version(cl_info, &version) < 0) {
		dev_err(bus->dev, "Could not get the NFC interface version");

		goto err;
	}

	ndev->fw_ivn = version.fw_ivn;
	ndev->vendor_id = version.vendor_id;
	ndev->radio_type = version.radio_type;

	dev_info(bus->dev, "NFC MEI VERSION: IVN 0x%x Vendor ID 0x%x Type 0x%x\n",
		ndev->fw_ivn, ndev->vendor_id, ndev->radio_type);

@@ -333,7 +322,9 @@ static void mei_nfc_init(struct work_struct *work)

	mutex_unlock(&bus->device_lock);

	if (mei_nfc_build_bus_name(ndev) < 0) {
	ndev->bus_name = mei_nfc_radio_name(&version);

	if (!ndev->bus_name) {
		dev_err(bus->dev, "Could not build the bus ID name\n");
		return;
	}
+1 −1
Original line number Diff line number Diff line
@@ -710,7 +710,7 @@ static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
struct mei_cl_device *mei_cl_add_device(struct mei_device *bus,
					struct mei_me_client *me_cl,
					struct mei_cl *cl,
					char *name)
					const char *name)
{
	struct mei_cl_device *cldev;
	int status;
+1 −1
Original line number Diff line number Diff line
@@ -333,7 +333,7 @@ struct mei_hw_ops {
struct mei_cl_device *mei_cl_add_device(struct mei_device *bus,
					struct mei_me_client *me_cl,
					struct mei_cl *cl,
					char *name);
					const char *name);
void mei_cl_remove_device(struct mei_cl_device *cldev);
void mei_cl_dev_fixup(struct mei_cl_device *dev);
ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,