root/drivers/video/backlight/lm3630a_bl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lm3630a_read
  2. lm3630a_write
  3. lm3630a_update
  4. lm3630a_chip_init
  5. lm3630a_delayed_func
  6. lm3630a_isr_func
  7. lm3630a_intr_config
  8. lm3630a_pwm_ctrl
  9. lm3630a_bank_a_update_status
  10. lm3630a_bank_a_get_brightness
  11. lm3630a_bank_b_update_status
  12. lm3630a_bank_b_get_brightness
  13. lm3630a_backlight_register
  14. lm3630a_parse_led_sources
  15. lm3630a_parse_bank
  16. lm3630a_parse_node
  17. lm3630a_probe
  18. lm3630a_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3 * Simple driver for Texas Instruments LM3630A Backlight driver chip
   4 * Copyright (C) 2012 Texas Instruments
   5 */
   6 #include <linux/module.h>
   7 #include <linux/slab.h>
   8 #include <linux/i2c.h>
   9 #include <linux/backlight.h>
  10 #include <linux/err.h>
  11 #include <linux/delay.h>
  12 #include <linux/uaccess.h>
  13 #include <linux/interrupt.h>
  14 #include <linux/regmap.h>
  15 #include <linux/pwm.h>
  16 #include <linux/platform_data/lm3630a_bl.h>
  17 
  18 #define REG_CTRL        0x00
  19 #define REG_BOOST       0x02
  20 #define REG_CONFIG      0x01
  21 #define REG_BRT_A       0x03
  22 #define REG_BRT_B       0x04
  23 #define REG_I_A         0x05
  24 #define REG_I_B         0x06
  25 #define REG_INT_STATUS  0x09
  26 #define REG_INT_EN      0x0A
  27 #define REG_FAULT       0x0B
  28 #define REG_PWM_OUTLOW  0x12
  29 #define REG_PWM_OUTHIGH 0x13
  30 #define REG_FILTER_STRENGTH     0x50
  31 #define REG_MAX         0x50
  32 
  33 #define INT_DEBOUNCE_MSEC       10
  34 
  35 #define LM3630A_BANK_0          0
  36 #define LM3630A_BANK_1          1
  37 
  38 #define LM3630A_NUM_SINKS       2
  39 #define LM3630A_SINK_0          0
  40 #define LM3630A_SINK_1          1
  41 
  42 struct lm3630a_chip {
  43         struct device *dev;
  44         struct delayed_work work;
  45 
  46         int irq;
  47         struct workqueue_struct *irqthread;
  48         struct lm3630a_platform_data *pdata;
  49         struct backlight_device *bleda;
  50         struct backlight_device *bledb;
  51         struct regmap *regmap;
  52         struct pwm_device *pwmd;
  53 };
  54 
  55 /* i2c access */
  56 static int lm3630a_read(struct lm3630a_chip *pchip, unsigned int reg)
  57 {
  58         int rval;
  59         unsigned int reg_val;
  60 
  61         rval = regmap_read(pchip->regmap, reg, &reg_val);
  62         if (rval < 0)
  63                 return rval;
  64         return reg_val & 0xFF;
  65 }
  66 
  67 static int lm3630a_write(struct lm3630a_chip *pchip,
  68                          unsigned int reg, unsigned int data)
  69 {
  70         return regmap_write(pchip->regmap, reg, data);
  71 }
  72 
  73 static int lm3630a_update(struct lm3630a_chip *pchip,
  74                           unsigned int reg, unsigned int mask,
  75                           unsigned int data)
  76 {
  77         return regmap_update_bits(pchip->regmap, reg, mask, data);
  78 }
  79 
  80 /* initialize chip */
  81 static int lm3630a_chip_init(struct lm3630a_chip *pchip)
  82 {
  83         int rval;
  84         struct lm3630a_platform_data *pdata = pchip->pdata;
  85 
  86         usleep_range(1000, 2000);
  87         /* set Filter Strength Register */
  88         rval = lm3630a_write(pchip, REG_FILTER_STRENGTH, 0x03);
  89         /* set Cofig. register */
  90         rval |= lm3630a_update(pchip, REG_CONFIG, 0x07, pdata->pwm_ctrl);
  91         /* set boost control */
  92         rval |= lm3630a_write(pchip, REG_BOOST, 0x38);
  93         /* set current A */
  94         rval |= lm3630a_update(pchip, REG_I_A, 0x1F, 0x1F);
  95         /* set current B */
  96         rval |= lm3630a_write(pchip, REG_I_B, 0x1F);
  97         /* set control */
  98         rval |= lm3630a_update(pchip, REG_CTRL, 0x14, pdata->leda_ctrl);
  99         rval |= lm3630a_update(pchip, REG_CTRL, 0x0B, pdata->ledb_ctrl);
 100         usleep_range(1000, 2000);
 101         /* set brightness A and B */
 102         rval |= lm3630a_write(pchip, REG_BRT_A, pdata->leda_init_brt);
 103         rval |= lm3630a_write(pchip, REG_BRT_B, pdata->ledb_init_brt);
 104 
 105         if (rval < 0)
 106                 dev_err(pchip->dev, "i2c failed to access register\n");
 107         return rval;
 108 }
 109 
 110 /* interrupt handling */
 111 static void lm3630a_delayed_func(struct work_struct *work)
 112 {
 113         int rval;
 114         struct lm3630a_chip *pchip;
 115 
 116         pchip = container_of(work, struct lm3630a_chip, work.work);
 117 
 118         rval = lm3630a_read(pchip, REG_INT_STATUS);
 119         if (rval < 0) {
 120                 dev_err(pchip->dev,
 121                         "i2c failed to access REG_INT_STATUS Register\n");
 122                 return;
 123         }
 124 
 125         dev_info(pchip->dev, "REG_INT_STATUS Register is 0x%x\n", rval);
 126 }
 127 
 128 static irqreturn_t lm3630a_isr_func(int irq, void *chip)
 129 {
 130         int rval;
 131         struct lm3630a_chip *pchip = chip;
 132         unsigned long delay = msecs_to_jiffies(INT_DEBOUNCE_MSEC);
 133 
 134         queue_delayed_work(pchip->irqthread, &pchip->work, delay);
 135 
 136         rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
 137         if (rval < 0) {
 138                 dev_err(pchip->dev, "i2c failed to access register\n");
 139                 return IRQ_NONE;
 140         }
 141         return IRQ_HANDLED;
 142 }
 143 
 144 static int lm3630a_intr_config(struct lm3630a_chip *pchip)
 145 {
 146         int rval;
 147 
 148         rval = lm3630a_write(pchip, REG_INT_EN, 0x87);
 149         if (rval < 0)
 150                 return rval;
 151 
 152         INIT_DELAYED_WORK(&pchip->work, lm3630a_delayed_func);
 153         pchip->irqthread = create_singlethread_workqueue("lm3630a-irqthd");
 154         if (!pchip->irqthread) {
 155                 dev_err(pchip->dev, "create irq thread fail\n");
 156                 return -ENOMEM;
 157         }
 158         if (request_threaded_irq
 159             (pchip->irq, NULL, lm3630a_isr_func,
 160              IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "lm3630a_irq", pchip)) {
 161                 dev_err(pchip->dev, "request threaded irq fail\n");
 162                 destroy_workqueue(pchip->irqthread);
 163                 return -ENOMEM;
 164         }
 165         return rval;
 166 }
 167 
 168 static void lm3630a_pwm_ctrl(struct lm3630a_chip *pchip, int br, int br_max)
 169 {
 170         unsigned int period = pchip->pdata->pwm_period;
 171         unsigned int duty = br * period / br_max;
 172 
 173         pwm_config(pchip->pwmd, duty, period);
 174         if (duty)
 175                 pwm_enable(pchip->pwmd);
 176         else
 177                 pwm_disable(pchip->pwmd);
 178 }
 179 
 180 /* update and get brightness */
 181 static int lm3630a_bank_a_update_status(struct backlight_device *bl)
 182 {
 183         int ret;
 184         struct lm3630a_chip *pchip = bl_get_data(bl);
 185         enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl;
 186 
 187         /* pwm control */
 188         if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) {
 189                 lm3630a_pwm_ctrl(pchip, bl->props.brightness,
 190                                  bl->props.max_brightness);
 191                 return bl->props.brightness;
 192         }
 193 
 194         /* disable sleep */
 195         ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
 196         if (ret < 0)
 197                 goto out_i2c_err;
 198         usleep_range(1000, 2000);
 199         /* minimum brightness is 0x04 */
 200         ret = lm3630a_write(pchip, REG_BRT_A, bl->props.brightness);
 201         if (bl->props.brightness < 0x4)
 202                 ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDA_ENABLE, 0);
 203         else
 204                 ret |= lm3630a_update(pchip, REG_CTRL,
 205                                       LM3630A_LEDA_ENABLE, LM3630A_LEDA_ENABLE);
 206         if (ret < 0)
 207                 goto out_i2c_err;
 208         return 0;
 209 
 210 out_i2c_err:
 211         dev_err(pchip->dev, "i2c failed to access\n");
 212         return bl->props.brightness;
 213 }
 214 
 215 static int lm3630a_bank_a_get_brightness(struct backlight_device *bl)
 216 {
 217         int brightness, rval;
 218         struct lm3630a_chip *pchip = bl_get_data(bl);
 219         enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl;
 220 
 221         if ((pwm_ctrl & LM3630A_PWM_BANK_A) != 0) {
 222                 rval = lm3630a_read(pchip, REG_PWM_OUTHIGH);
 223                 if (rval < 0)
 224                         goto out_i2c_err;
 225                 brightness = (rval & 0x01) << 8;
 226                 rval = lm3630a_read(pchip, REG_PWM_OUTLOW);
 227                 if (rval < 0)
 228                         goto out_i2c_err;
 229                 brightness |= rval;
 230                 goto out;
 231         }
 232 
 233         /* disable sleep */
 234         rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
 235         if (rval < 0)
 236                 goto out_i2c_err;
 237         usleep_range(1000, 2000);
 238         rval = lm3630a_read(pchip, REG_BRT_A);
 239         if (rval < 0)
 240                 goto out_i2c_err;
 241         brightness = rval;
 242 
 243 out:
 244         bl->props.brightness = brightness;
 245         return bl->props.brightness;
 246 out_i2c_err:
 247         dev_err(pchip->dev, "i2c failed to access register\n");
 248         return 0;
 249 }
 250 
 251 static const struct backlight_ops lm3630a_bank_a_ops = {
 252         .options = BL_CORE_SUSPENDRESUME,
 253         .update_status = lm3630a_bank_a_update_status,
 254         .get_brightness = lm3630a_bank_a_get_brightness,
 255 };
 256 
 257 /* update and get brightness */
 258 static int lm3630a_bank_b_update_status(struct backlight_device *bl)
 259 {
 260         int ret;
 261         struct lm3630a_chip *pchip = bl_get_data(bl);
 262         enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl;
 263 
 264         /* pwm control */
 265         if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) {
 266                 lm3630a_pwm_ctrl(pchip, bl->props.brightness,
 267                                  bl->props.max_brightness);
 268                 return bl->props.brightness;
 269         }
 270 
 271         /* disable sleep */
 272         ret = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
 273         if (ret < 0)
 274                 goto out_i2c_err;
 275         usleep_range(1000, 2000);
 276         /* minimum brightness is 0x04 */
 277         ret = lm3630a_write(pchip, REG_BRT_B, bl->props.brightness);
 278         if (bl->props.brightness < 0x4)
 279                 ret |= lm3630a_update(pchip, REG_CTRL, LM3630A_LEDB_ENABLE, 0);
 280         else
 281                 ret |= lm3630a_update(pchip, REG_CTRL,
 282                                       LM3630A_LEDB_ENABLE, LM3630A_LEDB_ENABLE);
 283         if (ret < 0)
 284                 goto out_i2c_err;
 285         return 0;
 286 
 287 out_i2c_err:
 288         dev_err(pchip->dev, "i2c failed to access REG_CTRL\n");
 289         return bl->props.brightness;
 290 }
 291 
 292 static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)
 293 {
 294         int brightness, rval;
 295         struct lm3630a_chip *pchip = bl_get_data(bl);
 296         enum lm3630a_pwm_ctrl pwm_ctrl = pchip->pdata->pwm_ctrl;
 297 
 298         if ((pwm_ctrl & LM3630A_PWM_BANK_B) != 0) {
 299                 rval = lm3630a_read(pchip, REG_PWM_OUTHIGH);
 300                 if (rval < 0)
 301                         goto out_i2c_err;
 302                 brightness = (rval & 0x01) << 8;
 303                 rval = lm3630a_read(pchip, REG_PWM_OUTLOW);
 304                 if (rval < 0)
 305                         goto out_i2c_err;
 306                 brightness |= rval;
 307                 goto out;
 308         }
 309 
 310         /* disable sleep */
 311         rval = lm3630a_update(pchip, REG_CTRL, 0x80, 0x00);
 312         if (rval < 0)
 313                 goto out_i2c_err;
 314         usleep_range(1000, 2000);
 315         rval = lm3630a_read(pchip, REG_BRT_B);
 316         if (rval < 0)
 317                 goto out_i2c_err;
 318         brightness = rval;
 319 
 320 out:
 321         bl->props.brightness = brightness;
 322         return bl->props.brightness;
 323 out_i2c_err:
 324         dev_err(pchip->dev, "i2c failed to access register\n");
 325         return 0;
 326 }
 327 
 328 static const struct backlight_ops lm3630a_bank_b_ops = {
 329         .options = BL_CORE_SUSPENDRESUME,
 330         .update_status = lm3630a_bank_b_update_status,
 331         .get_brightness = lm3630a_bank_b_get_brightness,
 332 };
 333 
 334 static int lm3630a_backlight_register(struct lm3630a_chip *pchip)
 335 {
 336         struct lm3630a_platform_data *pdata = pchip->pdata;
 337         struct backlight_properties props;
 338         const char *label;
 339 
 340         props.type = BACKLIGHT_RAW;
 341         if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) {
 342                 props.brightness = pdata->leda_init_brt;
 343                 props.max_brightness = pdata->leda_max_brt;
 344                 label = pdata->leda_label ? pdata->leda_label : "lm3630a_leda";
 345                 pchip->bleda =
 346                     devm_backlight_device_register(pchip->dev, label,
 347                                                    pchip->dev, pchip,
 348                                                    &lm3630a_bank_a_ops, &props);
 349                 if (IS_ERR(pchip->bleda))
 350                         return PTR_ERR(pchip->bleda);
 351         }
 352 
 353         if ((pdata->ledb_ctrl != LM3630A_LEDB_DISABLE) &&
 354             (pdata->ledb_ctrl != LM3630A_LEDB_ON_A)) {
 355                 props.brightness = pdata->ledb_init_brt;
 356                 props.max_brightness = pdata->ledb_max_brt;
 357                 label = pdata->ledb_label ? pdata->ledb_label : "lm3630a_ledb";
 358                 pchip->bledb =
 359                     devm_backlight_device_register(pchip->dev, label,
 360                                                    pchip->dev, pchip,
 361                                                    &lm3630a_bank_b_ops, &props);
 362                 if (IS_ERR(pchip->bledb))
 363                         return PTR_ERR(pchip->bledb);
 364         }
 365         return 0;
 366 }
 367 
 368 static const struct regmap_config lm3630a_regmap = {
 369         .reg_bits = 8,
 370         .val_bits = 8,
 371         .max_register = REG_MAX,
 372 };
 373 
 374 static int lm3630a_parse_led_sources(struct fwnode_handle *node,
 375                                      int default_led_sources)
 376 {
 377         u32 sources[LM3630A_NUM_SINKS];
 378         int ret, num_sources, i;
 379 
 380         num_sources = fwnode_property_count_u32(node, "led-sources");
 381         if (num_sources < 0)
 382                 return default_led_sources;
 383         else if (num_sources > ARRAY_SIZE(sources))
 384                 return -EINVAL;
 385 
 386         ret = fwnode_property_read_u32_array(node, "led-sources", sources,
 387                                              num_sources);
 388         if (ret)
 389                 return ret;
 390 
 391         for (i = 0; i < num_sources; i++) {
 392                 if (sources[i] < LM3630A_SINK_0 || sources[i] > LM3630A_SINK_1)
 393                         return -EINVAL;
 394 
 395                 ret |= BIT(sources[i]);
 396         }
 397 
 398         return ret;
 399 }
 400 
 401 static int lm3630a_parse_bank(struct lm3630a_platform_data *pdata,
 402                               struct fwnode_handle *node, int *seen_led_sources)
 403 {
 404         int led_sources, ret;
 405         const char *label;
 406         u32 bank, val;
 407         bool linear;
 408 
 409         ret = fwnode_property_read_u32(node, "reg", &bank);
 410         if (ret)
 411                 return ret;
 412 
 413         if (bank < LM3630A_BANK_0 || bank > LM3630A_BANK_1)
 414                 return -EINVAL;
 415 
 416         led_sources = lm3630a_parse_led_sources(node, BIT(bank));
 417         if (led_sources < 0)
 418                 return led_sources;
 419 
 420         if (*seen_led_sources & led_sources)
 421                 return -EINVAL;
 422 
 423         *seen_led_sources |= led_sources;
 424 
 425         linear = fwnode_property_read_bool(node,
 426                                            "ti,linear-mapping-mode");
 427         if (bank) {
 428                 if (led_sources & BIT(LM3630A_SINK_0) ||
 429                     !(led_sources & BIT(LM3630A_SINK_1)))
 430                         return -EINVAL;
 431 
 432                 pdata->ledb_ctrl = linear ?
 433                         LM3630A_LEDB_ENABLE_LINEAR :
 434                         LM3630A_LEDB_ENABLE;
 435         } else {
 436                 if (!(led_sources & BIT(LM3630A_SINK_0)))
 437                         return -EINVAL;
 438 
 439                 pdata->leda_ctrl = linear ?
 440                         LM3630A_LEDA_ENABLE_LINEAR :
 441                         LM3630A_LEDA_ENABLE;
 442 
 443                 if (led_sources & BIT(LM3630A_SINK_1))
 444                         pdata->ledb_ctrl = LM3630A_LEDB_ON_A;
 445         }
 446 
 447         ret = fwnode_property_read_string(node, "label", &label);
 448         if (!ret) {
 449                 if (bank)
 450                         pdata->ledb_label = label;
 451                 else
 452                         pdata->leda_label = label;
 453         }
 454 
 455         ret = fwnode_property_read_u32(node, "default-brightness",
 456                                        &val);
 457         if (!ret) {
 458                 if (bank)
 459                         pdata->ledb_init_brt = val;
 460                 else
 461                         pdata->leda_init_brt = val;
 462         }
 463 
 464         ret = fwnode_property_read_u32(node, "max-brightness", &val);
 465         if (!ret) {
 466                 if (bank)
 467                         pdata->ledb_max_brt = val;
 468                 else
 469                         pdata->leda_max_brt = val;
 470         }
 471 
 472         return 0;
 473 }
 474 
 475 static int lm3630a_parse_node(struct lm3630a_chip *pchip,
 476                               struct lm3630a_platform_data *pdata)
 477 {
 478         int ret = -ENODEV, seen_led_sources = 0;
 479         struct fwnode_handle *node;
 480 
 481         device_for_each_child_node(pchip->dev, node) {
 482                 ret = lm3630a_parse_bank(pdata, node, &seen_led_sources);
 483                 if (ret)
 484                         return ret;
 485         }
 486 
 487         return ret;
 488 }
 489 
 490 static int lm3630a_probe(struct i2c_client *client,
 491                          const struct i2c_device_id *id)
 492 {
 493         struct lm3630a_platform_data *pdata = dev_get_platdata(&client->dev);
 494         struct lm3630a_chip *pchip;
 495         int rval;
 496 
 497         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
 498                 dev_err(&client->dev, "fail : i2c functionality check\n");
 499                 return -EOPNOTSUPP;
 500         }
 501 
 502         pchip = devm_kzalloc(&client->dev, sizeof(struct lm3630a_chip),
 503                              GFP_KERNEL);
 504         if (!pchip)
 505                 return -ENOMEM;
 506         pchip->dev = &client->dev;
 507 
 508         pchip->regmap = devm_regmap_init_i2c(client, &lm3630a_regmap);
 509         if (IS_ERR(pchip->regmap)) {
 510                 rval = PTR_ERR(pchip->regmap);
 511                 dev_err(&client->dev, "fail : allocate reg. map: %d\n", rval);
 512                 return rval;
 513         }
 514 
 515         i2c_set_clientdata(client, pchip);
 516         if (pdata == NULL) {
 517                 pdata = devm_kzalloc(pchip->dev,
 518                                      sizeof(struct lm3630a_platform_data),
 519                                      GFP_KERNEL);
 520                 if (pdata == NULL)
 521                         return -ENOMEM;
 522 
 523                 /* default values */
 524                 pdata->leda_max_brt = LM3630A_MAX_BRIGHTNESS;
 525                 pdata->ledb_max_brt = LM3630A_MAX_BRIGHTNESS;
 526                 pdata->leda_init_brt = LM3630A_MAX_BRIGHTNESS;
 527                 pdata->ledb_init_brt = LM3630A_MAX_BRIGHTNESS;
 528 
 529                 rval = lm3630a_parse_node(pchip, pdata);
 530                 if (rval) {
 531                         dev_err(&client->dev, "fail : parse node\n");
 532                         return rval;
 533                 }
 534         }
 535         pchip->pdata = pdata;
 536 
 537         /* chip initialize */
 538         rval = lm3630a_chip_init(pchip);
 539         if (rval < 0) {
 540                 dev_err(&client->dev, "fail : init chip\n");
 541                 return rval;
 542         }
 543         /* backlight register */
 544         rval = lm3630a_backlight_register(pchip);
 545         if (rval < 0) {
 546                 dev_err(&client->dev, "fail : backlight register.\n");
 547                 return rval;
 548         }
 549         /* pwm */
 550         if (pdata->pwm_ctrl != LM3630A_PWM_DISABLE) {
 551                 pchip->pwmd = devm_pwm_get(pchip->dev, "lm3630a-pwm");
 552                 if (IS_ERR(pchip->pwmd)) {
 553                         dev_err(&client->dev, "fail : get pwm device\n");
 554                         return PTR_ERR(pchip->pwmd);
 555                 }
 556 
 557                 /*
 558                  * FIXME: pwm_apply_args() should be removed when switching to
 559                  * the atomic PWM API.
 560                  */
 561                 pwm_apply_args(pchip->pwmd);
 562         }
 563 
 564         /* interrupt enable  : irq 0 is not allowed */
 565         pchip->irq = client->irq;
 566         if (pchip->irq) {
 567                 rval = lm3630a_intr_config(pchip);
 568                 if (rval < 0)
 569                         return rval;
 570         }
 571         dev_info(&client->dev, "LM3630A backlight register OK.\n");
 572         return 0;
 573 }
 574 
 575 static int lm3630a_remove(struct i2c_client *client)
 576 {
 577         int rval;
 578         struct lm3630a_chip *pchip = i2c_get_clientdata(client);
 579 
 580         rval = lm3630a_write(pchip, REG_BRT_A, 0);
 581         if (rval < 0)
 582                 dev_err(pchip->dev, "i2c failed to access register\n");
 583 
 584         rval = lm3630a_write(pchip, REG_BRT_B, 0);
 585         if (rval < 0)
 586                 dev_err(pchip->dev, "i2c failed to access register\n");
 587 
 588         if (pchip->irq) {
 589                 free_irq(pchip->irq, pchip);
 590                 flush_workqueue(pchip->irqthread);
 591                 destroy_workqueue(pchip->irqthread);
 592         }
 593         return 0;
 594 }
 595 
 596 static const struct i2c_device_id lm3630a_id[] = {
 597         {LM3630A_NAME, 0},
 598         {}
 599 };
 600 
 601 static const struct of_device_id lm3630a_match_table[] = {
 602         { .compatible = "ti,lm3630a", },
 603         { },
 604 };
 605 
 606 MODULE_DEVICE_TABLE(i2c, lm3630a_id);
 607 
 608 static struct i2c_driver lm3630a_i2c_driver = {
 609         .driver = {
 610                    .name = LM3630A_NAME,
 611                    .of_match_table = lm3630a_match_table,
 612                    },
 613         .probe = lm3630a_probe,
 614         .remove = lm3630a_remove,
 615         .id_table = lm3630a_id,
 616 };
 617 
 618 module_i2c_driver(lm3630a_i2c_driver);
 619 
 620 MODULE_DESCRIPTION("Texas Instruments Backlight driver for LM3630A");
 621 MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>");
 622 MODULE_AUTHOR("LDD MLP <ldd-mlp@list.ti.com>");
 623 MODULE_LICENSE("GPL v2");

/* [<][>][^][v][top][bottom][index][help] */