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 |