This source file includes following definitions.
- tsl2550_set_operating_mode
- tsl2550_set_power_state
- tsl2550_get_adc_value
- tsl2550_calculate_lux
- tsl2550_show_power_state
- tsl2550_store_power_state
- tsl2550_show_operating_mode
- tsl2550_store_operating_mode
- __tsl2550_show_lux
- tsl2550_show_lux1_input
- tsl2550_init_client
- tsl2550_probe
- tsl2550_remove
- tsl2550_suspend
- tsl2550_resume
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 #include <linux/module.h>
  10 #include <linux/slab.h>
  11 #include <linux/i2c.h>
  12 #include <linux/mutex.h>
  13 
  14 #define TSL2550_DRV_NAME        "tsl2550"
  15 #define DRIVER_VERSION          "1.2"
  16 
  17 
  18 
  19 
  20 
  21 #define TSL2550_POWER_DOWN              0x00
  22 #define TSL2550_POWER_UP                0x03
  23 #define TSL2550_STANDARD_RANGE          0x18
  24 #define TSL2550_EXTENDED_RANGE          0x1d
  25 #define TSL2550_READ_ADC0               0x43
  26 #define TSL2550_READ_ADC1               0x83
  27 
  28 
  29 
  30 
  31 
  32 struct tsl2550_data {
  33         struct i2c_client *client;
  34         struct mutex update_lock;
  35 
  36         unsigned int power_state:1;
  37         unsigned int operating_mode:1;
  38 };
  39 
  40 
  41 
  42 
  43 
  44 static const u8 TSL2550_MODE_RANGE[2] = {
  45         TSL2550_STANDARD_RANGE, TSL2550_EXTENDED_RANGE,
  46 };
  47 
  48 
  49 
  50 
  51 
  52 static int tsl2550_set_operating_mode(struct i2c_client *client, int mode)
  53 {
  54         struct tsl2550_data *data = i2c_get_clientdata(client);
  55 
  56         int ret = i2c_smbus_write_byte(client, TSL2550_MODE_RANGE[mode]);
  57 
  58         data->operating_mode = mode;
  59 
  60         return ret;
  61 }
  62 
  63 static int tsl2550_set_power_state(struct i2c_client *client, int state)
  64 {
  65         struct tsl2550_data *data = i2c_get_clientdata(client);
  66         int ret;
  67 
  68         if (state == 0)
  69                 ret = i2c_smbus_write_byte(client, TSL2550_POWER_DOWN);
  70         else {
  71                 ret = i2c_smbus_write_byte(client, TSL2550_POWER_UP);
  72 
  73                 
  74                 tsl2550_set_operating_mode(client, data->operating_mode);
  75         }
  76 
  77         data->power_state = state;
  78 
  79         return ret;
  80 }
  81 
  82 static int tsl2550_get_adc_value(struct i2c_client *client, u8 cmd)
  83 {
  84         int ret;
  85 
  86         ret = i2c_smbus_read_byte_data(client, cmd);
  87         if (ret < 0)
  88                 return ret;
  89         if (!(ret & 0x80))
  90                 return -EAGAIN;
  91         return ret & 0x7f;      
  92 }
  93 
  94 
  95 
  96 
  97 
  98 #define TSL2550_MAX_LUX         1846
  99 
 100 static const u8 ratio_lut[] = {
 101         100, 100, 100, 100, 100, 100, 100, 100,
 102         100, 100, 100, 100, 100, 100, 99, 99,
 103         99, 99, 99, 99, 99, 99, 99, 99,
 104         99, 99, 99, 98, 98, 98, 98, 98,
 105         98, 98, 97, 97, 97, 97, 97, 96,
 106         96, 96, 96, 95, 95, 95, 94, 94,
 107         93, 93, 93, 92, 92, 91, 91, 90,
 108         89, 89, 88, 87, 87, 86, 85, 84,
 109         83, 82, 81, 80, 79, 78, 77, 75,
 110         74, 73, 71, 69, 68, 66, 64, 62,
 111         60, 58, 56, 54, 52, 49, 47, 44,
 112         42, 41, 40, 40, 39, 39, 38, 38,
 113         37, 37, 37, 36, 36, 36, 35, 35,
 114         35, 35, 34, 34, 34, 34, 33, 33,
 115         33, 33, 32, 32, 32, 32, 32, 31,
 116         31, 31, 31, 31, 30, 30, 30, 30,
 117         30,
 118 };
 119 
 120 static const u16 count_lut[] = {
 121         0, 1, 2, 3, 4, 5, 6, 7,
 122         8, 9, 10, 11, 12, 13, 14, 15,
 123         16, 18, 20, 22, 24, 26, 28, 30,
 124         32, 34, 36, 38, 40, 42, 44, 46,
 125         49, 53, 57, 61, 65, 69, 73, 77,
 126         81, 85, 89, 93, 97, 101, 105, 109,
 127         115, 123, 131, 139, 147, 155, 163, 171,
 128         179, 187, 195, 203, 211, 219, 227, 235,
 129         247, 263, 279, 295, 311, 327, 343, 359,
 130         375, 391, 407, 423, 439, 455, 471, 487,
 131         511, 543, 575, 607, 639, 671, 703, 735,
 132         767, 799, 831, 863, 895, 927, 959, 991,
 133         1039, 1103, 1167, 1231, 1295, 1359, 1423, 1487,
 134         1551, 1615, 1679, 1743, 1807, 1871, 1935, 1999,
 135         2095, 2223, 2351, 2479, 2607, 2735, 2863, 2991,
 136         3119, 3247, 3375, 3503, 3631, 3759, 3887, 4015,
 137 };
 138 
 139 
 140 
 141 
 142 
 143 static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
 144 {
 145         unsigned int lux;
 146 
 147         
 148         u16 c0 = count_lut[ch0];
 149         u16 c1 = count_lut[ch1];
 150 
 151         
 152 
 153 
 154 
 155         u8 r = 128;
 156 
 157         
 158         if (c1 <= c0)
 159                 if (c0) {
 160                         r = c1 * 128 / c0;
 161 
 162                         
 163                         lux = ((c0 - c1) * ratio_lut[r]) / 256;
 164                 } else
 165                         lux = 0;
 166         else
 167                 return 0;
 168 
 169         
 170         return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
 171 }
 172 
 173 
 174 
 175 
 176 
 177 static ssize_t tsl2550_show_power_state(struct device *dev,
 178                 struct device_attribute *attr, char *buf)
 179 {
 180         struct tsl2550_data *data = i2c_get_clientdata(to_i2c_client(dev));
 181 
 182         return sprintf(buf, "%u\n", data->power_state);
 183 }
 184 
 185 static ssize_t tsl2550_store_power_state(struct device *dev,
 186                 struct device_attribute *attr, const char *buf, size_t count)
 187 {
 188         struct i2c_client *client = to_i2c_client(dev);
 189         struct tsl2550_data *data = i2c_get_clientdata(client);
 190         unsigned long val = simple_strtoul(buf, NULL, 10);
 191         int ret;
 192 
 193         if (val > 1)
 194                 return -EINVAL;
 195 
 196         mutex_lock(&data->update_lock);
 197         ret = tsl2550_set_power_state(client, val);
 198         mutex_unlock(&data->update_lock);
 199 
 200         if (ret < 0)
 201                 return ret;
 202 
 203         return count;
 204 }
 205 
 206 static DEVICE_ATTR(power_state, S_IWUSR | S_IRUGO,
 207                    tsl2550_show_power_state, tsl2550_store_power_state);
 208 
 209 static ssize_t tsl2550_show_operating_mode(struct device *dev,
 210                 struct device_attribute *attr, char *buf)
 211 {
 212         struct tsl2550_data *data = i2c_get_clientdata(to_i2c_client(dev));
 213 
 214         return sprintf(buf, "%u\n", data->operating_mode);
 215 }
 216 
 217 static ssize_t tsl2550_store_operating_mode(struct device *dev,
 218                 struct device_attribute *attr, const char *buf, size_t count)
 219 {
 220         struct i2c_client *client = to_i2c_client(dev);
 221         struct tsl2550_data *data = i2c_get_clientdata(client);
 222         unsigned long val = simple_strtoul(buf, NULL, 10);
 223         int ret;
 224 
 225         if (val > 1)
 226                 return -EINVAL;
 227 
 228         if (data->power_state == 0)
 229                 return -EBUSY;
 230 
 231         mutex_lock(&data->update_lock);
 232         ret = tsl2550_set_operating_mode(client, val);
 233         mutex_unlock(&data->update_lock);
 234 
 235         if (ret < 0)
 236                 return ret;
 237 
 238         return count;
 239 }
 240 
 241 static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO,
 242                    tsl2550_show_operating_mode, tsl2550_store_operating_mode);
 243 
 244 static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf)
 245 {
 246         struct tsl2550_data *data = i2c_get_clientdata(client);
 247         u8 ch0, ch1;
 248         int ret;
 249 
 250         ret = tsl2550_get_adc_value(client, TSL2550_READ_ADC0);
 251         if (ret < 0)
 252                 return ret;
 253         ch0 = ret;
 254 
 255         ret = tsl2550_get_adc_value(client, TSL2550_READ_ADC1);
 256         if (ret < 0)
 257                 return ret;
 258         ch1 = ret;
 259 
 260         
 261         ret = tsl2550_calculate_lux(ch0, ch1);
 262         if (ret < 0)
 263                 return ret;
 264         if (data->operating_mode == 1)
 265                 ret *= 5;
 266 
 267         return sprintf(buf, "%d\n", ret);
 268 }
 269 
 270 static ssize_t tsl2550_show_lux1_input(struct device *dev,
 271                         struct device_attribute *attr, char *buf)
 272 {
 273         struct i2c_client *client = to_i2c_client(dev);
 274         struct tsl2550_data *data = i2c_get_clientdata(client);
 275         int ret;
 276 
 277         
 278         if (!data->power_state)
 279                 return -EBUSY;
 280 
 281         mutex_lock(&data->update_lock);
 282         ret = __tsl2550_show_lux(client, buf);
 283         mutex_unlock(&data->update_lock);
 284 
 285         return ret;
 286 }
 287 
 288 static DEVICE_ATTR(lux1_input, S_IRUGO,
 289                    tsl2550_show_lux1_input, NULL);
 290 
 291 static struct attribute *tsl2550_attributes[] = {
 292         &dev_attr_power_state.attr,
 293         &dev_attr_operating_mode.attr,
 294         &dev_attr_lux1_input.attr,
 295         NULL
 296 };
 297 
 298 static const struct attribute_group tsl2550_attr_group = {
 299         .attrs = tsl2550_attributes,
 300 };
 301 
 302 
 303 
 304 
 305 
 306 static int tsl2550_init_client(struct i2c_client *client)
 307 {
 308         struct tsl2550_data *data = i2c_get_clientdata(client);
 309         int err;
 310 
 311         
 312 
 313 
 314 
 315         err = i2c_smbus_read_byte_data(client, TSL2550_POWER_UP);
 316         if (err < 0)
 317                 return err;
 318         if (err != TSL2550_POWER_UP)
 319                 return -ENODEV;
 320         data->power_state = 1;
 321 
 322         
 323         err = i2c_smbus_write_byte(client,
 324                                    TSL2550_MODE_RANGE[data->operating_mode]);
 325         if (err < 0)
 326                 return err;
 327 
 328         return 0;
 329 }
 330 
 331 
 332 
 333 
 334 
 335 static struct i2c_driver tsl2550_driver;
 336 static int tsl2550_probe(struct i2c_client *client,
 337                                    const struct i2c_device_id *id)
 338 {
 339         struct i2c_adapter *adapter = client->adapter;
 340         struct tsl2550_data *data;
 341         int *opmode, err = 0;
 342 
 343         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE
 344                                             | I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
 345                 err = -EIO;
 346                 goto exit;
 347         }
 348 
 349         data = kzalloc(sizeof(struct tsl2550_data), GFP_KERNEL);
 350         if (!data) {
 351                 err = -ENOMEM;
 352                 goto exit;
 353         }
 354         data->client = client;
 355         i2c_set_clientdata(client, data);
 356 
 357         
 358         opmode = client->dev.platform_data;
 359         if (opmode) {
 360                 if (*opmode < 0 || *opmode > 1) {
 361                         dev_err(&client->dev, "invalid operating_mode (%d)\n",
 362                                         *opmode);
 363                         err = -EINVAL;
 364                         goto exit_kfree;
 365                 }
 366                 data->operating_mode = *opmode;
 367         } else
 368                 data->operating_mode = 0;       
 369         dev_info(&client->dev, "%s operating mode\n",
 370                         data->operating_mode ? "extended" : "standard");
 371 
 372         mutex_init(&data->update_lock);
 373 
 374         
 375         err = tsl2550_init_client(client);
 376         if (err)
 377                 goto exit_kfree;
 378 
 379         
 380         err = sysfs_create_group(&client->dev.kobj, &tsl2550_attr_group);
 381         if (err)
 382                 goto exit_kfree;
 383 
 384         dev_info(&client->dev, "support ver. %s enabled\n", DRIVER_VERSION);
 385 
 386         return 0;
 387 
 388 exit_kfree:
 389         kfree(data);
 390 exit:
 391         return err;
 392 }
 393 
 394 static int tsl2550_remove(struct i2c_client *client)
 395 {
 396         sysfs_remove_group(&client->dev.kobj, &tsl2550_attr_group);
 397 
 398         
 399         tsl2550_set_power_state(client, 0);
 400 
 401         kfree(i2c_get_clientdata(client));
 402 
 403         return 0;
 404 }
 405 
 406 #ifdef CONFIG_PM_SLEEP
 407 
 408 static int tsl2550_suspend(struct device *dev)
 409 {
 410         return tsl2550_set_power_state(to_i2c_client(dev), 0);
 411 }
 412 
 413 static int tsl2550_resume(struct device *dev)
 414 {
 415         return tsl2550_set_power_state(to_i2c_client(dev), 1);
 416 }
 417 
 418 static SIMPLE_DEV_PM_OPS(tsl2550_pm_ops, tsl2550_suspend, tsl2550_resume);
 419 #define TSL2550_PM_OPS (&tsl2550_pm_ops)
 420 
 421 #else
 422 
 423 #define TSL2550_PM_OPS NULL
 424 
 425 #endif 
 426 
 427 static const struct i2c_device_id tsl2550_id[] = {
 428         { "tsl2550", 0 },
 429         { }
 430 };
 431 MODULE_DEVICE_TABLE(i2c, tsl2550_id);
 432 
 433 static const struct of_device_id tsl2550_of_match[] = {
 434         { .compatible = "taos,tsl2550" },
 435         { }
 436 };
 437 MODULE_DEVICE_TABLE(of, tsl2550_of_match);
 438 
 439 static struct i2c_driver tsl2550_driver = {
 440         .driver = {
 441                 .name   = TSL2550_DRV_NAME,
 442                 .of_match_table = tsl2550_of_match,
 443                 .pm     = TSL2550_PM_OPS,
 444         },
 445         .probe  = tsl2550_probe,
 446         .remove = tsl2550_remove,
 447         .id_table = tsl2550_id,
 448 };
 449 
 450 module_i2c_driver(tsl2550_driver);
 451 
 452 MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
 453 MODULE_DESCRIPTION("TSL2550 ambient light sensor driver");
 454 MODULE_LICENSE("GPL");
 455 MODULE_VERSION(DRIVER_VERSION);