]> Git Repo - linux.git/blobdiff - drivers/platform/surface/aggregator/controller.c
Linux 6.14-rc3
[linux.git] / drivers / platform / surface / aggregator / controller.c
index 7e89f547999b2a00b0d406c005df83b3c2fcc1d9..a265e667538c1c736bba9806b7eb551161704426 100644 (file)
@@ -1104,13 +1104,6 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle,
        u64 funcs;
        int status;
 
-       /* Set defaults. */
-       caps->ssh_power_profile = U32_MAX;
-       caps->screen_on_sleep_idle_timeout = U32_MAX;
-       caps->screen_off_sleep_idle_timeout = U32_MAX;
-       caps->d3_closes_handle = false;
-       caps->ssh_buffer_size = U32_MAX;
-
        /* Pre-load supported DSM functions. */
        status = ssam_dsm_get_functions(handle, &funcs);
        if (status)
@@ -1149,6 +1142,52 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle,
        return 0;
 }
 
+/**
+ * ssam_controller_caps_load_from_of() - Load controller capabilities from OF/DT.
+ * @dev:  A pointer to the controller device
+ * @caps: Where to store the capabilities in.
+ *
+ * Return: Returns zero on success, a negative error code on failure.
+ */
+static int ssam_controller_caps_load_from_of(struct device *dev, struct ssam_controller_caps *caps)
+{
+       /*
+        * Every device starting with Surface Pro X through Laptop 7 uses these
+        * identical values, which makes them good defaults.
+        */
+       caps->d3_closes_handle = true;
+       caps->screen_on_sleep_idle_timeout = 5000;
+       caps->screen_off_sleep_idle_timeout = 30;
+       caps->ssh_buffer_size = 48;
+       /* TODO: figure out power profile */
+
+       return 0;
+}
+
+/**
+ * ssam_controller_caps_load() - Load controller capabilities
+ * @dev:  A pointer to the controller device
+ * @caps: Where to store the capabilities in.
+ *
+ * Return: Returns zero on success, a negative error code on failure.
+ */
+static int ssam_controller_caps_load(struct device *dev, struct ssam_controller_caps *caps)
+{
+       acpi_handle handle = ACPI_HANDLE(dev);
+
+       /* Set defaults. */
+       caps->ssh_power_profile = U32_MAX;
+       caps->screen_on_sleep_idle_timeout = U32_MAX;
+       caps->screen_off_sleep_idle_timeout = U32_MAX;
+       caps->d3_closes_handle = false;
+       caps->ssh_buffer_size = U32_MAX;
+
+       if (handle)
+               return ssam_controller_caps_load_from_acpi(handle, caps);
+       else
+               return ssam_controller_caps_load_from_of(dev, caps);
+}
+
 /**
  * ssam_controller_init() - Initialize SSAM controller.
  * @ctrl:   The controller to initialize.
@@ -1165,13 +1204,12 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle,
 int ssam_controller_init(struct ssam_controller *ctrl,
                         struct serdev_device *serdev)
 {
-       acpi_handle handle = ACPI_HANDLE(&serdev->dev);
        int status;
 
        init_rwsem(&ctrl->lock);
        kref_init(&ctrl->kref);
 
-       status = ssam_controller_caps_load_from_acpi(handle, &ctrl->caps);
+       status = ssam_controller_caps_load(&serdev->dev, &ctrl->caps);
        if (status)
                return status;
 
@@ -2716,11 +2754,12 @@ int ssam_irq_setup(struct ssam_controller *ctrl)
        const int irqf = IRQF_ONESHOT | IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN;
 
        gpiod = gpiod_get(dev, "ssam_wakeup-int", GPIOD_ASIS);
-       if (IS_ERR(gpiod))
-               return PTR_ERR(gpiod);
-
-       irq = gpiod_to_irq(gpiod);
-       gpiod_put(gpiod);
+       if (IS_ERR(gpiod)) {
+               irq = fwnode_irq_get(dev_fwnode(dev), 0);
+       } else {
+               irq = gpiod_to_irq(gpiod);
+               gpiod_put(gpiod);
+       }
 
        if (irq < 0)
                return irq;
This page took 0.045053 seconds and 4 git commands to generate.