HID: intel-ish-hid: Hide members of struct ishtp_cl_device
ISH clients don't need to access any field of struct ishtp_cl_device. To avoid this create an interface functions instead where it is required. In the case of ishtp_cl_allocate(), modify the parameters so that the clients don't have to dereference. Clients can also use tracing, here a new interface is added to get the common trace function pointer, instead of direct call. The new interface functions defined in one external header file, named intel-ish-client-if.h. This is the only header files all ISHTP clients must include. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
Родитель
6b3f75f75f
Коммит
7ab2184246
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/hid.h>
|
||||
#include <linux/intel-ish-client-if.h>
|
||||
#include <linux/sched.h>
|
||||
#include "ishtp/ishtp-dev.h"
|
||||
#include "ishtp/client.h"
|
||||
|
@ -24,6 +25,8 @@
|
|||
#define HID_CL_RX_RING_SIZE 32
|
||||
#define HID_CL_TX_RING_SIZE 16
|
||||
|
||||
#define cl_data_to_dev(client_data) ishtp_device(client_data->cl_device)
|
||||
|
||||
/**
|
||||
* report_bad_packets() - Report bad packets
|
||||
* @hid_ishtp_cl: Client instance to get stats
|
||||
|
@ -39,7 +42,7 @@ static void report_bad_packet(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
struct hostif_msg *recv_msg = recv_buf;
|
||||
struct ishtp_cl_data *client_data = hid_ishtp_cl->client_data;
|
||||
|
||||
dev_err(&client_data->cl_device->dev, "[hid-ish]: BAD packet %02X\n"
|
||||
dev_err(cl_data_to_dev(client_data), "[hid-ish]: BAD packet %02X\n"
|
||||
"total_bad=%u cur_pos=%u\n"
|
||||
"[%02X %02X %02X %02X]\n"
|
||||
"payload_len=%u\n"
|
||||
|
@ -85,7 +88,7 @@ static void process_recv(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
|
||||
do {
|
||||
if (cur_pos + sizeof(struct hostif_msg) > total_len) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: error, received %u which is less than data header %u\n",
|
||||
(unsigned int)data_len,
|
||||
(unsigned int)sizeof(struct hostif_msg_hdr));
|
||||
|
@ -124,12 +127,12 @@ static void process_recv(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
client_data->hid_dev_count = (unsigned int)*payload;
|
||||
if (!client_data->hid_devices)
|
||||
client_data->hid_devices = devm_kcalloc(
|
||||
&client_data->cl_device->dev,
|
||||
cl_data_to_dev(client_data),
|
||||
client_data->hid_dev_count,
|
||||
sizeof(struct device_info),
|
||||
GFP_KERNEL);
|
||||
if (!client_data->hid_devices) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"Mem alloc failed for hid device info\n");
|
||||
wake_up_interruptible(&client_data->init_wait);
|
||||
break;
|
||||
|
@ -137,7 +140,7 @@ static void process_recv(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
for (i = 0; i < client_data->hid_dev_count; ++i) {
|
||||
if (1 + sizeof(struct device_info) * i >=
|
||||
payload_len) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: [ENUM_DEVICES]: content size %zu is bigger than payload_len %zu\n",
|
||||
1 + sizeof(struct device_info)
|
||||
* i, payload_len);
|
||||
|
@ -172,7 +175,7 @@ static void process_recv(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
}
|
||||
if (!client_data->hid_descr[curr_hid_dev])
|
||||
client_data->hid_descr[curr_hid_dev] =
|
||||
devm_kmalloc(&client_data->cl_device->dev,
|
||||
devm_kmalloc(cl_data_to_dev(client_data),
|
||||
payload_len, GFP_KERNEL);
|
||||
if (client_data->hid_descr[curr_hid_dev]) {
|
||||
memcpy(client_data->hid_descr[curr_hid_dev],
|
||||
|
@ -197,7 +200,7 @@ static void process_recv(struct ishtp_cl *hid_ishtp_cl, void *recv_buf,
|
|||
}
|
||||
if (!client_data->report_descr[curr_hid_dev])
|
||||
client_data->report_descr[curr_hid_dev] =
|
||||
devm_kmalloc(&client_data->cl_device->dev,
|
||||
devm_kmalloc(cl_data_to_dev(client_data),
|
||||
payload_len, GFP_KERNEL);
|
||||
if (client_data->report_descr[curr_hid_dev]) {
|
||||
memcpy(client_data->report_descr[curr_hid_dev],
|
||||
|
@ -516,12 +519,12 @@ static int ishtp_enum_enum_devices(struct ishtp_cl *hid_ishtp_cl)
|
|||
sizeof(struct hostif_msg));
|
||||
}
|
||||
if (!client_data->enum_devices_done) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: timed out waiting for enum_devices\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
if (!client_data->hid_devices) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: failed to allocate HID dev structures\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -564,13 +567,13 @@ static int ishtp_get_hid_descriptor(struct ishtp_cl *hid_ishtp_cl, int index)
|
|||
client_data->hid_descr_done,
|
||||
3 * HZ);
|
||||
if (!client_data->hid_descr_done) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: timed out for hid_descr_done\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (!client_data->hid_descr[index]) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: allocation HID desc fail\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -611,12 +614,12 @@ static int ishtp_get_report_descriptor(struct ishtp_cl *hid_ishtp_cl,
|
|||
client_data->report_descr_done,
|
||||
3 * HZ);
|
||||
if (!client_data->report_descr_done) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: timed out for report descr\n");
|
||||
return -EIO;
|
||||
}
|
||||
if (!client_data->report_descr[index]) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: failed to alloc report descr\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -646,12 +649,12 @@ static int hid_ishtp_cl_init(struct ishtp_cl *hid_ishtp_cl, int reset)
|
|||
int i;
|
||||
int rv;
|
||||
|
||||
dev_dbg(&client_data->cl_device->dev, "%s\n", __func__);
|
||||
dev_dbg(cl_data_to_dev(client_data), "%s\n", __func__);
|
||||
hid_ishtp_trace(client_data, "%s reset flag: %d\n", __func__, reset);
|
||||
|
||||
rv = ishtp_cl_link(hid_ishtp_cl, ISHTP_HOST_CLIENT_ID_ANY);
|
||||
if (rv) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"ishtp_cl_link failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -666,7 +669,7 @@ static int hid_ishtp_cl_init(struct ishtp_cl *hid_ishtp_cl, int reset)
|
|||
|
||||
fw_client = ishtp_fw_cl_get_client(dev, &hid_ishtp_guid);
|
||||
if (!fw_client) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"ish client uuid not found\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
@ -676,7 +679,7 @@ static int hid_ishtp_cl_init(struct ishtp_cl *hid_ishtp_cl, int reset)
|
|||
|
||||
rv = ishtp_cl_connect(hid_ishtp_cl);
|
||||
if (rv) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"client connect fail\n");
|
||||
goto err_cl_unlink;
|
||||
}
|
||||
|
@ -707,7 +710,7 @@ static int hid_ishtp_cl_init(struct ishtp_cl *hid_ishtp_cl, int reset)
|
|||
if (!reset) {
|
||||
rv = ishtp_hid_probe(i, client_data);
|
||||
if (rv) {
|
||||
dev_err(&client_data->cl_device->dev,
|
||||
dev_err(cl_data_to_dev(client_data),
|
||||
"[hid-ish]: HID probe for #%u failed: %d\n",
|
||||
i, rv);
|
||||
goto err_cl_disconnect;
|
||||
|
@ -763,7 +766,7 @@ static void hid_ishtp_cl_reset_handler(struct work_struct *work)
|
|||
|
||||
hid_ishtp_cl_deinit(hid_ishtp_cl);
|
||||
|
||||
hid_ishtp_cl = ishtp_cl_allocate(cl_device->ishtp_dev);
|
||||
hid_ishtp_cl = ishtp_cl_allocate(cl_device);
|
||||
if (!hid_ishtp_cl)
|
||||
return;
|
||||
|
||||
|
@ -777,15 +780,17 @@ static void hid_ishtp_cl_reset_handler(struct work_struct *work)
|
|||
rv = hid_ishtp_cl_init(hid_ishtp_cl, 1);
|
||||
if (!rv)
|
||||
break;
|
||||
dev_err(&client_data->cl_device->dev, "Retry reset init\n");
|
||||
dev_err(cl_data_to_dev(client_data), "Retry reset init\n");
|
||||
}
|
||||
if (rv) {
|
||||
dev_err(&client_data->cl_device->dev, "Reset Failed\n");
|
||||
dev_err(cl_data_to_dev(client_data), "Reset Failed\n");
|
||||
hid_ishtp_trace(client_data, "%s Failed hid_ishtp_cl %p\n",
|
||||
__func__, hid_ishtp_cl);
|
||||
}
|
||||
}
|
||||
|
||||
void (*hid_print_trace)(void *dev, const char *format, ...);
|
||||
|
||||
/**
|
||||
* hid_ishtp_cl_probe() - ISHTP client driver probe
|
||||
* @cl_device: ISHTP client device instance
|
||||
|
@ -803,12 +808,13 @@ static int hid_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
|
|||
if (!cl_device)
|
||||
return -ENODEV;
|
||||
|
||||
client_data = devm_kzalloc(&cl_device->dev, sizeof(*client_data),
|
||||
client_data = devm_kzalloc(ishtp_device(cl_device),
|
||||
sizeof(*client_data),
|
||||
GFP_KERNEL);
|
||||
if (!client_data)
|
||||
return -ENOMEM;
|
||||
|
||||
hid_ishtp_cl = ishtp_cl_allocate(cl_device->ishtp_dev);
|
||||
hid_ishtp_cl = ishtp_cl_allocate(cl_device);
|
||||
if (!hid_ishtp_cl)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -822,6 +828,8 @@ static int hid_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
|
|||
|
||||
INIT_WORK(&client_data->work, hid_ishtp_cl_reset_handler);
|
||||
|
||||
hid_print_trace = ishtp_trace_callback(cl_device);
|
||||
|
||||
rv = hid_ishtp_cl_init(hid_ishtp_cl, 0);
|
||||
if (rv) {
|
||||
ishtp_cl_free(hid_ishtp_cl);
|
||||
|
@ -848,7 +856,7 @@ static int hid_ishtp_cl_remove(struct ishtp_cl_device *cl_device)
|
|||
hid_ishtp_trace(client_data, "%s hid_ishtp_cl %p\n", __func__,
|
||||
hid_ishtp_cl);
|
||||
|
||||
dev_dbg(&cl_device->dev, "%s\n", __func__);
|
||||
dev_dbg(ishtp_device(cl_device), "%s\n", __func__);
|
||||
hid_ishtp_cl->state = ISHTP_CL_DISCONNECTING;
|
||||
ishtp_cl_disconnect(hid_ishtp_cl);
|
||||
ishtp_put_device(cl_device);
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/hid.h>
|
||||
#include <linux/intel-ish-client-if.h>
|
||||
#include <uapi/linux/input.h>
|
||||
#include "ishtp/client.h"
|
||||
#include "ishtp-hid.h"
|
||||
|
@ -241,7 +242,8 @@ int ishtp_hid_probe(unsigned int cur_hid_dev,
|
|||
|
||||
hid->ll_driver = &ishtp_hid_ll_driver;
|
||||
hid->bus = BUS_INTEL_ISHTP;
|
||||
hid->dev.parent = &client_data->cl_device->dev;
|
||||
hid->dev.parent = ishtp_device(client_data->cl_device);
|
||||
|
||||
hid->version = le16_to_cpu(ISH_HID_VERSION);
|
||||
hid->vendor = le16_to_cpu(client_data->hid_devices[cur_hid_dev].vid);
|
||||
hid->product = le16_to_cpu(client_data->hid_devices[cur_hid_dev].pid);
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#define IS_RESPONSE 0x80
|
||||
|
||||
/* Used to dump to Linux trace buffer, if enabled */
|
||||
#define hid_ishtp_trace(client, ...) \
|
||||
#define hid_ishtp_trace(client, ...) \
|
||||
client->cl_device->ishtp_dev->print_log(\
|
||||
client->cl_device->ishtp_dev, __VA_ARGS__)
|
||||
|
||||
|
|
|
@ -827,6 +827,33 @@ int ishtp_use_dma_transfer(void)
|
|||
return ishtp_use_dma;
|
||||
}
|
||||
|
||||
/**
|
||||
* ishtp_device() - Return device pointer
|
||||
*
|
||||
* This interface is used to return device pointer from ishtp_cl_device
|
||||
* instance.
|
||||
*
|
||||
* Return: device *.
|
||||
*/
|
||||
struct device *ishtp_device(struct ishtp_cl_device *device)
|
||||
{
|
||||
return &device->dev;
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_device);
|
||||
|
||||
/**
|
||||
* ishtp_trace_callback() - Return trace callback
|
||||
*
|
||||
* This interface is used to return trace callback function pointer.
|
||||
*
|
||||
* Return: void *.
|
||||
*/
|
||||
void *ishtp_trace_callback(struct ishtp_cl_device *cl_device)
|
||||
{
|
||||
return cl_device->ishtp_dev->print_log;
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_trace_callback);
|
||||
|
||||
/**
|
||||
* ishtp_bus_register() - Function to register bus
|
||||
*
|
||||
|
|
|
@ -126,7 +126,7 @@ static void ishtp_cl_init(struct ishtp_cl *cl, struct ishtp_device *dev)
|
|||
*
|
||||
* Return: The allocated client instance or NULL on failure
|
||||
*/
|
||||
struct ishtp_cl *ishtp_cl_allocate(struct ishtp_device *dev)
|
||||
struct ishtp_cl *ishtp_cl_allocate(struct ishtp_cl_device *cl_device)
|
||||
{
|
||||
struct ishtp_cl *cl;
|
||||
|
||||
|
@ -134,7 +134,7 @@ struct ishtp_cl *ishtp_cl_allocate(struct ishtp_device *dev)
|
|||
if (!cl)
|
||||
return NULL;
|
||||
|
||||
ishtp_cl_init(cl, dev);
|
||||
ishtp_cl_init(cl, cl_device->ishtp_dev);
|
||||
return cl;
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_cl_allocate);
|
||||
|
|
|
@ -170,7 +170,7 @@ static inline bool ishtp_cl_cmp_id(const struct ishtp_cl *cl1,
|
|||
}
|
||||
|
||||
/* exported functions from ISHTP under client management scope */
|
||||
struct ishtp_cl *ishtp_cl_allocate(struct ishtp_device *dev);
|
||||
struct ishtp_cl *ishtp_cl_allocate(struct ishtp_cl_device *cl_device);
|
||||
void ishtp_cl_free(struct ishtp_cl *cl);
|
||||
int ishtp_cl_link(struct ishtp_cl *cl, int id);
|
||||
void ishtp_cl_unlink(struct ishtp_cl *cl);
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Intel ISH client Interface definitions
|
||||
*
|
||||
* Copyright (c) 2019, Intel Corporation.
|
||||
*/
|
||||
|
||||
#ifndef _INTEL_ISH_CLIENT_IF_H_
|
||||
#define _INTEL_ISH_CLIENT_IF_H_
|
||||
|
||||
struct ishtp_cl_device;
|
||||
|
||||
/* Get the device * from ishtp device instance */
|
||||
struct device *ishtp_device(struct ishtp_cl_device *cl_device);
|
||||
/* Trace interface for clients */
|
||||
void *ishtp_trace_callback(struct ishtp_cl_device *cl_device);
|
||||
|
||||
#endif /* _INTEL_ISH_CLIENT_IF_H_ */
|
Загрузка…
Ссылка в новой задаче