From b39910c2e0ac7c3d0e2f1999b04308c771b1d8fc Mon Sep 17 00:00:00 2001 From: Tomas Winkler Date: Thu, 23 Jul 2015 15:08:46 +0300 Subject: 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: Tomas Winkler Signed-off-by: Greg Kroah-Hartman --- drivers/misc/mei/bus-fixup.c | 115 ++++++++++++++++++++----------------------- drivers/misc/mei/bus.c | 2 +- drivers/misc/mei/mei_dev.h | 2 +- 3 files changed, 55 insertions(+), 64 deletions(-) diff --git a/drivers/misc/mei/bus-fixup.c b/drivers/misc/mei/bus-fixup.c index fd6470f42671..a4c6719d36b4 100644 --- a/drivers/misc/mei/bus-fixup.c +++ b/drivers/misc/mei/bus-fixup.c @@ -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; } diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 68b7756bf384..7e51700515f4 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -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; diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index ad59ab776f2d..7098dcaccc96 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h @@ -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, -- cgit v1.2.3