]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i3c: mipi-i3c-hci: Add a quirk to set PIO mode
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Thu, 29 Aug 2024 09:17:10 +0000 (14:47 +0530)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 5 Sep 2024 16:34:08 +0000 (18:34 +0200)
The AMD HCI controller currently only supports PIO mode but exposes DMA
rings to the OS, which leads to the controller being configured in DMA
mode. To address this, add a quirk to avoid configuring the controller in
DMA mode and default to PIO mode.

Additionally, introduce a generic quirk infrastructure to the mipi-i3c-hci
driver to facilitate seamless future quirk additions.

Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Co-developed-by: Krishnamoorthi M <krishnamoorthi.m@amd.com>
Signed-off-by: Krishnamoorthi M <krishnamoorthi.m@amd.com>
Co-developed-by: Guruvendra Punugupati <Guruvendra.Punugupati@amd.com>
Signed-off-by: Guruvendra Punugupati <Guruvendra.Punugupati@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://lore.kernel.org/r/20240829091713.736217-4-Shyam-sundar.S-k@amd.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/mipi-i3c-hci/core.c
drivers/i3c/master/mipi-i3c-hci/hci.h

index a6781cfeebb8468bad0928e5460f3ff30f8194d3..23abf91b277bee44adc9bf00a180634ae758f5d9 100644 (file)
@@ -756,6 +756,10 @@ static int i3c_hci_init(struct i3c_hci *hci)
        mode_selector = hci->version_major > 1 ||
                                (hci->version_major == 1 && hci->version_minor > 0);
 
+       /* Quirk for HCI_QUIRK_PIO_MODE on AMD platforms */
+       if (hci->quirks & HCI_QUIRK_PIO_MODE)
+               hci->RHS_regs = NULL;
+
        /* Try activating DMA operations first */
        if (hci->RHS_regs) {
                reg_clear(HC_CONTROL, HC_CONTROL_PIO_MODE);
@@ -806,6 +810,8 @@ static int i3c_hci_probe(struct platform_device *pdev)
        /* temporary for dev_printk's, to be replaced in i3c_master_register */
        hci->master.dev.init_name = dev_name(&pdev->dev);
 
+       hci->quirks = (unsigned long)device_get_match_data(&pdev->dev);
+
        ret = i3c_hci_init(hci);
        if (ret)
                return ret;
@@ -838,7 +844,7 @@ static const __maybe_unused struct of_device_id i3c_hci_of_match[] = {
 MODULE_DEVICE_TABLE(of, i3c_hci_of_match);
 
 static const struct acpi_device_id i3c_hci_acpi_match[] = {
-       { "AMDI5017" },
+       { "AMDI5017", HCI_QUIRK_PIO_MODE },
        {}
 };
 MODULE_DEVICE_TABLE(acpi, i3c_hci_acpi_match);
index f94d95e024becc41106166073fd62edee55d032e..c56b838fb431338b20da0ee8fe5ae68679ed325a 100644 (file)
@@ -135,6 +135,7 @@ struct i3c_hci_dev_data {
 
 /* list of quirks */
 #define HCI_QUIRK_RAW_CCC      BIT(1)  /* CCC framing must be explicit */
+#define HCI_QUIRK_PIO_MODE     BIT(2)  /* Set PIO mode for AMD platforms */
 
 
 /* global functions */