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 |