1
This series targetting improved readability of code
1
This series targetting improved readability of code
2
and modernizing code to match today standards.
2
and modernizing code to match AL3000a (recently upstreamed).
3
3
4
Except slightly improved error reporting,
4
Except slightly improved error reporting,
5
there shouldn't be any function changes.
5
there shouldn't be any function changes.
6
6
7
Size before:
7
Module before after
8
72224 al3010.ko
8
al3010 72 kB 58 kB
9
72744 al3320a.ko
9
al3320a 72 kB 58 kB
10
11
Size after:
12
58032 al3010.ko
13
58632 al3320a.ko
14
10
15
Signed-off-by: David Heidelberg <david@ixit.cz>
11
Signed-off-by: David Heidelberg <david@ixit.cz>
16
---
12
---
17
David Heidelberg (4):
13
Changes in v2:
18
iio: light: al3320a: Drop deprecated email for Daniel
14
- Dropped Daniel's email update.
19
iio: light: al3000a: Use DRV_NAME
15
- Dropped DRV_NAME introduction for al3000a
16
- Added DRV_NAME define removal for al3010 and al3320a.
17
- Splitted unsigned int conversion into separate patches.
18
- Replaced generic value with specific raw and gain variable.
19
- Use dev_err_probe() for error handling.
20
- Separated devm_add_action_or_reset move from _init back to _probe.
21
- Dropped copyright update.
22
- Link to v1: https://lore.kernel.org/r/20250308-al3010-iio-regmap-v1-0-b672535e8213@ixit.cz
23
24
---
25
David Heidelberg (13):
26
iio: light: al3010: Use unsigned int for the indexing
27
iio: light: al3320a: Use unsigned int for the indexing
28
iio: light: al3010: Remove DRV_NAME definition
29
iio: light: al3320a: Remove DRV_NAME definition
30
iio: light: al3010: Abstract device reference in the probe function
31
iio: light: al3320a: Abstract device reference in the probe function
32
iio: light: al3010: Split set_pwr function into set_pwr_on and _off
33
iio: light: al3320a: Split set_pwr function into set_pwr_on and _off
34
iio: light: al3010: Move devm_add_action_or_reset back to _probe
35
iio: light: al3010: Improve al3010_init error handling with dev_err_probe
36
iio: light: al3320a: Improve error handling with dev_err_probe
20
iio: light: al3010: Implement regmap support
37
iio: light: al3010: Implement regmap support
21
iio: light: al3320a: Implement regmap support
38
iio: light: al3320a: Implement regmap support
22
39
23
drivers/iio/light/al3000a.c | 6 ++-
40
drivers/iio/light/al3010.c | 103 +++++++++++++++++++++------------------
24
drivers/iio/light/al3010.c | 95 ++++++++++++++++++++++------------------
41
drivers/iio/light/al3320a.c | 115 +++++++++++++++++++++++---------------------
25
drivers/iio/light/al3320a.c | 103 ++++++++++++++++++++++++--------------------
42
2 files changed, 116 insertions(+), 102 deletions(-)
26
3 files changed, 114 insertions(+), 90 deletions(-)
27
---
43
---
28
base-commit: 0a2f889128969dab41861b6e40111aa03dc57014
44
base-commit: ff7f9b199e3f4cc7d61df5a9a26a7cbb5c1492e6
29
change-id: 20250308-al3010-iio-regmap-038cea39f85d
45
change-id: 20250308-al3010-iio-regmap-038cea39f85d
30
46
31
Best regards,
47
Best regards,
32
--
48
--
33
David Heidelberg <david@ixit.cz>
49
David Heidelberg <david@ixit.cz>
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
The integer is used as array index which cannot be negative.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3010.c | 2 +-
8
1 file changed, 1 insertion(+), 1 deletion(-)
9
10
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3010.c
13
+++ b/drivers/iio/light/al3010.c
14
@@ -XXX,XX +XXX,XX @@ static int al3010_write_raw(struct iio_dev *indio_dev,
15
             int val2, long mask)
16
{
17
    struct al3010_data *data = iio_priv(indio_dev);
18
-    int i;
19
+    unsigned int i;
20
21
    switch (mask) {
22
    case IIO_CHAN_INFO_SCALE:
23
24
--
25
2.49.0
diff view generated by jsdifflib
1
From: David Heidelberg <david@ixit.cz>
1
From: David Heidelberg <david@ixit.cz>
2
2
3
He no longer works at Intel.
3
The integer is used as array index which cannot be negative.
4
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
6
---
7
drivers/iio/light/al3320a.c | 2 +-
7
drivers/iio/light/al3320a.c | 2 +-
8
1 file changed, 1 insertion(+), 1 deletion(-)
8
1 file changed, 1 insertion(+), 1 deletion(-)
9
9
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3320a.c
12
--- a/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
14
@@ -XXX,XX +XXX,XX @@ static struct i2c_driver al3320a_driver = {
14
@@ -XXX,XX +XXX,XX @@ static int al3320a_write_raw(struct iio_dev *indio_dev,
15
15
             int val2, long mask)
16
module_i2c_driver(al3320a_driver);
16
{
17
17
    struct al3320a_data *data = iio_priv(indio_dev);
18
-MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");
18
-    int i;
19
+MODULE_AUTHOR("Daniel Baluta");
19
+    unsigned int i;
20
MODULE_DESCRIPTION("AL3320A Ambient Light Sensor driver");
20
21
MODULE_LICENSE("GPL v2");
21
    switch (mask) {
22
    case IIO_CHAN_INFO_SCALE:
22
23
23
--
24
--
24
2.47.2
25
2.49.0
diff view generated by jsdifflib
1
From: David Heidelberg <david@ixit.cz>
1
From: David Heidelberg <david@ixit.cz>
2
2
3
Sync syntax with other similar drivers.
3
The driver name should be passed directly.
4
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
6
---
7
drivers/iio/light/al3000a.c | 6 ++++--
7
drivers/iio/light/al3010.c | 6 ++----
8
1 file changed, 4 insertions(+), 2 deletions(-)
8
1 file changed, 2 insertions(+), 4 deletions(-)
9
9
10
diff --git a/drivers/iio/light/al3000a.c b/drivers/iio/light/al3000a.c
10
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3000a.c
12
--- a/drivers/iio/light/al3010.c
13
+++ b/drivers/iio/light/al3000a.c
13
+++ b/drivers/iio/light/al3010.c
14
@@ -XXX,XX +XXX,XX @@
14
@@ -XXX,XX +XXX,XX @@
15
16
#include <linux/iio/iio.h>
15
#include <linux/iio/iio.h>
17
16
#include <linux/iio/sysfs.h>
18
+#define AL3000A_DRV_NAME "al3000a"
17
19
+
18
-#define AL3010_DRV_NAME "al3010"
20
#define AL3000A_REG_SYSTEM        0x00
19
-
21
#define AL3000A_REG_DATA        0x05
20
#define AL3010_REG_SYSTEM        0x00
22
21
#define AL3010_REG_DATA_LOW        0x0c
23
@@ -XXX,XX +XXX,XX @@ static int al3000a_probe(struct i2c_client *client)
22
#define AL3010_REG_CONFIG        0x10
24
                 "failed to get vdd regulator\n");
23
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
25
24
    data->client = client;
26
    indio_dev->info = &al3000a_info;
25
27
-    indio_dev->name = "al3000a";
26
    indio_dev->info = &al3010_info;
28
+    indio_dev->name = AL3000A_DRV_NAME;
27
-    indio_dev->name = AL3010_DRV_NAME;
29
    indio_dev->channels = al3000a_channels;
28
+    indio_dev->name = "al3010";
30
    indio_dev->num_channels = ARRAY_SIZE(al3000a_channels);
29
    indio_dev->channels = al3010_channels;
30
    indio_dev->num_channels = ARRAY_SIZE(al3010_channels);
31
    indio_dev->modes = INDIO_DIRECT_MODE;
31
    indio_dev->modes = INDIO_DIRECT_MODE;
32
@@ -XXX,XX +XXX,XX @@ MODULE_DEVICE_TABLE(of, al3000a_of_match);
32
@@ -XXX,XX +XXX,XX @@ MODULE_DEVICE_TABLE(of, al3010_of_match);
33
33
34
static struct i2c_driver al3000a_driver = {
34
static struct i2c_driver al3010_driver = {
35
    .driver = {
35
    .driver = {
36
-        .name = "al3000a",
36
-        .name = AL3010_DRV_NAME,
37
+        .name = AL3000A_DRV_NAME,
37
+        .name = "al3010",
38
        .of_match_table = al3000a_of_match,
38
        .of_match_table = al3010_of_match,
39
        .pm = pm_sleep_ptr(&al3000a_pm_ops),
39
        .pm = pm_sleep_ptr(&al3010_pm_ops),
40
    },
40
    },
41
41
42
--
42
--
43
2.47.2
43
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
The driver name should be passed directly.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3320a.c | 6 ++----
8
1 file changed, 2 insertions(+), 4 deletions(-)
9
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
14
@@ -XXX,XX +XXX,XX @@
15
#include <linux/iio/iio.h>
16
#include <linux/iio/sysfs.h>
17
18
-#define AL3320A_DRV_NAME "al3320a"
19
-
20
#define AL3320A_REG_CONFIG        0x00
21
#define AL3320A_REG_STATUS        0x01
22
#define AL3320A_REG_INT            0x02
23
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
24
    data->client = client;
25
26
    indio_dev->info = &al3320a_info;
27
-    indio_dev->name = AL3320A_DRV_NAME;
28
+    indio_dev->name = "al3320a";
29
    indio_dev->channels = al3320a_channels;
30
    indio_dev->num_channels = ARRAY_SIZE(al3320a_channels);
31
    indio_dev->modes = INDIO_DIRECT_MODE;
32
@@ -XXX,XX +XXX,XX @@ MODULE_DEVICE_TABLE(acpi, al3320a_acpi_match);
33
34
static struct i2c_driver al3320a_driver = {
35
    .driver = {
36
-        .name = AL3320A_DRV_NAME,
37
+        .name = "al3320a",
38
        .of_match_table = al3320a_of_match,
39
        .pm = pm_sleep_ptr(&al3320a_pm_ops),
40
        .acpi_match_table = al3320a_acpi_match,
41
42
--
43
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Introduce a local variable reducing redundancy and improving readability.
4
5
No functional changes.
6
7
Signed-off-by: David Heidelberg <david@ixit.cz>
8
---
9
drivers/iio/light/al3010.c | 7 ++++---
10
1 file changed, 4 insertions(+), 3 deletions(-)
11
12
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/iio/light/al3010.c
15
+++ b/drivers/iio/light/al3010.c
16
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3010_info = {
17
static int al3010_probe(struct i2c_client *client)
18
{
19
    struct al3010_data *data;
20
+    struct device *dev = &client->dev;
21
    struct iio_dev *indio_dev;
22
    int ret;
23
24
-    indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
25
+    indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
26
    if (!indio_dev)
27
        return -ENOMEM;
28
29
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
30
31
    ret = al3010_init(data);
32
    if (ret < 0) {
33
-        dev_err(&client->dev, "al3010 chip init failed\n");
34
+        dev_err(dev, "al3010 chip init failed\n");
35
        return ret;
36
    }
37
38
-    return devm_iio_device_register(&client->dev, indio_dev);
39
+    return devm_iio_device_register(dev, indio_dev);
40
}
41
42
static int al3010_suspend(struct device *dev)
43
44
--
45
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Introduce a local variable reducing redundancy and improving readability.
4
5
No functional changes.
6
7
Signed-off-by: David Heidelberg <david@ixit.cz>
8
---
9
drivers/iio/light/al3320a.c | 11 +++++------
10
1 file changed, 5 insertions(+), 6 deletions(-)
11
12
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/iio/light/al3320a.c
15
+++ b/drivers/iio/light/al3320a.c
16
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3320a_info = {
17
static int al3320a_probe(struct i2c_client *client)
18
{
19
    struct al3320a_data *data;
20
+    struct device *dev = &client->dev;
21
    struct iio_dev *indio_dev;
22
    int ret;
23
24
-    indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
25
+    indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
26
    if (!indio_dev)
27
        return -ENOMEM;
28
29
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
30
31
    ret = al3320a_init(data);
32
    if (ret < 0) {
33
-        dev_err(&client->dev, "al3320a chip init failed\n");
34
+        dev_err(dev, "al3320a chip init failed\n");
35
        return ret;
36
    }
37
38
-    ret = devm_add_action_or_reset(&client->dev,
39
-                    al3320a_set_pwr_off,
40
-                    data);
41
+    ret = devm_add_action_or_reset(dev, al3320a_set_pwr_off, data);
42
    if (ret < 0)
43
        return ret;
44
45
-    return devm_iio_device_register(&client->dev, indio_dev);
46
+    return devm_iio_device_register(dev, indio_dev);
47
}
48
49
static int al3320a_suspend(struct device *dev)
50
51
--
52
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Simplifies later conversion to the regmap framework.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3010.c | 18 +++++++++++-------
8
1 file changed, 11 insertions(+), 7 deletions(-)
9
10
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3010.c
13
+++ b/drivers/iio/light/al3010.c
14
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3010_attribute_group = {
15
    .attrs = al3010_attributes,
16
};
17
18
-static int al3010_set_pwr(struct i2c_client *client, bool pwr)
19
+static int al3010_set_pwr_on(struct i2c_client *client)
20
{
21
-    u8 val = pwr ? AL3010_CONFIG_ENABLE : AL3010_CONFIG_DISABLE;
22
-    return i2c_smbus_write_byte_data(client, AL3010_REG_SYSTEM, val);
23
+    return i2c_smbus_write_byte_data(client, AL3010_REG_SYSTEM,
24
+                     AL3010_CONFIG_ENABLE);
25
}
26
27
static void al3010_set_pwr_off(void *_data)
28
{
29
    struct al3010_data *data = _data;
30
31
-    al3010_set_pwr(data->client, false);
32
+    i2c_smbus_write_byte_data(data->client, AL3010_REG_SYSTEM,
33
+                 AL3010_CONFIG_DISABLE);
34
}
35
36
static int al3010_init(struct al3010_data *data)
37
{
38
    int ret;
39
40
-    ret = al3010_set_pwr(data->client, true);
41
+    ret = al3010_set_pwr_on(data->client);
42
    if (ret < 0)
43
        return ret;
44
45
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
46
47
static int al3010_suspend(struct device *dev)
48
{
49
-    return al3010_set_pwr(to_i2c_client(dev), false);
50
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
51
+
52
+    al3010_set_pwr_off(data);
53
+    return 0;
54
}
55
56
static int al3010_resume(struct device *dev)
57
{
58
-    return al3010_set_pwr(to_i2c_client(dev), true);
59
+    return al3010_set_pwr_on(to_i2c_client(dev));
60
}
61
62
static DEFINE_SIMPLE_DEV_PM_OPS(al3010_pm_ops, al3010_suspend, al3010_resume);
63
64
--
65
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Simplifies later conversion to the regmap framework.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3320a.c | 16 +++++++++-------
8
1 file changed, 9 insertions(+), 7 deletions(-)
9
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
14
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3320a_attribute_group = {
15
    .attrs = al3320a_attributes,
16
};
17
18
-static int al3320a_set_pwr(struct i2c_client *client, bool pwr)
19
+static int al3320a_set_pwr_on(struct i2c_client *client)
20
{
21
-    u8 val = pwr ? AL3320A_CONFIG_ENABLE : AL3320A_CONFIG_DISABLE;
22
-    return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, val);
23
+    return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, AL3320A_CONFIG_ENABLE);
24
}
25
26
static void al3320a_set_pwr_off(void *_data)
27
{
28
    struct al3320a_data *data = _data;
29
30
-    al3320a_set_pwr(data->client, false);
31
+    i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG, AL3320A_CONFIG_DISABLE);
32
}
33
34
static int al3320a_init(struct al3320a_data *data)
35
{
36
    int ret;
37
38
-    ret = al3320a_set_pwr(data->client, true);
39
+    ret = al3320a_set_pwr_on(data->client);
40
41
    if (ret < 0)
42
        return ret;
43
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
44
45
static int al3320a_suspend(struct device *dev)
46
{
47
-    return al3320a_set_pwr(to_i2c_client(dev), false);
48
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
49
+
50
+    al3320a_set_pwr_off(data);
51
+    return 0;
52
}
53
54
static int al3320a_resume(struct device *dev)
55
{
56
-    return al3320a_set_pwr(to_i2c_client(dev), true);
57
+    return al3320a_set_pwr_on(to_i2c_client(dev));
58
}
59
60
static DEFINE_SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend,
61
62
--
63
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
In a preparation to the regmap transition.
4
5
Improve error handling using dev_err_probe().
6
7
Signed-off-by: David Heidelberg <david@ixit.cz>
8
---
9
drivers/iio/light/al3010.c | 10 ++++------
10
1 file changed, 4 insertions(+), 6 deletions(-)
11
12
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/iio/light/al3010.c
15
+++ b/drivers/iio/light/al3010.c
16
@@ -XXX,XX +XXX,XX @@ static int al3010_init(struct al3010_data *data)
17
    if (ret < 0)
18
        return ret;
19
20
-    ret = devm_add_action_or_reset(&data->client->dev,
21
-                 al3010_set_pwr_off,
22
-                 data);
23
-    if (ret < 0)
24
-        return ret;
25
-
26
    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
27
                    FIELD_PREP(AL3010_GAIN_MASK,
28
                         AL3XXX_RANGE_3));
29
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
30
        return ret;
31
    }
32
33
+    ret = devm_add_action_or_reset(dev, al3010_set_pwr_off, data);
34
+    if (ret)
35
+        return dev_err_probe(dev, ret, "failed to add action\n");
36
+
37
    return devm_iio_device_register(dev, indio_dev);
38
}
39
40
41
--
42
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Slight simplification of the code.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3010.c | 6 ++----
8
1 file changed, 2 insertions(+), 4 deletions(-)
9
10
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3010.c
13
+++ b/drivers/iio/light/al3010.c
14
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
15
    indio_dev->modes = INDIO_DIRECT_MODE;
16
17
    ret = al3010_init(data);
18
-    if (ret < 0) {
19
-        dev_err(dev, "al3010 chip init failed\n");
20
-        return ret;
21
-    }
22
+    if (ret)
23
+        return dev_err_probe(dev, ret, "failed to init ALS\n");
24
25
    ret = devm_add_action_or_reset(dev, al3010_set_pwr_off, data);
26
    if (ret)
27
28
--
29
2.49.0
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Slight simplification of the code.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3320a.c | 10 ++++------
8
1 file changed, 4 insertions(+), 6 deletions(-)
9
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
14
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
15
    indio_dev->modes = INDIO_DIRECT_MODE;
16
17
    ret = al3320a_init(data);
18
-    if (ret < 0) {
19
-        dev_err(dev, "al3320a chip init failed\n");
20
-        return ret;
21
-    }
22
+    if (ret)
23
+        return dev_err_probe(dev, ret, "failed to init ALS\n");
24
25
    ret = devm_add_action_or_reset(dev, al3320a_set_pwr_off, data);
26
-    if (ret < 0)
27
-        return ret;
28
+    if (ret)
29
+        return dev_err_probe(dev, ret, "failed to add action\n");
30
31
    return devm_iio_device_register(dev, indio_dev);
32
}
33
34
--
35
2.49.0
diff view generated by jsdifflib
1
From: David Heidelberg <david@ixit.cz>
1
From: David Heidelberg <david@ixit.cz>
2
2
3
Modernize and make driver a bit cleaner.
3
Modernize and make driver a bit cleaner.
4
4
5
Incorporate most of the feedback given on new AL3000A.
5
After the regmap implementation, the compiler is able to produce
6
much smaller module.
7
8
Size before: 72 kB
9
Size after: 58 kB
6
10
7
Signed-off-by: David Heidelberg <david@ixit.cz>
11
Signed-off-by: David Heidelberg <david@ixit.cz>
8
---
12
---
9
drivers/iio/light/al3010.c | 95 ++++++++++++++++++++++++++--------------------
13
drivers/iio/light/al3010.c | 70 ++++++++++++++++++++++++++--------------------
10
1 file changed, 53 insertions(+), 42 deletions(-)
14
1 file changed, 39 insertions(+), 31 deletions(-)
11
15
12
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
16
diff --git a/drivers/iio/light/al3010.c b/drivers/iio/light/al3010.c
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/iio/light/al3010.c
18
--- a/drivers/iio/light/al3010.c
15
+++ b/drivers/iio/light/al3010.c
19
+++ b/drivers/iio/light/al3010.c
16
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
17
*
18
* Copyright (c) 2014, Intel Corporation.
19
* Copyright (c) 2016, Dyna-Image Corp.
20
- * Copyright (c) 2020, David Heidelberg, Michał Mirosław, Dmitry Osipenko
21
+ * Copyright (c) 2020 - 2025, David Heidelberg, Michał Mirosław, Dmitry Osipenko
22
*
23
* IIO driver for AL3010 (7-bit I2C slave address 0x1C).
24
*
25
@@ -XXX,XX +XXX,XX @@
26
#include <linux/bitfield.h>
21
#include <linux/bitfield.h>
27
#include <linux/i2c.h>
22
#include <linux/i2c.h>
28
#include <linux/module.h>
23
#include <linux/module.h>
29
+#include <linux/regmap.h>
24
+#include <linux/regmap.h>
30
#include <linux/mod_devicetable.h>
25
#include <linux/mod_devicetable.h>
...
...
48
static const struct iio_chan_spec al3010_channels[] = {
43
static const struct iio_chan_spec al3010_channels[] = {
49
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3010_attribute_group = {
44
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3010_attribute_group = {
50
    .attrs = al3010_attributes,
45
    .attrs = al3010_attributes,
51
};
46
};
52
47
53
-static int al3010_set_pwr(struct i2c_client *client, bool pwr)
48
-static int al3010_set_pwr_on(struct i2c_client *client)
54
+static int al3010_set_pwr_on(struct al3010_data *data)
49
+static int al3010_set_pwr_on(struct al3010_data *data)
55
{
50
{
56
-    u8 val = pwr ? AL3010_CONFIG_ENABLE : AL3010_CONFIG_DISABLE;
51
-    return i2c_smbus_write_byte_data(client, AL3010_REG_SYSTEM,
57
-    return i2c_smbus_write_byte_data(client, AL3010_REG_SYSTEM, val);
52
-                     AL3010_CONFIG_ENABLE);
58
+    return regmap_write(data->regmap, AL3010_REG_SYSTEM, AL3010_CONFIG_ENABLE);
53
+    return regmap_write(data->regmap, AL3010_REG_SYSTEM, AL3010_CONFIG_ENABLE);
59
}
54
}
60
55
61
static void al3010_set_pwr_off(void *_data)
56
static void al3010_set_pwr_off(void *_data)
62
{
57
{
63
    struct al3010_data *data = _data;
58
    struct al3010_data *data = _data;
64
+    struct device *dev = regmap_get_device(data->regmap);
59
+    struct device *dev = regmap_get_device(data->regmap);
65
+    int ret;
60
+    int ret;
66
61
67
-    al3010_set_pwr(data->client, false);
62
-    i2c_smbus_write_byte_data(data->client, AL3010_REG_SYSTEM,
63
-                 AL3010_CONFIG_DISABLE);
68
+    ret = regmap_write(data->regmap, AL3010_REG_SYSTEM, AL3010_CONFIG_DISABLE);
64
+    ret = regmap_write(data->regmap, AL3010_REG_SYSTEM, AL3010_CONFIG_DISABLE);
69
+    if (ret)
65
+    if (ret)
70
+        dev_err(dev, "failed to write system register\n");
66
+        dev_err(dev, "failed to write system register\n");
71
}
67
}
72
68
73
static int al3010_init(struct al3010_data *data)
69
static int al3010_init(struct al3010_data *data)
74
{
70
{
75
    int ret;
71
    int ret;
76
72
77
-    ret = al3010_set_pwr(data->client, true);
73
-    ret = al3010_set_pwr_on(data->client);
78
-    if (ret < 0)
79
-        return ret;
80
-
81
-    ret = devm_add_action_or_reset(&data->client->dev,
82
-                 al3010_set_pwr_off,
83
-                 data);
84
-    if (ret < 0)
74
-    if (ret < 0)
85
-        return ret;
75
-        return ret;
86
-
76
-
87
-    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
77
-    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
88
-                    FIELD_PREP(AL3010_GAIN_MASK,
78
-                    FIELD_PREP(AL3010_GAIN_MASK,
...
...
101
@@ -XXX,XX +XXX,XX @@ static int al3010_read_raw(struct iio_dev *indio_dev,
91
@@ -XXX,XX +XXX,XX @@ static int al3010_read_raw(struct iio_dev *indio_dev,
102
             int *val2, long mask)
92
             int *val2, long mask)
103
{
93
{
104
    struct al3010_data *data = iio_priv(indio_dev);
94
    struct al3010_data *data = iio_priv(indio_dev);
105
-    int ret;
95
-    int ret;
106
+    int ret, value;
96
+    int ret, gain, raw;
107
97
108
    switch (mask) {
98
    switch (mask) {
109
    case IIO_CHAN_INFO_RAW:
99
    case IIO_CHAN_INFO_RAW:
110
@@ -XXX,XX +XXX,XX @@ static int al3010_read_raw(struct iio_dev *indio_dev,
100
@@ -XXX,XX +XXX,XX @@ static int al3010_read_raw(struct iio_dev *indio_dev,
111
         * - low byte of output is stored at AL3010_REG_DATA_LOW
101
         * - low byte of output is stored at AL3010_REG_DATA_LOW
112
         * - high byte of output is stored at AL3010_REG_DATA_LOW + 1
102
         * - high byte of output is stored at AL3010_REG_DATA_LOW + 1
113
         */
103
         */
114
-        ret = i2c_smbus_read_word_data(data->client,
104
-        ret = i2c_smbus_read_word_data(data->client,
115
-                     AL3010_REG_DATA_LOW);
105
-                     AL3010_REG_DATA_LOW);
116
-        if (ret < 0)
106
-        if (ret < 0)
117
+        ret = regmap_read(data->regmap, AL3010_REG_DATA_LOW, &value);
107
+        ret = regmap_read(data->regmap, AL3010_REG_DATA_LOW, &raw);
118
+        if (ret)
108
+        if (ret)
119
            return ret;
109
            return ret;
120
-        *val = ret;
110
-        *val = ret;
121
+
111
+
122
+        *val = value;
112
+        *val = raw;
123
+
113
+
124
        return IIO_VAL_INT;
114
        return IIO_VAL_INT;
125
    case IIO_CHAN_INFO_SCALE:
115
    case IIO_CHAN_INFO_SCALE:
126
-        ret = i2c_smbus_read_byte_data(data->client,
116
-        ret = i2c_smbus_read_byte_data(data->client,
127
-                     AL3010_REG_CONFIG);
117
-                     AL3010_REG_CONFIG);
128
-        if (ret < 0)
118
-        if (ret < 0)
129
+        ret = regmap_read(data->regmap, AL3010_REG_CONFIG, &value);
119
+        ret = regmap_read(data->regmap, AL3010_REG_CONFIG, &gain);
130
+        if (ret)
120
+        if (ret)
131
            return ret;
121
            return ret;
132
122
133
-        ret = FIELD_GET(AL3010_GAIN_MASK, ret);
123
-        ret = FIELD_GET(AL3010_GAIN_MASK, ret);
134
-        *val = al3010_scales[ret][0];
124
-        *val = al3010_scales[ret][0];
135
-        *val2 = al3010_scales[ret][1];
125
-        *val2 = al3010_scales[ret][1];
136
+        value = FIELD_GET(AL3010_GAIN_MASK, value);
126
+        gain = FIELD_GET(AL3010_GAIN_MASK, gain);
137
+        *val = al3010_scales[value][0];
127
+        *val = al3010_scales[gain][0];
138
+        *val2 = al3010_scales[value][1];
128
+        *val2 = al3010_scales[gain][1];
139
129
140
        return IIO_VAL_INT_PLUS_MICRO;
130
        return IIO_VAL_INT_PLUS_MICRO;
141
    }
131
    }
142
@@ -XXX,XX +XXX,XX @@ static int al3010_write_raw(struct iio_dev *indio_dev,
132
@@ -XXX,XX +XXX,XX @@ static int al3010_write_raw(struct iio_dev *indio_dev,
143
             int val2, long mask)
144
{
145
    struct al3010_data *data = iio_priv(indio_dev);
146
-    int i;
147
+    unsigned int i;
148
149
    switch (mask) {
150
    case IIO_CHAN_INFO_SCALE:
151
@@ -XXX,XX +XXX,XX @@ static int al3010_write_raw(struct iio_dev *indio_dev,
152
             val2 != al3010_scales[i][1])
133
             val2 != al3010_scales[i][1])
153
                continue;
134
                continue;
154
135
155
-            return i2c_smbus_write_byte_data(data->client,
136
-            return i2c_smbus_write_byte_data(data->client,
156
-                    AL3010_REG_CONFIG,
137
-                    AL3010_REG_CONFIG,
157
-                    FIELD_PREP(AL3010_GAIN_MASK, i));
138
-                    FIELD_PREP(AL3010_GAIN_MASK, i));
158
+            return regmap_write(data->regmap, AL3010_REG_CONFIG,
139
+            return regmap_write(data->regmap, AL3010_REG_CONFIG,
159
+                     FIELD_PREP(AL3010_GAIN_MASK, i));
140
+                     FIELD_PREP(AL3010_GAIN_MASK, i));
160
        }
141
        }
161
        break;
142
        break;
162
    }
143
    }
163
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3010_info = {
144
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
164
static int al3010_probe(struct i2c_client *client)
165
{
166
    struct al3010_data *data;
167
+    struct device *dev = &client->dev;
168
    struct iio_dev *indio_dev;
169
    int ret;
170
171
-    indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
172
+    indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
173
    if (!indio_dev)
174
        return -ENOMEM;
175
145
176
    data = iio_priv(indio_dev);
146
    data = iio_priv(indio_dev);
177
    i2c_set_clientdata(client, indio_dev);
147
    i2c_set_clientdata(client, indio_dev);
178
-    data->client = client;
148
-    data->client = client;
179
+    data->regmap = devm_regmap_init_i2c(client, &al3010_regmap_config);
149
+    data->regmap = devm_regmap_init_i2c(client, &al3010_regmap_config);
180
+    if (IS_ERR(data->regmap))
150
+    if (IS_ERR(data->regmap))
181
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
151
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
182
+                 "cannot allocate regmap\n");
152
+                 "cannot allocate regmap\n");
183
153
184
    indio_dev->info = &al3010_info;
154
    indio_dev->info = &al3010_info;
185
    indio_dev->name = AL3010_DRV_NAME;
155
    indio_dev->name = "al3010";
186
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
156
@@ -XXX,XX +XXX,XX @@ static int al3010_suspend(struct device *dev)
187
188
    ret = al3010_init(data);
189
    if (ret < 0) {
190
-        dev_err(&client->dev, "al3010 chip init failed\n");
191
+        dev_err(dev, "failed to init ALS\n");
192
        return ret;
193
    }
194
195
-    return devm_iio_device_register(&client->dev, indio_dev);
196
+    ret = devm_add_action_or_reset(dev, al3010_set_pwr_off, data);
197
+    if (ret < 0)
198
+        return ret;
199
+
200
+    return devm_iio_device_register(dev, indio_dev);
201
}
202
203
static int al3010_suspend(struct device *dev)
204
{
205
-    return al3010_set_pwr(to_i2c_client(dev), false);
206
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
207
+
208
+    al3010_set_pwr_off(data);
209
+    return 0;
210
}
211
157
212
static int al3010_resume(struct device *dev)
158
static int al3010_resume(struct device *dev)
213
{
159
{
214
-    return al3010_set_pwr(to_i2c_client(dev), true);
160
-    return al3010_set_pwr_on(to_i2c_client(dev));
215
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
161
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
216
+
162
+
217
+    return al3010_set_pwr_on(data);
163
+    return al3010_set_pwr_on(data);
218
}
164
}
219
165
220
static DEFINE_SIMPLE_DEV_PM_OPS(al3010_pm_ops, al3010_suspend, al3010_resume);
166
static DEFINE_SIMPLE_DEV_PM_OPS(al3010_pm_ops, al3010_suspend, al3010_resume);
221
167
222
--
168
--
223
2.47.2
169
2.49.0
224
225
diff view generated by jsdifflib
1
From: David Heidelberg <david@ixit.cz>
1
From: David Heidelberg <david@ixit.cz>
2
2
3
Modernize and make driver a bit cleaner.
3
Modernize and make driver a bit cleaner.
4
4
5
Incorporate most of the feedback given on new AL3000A.
5
After the regmap implementation, the compiler is able to produce
6
much smaller module.
7
8
Size before: 72 kB
9
Size after: 58 kB
6
10
7
Signed-off-by: David Heidelberg <david@ixit.cz>
11
Signed-off-by: David Heidelberg <david@ixit.cz>
8
---
12
---
9
drivers/iio/light/al3320a.c | 101 ++++++++++++++++++++++++--------------------
13
drivers/iio/light/al3320a.c | 82 +++++++++++++++++++++++++--------------------
10
1 file changed, 56 insertions(+), 45 deletions(-)
14
1 file changed, 46 insertions(+), 36 deletions(-)
11
15
12
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
16
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/drivers/iio/light/al3320a.c
18
--- a/drivers/iio/light/al3320a.c
15
+++ b/drivers/iio/light/al3320a.c
19
+++ b/drivers/iio/light/al3320a.c
...
...
39
static const struct iio_chan_spec al3320a_channels[] = {
43
static const struct iio_chan_spec al3320a_channels[] = {
40
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3320a_attribute_group = {
44
@@ -XXX,XX +XXX,XX @@ static const struct attribute_group al3320a_attribute_group = {
41
    .attrs = al3320a_attributes,
45
    .attrs = al3320a_attributes,
42
};
46
};
43
47
44
-static int al3320a_set_pwr(struct i2c_client *client, bool pwr)
48
-static int al3320a_set_pwr_on(struct i2c_client *client)
45
+static int al3320a_set_pwr_on(struct al3320a_data *data)
49
+static int al3320a_set_pwr_on(struct al3320a_data *data)
46
{
50
{
47
-    u8 val = pwr ? AL3320A_CONFIG_ENABLE : AL3320A_CONFIG_DISABLE;
51
-    return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, AL3320A_CONFIG_ENABLE);
48
-    return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, val);
49
+    return regmap_write(data->regmap, AL3320A_REG_CONFIG, AL3320A_CONFIG_ENABLE);
52
+    return regmap_write(data->regmap, AL3320A_REG_CONFIG, AL3320A_CONFIG_ENABLE);
50
}
53
}
51
54
52
static void al3320a_set_pwr_off(void *_data)
55
static void al3320a_set_pwr_off(void *_data)
53
{
56
{
54
    struct al3320a_data *data = _data;
57
    struct al3320a_data *data = _data;
55
+    struct device *dev = regmap_get_device(data->regmap);
58
+    struct device *dev = regmap_get_device(data->regmap);
56
+    int ret;
59
+    int ret;
57
60
58
-    al3320a_set_pwr(data->client, false);
61
-    i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG, AL3320A_CONFIG_DISABLE);
59
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG, AL3320A_CONFIG_DISABLE);
62
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG, AL3320A_CONFIG_DISABLE);
60
+    if (ret)
63
+    if (ret)
61
+        dev_err(dev, "failed to write system register\n");
64
+        dev_err(dev, "failed to write system register\n");
62
}
65
}
63
66
64
static int al3320a_init(struct al3320a_data *data)
67
static int al3320a_init(struct al3320a_data *data)
65
{
68
{
66
    int ret;
69
    int ret;
67
70
68
-    ret = al3320a_set_pwr(data->client, true);
71
-    ret = al3320a_set_pwr_on(data->client);
69
-
72
-
73
-    if (ret < 0)
74
-        return ret;
75
-
76
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
77
-                    FIELD_PREP(AL3320A_GAIN_MASK,
78
-                         AL3320A_RANGE_3));
70
-    if (ret < 0)
79
-    if (ret < 0)
71
+    ret = al3320a_set_pwr_on(data);
80
+    ret = al3320a_set_pwr_on(data);
72
+    if (ret)
81
+    if (ret)
73
        return ret;
82
        return ret;
74
83
75
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
76
-                    FIELD_PREP(AL3320A_GAIN_MASK,
77
-                         AL3320A_RANGE_3));
78
-    if (ret < 0)
79
-        return ret;
80
-
81
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_MEAN_TIME,
84
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_MEAN_TIME,
82
-                    AL3320A_DEFAULT_MEAN_TIME);
85
-                    AL3320A_DEFAULT_MEAN_TIME);
83
-    if (ret < 0)
86
-    if (ret < 0)
84
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
87
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
85
+             FIELD_PREP(AL3320A_GAIN_MASK, AL3320A_RANGE_3));
88
+             FIELD_PREP(AL3320A_GAIN_MASK, AL3320A_RANGE_3));
...
...
103
@@ -XXX,XX +XXX,XX @@ static int al3320a_read_raw(struct iio_dev *indio_dev,
106
@@ -XXX,XX +XXX,XX @@ static int al3320a_read_raw(struct iio_dev *indio_dev,
104
             int *val2, long mask)
107
             int *val2, long mask)
105
{
108
{
106
    struct al3320a_data *data = iio_priv(indio_dev);
109
    struct al3320a_data *data = iio_priv(indio_dev);
107
-    int ret;
110
-    int ret;
108
+    int ret, value;
111
+    int ret, gain, raw;
109
112
110
    switch (mask) {
113
    switch (mask) {
111
    case IIO_CHAN_INFO_RAW:
114
    case IIO_CHAN_INFO_RAW:
112
@@ -XXX,XX +XXX,XX @@ static int al3320a_read_raw(struct iio_dev *indio_dev,
115
@@ -XXX,XX +XXX,XX @@ static int al3320a_read_raw(struct iio_dev *indio_dev,
113
         * - low byte of output is stored at AL3320A_REG_DATA_LOW
116
         * - low byte of output is stored at AL3320A_REG_DATA_LOW
114
         * - high byte of output is stored at AL3320A_REG_DATA_LOW + 1
117
         * - high byte of output is stored at AL3320A_REG_DATA_LOW + 1
115
         */
118
         */
116
-        ret = i2c_smbus_read_word_data(data->client,
119
-        ret = i2c_smbus_read_word_data(data->client,
117
-                     AL3320A_REG_DATA_LOW);
120
-                     AL3320A_REG_DATA_LOW);
118
-        if (ret < 0)
121
-        if (ret < 0)
119
+        ret = regmap_read(data->regmap, AL3320A_REG_DATA_LOW, &value);
122
+        ret = regmap_read(data->regmap, AL3320A_REG_DATA_LOW, &raw);
120
+        if (ret)
123
+        if (ret)
121
            return ret;
124
            return ret;
122
-        *val = ret;
125
-        *val = ret;
123
+
126
+
124
+        *val = value;
127
+        *val = raw;
125
+
128
+
126
        return IIO_VAL_INT;
129
        return IIO_VAL_INT;
127
    case IIO_CHAN_INFO_SCALE:
130
    case IIO_CHAN_INFO_SCALE:
128
-        ret = i2c_smbus_read_byte_data(data->client,
131
-        ret = i2c_smbus_read_byte_data(data->client,
129
-                     AL3320A_REG_CONFIG_RANGE);
132
-                     AL3320A_REG_CONFIG_RANGE);
130
-        if (ret < 0)
133
-        if (ret < 0)
131
+        ret = regmap_read(data->regmap, AL3320A_REG_CONFIG_RANGE, &value);
134
+        ret = regmap_read(data->regmap, AL3320A_REG_CONFIG_RANGE, &gain);
132
+        if (ret)
135
+        if (ret)
133
            return ret;
136
            return ret;
134
137
135
-        ret = FIELD_GET(AL3320A_GAIN_MASK, ret);
138
-        ret = FIELD_GET(AL3320A_GAIN_MASK, ret);
136
-        *val = al3320a_scales[ret][0];
139
-        *val = al3320a_scales[ret][0];
137
-        *val2 = al3320a_scales[ret][1];
140
-        *val2 = al3320a_scales[ret][1];
138
+        value = FIELD_GET(AL3320A_GAIN_MASK, value);
141
+        gain = FIELD_GET(AL3320A_GAIN_MASK, gain);
139
+        *val = al3320a_scales[value][0];
142
+        *val = al3320a_scales[gain][0];
140
+        *val2 = al3320a_scales[value][1];
143
+        *val2 = al3320a_scales[gain][1];
141
144
142
        return IIO_VAL_INT_PLUS_MICRO;
145
        return IIO_VAL_INT_PLUS_MICRO;
143
    }
146
    }
144
@@ -XXX,XX +XXX,XX @@ static int al3320a_write_raw(struct iio_dev *indio_dev,
147
@@ -XXX,XX +XXX,XX @@ static int al3320a_write_raw(struct iio_dev *indio_dev,
145
             int val2, long mask)
146
{
147
    struct al3320a_data *data = iio_priv(indio_dev);
148
-    int i;
149
+    unsigned int i;
150
151
    switch (mask) {
152
    case IIO_CHAN_INFO_SCALE:
153
@@ -XXX,XX +XXX,XX @@ static int al3320a_write_raw(struct iio_dev *indio_dev,
154
             val2 != al3320a_scales[i][1])
148
             val2 != al3320a_scales[i][1])
155
                continue;
149
                continue;
156
150
157
-            return i2c_smbus_write_byte_data(data->client,
151
-            return i2c_smbus_write_byte_data(data->client,
158
-                    AL3320A_REG_CONFIG_RANGE,
152
-                    AL3320A_REG_CONFIG_RANGE,
159
-                    FIELD_PREP(AL3320A_GAIN_MASK, i));
153
-                    FIELD_PREP(AL3320A_GAIN_MASK, i));
160
+            return regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
154
+            return regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
161
+                     FIELD_PREP(AL3320A_GAIN_MASK, i));
155
+                     FIELD_PREP(AL3320A_GAIN_MASK, i));
162
        }
156
        }
163
        break;
157
        break;
164
    }
158
    }
165
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3320a_info = {
159
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
166
static int al3320a_probe(struct i2c_client *client)
167
{
168
    struct al3320a_data *data;
169
+    struct device *dev = &client->dev;
170
    struct iio_dev *indio_dev;
171
    int ret;
172
173
-    indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
174
+    indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
175
    if (!indio_dev)
176
        return -ENOMEM;
177
160
178
    data = iio_priv(indio_dev);
161
    data = iio_priv(indio_dev);
179
    i2c_set_clientdata(client, indio_dev);
162
    i2c_set_clientdata(client, indio_dev);
180
-    data->client = client;
163
-    data->client = client;
181
+
164
+
182
+    data->regmap = devm_regmap_init_i2c(client, &al3320a_regmap_config);
165
+    data->regmap = devm_regmap_init_i2c(client, &al3320a_regmap_config);
183
+    if (IS_ERR(data->regmap))
166
+    if (IS_ERR(data->regmap))
184
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
167
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
185
+                 "cannot allocate regmap\n");
168
+                 "cannot allocate regmap\n");
186
169
187
    indio_dev->info = &al3320a_info;
170
    indio_dev->info = &al3320a_info;
188
    indio_dev->name = AL3320A_DRV_NAME;
171
    indio_dev->name = "al3320a";
189
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
172
@@ -XXX,XX +XXX,XX @@ static int al3320a_suspend(struct device *dev)
190
191
    ret = al3320a_init(data);
192
    if (ret < 0) {
193
-        dev_err(&client->dev, "al3320a chip init failed\n");
194
+        dev_err(dev, "failed to init ALS\n");
195
        return ret;
196
    }
197
198
-    ret = devm_add_action_or_reset(&client->dev,
199
-                    al3320a_set_pwr_off,
200
-                    data);
201
+    ret = devm_add_action_or_reset(dev, al3320a_set_pwr_off, data);
202
    if (ret < 0)
203
        return ret;
204
205
-    return devm_iio_device_register(&client->dev, indio_dev);
206
+    return devm_iio_device_register(dev, indio_dev);
207
}
208
209
static int al3320a_suspend(struct device *dev)
210
{
211
-    return al3320a_set_pwr(to_i2c_client(dev), false);
212
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
213
+
214
+    al3320a_set_pwr_off(data);
215
+    return 0;
216
}
217
173
218
static int al3320a_resume(struct device *dev)
174
static int al3320a_resume(struct device *dev)
219
{
175
{
220
-    return al3320a_set_pwr(to_i2c_client(dev), true);
176
-    return al3320a_set_pwr_on(to_i2c_client(dev));
221
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
177
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
222
+
178
+
223
+    return al3320a_set_pwr_on(data);
179
+    return al3320a_set_pwr_on(data);
224
}
180
}
225
181
226
static DEFINE_SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend,
182
static DEFINE_SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend,
227
183
228
--
184
--
229
2.47.2
185
2.49.0
diff view generated by jsdifflib