mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:46:16 +00:00
HID: amd_sfh: Switch to device-managed dmam_alloc_coherent()
Using the device-managed version allows to simplify clean-up in probe()
error path.
Additionally, this device-managed ensures proper cleanup, which helps to
resolve memory errors, page faults, btrfs going read-only, and btrfs
disk corruption.
Fixes: 4b2c53d93a
("SFH:Transport Driver to add support of AMD Sensor Fusion Hub (SFH)")
Tested-by: Chris Hixon <linux-kernel-bugs@hixontech.com>
Tested-by: Richard <hobbes1069@gmail.com>
Tested-by: Skyler <skpu@pm.me>
Reported-by: Chris Hixon <linux-kernel-bugs@hixontech.com>
Closes: https://lore.kernel.org/all/3b129b1f-8636-456a-80b4-0f6cce0eef63@hixontech.com/
Link: https://bugzilla.kernel.org/show_bug.cgi?id=219331
Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
parent
7a5ab80711
commit
c56f9ecb7f
@ -236,9 +236,9 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
|
|||||||
cl_data->in_data = in_data;
|
cl_data->in_data = in_data;
|
||||||
|
|
||||||
for (i = 0; i < cl_data->num_hid_devices; i++) {
|
for (i = 0; i < cl_data->num_hid_devices; i++) {
|
||||||
in_data->sensor_virt_addr[i] = dma_alloc_coherent(dev, sizeof(int) * 8,
|
in_data->sensor_virt_addr[i] = dmam_alloc_coherent(dev, sizeof(int) * 8,
|
||||||
&cl_data->sensor_dma_addr[i],
|
&cl_data->sensor_dma_addr[i],
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!in_data->sensor_virt_addr[i]) {
|
if (!in_data->sensor_virt_addr[i]) {
|
||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -331,7 +331,6 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
|
|||||||
int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata)
|
int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata)
|
||||||
{
|
{
|
||||||
struct amdtp_cl_data *cl_data = privdata->cl_data;
|
struct amdtp_cl_data *cl_data = privdata->cl_data;
|
||||||
struct amd_input_data *in_data = cl_data->in_data;
|
|
||||||
int i, status;
|
int i, status;
|
||||||
|
|
||||||
for (i = 0; i < cl_data->num_hid_devices; i++) {
|
for (i = 0; i < cl_data->num_hid_devices; i++) {
|
||||||
@ -351,12 +350,5 @@ int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata)
|
|||||||
cancel_delayed_work_sync(&cl_data->work_buffer);
|
cancel_delayed_work_sync(&cl_data->work_buffer);
|
||||||
amdtp_hid_remove(cl_data);
|
amdtp_hid_remove(cl_data);
|
||||||
|
|
||||||
for (i = 0; i < cl_data->num_hid_devices; i++) {
|
|
||||||
if (in_data->sensor_virt_addr[i]) {
|
|
||||||
dma_free_coherent(&privdata->pdev->dev, 8 * sizeof(int),
|
|
||||||
in_data->sensor_virt_addr[i],
|
|
||||||
cl_data->sensor_dma_addr[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user