lkml.org 
[lkml]   [2022]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 015/262] HID: amd_sfh: Add functionality to clear interrupts
    Date
    From: Basavaraj Natikar <Basavaraj.Natikar@amd.com>

    [ Upstream commit fb75a3791a8032848c987db29b622878d8fe2b1c ]

    Newer AMD platforms with SFH may generate interrupts on some events
    which are unwarranted. Until this is cleared the actual MP2 data
    processing maybe stalled in some cases.

    Add a mechanism to clear the pending interrupts (if any) during the
    driver initialization and sensor command operations.

    Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 25 ++++++++++++++++++++++++-
    drivers/hid/amd-sfh-hid/amd_sfh_pcie.h | 1 +
    2 files changed, 25 insertions(+), 1 deletion(-)

    diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
    index 4198a8a786c8a..f1efeeaa465a2 100644
    --- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
    +++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
    @@ -88,6 +88,20 @@ static void amd_stop_all_sensor_v2(struct amd_mp2_dev *privdata)
    writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
    }

    +static void amd_sfh_clear_intr_v2(struct amd_mp2_dev *privdata)
    +{
    + if (readl(privdata->mmio + AMD_P2C_MSG(4))) {
    + writel(0, privdata->mmio + AMD_P2C_MSG(4));
    + writel(0xf, privdata->mmio + AMD_P2C_MSG(5));
    + }
    +}
    +
    +static void amd_sfh_clear_intr(struct amd_mp2_dev *privdata)
    +{
    + if (privdata->mp2_ops->clear_intr)
    + privdata->mp2_ops->clear_intr(privdata);
    +}
    +
    void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info)
    {
    union sfh_cmd_param cmd_param;
    @@ -192,6 +206,7 @@ static void amd_mp2_pci_remove(void *privdata)
    struct amd_mp2_dev *mp2 = privdata;
    amd_sfh_hid_client_deinit(privdata);
    mp2->mp2_ops->stop_all(mp2);
    + amd_sfh_clear_intr(mp2);
    }

    static const struct amd_mp2_ops amd_sfh_ops_v2 = {
    @@ -199,6 +214,7 @@ static const struct amd_mp2_ops amd_sfh_ops_v2 = {
    .stop = amd_stop_sensor_v2,
    .stop_all = amd_stop_all_sensor_v2,
    .response = amd_sfh_wait_response_v2,
    + .clear_intr = amd_sfh_clear_intr_v2,
    };

    static const struct amd_mp2_ops amd_sfh_ops = {
    @@ -258,8 +274,13 @@ static int amd_mp2_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
    mp2_select_ops(privdata);

    rc = amd_sfh_hid_client_init(privdata);
    - if (rc)
    + if (rc) {
    + amd_sfh_clear_intr(privdata);
    + dev_err(&pdev->dev, "amd_sfh_hid_client_init failed\n");
    return rc;
    + }
    +
    + amd_sfh_clear_intr(privdata);

    return devm_add_action_or_reset(&pdev->dev, amd_mp2_pci_remove, privdata);
    }
    @@ -288,6 +309,7 @@ static int __maybe_unused amd_mp2_pci_resume(struct device *dev)
    }

    schedule_delayed_work(&cl_data->work_buffer, msecs_to_jiffies(AMD_SFH_IDLE_LOOP));
    + amd_sfh_clear_intr(mp2);

    return 0;
    }
    @@ -313,6 +335,7 @@ static int __maybe_unused amd_mp2_pci_suspend(struct device *dev)
    }

    cancel_delayed_work_sync(&cl_data->work_buffer);
    + amd_sfh_clear_intr(mp2);

    return 0;
    }
    diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
    index 9c9119227135e..ee9818d3082e3 100644
    --- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
    +++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
    @@ -140,5 +140,6 @@ struct amd_mp2_ops {
    void (*stop)(struct amd_mp2_dev *privdata, u16 sensor_idx);
    void (*stop_all)(struct amd_mp2_dev *privdata);
    int (*response)(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
    + void (*clear_intr)(struct amd_mp2_dev *privdata);
    };
    #endif
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-03-07 11:02    [W:2.225 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site