lkml.org 
[lkml]   [2023]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.1 06/47] platform/x86: serial-multi-instantiate: Auto detect IRQ resource for CSC3551
    Date
    From: David Xu <xuwd1@hotmail.com>

    [ Upstream commit 676b7c5ecab36274442887ceadd6dee8248a244f ]

    The current code assumes that the CSC3551(multiple cs35l41) always have
    its interrupt pin connected to GPIO thus the IRQ can be acquired with
    acpi_dev_gpio_irq_get. However on some newer laptop models this is no
    longer the case as they have the CSC3551's interrupt pin connected to
    APIC. This causes smi_i2c_probe to fail on these machines.

    To support these machines, a new macro IRQ_RESOURCE_AUTO was introduced
    for cs35l41 smi_node, and smi_get_irq function was modified so it tries
    to get GPIO irq resource first and if failed, tries to get
    APIC irq resource for cs35l41.

    This patch affects only the cs35l41's probing and brings no negative
    influence on machines that indeed have the cs35l41's interrupt pin
    connected to GPIO.

    Signed-off-by: David Xu <xuwd1@hotmail.com>
    Link: https://lore.kernel.org/r/SY4P282MB18350CD8288687B87FFD2243E037A@SY4P282MB1835.AUSP282.PROD.OUTLOOK.COM
    Reviewed-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../platform/x86/serial-multi-instantiate.c | 21 +++++++++++++++----
    1 file changed, 17 insertions(+), 4 deletions(-)

    diff --git a/drivers/platform/x86/serial-multi-instantiate.c b/drivers/platform/x86/serial-multi-instantiate.c
    index 5362f1a7b77c5..85c9eabd85c08 100644
    --- a/drivers/platform/x86/serial-multi-instantiate.c
    +++ b/drivers/platform/x86/serial-multi-instantiate.c
    @@ -21,6 +21,7 @@
    #define IRQ_RESOURCE_NONE 0
    #define IRQ_RESOURCE_GPIO 1
    #define IRQ_RESOURCE_APIC 2
    +#define IRQ_RESOURCE_AUTO 3

    enum smi_bus_type {
    SMI_I2C,
    @@ -52,6 +53,18 @@ static int smi_get_irq(struct platform_device *pdev, struct acpi_device *adev,
    int ret;

    switch (inst->flags & IRQ_RESOURCE_TYPE) {
    + case IRQ_RESOURCE_AUTO:
    + ret = acpi_dev_gpio_irq_get(adev, inst->irq_idx);
    + if (ret > 0) {
    + dev_dbg(&pdev->dev, "Using gpio irq\n");
    + break;
    + }
    + ret = platform_get_irq(pdev, inst->irq_idx);
    + if (ret > 0) {
    + dev_dbg(&pdev->dev, "Using platform irq\n");
    + break;
    + }
    + break;
    case IRQ_RESOURCE_GPIO:
    ret = acpi_dev_gpio_irq_get(adev, inst->irq_idx);
    break;
    @@ -308,10 +321,10 @@ static const struct smi_node int3515_data = {

    static const struct smi_node cs35l41_hda = {
    .instances = {
    - { "cs35l41-hda", IRQ_RESOURCE_GPIO, 0 },
    - { "cs35l41-hda", IRQ_RESOURCE_GPIO, 0 },
    - { "cs35l41-hda", IRQ_RESOURCE_GPIO, 0 },
    - { "cs35l41-hda", IRQ_RESOURCE_GPIO, 0 },
    + { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
    + { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
    + { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
    + { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
    {}
    },
    .bus_type = SMI_AUTO_DETECT,
    --
    2.40.1
    \
     
     \ /
      Last update: 2023-08-13 18:02    [W:4.152 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site