leds-lp55xx: use lp55xx common init function - reset
[deliverable/linux.git] / drivers / leds / leds-lp55xx-common.c
CommitLineData
c93d08fa
MWK
1/*
2 * LP5521/LP5523/LP55231 Common Driver
3 *
4 * Copyright 2012 Texas Instruments
5 *
6 * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 * Derived from leds-lp5521.c, leds-lp5523.c
13 */
14
a85908dd 15#include <linux/delay.h>
c93d08fa
MWK
16#include <linux/i2c.h>
17#include <linux/leds.h>
18#include <linux/module.h>
19#include <linux/platform_data/leds-lp55xx.h>
20
21#include "leds-lp55xx-common.h"
22
48068d5d
MWK
23static void lp55xx_reset_device(struct lp55xx_chip *chip)
24{
25 struct lp55xx_device_config *cfg = chip->cfg;
26 u8 addr = cfg->reset.addr;
27 u8 val = cfg->reset.val;
28
29 /* no error checking here because no ACK from the device after reset */
30 lp55xx_write(chip, addr, val);
31}
32
c93d08fa
MWK
33int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val)
34{
35 return i2c_smbus_write_byte_data(chip->cl, reg, val);
36}
37EXPORT_SYMBOL_GPL(lp55xx_write);
38
39int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val)
40{
41 s32 ret;
42
43 ret = i2c_smbus_read_byte_data(chip->cl, reg);
44 if (ret < 0)
45 return ret;
46
47 *val = ret;
48 return 0;
49}
50EXPORT_SYMBOL_GPL(lp55xx_read);
51
52int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg, u8 mask, u8 val)
53{
54 int ret;
55 u8 tmp;
56
57 ret = lp55xx_read(chip, reg, &tmp);
58 if (ret)
59 return ret;
60
61 tmp &= ~mask;
62 tmp |= val & mask;
63
64 return lp55xx_write(chip, reg, tmp);
65}
66EXPORT_SYMBOL_GPL(lp55xx_update_bits);
67
a85908dd
MWK
68int lp55xx_init_device(struct lp55xx_chip *chip)
69{
70 struct lp55xx_platform_data *pdata;
48068d5d 71 struct lp55xx_device_config *cfg;
a85908dd
MWK
72 struct device *dev = &chip->cl->dev;
73 int ret = 0;
74
75 WARN_ON(!chip);
76
77 pdata = chip->pdata;
48068d5d 78 cfg = chip->cfg;
a85908dd 79
48068d5d 80 if (!pdata || !cfg)
a85908dd
MWK
81 return -EINVAL;
82
83 if (pdata->setup_resources) {
84 ret = pdata->setup_resources();
85 if (ret < 0) {
86 dev_err(dev, "setup resoure err: %d\n", ret);
87 goto err;
88 }
89 }
90
91 if (pdata->enable) {
92 pdata->enable(0);
93 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
94 pdata->enable(1);
95 usleep_range(1000, 2000); /* 500us abs min. */
96 }
97
48068d5d
MWK
98 lp55xx_reset_device(chip);
99
100 /*
101 * Exact value is not available. 10 - 20ms
102 * appears to be enough for reset.
103 */
104 usleep_range(10000, 20000);
105
a85908dd
MWK
106err:
107 return ret;
108}
109EXPORT_SYMBOL_GPL(lp55xx_init_device);
110
c93d08fa
MWK
111MODULE_AUTHOR("Milo Kim <milo.kim@ti.com>");
112MODULE_DESCRIPTION("LP55xx Common Driver");
113MODULE_LICENSE("GPL");
This page took 0.080214 seconds and 5 git commands to generate.