1
This series targetting improved readability of code
1
This series aims to improve code readability and modernize it to align
2
and modernizing code to match today standards.
2
with the recently upstreamed AL3000a.
3
3
4
Except slightly improved error reporting,
4
Apart from slightly improved error reporting, and error handling
5
there shouldn't be any function changes.
5
there should be no functional 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 v4:
18
iio: light: al3320a: Drop deprecated email for Daniel
14
- Fixed mixed-up rebase changes between commits and added
19
iio: light: al3000a: Use DRV_NAME
15
regmap_get_device into _init functions to get the device.
16
- Link to v3: https://lore.kernel.org/r/20250402-al3010-iio-regmap-v3-0-cc3da273b5b2@ixit.cz
17
18
Changes in v3:
19
- Stripped patches merged from second version of patchset.
20
- Dropped iio: light: al3010: Move devm_add_action_or_reset back to _probe
21
in favor of opposite approach moving devm_add.. to _init for al3xx0a:
22
- iio: light: al3000a: Fix an error handling path in al3000a_probe()
23
- iio: light: al3320a: Fix an error handling path in al3320a_probe()
24
- Link to v2: https://lore.kernel.org/r/20250319-al3010-iio-regmap-v2-0-1310729d0543@ixit.cz
25
26
Changes in v2:
27
- Dropped Daniel's email update.
28
- Dropped DRV_NAME introduction for al3000a
29
- Added DRV_NAME define removal for al3010 and al3320a.
30
- Splitted unsigned int conversion into separate patches.
31
- Replaced generic value with specific raw and gain variable.
32
- Use dev_err_probe() for error handling.
33
- Separated devm_add_action_or_reset move from _init back to _probe.
34
- Dropped copyright update.
35
- Link to v1: https://lore.kernel.org/r/20250308-al3010-iio-regmap-v1-0-b672535e8213@ixit.cz
36
37
---
38
David Heidelberg (5):
39
iio: light: al3010: Improve al3010_init error handling with dev_err_probe()
40
iio: light: al3000a: Fix an error handling path in al3000a_probe()
41
iio: light: al3320a: Fix an error handling path in al3320a_probe()
20
iio: light: al3010: Implement regmap support
42
iio: light: al3010: Implement regmap support
21
iio: light: al3320a: Implement regmap support
43
iio: light: al3320a: Implement regmap support
22
44
23
drivers/iio/light/al3000a.c | 6 ++-
45
drivers/iio/light/al3000a.c | 9 +++--
24
drivers/iio/light/al3010.c | 95 ++++++++++++++++++++++------------------
46
drivers/iio/light/al3010.c | 85 +++++++++++++++++++++++--------------------
25
drivers/iio/light/al3320a.c | 103 ++++++++++++++++++++++++--------------------
47
drivers/iio/light/al3320a.c | 89 +++++++++++++++++++++++++--------------------
26
3 files changed, 114 insertions(+), 90 deletions(-)
48
3 files changed, 100 insertions(+), 83 deletions(-)
27
---
49
---
28
base-commit: 0a2f889128969dab41861b6e40111aa03dc57014
50
base-commit: f8ffc92ae9052e6615896052f0c5b808bfc17520
29
change-id: 20250308-al3010-iio-regmap-038cea39f85d
51
change-id: 20250308-al3010-iio-regmap-038cea39f85d
30
52
31
Best regards,
53
Best regards,
32
--
54
--
33
David Heidelberg <david@ixit.cz>
55
David Heidelberg <david@ixit.cz>
diff view generated by jsdifflib
New patch
1
From: David Heidelberg <david@ixit.cz>
1
2
3
Minor code simplifications and improved error reporting.
4
5
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
7
drivers/iio/light/al3010.c | 10 ++++------
8
1 file changed, 4 insertions(+), 6 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_init(struct al3010_data *data)
15
    ret = devm_add_action_or_reset(&data->client->dev,
16
                 al3010_set_pwr_off,
17
                 data);
18
-    if (ret < 0)
19
-        return ret;
20
+    if (ret)
21
+        return dev_err_probe(&data->client->dev, ret, "failed to add action\n");
22
23
    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
24
                    FIELD_PREP(AL3010_GAIN_MASK,
25
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
26
    indio_dev->modes = INDIO_DIRECT_MODE;
27
28
    ret = al3010_init(data);
29
-    if (ret < 0) {
30
-        dev_err(dev, "al3010 chip init failed\n");
31
-        return ret;
32
-    }
33
+    if (ret)
34
+        return dev_err_probe(dev, ret, "failed to init ALS\n");
35
36
    return devm_iio_device_register(dev, indio_dev);
37
}
38
39
--
40
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
If regmap_write() fails in al3000a_init(), al3000a_set_pwr_off is
4
not called.
5
6
In order to avoid such a situation, move the devm_add_action_or_reset()
7
which calls al3000a_set_pwr_off right after a successful
8
al3000a_set_pwr_on.
4
9
5
Signed-off-by: David Heidelberg <david@ixit.cz>
10
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
11
---
7
drivers/iio/light/al3000a.c | 6 ++++--
12
drivers/iio/light/al3000a.c | 9 +++++----
8
1 file changed, 4 insertions(+), 2 deletions(-)
13
1 file changed, 5 insertions(+), 4 deletions(-)
9
14
10
diff --git a/drivers/iio/light/al3000a.c b/drivers/iio/light/al3000a.c
15
diff --git a/drivers/iio/light/al3000a.c b/drivers/iio/light/al3000a.c
11
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3000a.c
17
--- a/drivers/iio/light/al3000a.c
13
+++ b/drivers/iio/light/al3000a.c
18
+++ b/drivers/iio/light/al3000a.c
14
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void al3000a_set_pwr_off(void *_data)
15
20
16
#include <linux/iio/iio.h>
21
static int al3000a_init(struct al3000a_data *data)
17
22
{
18
+#define AL3000A_DRV_NAME "al3000a"
23
+    struct device *dev = regmap_get_device(data->regmap);
24
    int ret;
25
26
    ret = al3000a_set_pwr_on(data);
27
    if (ret)
28
        return ret;
29
30
+    ret = devm_add_action_or_reset(dev, al3000a_set_pwr_off, data);
31
+    if (ret)
32
+        return dev_err_probe(dev, ret, "failed to add action\n");
19
+
33
+
20
#define AL3000A_REG_SYSTEM        0x00
34
    ret = regmap_write(data->regmap, AL3000A_REG_SYSTEM, AL3000A_CONFIG_RESET);
21
#define AL3000A_REG_DATA        0x05
35
    if (ret)
22
36
        return ret;
23
@@ -XXX,XX +XXX,XX @@ static int al3000a_probe(struct i2c_client *client)
37
@@ -XXX,XX +XXX,XX @@ static int al3000a_probe(struct i2c_client *client)
24
                 "failed to get vdd regulator\n");
38
    if (ret)
25
39
        return dev_err_probe(dev, ret, "failed to init ALS\n");
26
    indio_dev->info = &al3000a_info;
40
27
-    indio_dev->name = "al3000a";
41
-    ret = devm_add_action_or_reset(dev, al3000a_set_pwr_off, data);
28
+    indio_dev->name = AL3000A_DRV_NAME;
42
-    if (ret)
29
    indio_dev->channels = al3000a_channels;
43
-        return dev_err_probe(dev, ret, "failed to add action\n");
30
    indio_dev->num_channels = ARRAY_SIZE(al3000a_channels);
44
-
31
    indio_dev->modes = INDIO_DIRECT_MODE;
45
    return devm_iio_device_register(dev, indio_dev);
32
@@ -XXX,XX +XXX,XX @@ MODULE_DEVICE_TABLE(of, al3000a_of_match);
46
}
33
47
34
static struct i2c_driver al3000a_driver = {
35
    .driver = {
36
-        .name = "al3000a",
37
+        .name = AL3000A_DRV_NAME,
38
        .of_match_table = al3000a_of_match,
39
        .pm = pm_sleep_ptr(&al3000a_pm_ops),
40
    },
41
48
42
--
49
--
43
2.47.2
50
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
If regmap_write() fails in al3320a_init(), al3320a_set_pwr_off is
4
not called.
5
6
In order to avoid such a situation, move the devm_add_action_or_reset()
7
which calls al3320a_set_pwr_off right after a successful
8
al3320a_set_pwr_on.
4
9
5
Signed-off-by: David Heidelberg <david@ixit.cz>
10
Signed-off-by: David Heidelberg <david@ixit.cz>
6
---
11
---
7
drivers/iio/light/al3320a.c | 2 +-
12
drivers/iio/light/al3320a.c | 10 ++++++----
8
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 6 insertions(+), 4 deletions(-)
9
14
10
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
15
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c
11
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/iio/light/al3320a.c
17
--- a/drivers/iio/light/al3320a.c
13
+++ b/drivers/iio/light/al3320a.c
18
+++ b/drivers/iio/light/al3320a.c
14
@@ -XXX,XX +XXX,XX @@ static struct i2c_driver al3320a_driver = {
19
@@ -XXX,XX +XXX,XX @@ static int al3320a_init(struct al3320a_data *data)
15
20
    if (ret < 0)
16
module_i2c_driver(al3320a_driver);
21
        return ret;
17
22
18
-MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");
23
+    ret = devm_add_action_or_reset(&data->client->dev,
19
+MODULE_AUTHOR("Daniel Baluta");
24
+                 al3320a_set_pwr_off,
20
MODULE_DESCRIPTION("AL3320A Ambient Light Sensor driver");
25
+                 data);
21
MODULE_LICENSE("GPL v2");
26
+    if (ret)
27
+        return dev_err_probe(&data->client->dev, ret, "failed to add action\n");
28
+
29
    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
30
                    FIELD_PREP(AL3320A_GAIN_MASK,
31
                         AL3320A_RANGE_3));
32
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
33
        return ret;
34
    }
35
36
-    ret = devm_add_action_or_reset(dev, al3320a_set_pwr_off, data);
37
-    if (ret < 0)
38
-        return ret;
39
-
40
    return devm_iio_device_register(dev, indio_dev);
41
}
42
22
43
23
--
44
--
24
2.47.2
45
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 clean up the driver using the regmap framework.
4
4
5
Incorporate most of the feedback given on new AL3000A.
5
With the regmap implementation, the compiler produces
6
a significantly 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 | 77 +++++++++++++++++++++++++---------------------
10
1 file changed, 53 insertions(+), 42 deletions(-)
14
1 file changed, 42 insertions(+), 35 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
{
71
+    struct device *dev = regmap_get_device(data->regmap);
75
    int ret;
72
    int ret;
76
73
77
-    ret = al3010_set_pwr(data->client, true);
74
-    ret = al3010_set_pwr_on(data->client);
78
-    if (ret < 0)
75
-    if (ret < 0)
79
-        return ret;
76
+    ret = al3010_set_pwr_on(data);
80
-
77
+    if (ret)
78
        return ret;
79
81
-    ret = devm_add_action_or_reset(&data->client->dev,
80
-    ret = devm_add_action_or_reset(&data->client->dev,
82
-                 al3010_set_pwr_off,
81
-                 al3010_set_pwr_off,
83
-                 data);
82
-                 data);
84
-    if (ret < 0)
83
+    ret = devm_add_action_or_reset(dev, al3010_set_pwr_off, data);
85
-        return ret;
84
    if (ret)
85
-        return dev_err_probe(&data->client->dev, ret, "failed to add action\n");
86
-
86
-
87
-    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
87
-    ret = i2c_smbus_write_byte_data(data->client, AL3010_REG_CONFIG,
88
-                    FIELD_PREP(AL3010_GAIN_MASK,
88
-                    FIELD_PREP(AL3010_GAIN_MASK,
89
-                         AL3XXX_RANGE_3));
89
-                         AL3XXX_RANGE_3));
90
-    if (ret < 0)
90
-    if (ret < 0)
91
+    ret = al3010_set_pwr_on(data);
91
-        return ret;
92
+    if (ret)
92
+        return dev_err_probe(dev, ret, "failed to add action\n");
93
        return ret;
94
93
95
-    return 0;
94
-    return 0;
96
+    return regmap_write(data->regmap, AL3010_REG_CONFIG,
95
+    return regmap_write(data->regmap, AL3010_REG_CONFIG,
97
+             FIELD_PREP(AL3010_GAIN_MASK, AL3XXX_RANGE_3));
96
+             FIELD_PREP(AL3010_GAIN_MASK, AL3XXX_RANGE_3));
98
}
97
}
...
...
101
@@ -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,
102
             int *val2, long mask)
101
             int *val2, long mask)
103
{
102
{
104
    struct al3010_data *data = iio_priv(indio_dev);
103
    struct al3010_data *data = iio_priv(indio_dev);
105
-    int ret;
104
-    int ret;
106
+    int ret, value;
105
+    int ret, gain, raw;
107
106
108
    switch (mask) {
107
    switch (mask) {
109
    case IIO_CHAN_INFO_RAW:
108
    case IIO_CHAN_INFO_RAW:
110
@@ -XXX,XX +XXX,XX @@ static int al3010_read_raw(struct iio_dev *indio_dev,
109
@@ -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
110
         * - low byte of output is stored at AL3010_REG_DATA_LOW
112
         * - high byte of output is stored at AL3010_REG_DATA_LOW + 1
111
         * - high byte of output is stored at AL3010_REG_DATA_LOW + 1
113
         */
112
         */
114
-        ret = i2c_smbus_read_word_data(data->client,
113
-        ret = i2c_smbus_read_word_data(data->client,
115
-                     AL3010_REG_DATA_LOW);
114
-                     AL3010_REG_DATA_LOW);
116
-        if (ret < 0)
115
-        if (ret < 0)
117
+        ret = regmap_read(data->regmap, AL3010_REG_DATA_LOW, &value);
116
+        ret = regmap_read(data->regmap, AL3010_REG_DATA_LOW, &raw);
118
+        if (ret)
117
+        if (ret)
119
            return ret;
118
            return ret;
120
-        *val = ret;
119
-        *val = ret;
121
+
120
+
122
+        *val = value;
121
+        *val = raw;
123
+
122
+
124
        return IIO_VAL_INT;
123
        return IIO_VAL_INT;
125
    case IIO_CHAN_INFO_SCALE:
124
    case IIO_CHAN_INFO_SCALE:
126
-        ret = i2c_smbus_read_byte_data(data->client,
125
-        ret = i2c_smbus_read_byte_data(data->client,
127
-                     AL3010_REG_CONFIG);
126
-                     AL3010_REG_CONFIG);
128
-        if (ret < 0)
127
-        if (ret < 0)
129
+        ret = regmap_read(data->regmap, AL3010_REG_CONFIG, &value);
128
+        ret = regmap_read(data->regmap, AL3010_REG_CONFIG, &gain);
130
+        if (ret)
129
+        if (ret)
131
            return ret;
130
            return ret;
132
131
133
-        ret = FIELD_GET(AL3010_GAIN_MASK, ret);
132
-        ret = FIELD_GET(AL3010_GAIN_MASK, ret);
134
-        *val = al3010_scales[ret][0];
133
-        *val = al3010_scales[ret][0];
135
-        *val2 = al3010_scales[ret][1];
134
-        *val2 = al3010_scales[ret][1];
136
+        value = FIELD_GET(AL3010_GAIN_MASK, value);
135
+        gain = FIELD_GET(AL3010_GAIN_MASK, gain);
137
+        *val = al3010_scales[value][0];
136
+        *val = al3010_scales[gain][0];
138
+        *val2 = al3010_scales[value][1];
137
+        *val2 = al3010_scales[gain][1];
139
138
140
        return IIO_VAL_INT_PLUS_MICRO;
139
        return IIO_VAL_INT_PLUS_MICRO;
141
    }
140
    }
142
@@ -XXX,XX +XXX,XX @@ static int al3010_write_raw(struct iio_dev *indio_dev,
141
@@ -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])
142
             val2 != al3010_scales[i][1])
153
                continue;
143
                continue;
154
144
155
-            return i2c_smbus_write_byte_data(data->client,
145
-            return i2c_smbus_write_byte_data(data->client,
156
-                    AL3010_REG_CONFIG,
146
-                    AL3010_REG_CONFIG,
157
-                    FIELD_PREP(AL3010_GAIN_MASK, i));
147
-                    FIELD_PREP(AL3010_GAIN_MASK, i));
158
+            return regmap_write(data->regmap, AL3010_REG_CONFIG,
148
+            return regmap_write(data->regmap, AL3010_REG_CONFIG,
159
+                     FIELD_PREP(AL3010_GAIN_MASK, i));
149
+                     FIELD_PREP(AL3010_GAIN_MASK, i));
160
        }
150
        }
161
        break;
151
        break;
162
    }
152
    }
163
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3010_info = {
153
@@ -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
154
176
    data = iio_priv(indio_dev);
155
    data = iio_priv(indio_dev);
177
    i2c_set_clientdata(client, indio_dev);
156
    i2c_set_clientdata(client, indio_dev);
178
-    data->client = client;
157
-    data->client = client;
179
+    data->regmap = devm_regmap_init_i2c(client, &al3010_regmap_config);
158
+    data->regmap = devm_regmap_init_i2c(client, &al3010_regmap_config);
180
+    if (IS_ERR(data->regmap))
159
+    if (IS_ERR(data->regmap))
181
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
160
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
182
+                 "cannot allocate regmap\n");
161
+                 "cannot allocate regmap\n");
183
162
184
    indio_dev->info = &al3010_info;
163
    indio_dev->info = &al3010_info;
185
    indio_dev->name = AL3010_DRV_NAME;
164
    indio_dev->name = "al3010";
186
@@ -XXX,XX +XXX,XX @@ static int al3010_probe(struct i2c_client *client)
165
@@ -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
166
212
static int al3010_resume(struct device *dev)
167
static int al3010_resume(struct device *dev)
213
{
168
{
214
-    return al3010_set_pwr(to_i2c_client(dev), true);
169
-    return al3010_set_pwr_on(to_i2c_client(dev));
215
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
170
+    struct al3010_data *data = iio_priv(dev_get_drvdata(dev));
216
+
171
+
217
+    return al3010_set_pwr_on(data);
172
+    return al3010_set_pwr_on(data);
218
}
173
}
219
174
220
static DEFINE_SIMPLE_DEV_PM_OPS(al3010_pm_ops, al3010_suspend, al3010_resume);
175
static DEFINE_SIMPLE_DEV_PM_OPS(al3010_pm_ops, al3010_suspend, al3010_resume);
221
176
222
--
177
--
223
2.47.2
178
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 clean up the driver using the regmap framework.
4
4
5
Incorporate most of the feedback given on new AL3000A.
5
With the regmap implementation, the compiler produces
6
a significantly 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 | 89 +++++++++++++++++++++++++--------------------
10
1 file changed, 56 insertions(+), 45 deletions(-)
14
1 file changed, 49 insertions(+), 40 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
{
69
+    struct device *dev = regmap_get_device(data->regmap);
66
    int ret;
70
    int ret;
67
71
68
-    ret = al3320a_set_pwr(data->client, true);
72
-    ret = al3320a_set_pwr_on(data->client);
69
-
73
-
70
-    if (ret < 0)
74
-    if (ret < 0)
71
+    ret = al3320a_set_pwr_on(data);
75
+    ret = al3320a_set_pwr_on(data);
72
+    if (ret)
76
+    if (ret)
73
        return ret;
77
        return ret;
74
78
79
-    ret = devm_add_action_or_reset(&data->client->dev,
80
-                 al3320a_set_pwr_off,
81
-                 data);
82
+    ret = devm_add_action_or_reset(dev, al3320a_set_pwr_off, data);
83
    if (ret)
84
-        return dev_err_probe(&data->client->dev, ret, "failed to add action\n");
85
-
75
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
86
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE,
76
-                    FIELD_PREP(AL3320A_GAIN_MASK,
87
-                    FIELD_PREP(AL3320A_GAIN_MASK,
77
-                         AL3320A_RANGE_3));
88
-                         AL3320A_RANGE_3));
78
-    if (ret < 0)
89
-    if (ret < 0)
79
-        return ret;
90
-        return ret;
80
-
91
+        return dev_err_probe(dev, ret, "failed to add action\n");
92
81
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_MEAN_TIME,
93
-    ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_MEAN_TIME,
82
-                    AL3320A_DEFAULT_MEAN_TIME);
94
-                    AL3320A_DEFAULT_MEAN_TIME);
83
-    if (ret < 0)
95
-    if (ret < 0)
84
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
96
+    ret = regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
85
+             FIELD_PREP(AL3320A_GAIN_MASK, AL3320A_RANGE_3));
97
+             FIELD_PREP(AL3320A_GAIN_MASK, AL3320A_RANGE_3));
...
...
103
@@ -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,
104
             int *val2, long mask)
116
             int *val2, long mask)
105
{
117
{
106
    struct al3320a_data *data = iio_priv(indio_dev);
118
    struct al3320a_data *data = iio_priv(indio_dev);
107
-    int ret;
119
-    int ret;
108
+    int ret, value;
120
+    int ret, gain, raw;
109
121
110
    switch (mask) {
122
    switch (mask) {
111
    case IIO_CHAN_INFO_RAW:
123
    case IIO_CHAN_INFO_RAW:
112
@@ -XXX,XX +XXX,XX @@ static int al3320a_read_raw(struct iio_dev *indio_dev,
124
@@ -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
125
         * - low byte of output is stored at AL3320A_REG_DATA_LOW
114
         * - high byte of output is stored at AL3320A_REG_DATA_LOW + 1
126
         * - high byte of output is stored at AL3320A_REG_DATA_LOW + 1
115
         */
127
         */
116
-        ret = i2c_smbus_read_word_data(data->client,
128
-        ret = i2c_smbus_read_word_data(data->client,
117
-                     AL3320A_REG_DATA_LOW);
129
-                     AL3320A_REG_DATA_LOW);
118
-        if (ret < 0)
130
-        if (ret < 0)
119
+        ret = regmap_read(data->regmap, AL3320A_REG_DATA_LOW, &value);
131
+        ret = regmap_read(data->regmap, AL3320A_REG_DATA_LOW, &raw);
120
+        if (ret)
132
+        if (ret)
121
            return ret;
133
            return ret;
122
-        *val = ret;
134
-        *val = ret;
123
+
135
+
124
+        *val = value;
136
+        *val = raw;
125
+
137
+
126
        return IIO_VAL_INT;
138
        return IIO_VAL_INT;
127
    case IIO_CHAN_INFO_SCALE:
139
    case IIO_CHAN_INFO_SCALE:
128
-        ret = i2c_smbus_read_byte_data(data->client,
140
-        ret = i2c_smbus_read_byte_data(data->client,
129
-                     AL3320A_REG_CONFIG_RANGE);
141
-                     AL3320A_REG_CONFIG_RANGE);
130
-        if (ret < 0)
142
-        if (ret < 0)
131
+        ret = regmap_read(data->regmap, AL3320A_REG_CONFIG_RANGE, &value);
143
+        ret = regmap_read(data->regmap, AL3320A_REG_CONFIG_RANGE, &gain);
132
+        if (ret)
144
+        if (ret)
133
            return ret;
145
            return ret;
134
146
135
-        ret = FIELD_GET(AL3320A_GAIN_MASK, ret);
147
-        ret = FIELD_GET(AL3320A_GAIN_MASK, ret);
136
-        *val = al3320a_scales[ret][0];
148
-        *val = al3320a_scales[ret][0];
137
-        *val2 = al3320a_scales[ret][1];
149
-        *val2 = al3320a_scales[ret][1];
138
+        value = FIELD_GET(AL3320A_GAIN_MASK, value);
150
+        gain = FIELD_GET(AL3320A_GAIN_MASK, gain);
139
+        *val = al3320a_scales[value][0];
151
+        *val = al3320a_scales[gain][0];
140
+        *val2 = al3320a_scales[value][1];
152
+        *val2 = al3320a_scales[gain][1];
141
153
142
        return IIO_VAL_INT_PLUS_MICRO;
154
        return IIO_VAL_INT_PLUS_MICRO;
143
    }
155
    }
144
@@ -XXX,XX +XXX,XX @@ static int al3320a_write_raw(struct iio_dev *indio_dev,
156
@@ -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])
157
             val2 != al3320a_scales[i][1])
155
                continue;
158
                continue;
156
159
157
-            return i2c_smbus_write_byte_data(data->client,
160
-            return i2c_smbus_write_byte_data(data->client,
158
-                    AL3320A_REG_CONFIG_RANGE,
161
-                    AL3320A_REG_CONFIG_RANGE,
159
-                    FIELD_PREP(AL3320A_GAIN_MASK, i));
162
-                    FIELD_PREP(AL3320A_GAIN_MASK, i));
160
+            return regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
163
+            return regmap_write(data->regmap, AL3320A_REG_CONFIG_RANGE,
161
+                     FIELD_PREP(AL3320A_GAIN_MASK, i));
164
+                     FIELD_PREP(AL3320A_GAIN_MASK, i));
162
        }
165
        }
163
        break;
166
        break;
164
    }
167
    }
165
@@ -XXX,XX +XXX,XX @@ static const struct iio_info al3320a_info = {
168
@@ -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
169
178
    data = iio_priv(indio_dev);
170
    data = iio_priv(indio_dev);
179
    i2c_set_clientdata(client, indio_dev);
171
    i2c_set_clientdata(client, indio_dev);
180
-    data->client = client;
172
-    data->client = client;
181
+
173
+
182
+    data->regmap = devm_regmap_init_i2c(client, &al3320a_regmap_config);
174
+    data->regmap = devm_regmap_init_i2c(client, &al3320a_regmap_config);
183
+    if (IS_ERR(data->regmap))
175
+    if (IS_ERR(data->regmap))
184
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
176
+        return dev_err_probe(dev, PTR_ERR(data->regmap),
185
+                 "cannot allocate regmap\n");
177
+                 "cannot allocate regmap\n");
186
178
187
    indio_dev->info = &al3320a_info;
179
    indio_dev->info = &al3320a_info;
188
    indio_dev->name = AL3320A_DRV_NAME;
180
    indio_dev->name = "al3320a";
189
@@ -XXX,XX +XXX,XX @@ static int al3320a_probe(struct i2c_client *client)
181
@@ -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
182
218
static int al3320a_resume(struct device *dev)
183
static int al3320a_resume(struct device *dev)
219
{
184
{
220
-    return al3320a_set_pwr(to_i2c_client(dev), true);
185
-    return al3320a_set_pwr_on(to_i2c_client(dev));
221
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
186
+    struct al3320a_data *data = iio_priv(dev_get_drvdata(dev));
222
+
187
+
223
+    return al3320a_set_pwr_on(data);
188
+    return al3320a_set_pwr_on(data);
224
}
189
}
225
190
226
static DEFINE_SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend,
191
static DEFINE_SIMPLE_DEV_PM_OPS(al3320a_pm_ops, al3320a_suspend,
227
192
228
--
193
--
229
2.47.2
194
2.49.0
diff view generated by jsdifflib