[PATCH v4 (staging-next) 2/5] staging:iio:hmc5843: Split hmc5843.c to multiple files

Jonathan Cameron jic23 at kernel.org
Sun Jul 20 16:33:37 UTC 2014


On 20/07/14 17:32, Jonathan Cameron wrote:
> On 16/07/14 14:07, Josef Gajdusek wrote:
>> This patch splits hmc5843.c to multiple files - the interface-agnostic
>> hmc5843_core.c, i2c specific hmc5843_i2c.c and header file hmc5843.h. This is
>> another step to add support of SPI-enabled hmc5983.
>>
>> Signed-off-by: Josef Gajdusek <atx at atx.name>
> Unfortunately taking the tables non static just causes sparse to complain:
>
> drivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static?
> drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static?
> drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
>    CC [M]  drivers/staging/iio/magnetometer/hmc5843_core.o
>    CHECK   drivers/staging/iio/magnetometer/hmc5843_i2c.c
> drivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static?
> drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static?
> drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
>    CC [M]  drivers/staging/iio/magnetometer/hmc5843_i2c.o
>
> I think you'll probably just have to duplicate them (which is irritating, but there we are).
>
> Jonathan
p.s. For now I've backed out patch 1 as well so that we can keep this as a
clean series rather than splitting it through time!
>> ---
>>   drivers/staging/iio/magnetometer/Kconfig           |  14 +-
>>   drivers/staging/iio/magnetometer/Makefile          |   3 +-
>>   drivers/staging/iio/magnetometer/hmc5843.h         |  85 ++++++++++++
>>   .../iio/magnetometer/{hmc5843.c => hmc5843_core.c} | 154 +++++----------------
>>   drivers/staging/iio/magnetometer/hmc5843_i2c.c     |  75 ++++++++++
>>   5 files changed, 203 insertions(+), 128 deletions(-)
>>   create mode 100644 drivers/staging/iio/magnetometer/hmc5843.h
>>   rename drivers/staging/iio/magnetometer/{hmc5843.c => hmc5843_core.c} (79%)
>>   create mode 100644 drivers/staging/iio/magnetometer/hmc5843_i2c.c
>>
>> diff --git a/drivers/staging/iio/magnetometer/Kconfig b/drivers/staging/iio/magnetometer/Kconfig
>> index ad88d61..0a27f98 100644
>> --- a/drivers/staging/iio/magnetometer/Kconfig
>> +++ b/drivers/staging/iio/magnetometer/Kconfig
>> @@ -4,16 +4,22 @@
>>   menu "Magnetometer sensors"
>>
>>   config SENSORS_HMC5843
>> -    tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer"
>> -    depends on I2C
>> +    tristate
>>       select IIO_BUFFER
>>       select IIO_TRIGGERED_BUFFER
>> +
>> +config SENSORS_HMC5843_I2C
>> +    tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer (I2C)"
>> +    depends on I2C
>> +    select SENSORS_HMC5843
>>       select REGMAP_I2C
>>       help
>>         Say Y here to add support for the Honeywell HMC5843, HMC5883 and
>>         HMC5883L 3-Axis Magnetometer (digital compass).
>>
>> -      To compile this driver as a module, choose M here: the module
>> -      will be called hmc5843.
>> +      This driver can also be compiled as a set of modules.
>> +      If so, these modules will be created:
>> +      - hmc5843_core (core functions)
>> +      - hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L)
>>
>>   endmenu
>> diff --git a/drivers/staging/iio/magnetometer/Makefile b/drivers/staging/iio/magnetometer/Makefile
>> index f9bfb2e..65baf1c 100644
>> --- a/drivers/staging/iio/magnetometer/Makefile
>> +++ b/drivers/staging/iio/magnetometer/Makefile
>> @@ -2,4 +2,5 @@
>>   # Makefile for industrial I/O Magnetometer sensors
>>   #
>>
>> -obj-$(CONFIG_SENSORS_HMC5843)    += hmc5843.o
>> +obj-$(CONFIG_SENSORS_HMC5843)        += hmc5843_core.o
>> +obj-$(CONFIG_SENSORS_HMC5843_I2C)    += hmc5843_i2c.o
>> diff --git a/drivers/staging/iio/magnetometer/hmc5843.h b/drivers/staging/iio/magnetometer/hmc5843.h
>> new file mode 100644
>> index 0000000..0d9b02e
>> --- /dev/null
>> +++ b/drivers/staging/iio/magnetometer/hmc5843.h
>> @@ -0,0 +1,85 @@
>> +/*
>> + * Header file for hmc5843 driver
>> + *
>> + * Split from hmc5843.c
>> + * Copyright (C) Josef Gajdusek <atx at atx.name>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + *
>> + * */
>> +
>> +
>> +#ifndef HMC5843_CORE_H
>> +#define HMC5843_CORE_H
>> +
>> +#include <linux/regmap.h>
>> +#include <linux/iio/iio.h>
>> +
>> +#define HMC5843_CONFIG_REG_A            0x00
>> +#define HMC5843_CONFIG_REG_B            0x01
>> +#define HMC5843_MODE_REG            0x02
>> +#define HMC5843_DATA_OUT_MSB_REGS        0x03
>> +#define HMC5843_STATUS_REG            0x09
>> +#define HMC5843_ID_REG                0x0a
>> +#define HMC5843_ID_END                0x0c
>> +
>> +enum hmc5843_ids {
>> +    HMC5843_ID,
>> +    HMC5883_ID,
>> +    HMC5883L_ID,
>> +};
>> +
>> +struct hmc5843_data {
>> +    struct device *dev;
>> +    struct mutex lock;
>> +    struct regmap *regmap;
>> +    const struct hmc5843_chip_info *variant;
>> +    __be16 buffer[8]; /* 3x 16-bit channels + padding + 64-bit timestamp */
>> +};
>> +
>> +int hmc5843_common_probe(struct device *dev, struct regmap *regmap,
>> +        enum hmc5843_ids id);
>> +int hmc5843_common_remove(struct device *dev);
>> +
>> +int hmc5843_common_suspend(struct device *dev);
>> +int hmc5843_common_resume(struct device *dev);
>> +
>> +#ifdef CONFIG_PM_SLEEP
>> +static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops,
>> +        hmc5843_common_suspend,
>> +        hmc5843_common_resume);
>> +#define HMC5843_PM_OPS (&hmc5843_pm_ops)
>> +#else
>> +#define HMC5843_PM_OPS NULL
>> +#endif
>> +
>> +static const struct regmap_range hmc5843_readable_ranges[] = {
>> +        regmap_reg_range(0, HMC5843_ID_END),
>> +};
>> +
>> +struct regmap_access_table hmc5843_readable_table = {
>> +        .yes_ranges = hmc5843_readable_ranges,
>> +        .n_yes_ranges = ARRAY_SIZE(hmc5843_readable_ranges),
>> +};
>> +
>> +static const struct regmap_range hmc5843_writable_ranges[] = {
>> +        regmap_reg_range(0, HMC5843_MODE_REG),
>> +};
>> +
>> +struct regmap_access_table hmc5843_writable_table = {
>> +        .yes_ranges = hmc5843_writable_ranges,
>> +        .n_yes_ranges = ARRAY_SIZE(hmc5843_writable_ranges),
>> +};
>> +
>> +static const struct regmap_range hmc5843_volatile_ranges[] = {
>> +        regmap_reg_range(HMC5843_DATA_OUT_MSB_REGS, HMC5843_STATUS_REG),
>> +};
>> +
>> +struct regmap_access_table hmc5843_volatile_table = {
>> +        .yes_ranges = hmc5843_volatile_ranges,
>> +        .n_yes_ranges = ARRAY_SIZE(hmc5843_volatile_ranges),
>> +};
>> +
>> +#endif /* HMC5843_CORE_H */
>> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843_core.c
>> similarity index 79%
>> rename from drivers/staging/iio/magnetometer/hmc5843.c
>> rename to drivers/staging/iio/magnetometer/hmc5843_core.c
>> index 6f06f98..bdeaf43 100644
>> --- a/drivers/staging/iio/magnetometer/hmc5843.c
>> +++ b/drivers/staging/iio/magnetometer/hmc5843_core.c
>> @@ -4,6 +4,8 @@
>>
>>       Support for HMC5883 and HMC5883L by Peter Meerwald <pmeerw at pmeerw.net>.
>>
>> +    Split to multiple files by Josef Gajdusek <atx at atx.name> - 2014
>> +
>>       This program is free software; you can redistribute it and/or modify
>>       it under the terms of the GNU General Public License as published by
>>       the Free Software Foundation; either version 2 of the License, or
>> @@ -20,7 +22,6 @@
>>   */
>>
>>   #include <linux/module.h>
>> -#include <linux/i2c.h>
>>   #include <linux/regmap.h>
>>   #include <linux/iio/iio.h>
>>   #include <linux/iio/sysfs.h>
>> @@ -29,19 +30,7 @@
>>   #include <linux/iio/triggered_buffer.h>
>>   #include <linux/delay.h>
>>
>> -#define HMC5843_CONFIG_REG_A            0x00
>> -#define HMC5843_CONFIG_REG_B            0x01
>> -#define HMC5843_MODE_REG            0x02
>> -#define HMC5843_DATA_OUT_MSB_REGS        0x03
>> -#define HMC5843_STATUS_REG            0x09
>> -#define HMC5843_ID_REG                0x0a
>> -#define HMC5843_ID_END                0x0c
>> -
>> -enum hmc5843_ids {
>> -    HMC5843_ID,
>> -    HMC5883_ID,
>> -    HMC5883L_ID,
>> -};
>> +#include "hmc5843.h"
>>
>>   /*
>>    * Range gain settings in (+-)Ga
>> @@ -121,15 +110,6 @@ struct hmc5843_chip_info {
>>       const int *regval_to_nanoscale;
>>   };
>>
>> -/* Each client has this additional data */
>> -struct hmc5843_data {
>> -    struct i2c_client *client;
>> -    struct mutex lock;
>> -    struct regmap *regmap;
>> -    const struct hmc5843_chip_info *variant;
>> -    __be16 buffer[8]; /* 3x 16-bit channels + padding + 64-bit timestamp */
>> -};
>> -
>>   /* The lower two bits contain the current conversion mode */
>>   static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode)
>>   {
>> @@ -159,7 +139,7 @@ static int hmc5843_wait_measurement(struct hmc5843_data *data)
>>       }
>>
>>       if (tries < 0) {
>> -        dev_err(&data->client->dev, "data not ready\n");
>> +        dev_err(data->dev, "data not ready\n");
>>           return -EIO;
>>       }
>>
>> @@ -524,7 +504,7 @@ static int hmc5843_init(struct hmc5843_data *data)
>>       if (ret < 0)
>>           return ret;
>>       if (id[0] != 'H' || id[1] != '4' || id[2] != '3') {
>> -        dev_err(&data->client->dev, "no HMC5843/5883/5883L sensor\n");
>> +        dev_err(data->dev, "no HMC5843/5883/5883L sensor\n");
>>           return -ENODEV;
>>       }
>>
>> @@ -550,66 +530,43 @@ static const struct iio_info hmc5843_info = {
>>
>>   static const unsigned long hmc5843_scan_masks[] = {0x7, 0};
>>
>> -static const struct regmap_range hmc5843_readable_ranges[] = {
>> -        regmap_reg_range(0, HMC5843_ID_END),
>> -};
>> -
>> -static struct regmap_access_table hmc5843_readable_table = {
>> -        .yes_ranges = hmc5843_readable_ranges,
>> -        .n_yes_ranges = ARRAY_SIZE(hmc5843_readable_ranges),
>> -};
>>
>> -static const struct regmap_range hmc5843_writable_ranges[] = {
>> -        regmap_reg_range(0, HMC5843_MODE_REG),
>> -};
>> -
>> -static struct regmap_access_table hmc5843_writable_table = {
>> -        .yes_ranges = hmc5843_writable_ranges,
>> -        .n_yes_ranges = ARRAY_SIZE(hmc5843_writable_ranges),
>> -};
>> -
>> -static const struct regmap_range hmc5843_volatile_ranges[] = {
>> -        regmap_reg_range(HMC5843_DATA_OUT_MSB_REGS, HMC5843_STATUS_REG),
>> -};
>> -
>> -static struct regmap_access_table hmc5843_volatile_table = {
>> -        .yes_ranges = hmc5843_volatile_ranges,
>> -        .n_yes_ranges = ARRAY_SIZE(hmc5843_volatile_ranges),
>> -};
>> -
>> -static struct regmap_config hmc5843_regmap_config = {
>> -        .reg_bits = 8,
>> -        .val_bits = 8,
>> -
>> -        .rd_table = &hmc5843_readable_table,
>> -        .wr_table = &hmc5843_writable_table,
>> -        .volatile_table = &hmc5843_volatile_table,
>> +int hmc5843_common_suspend(struct device *dev)
>> +{
>> +    return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)),
>> +            HMC5843_MODE_CONVERSION_CONTINUOUS);
>> +}
>> +EXPORT_SYMBOL(hmc5843_common_suspend);
>>
>> -        .cache_type = REGCACHE_RBTREE,
>> -};
>> +int hmc5843_common_resume(struct device *dev)
>> +{
>> +    return hmc5843_set_mode(iio_priv(dev_get_drvdata(dev)),
>> +            HMC5843_MODE_SLEEP);
>> +}
>> +EXPORT_SYMBOL(hmc5843_common_resume);
>>
>> -static int hmc5843_probe(struct i2c_client *client,
>> -             const struct i2c_device_id *id)
>> +int hmc5843_common_probe(struct device *dev, struct regmap *regmap,
>> +        enum hmc5843_ids id)
>>   {
>>       struct hmc5843_data *data;
>>       struct iio_dev *indio_dev;
>>       int ret;
>>
>> -    indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
>> +    indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
>>       if (indio_dev == NULL)
>>           return -ENOMEM;
>>
>> +    dev_set_drvdata(dev, indio_dev);
>> +
>>       /* default settings at probe */
>>       data = iio_priv(indio_dev);
>> -    data->client = client;
>> -    data->variant = &hmc5843_chip_info_tbl[id->driver_data];
>> -    data->regmap = devm_regmap_init_i2c(client, &hmc5843_regmap_config);
>> +    data->dev = dev;
>> +    data->regmap = regmap;
>> +    data->variant = &hmc5843_chip_info_tbl[id];
>>       mutex_init(&data->lock);
>>
>> -    i2c_set_clientdata(client, indio_dev);
>> +    indio_dev->dev.parent = dev;
>>       indio_dev->info = &hmc5843_info;
>> -    indio_dev->name = id->name;
>> -    indio_dev->dev.parent = &client->dev;
>>       indio_dev->modes = INDIO_DIRECT_MODE;
>>       indio_dev->channels = data->variant->channels;
>>       indio_dev->num_channels = 4;
>> @@ -634,10 +591,11 @@ buffer_cleanup:
>>       iio_triggered_buffer_cleanup(indio_dev);
>>       return ret;
>>   }
>> +EXPORT_SYMBOL(hmc5843_common_probe);
>>
>> -static int hmc5843_remove(struct i2c_client *client)
>> +int hmc5843_common_remove(struct device *dev)
>>   {
>> -    struct iio_dev *indio_dev = i2c_get_clientdata(client);
>> +    struct iio_dev *indio_dev = dev_get_drvdata(dev);
>>
>>       iio_device_unregister(indio_dev);
>>       iio_triggered_buffer_cleanup(indio_dev);
>> @@ -647,58 +605,8 @@ static int hmc5843_remove(struct i2c_client *client)
>>
>>       return 0;
>>   }
>> -
>> -#ifdef CONFIG_PM_SLEEP
>> -static int hmc5843_suspend(struct device *dev)
>> -{
>> -    struct hmc5843_data *data = iio_priv(i2c_get_clientdata(
>> -        to_i2c_client(dev)));
>> -
>> -    return hmc5843_set_mode(data, HMC5843_MODE_SLEEP);
>> -}
>> -
>> -static int hmc5843_resume(struct device *dev)
>> -{
>> -    struct hmc5843_data *data = iio_priv(i2c_get_clientdata(
>> -        to_i2c_client(dev)));
>> -
>> -    return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
>> -}
>> -
>> -static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, hmc5843_suspend, hmc5843_resume);
>> -#define HMC5843_PM_OPS (&hmc5843_pm_ops)
>> -#else
>> -#define HMC5843_PM_OPS NULL
>> -#endif
>> -
>> -static const struct i2c_device_id hmc5843_id[] = {
>> -    { "hmc5843", HMC5843_ID },
>> -    { "hmc5883", HMC5883_ID },
>> -    { "hmc5883l", HMC5883L_ID },
>> -    { }
>> -};
>> -MODULE_DEVICE_TABLE(i2c, hmc5843_id);
>> -
>> -static const struct of_device_id hmc5843_of_match[] = {
>> -    { .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID },
>> -    { .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID },
>> -    { .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID },
>> -    {}
>> -};
>> -MODULE_DEVICE_TABLE(of, hmc5843_of_match);
>> -
>> -static struct i2c_driver hmc5843_driver = {
>> -    .driver = {
>> -        .name    = "hmc5843",
>> -        .pm    = HMC5843_PM_OPS,
>> -        .of_match_table = hmc5843_of_match,
>> -    },
>> -    .id_table    = hmc5843_id,
>> -    .probe        = hmc5843_probe,
>> -    .remove        = hmc5843_remove,
>> -};
>> -module_i2c_driver(hmc5843_driver);
>> +EXPORT_SYMBOL(hmc5843_common_remove);
>>
>>   MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti at ti.com>");
>> -MODULE_DESCRIPTION("HMC5843/5883/5883L driver");
>> +MODULE_DESCRIPTION("HMC5843/5883/5883L core driver");
>>   MODULE_LICENSE("GPL");
>> diff --git a/drivers/staging/iio/magnetometer/hmc5843_i2c.c b/drivers/staging/iio/magnetometer/hmc5843_i2c.c
>> new file mode 100644
>> index 0000000..20b5c93
>> --- /dev/null
>> +++ b/drivers/staging/iio/magnetometer/hmc5843_i2c.c
>> @@ -0,0 +1,75 @@
>> +/*
>> + * i2c driver for hmc5843/5843/5883/5883l
>> + *
>> + * Split from hmc5843.c
>> + * Copyright (C) Josef Gajdusek <atx at atx.name>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + *
>> + * */
>> +
>> +#include <linux/module.h>
>> +#include <linux/i2c.h>
>> +#include <linux/regmap.h>
>> +#include <linux/iio/iio.h>
>> +#include <linux/iio/triggered_buffer.h>
>> +
>> +#include "hmc5843.h"
>> +
>> +static struct regmap_config hmc5843_i2c_regmap_config = {
>> +        .reg_bits = 8,
>> +        .val_bits = 8,
>> +
>> +        .rd_table = &hmc5843_readable_table,
>> +        .wr_table = &hmc5843_writable_table,
>> +        .volatile_table = &hmc5843_volatile_table,
>> +
>> +        .cache_type = REGCACHE_RBTREE,
>> +};
>> +
>> +static int hmc5843_i2c_probe(struct i2c_client *client,
>> +             const struct i2c_device_id *id)
>> +{
>> +    return hmc5843_common_probe(&client->dev,
>> +            devm_regmap_init_i2c(client, &hmc5843_i2c_regmap_config),
>> +            id->driver_data);
>> +}
>> +
>> +static int hmc5843_i2c_remove(struct i2c_client *client)
>> +{
>> +    return hmc5843_common_remove(&client->dev);
>> +}
>> +
>> +static const struct i2c_device_id hmc5843_id[] = {
>> +    { "hmc5843", HMC5843_ID },
>> +    { "hmc5883", HMC5883_ID },
>> +    { "hmc5883l", HMC5883L_ID },
>> +    { }
>> +};
>> +MODULE_DEVICE_TABLE(i2c, hmc5843_id);
>> +
>> +static const struct of_device_id hmc5843_of_match[] = {
>> +    { .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID },
>> +    { .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID },
>> +    { .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID },
>> +    {}
>> +};
>> +MODULE_DEVICE_TABLE(of, hmc5843_of_match);
>> +
>> +static struct i2c_driver hmc5843_driver = {
>> +    .driver = {
>> +        .name    = "hmc5843",
>> +        .pm    = HMC5843_PM_OPS,
>> +        .of_match_table = hmc5843_of_match,
>> +    },
>> +    .id_table    = hmc5843_id,
>> +    .probe        = hmc5843_i2c_probe,
>> +    .remove        = hmc5843_i2c_remove,
>> +};
>> +module_i2c_driver(hmc5843_driver);
>> +
>> +MODULE_AUTHOR("Josef Gajdusek <atx at atx.name>");
>> +MODULE_DESCRIPTION("HMC5843/5883/5883L i2c driver");
>> +MODULE_LICENSE("GPL");
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the devel mailing list