kernel: Make the patches apply on top of 4.19
[openwrt/staging/chunkeey.git] / target / linux / generic / files / drivers / net / phy / swconfig_leds.c
index 92be3c7501ff6a9ee7df2f2a2e2857164a338a1f..e982cb7b58f352f4e8c34c36f85daada44f29ace 100644 (file)
@@ -124,18 +124,16 @@ swconfig_trig_port_mask_store(struct device *dev, struct device_attribute *attr,
                return ret;
 
        write_lock(&trig_data->lock);
-
        changed = (trig_data->port_mask != port_mask);
+       trig_data->port_mask = port_mask;
+       write_unlock(&trig_data->lock);
+
        if (changed) {
-               trig_data->port_mask = port_mask;
                if (port_mask == 0)
                        swconfig_trig_set_brightness(trig_data, LED_OFF);
-       }
 
-       write_unlock(&trig_data->lock);
-
-       if (changed)
                swconfig_trig_update_port_mask(led_cdev->trigger);
+       }
 
        return size;
 }
@@ -146,11 +144,14 @@ swconfig_trig_port_mask_show(struct device *dev, struct device_attribute *attr,
 {
        struct led_classdev *led_cdev = dev_get_drvdata(dev);
        struct swconfig_trig_data *trig_data = led_cdev->trigger_data;
+       u32 port_mask;
 
        read_lock(&trig_data->lock);
-       sprintf(buf, "%#x\n", trig_data->port_mask);
+       port_mask = trig_data->port_mask;
        read_unlock(&trig_data->lock);
 
+       sprintf(buf, "%#x\n", port_mask);
+
        return strlen(buf) + 1;
 }
 
@@ -164,11 +165,14 @@ static ssize_t swconfig_trig_speed_mask_show(struct device *dev,
 {
        struct led_classdev *led_cdev = dev_get_drvdata(dev);
        struct swconfig_trig_data *trig_data = led_cdev->trigger_data;
+       u8 speed_mask;
 
        read_lock(&trig_data->lock);
-       sprintf(buf, "%#x\n", trig_data->speed_mask);
+       speed_mask = trig_data->speed_mask;
        read_unlock(&trig_data->lock);
 
+       sprintf(buf, "%#x\n", speed_mask);
+
        return strlen(buf) + 1;
 }
 
@@ -270,19 +274,16 @@ static ssize_t swconfig_trig_mode_store(struct device *dev,
 static DEVICE_ATTR(mode, 0644, swconfig_trig_mode_show,
                   swconfig_trig_mode_store);
 
-static void
+static int
 swconfig_trig_activate(struct led_classdev *led_cdev)
 {
        struct switch_led_trigger *sw_trig;
        struct swconfig_trig_data *trig_data;
        int err;
 
-       if (led_cdev->trigger->activate != swconfig_trig_activate)
-               return;
-
        trig_data = kzalloc(sizeof(struct swconfig_trig_data), GFP_KERNEL);
        if (!trig_data)
-               return;
+               return -ENOMEM;
 
        sw_trig = (void *) led_cdev->trigger;
 
@@ -305,7 +306,7 @@ swconfig_trig_activate(struct led_classdev *led_cdev)
        if (err)
                goto err_mode_free;
 
-       return;
+       return 0;
 
 err_mode_free:
        device_remove_file(led_cdev->dev, &dev_attr_speed_mask);
@@ -316,7 +317,17 @@ err_dev_free:
 err_free:
        led_cdev->trigger_data = NULL;
        kfree(trig_data);
+
+       return err;
+}
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0)
+static void
+swconfig_trig_activate_void(struct led_classdev *led_cdev)
+{
+       swconfig_trig_activate(led_cdev);
 }
+#endif
 
 static void
 swconfig_trig_deactivate(struct led_classdev *led_cdev)
@@ -512,7 +523,11 @@ swconfig_create_led_trigger(struct switch_dev *swdev)
 
        sw_trig->swdev = swdev;
        sw_trig->trig.name = swdev->devname;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0)
+       sw_trig->trig.activate = swconfig_trig_activate_void;
+#else
        sw_trig->trig.activate = swconfig_trig_activate;
+#endif
        sw_trig->trig.deactivate = swconfig_trig_deactivate;
 
        INIT_DELAYED_WORK(&sw_trig->sw_led_work, swconfig_led_work_func);