RISCV: configs: tizen_visionfive2: Enable DM_BOW feature
[platform/kernel/linux-starfive.git] / drivers / leds / leds-turris-omnia.c
index b8a95a9..b13a547 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * CZ.NIC's Turris Omnia LEDs driver
  *
- * 2020 by Marek BehĂșn <kabel@kernel.org>
+ * 2020, 2023 by Marek BehĂșn <kabel@kernel.org>
  */
 
 #include <linux/i2c.h>
@@ -41,6 +41,37 @@ struct omnia_leds {
        struct omnia_led leds[];
 };
 
+static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val)
+{
+       u8 buf[2] = { cmd, val };
+
+       return i2c_master_send(client, buf, sizeof(buf));
+}
+
+static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd)
+{
+       struct i2c_msg msgs[2];
+       u8 reply;
+       int ret;
+
+       msgs[0].addr = client->addr;
+       msgs[0].flags = 0;
+       msgs[0].len = 1;
+       msgs[0].buf = &cmd;
+       msgs[1].addr = client->addr;
+       msgs[1].flags = I2C_M_RD;
+       msgs[1].len = 1;
+       msgs[1].buf = &reply;
+
+       ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+       if (likely(ret == ARRAY_SIZE(msgs)))
+               return reply;
+       else if (ret < 0)
+               return ret;
+       else
+               return -EIO;
+}
+
 static int omnia_led_brightness_set_blocking(struct led_classdev *cdev,
                                             enum led_brightness brightness)
 {
@@ -64,7 +95,7 @@ static int omnia_led_brightness_set_blocking(struct led_classdev *cdev,
        if (buf[2] || buf[3] || buf[4])
                state |= CMD_LED_STATE_ON;
 
-       ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_STATE, state);
+       ret = omnia_cmd_write_u8(leds->client, CMD_LED_STATE, state);
        if (ret >= 0 && (state & CMD_LED_STATE_ON))
                ret = i2c_master_send(leds->client, buf, 5);
 
@@ -114,9 +145,9 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led,
        cdev->brightness_set_blocking = omnia_led_brightness_set_blocking;
 
        /* put the LED into software mode */
-       ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE,
-                                       CMD_LED_MODE_LED(led->reg) |
-                                       CMD_LED_MODE_USER);
+       ret = omnia_cmd_write_u8(client, CMD_LED_MODE,
+                                CMD_LED_MODE_LED(led->reg) |
+                                CMD_LED_MODE_USER);
        if (ret < 0) {
                dev_err(dev, "Cannot set LED %pOF to software mode: %i\n", np,
                        ret);
@@ -124,8 +155,8 @@ static int omnia_led_register(struct i2c_client *client, struct omnia_led *led,
        }
 
        /* disable the LED */
-       ret = i2c_smbus_write_byte_data(client, CMD_LED_STATE,
-                                       CMD_LED_STATE_LED(led->reg));
+       ret = omnia_cmd_write_u8(client, CMD_LED_STATE,
+                                CMD_LED_STATE_LED(led->reg));
        if (ret < 0) {
                dev_err(dev, "Cannot set LED %pOF brightness: %i\n", np, ret);
                return ret;
@@ -158,7 +189,7 @@ static ssize_t brightness_show(struct device *dev, struct device_attribute *a,
        struct i2c_client *client = to_i2c_client(dev);
        int ret;
 
-       ret = i2c_smbus_read_byte_data(client, CMD_LED_GET_BRIGHTNESS);
+       ret = omnia_cmd_read_u8(client, CMD_LED_GET_BRIGHTNESS);
 
        if (ret < 0)
                return ret;
@@ -179,8 +210,7 @@ static ssize_t brightness_store(struct device *dev, struct device_attribute *a,
        if (brightness > 100)
                return -EINVAL;
 
-       ret = i2c_smbus_write_byte_data(client, CMD_LED_SET_BRIGHTNESS,
-                                       (u8)brightness);
+       ret = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness);
 
        return ret < 0 ? ret : count;
 }
@@ -237,8 +267,8 @@ static void omnia_leds_remove(struct i2c_client *client)
        u8 buf[5];
 
        /* put all LEDs into default (HW triggered) mode */
-       i2c_smbus_write_byte_data(client, CMD_LED_MODE,
-                                 CMD_LED_MODE_LED(OMNIA_BOARD_LEDS));
+       omnia_cmd_write_u8(client, CMD_LED_MODE,
+                          CMD_LED_MODE_LED(OMNIA_BOARD_LEDS));
 
        /* set all LEDs color to [255, 255, 255] */
        buf[0] = CMD_LED_COLOR;