[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <4B23DA53.9090008@cam.ac.uk>
Date: Sat, 12 Dec 2009 18:00:51 +0000
From: Jonathan Cameron <jic23@....ac.uk>
To: LKML <linux-kernel@...r.kernel.org>,
Jean Delvare <khali@...ux-fr.org>,
Daniel Mack <daniel@...aq.de>, Zhang Rui <rui.zhang@...el.com>,
Amit Kucheria <amit.kucheria@...durent.com>
Subject: [PATCH] isl29003: Move from misc to als now it available with minimal
changes
Signed-off-by: Jonathan Cameron <jic23@....ac.uk>
---
I originally offered to move this to IIO, but ALS is more appropriate.
There are a couple of attibutes in here that don't correspond directly
to any currently in ALS. Feel free to offer suggestions for renames etc
on these, but I'd prefer to see them in a second patch allowing us to
keep things in this movement patch nice and clean. Will do api help
once these are pinned down.
I've used the git move detection here so as to highlight what has actually
changed in the driver. Just ask if you would prefer a version without
that.
Daniel: Don't suppose you could test this? I don't think I have done
anything that should cause any problems and it builds fine, but always
nice to confirm!
Other than the tsl2563 driver currently in IIO (Greg K-H has sent pull
request) I think this is the final non ALS ambient light sensor in
mainline (assuming other patches have gone in first)
For purposes of testing I've put a kit tree up on kernel.org.
I will rebase this as makes sense to make minor edits to this and the tsl2550
driver so please don't base off it or send on without either telling me
or warning whoever you send it to.
git://git.kernel.org/pub/scm/linux/kernel/git/jic23/als-temp.git
drivers/als/Kconfig | 10 ++++++++
drivers/als/Makefile | 1 +
drivers/{misc => als}/isl29003.c | 45 +++++++++++++++++++++++++------------
drivers/misc/Kconfig | 10 --------
drivers/misc/Makefile | 1 -
5 files changed, 41 insertions(+), 26 deletions(-)
diff --git a/drivers/als/Kconfig b/drivers/als/Kconfig
index 1564ffc..9d99ac2 100644
--- a/drivers/als/Kconfig
+++ b/drivers/als/Kconfig
@@ -11,6 +11,16 @@ menuconfig ALS
if ALS
+config ALS_ISL29003
+ tristate "Intersil ISL29003 ambient light sensor"
+ depends on I2C && SYSFS
+ help
+ If you say yes here you get support for the Intersil ISL29003
+ ambient light sensor.
+
+ This driver can also be built as a module. If so, the module
+ will be called isl29003.
+
config ALS_TSL2550
tristate "Taos TSL2550 ambient light sensor"
depends on EXPERIMENTAL && I2C
diff --git a/drivers/als/Makefile b/drivers/als/Makefile
index 7be5631..55aa8af 100644
--- a/drivers/als/Makefile
+++ b/drivers/als/Makefile
@@ -4,4 +4,5 @@
obj-$(CONFIG_ALS) += als_sys.o
+obj-$(CONFIG_ALS_ISL29003) += isl29003.o
obj-$(CONFIG_ALS_TSL2550) += tsl2550.o
\ No newline at end of file
diff --git a/drivers/misc/isl29003.c b/drivers/als/isl29003.c
similarity index 90%
rename from drivers/misc/isl29003.c
rename to drivers/als/isl29003.c
index a71e245..2ab188e 100644
--- a/drivers/misc/isl29003.c
+++ b/drivers/als/isl29003.c
@@ -31,9 +31,10 @@
#include <linux/i2c.h>
#include <linux/mutex.h>
#include <linux/delay.h>
+#include <linux/als_sys.h>
#define ISL29003_DRV_NAME "isl29003"
-#define DRIVER_VERSION "1.0"
+#define DRIVER_VERSION "2.0"
#define ISL29003_REG_COMMAND 0x00
#define ISL29003_ADC_ENABLED (1 << 7)
@@ -61,6 +62,7 @@
#define ISL29003_NUM_CACHABLE_REGS 4
struct isl29003_data {
+ struct device *classdev;
struct i2c_client *client;
struct mutex lock;
u8 reg_cache[ISL29003_NUM_CACHABLE_REGS];
@@ -196,7 +198,7 @@ static int isl29003_get_adc_value(struct i2c_client *client)
static ssize_t isl29003_show_range(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
return sprintf(buf, "%i\n", isl29003_get_range(client));
}
@@ -204,7 +206,7 @@ static ssize_t isl29003_store_range(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
unsigned long val;
int ret;
@@ -227,7 +229,7 @@ static ssize_t isl29003_show_resolution(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
return sprintf(buf, "%d\n", isl29003_get_resolution(client));
}
@@ -235,7 +237,7 @@ static ssize_t isl29003_store_resolution(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
unsigned long val;
int ret;
@@ -256,14 +258,14 @@ static DEVICE_ATTR(resolution, S_IWUSR | S_IRUGO,
static ssize_t isl29003_show_mode(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
return sprintf(buf, "%d\n", isl29003_get_mode(client));
}
static ssize_t isl29003_store_mode(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
unsigned long val;
int ret;
@@ -286,7 +288,7 @@ static ssize_t isl29003_show_power_state(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
return sprintf(buf, "%d\n", isl29003_get_power_state(client));
}
@@ -294,7 +296,7 @@ static ssize_t isl29003_store_power_state(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
unsigned long val;
int ret;
@@ -313,7 +315,7 @@ static DEVICE_ATTR(power_state, S_IWUSR | S_IRUGO,
static ssize_t isl29003_show_lux(struct device *dev,
struct device_attribute *attr, char *buf)
{
- struct i2c_client *client = to_i2c_client(dev);
+ struct i2c_client *client = to_i2c_client(dev->parent);
/* No LUX data if not operational */
if (!isl29003_get_power_state(client))
@@ -322,14 +324,14 @@ static ssize_t isl29003_show_lux(struct device *dev,
return sprintf(buf, "%d\n", isl29003_get_adc_value(client));
}
-static DEVICE_ATTR(lux, S_IRUGO, isl29003_show_lux, NULL);
+static DEVICE_ATTR(illuminance0, S_IRUGO, isl29003_show_lux, NULL);
static struct attribute *isl29003_attributes[] = {
&dev_attr_range.attr,
&dev_attr_resolution.attr,
&dev_attr_mode.attr,
&dev_attr_power_state.attr,
- &dev_attr_lux.attr,
+ &dev_attr_illuminance0.attr,
NULL
};
@@ -388,14 +390,23 @@ static int __devinit isl29003_probe(struct i2c_client *client,
if (err)
goto exit_kfree;
+ data->classdev = als_device_register(&client->dev);
+ if (IS_ERR(data->classdev)) {
+ err = PTR_ERR(data->classdev);
+ goto exit_kfree;
+ }
+
/* register sysfs hooks */
- err = sysfs_create_group(&client->dev.kobj, &isl29003_attr_group);
+ err = sysfs_create_group(&data->classdev->kobj, &isl29003_attr_group);
if (err)
- goto exit_kfree;
+ goto exit_unreg;
dev_info(&client->dev, "driver version %s enabled\n", DRIVER_VERSION);
+
return 0;
+exit_unreg:
+ als_device_unregister(data->classdev);
exit_kfree:
kfree(data);
return err;
@@ -403,9 +414,13 @@ exit_kfree:
static int __devexit isl29003_remove(struct i2c_client *client)
{
- sysfs_remove_group(&client->dev.kobj, &isl29003_attr_group);
+ struct isl29003_data *data = i2c_get_clientdata(client);
+
+ sysfs_remove_group(&data->classdev->kobj, &isl29003_attr_group);
+ als_device_unregister(data->classdev);
isl29003_set_power_state(client, 0);
kfree(i2c_get_clientdata(client));
+
return 0;
}
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 2c16ca6..e5ffa20 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -223,16 +223,6 @@ config DELL_LAPTOP
This driver adds support for rfkill and backlight control to Dell
laptops.
-config ISL29003
- tristate "Intersil ISL29003 ambient light sensor"
- depends on I2C && SYSFS
- help
- If you say yes here you get support for the Intersil ISL29003
- ambient light sensor.
-
- This driver can also be built as a module. If so, the module
- will be called isl29003.
-
config EP93XX_PWM
tristate "EP93xx PWM support"
depends on ARCH_EP93XX
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 906a0ed..ab6e0af 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -18,7 +18,6 @@ obj-$(CONFIG_KGDB_TESTS) += kgdbts.o
obj-$(CONFIG_SGI_XP) += sgi-xp/
obj-$(CONFIG_SGI_GRU) += sgi-gru/
obj-$(CONFIG_HP_ILO) += hpilo.o
-obj-$(CONFIG_ISL29003) += isl29003.o
obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o
obj-$(CONFIG_DS1682) += ds1682.o
obj-$(CONFIG_C2PORT) += c2port/
--
1.6.4.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists