1 // SPDX-License-Identifier: GPL-2.0-only
3 * TI/National Semiconductor LP3943 MFD Core Driver
5 * Copyright 2013 Texas Instruments
7 * Author: Milo Kim <milo.kim@ti.com>
10 * LP3943 is an integrated device capable of driving 16 output channels.
11 * It can be used for a GPIO expander and PWM generators.
13 * LED control General usage for a device
14 * ___________ ____________________________
16 * LP3943 MFD ---- GPIO expander leds-gpio eg) HW enable pin
18 * --- PWM generator leds-pwm eg) PWM input
20 * Internal two PWM channels are used for LED dimming effect.
21 * And each output pin can be used as a GPIO as well.
22 * The LED functionality can work with GPIOs or PWMs.
23 * LEDs can be controlled with legacy leds-gpio(static brightness) or
24 * leds-pwm drivers(dynamic brightness control).
25 * Alternatively, it can be used for generic GPIO and PWM controller.
26 * For example, a GPIO is HW enable pin of a device.
27 * A PWM is input pin of a backlight device.
30 #include <linux/err.h>
31 #include <linux/gpio.h>
32 #include <linux/i2c.h>
33 #include <linux/mfd/core.h>
34 #include <linux/mfd/lp3943.h>
35 #include <linux/module.h>
37 #include <linux/slab.h>
39 #define LP3943_MAX_REGISTERS 0x09
41 /* Register configuration for pin MUX */
42 static const struct lp3943_reg_cfg lp3943_mux_cfg
[] = {
43 /* address, mask, shift */
44 { LP3943_REG_MUX0
, 0x03, 0 },
45 { LP3943_REG_MUX0
, 0x0C, 2 },
46 { LP3943_REG_MUX0
, 0x30, 4 },
47 { LP3943_REG_MUX0
, 0xC0, 6 },
48 { LP3943_REG_MUX1
, 0x03, 0 },
49 { LP3943_REG_MUX1
, 0x0C, 2 },
50 { LP3943_REG_MUX1
, 0x30, 4 },
51 { LP3943_REG_MUX1
, 0xC0, 6 },
52 { LP3943_REG_MUX2
, 0x03, 0 },
53 { LP3943_REG_MUX2
, 0x0C, 2 },
54 { LP3943_REG_MUX2
, 0x30, 4 },
55 { LP3943_REG_MUX2
, 0xC0, 6 },
56 { LP3943_REG_MUX3
, 0x03, 0 },
57 { LP3943_REG_MUX3
, 0x0C, 2 },
58 { LP3943_REG_MUX3
, 0x30, 4 },
59 { LP3943_REG_MUX3
, 0xC0, 6 },
62 static const struct mfd_cell lp3943_devs
[] = {
65 .of_compatible
= "ti,lp3943-pwm",
68 .name
= "lp3943-gpio",
69 .of_compatible
= "ti,lp3943-gpio",
73 int lp3943_read_byte(struct lp3943
*lp3943
, u8 reg
, u8
*read
)
78 ret
= regmap_read(lp3943
->regmap
, reg
, &val
);
85 EXPORT_SYMBOL_GPL(lp3943_read_byte
);
87 int lp3943_write_byte(struct lp3943
*lp3943
, u8 reg
, u8 data
)
89 return regmap_write(lp3943
->regmap
, reg
, data
);
91 EXPORT_SYMBOL_GPL(lp3943_write_byte
);
93 int lp3943_update_bits(struct lp3943
*lp3943
, u8 reg
, u8 mask
, u8 data
)
95 return regmap_update_bits(lp3943
->regmap
, reg
, mask
, data
);
97 EXPORT_SYMBOL_GPL(lp3943_update_bits
);
99 static const struct regmap_config lp3943_regmap_config
= {
102 .max_register
= LP3943_MAX_REGISTERS
,
105 static int lp3943_probe(struct i2c_client
*cl
)
107 struct lp3943
*lp3943
;
108 struct device
*dev
= &cl
->dev
;
110 lp3943
= devm_kzalloc(dev
, sizeof(*lp3943
), GFP_KERNEL
);
114 lp3943
->regmap
= devm_regmap_init_i2c(cl
, &lp3943_regmap_config
);
115 if (IS_ERR(lp3943
->regmap
))
116 return PTR_ERR(lp3943
->regmap
);
118 lp3943
->pdata
= dev_get_platdata(dev
);
120 lp3943
->mux_cfg
= lp3943_mux_cfg
;
121 i2c_set_clientdata(cl
, lp3943
);
123 return devm_mfd_add_devices(dev
, -1, lp3943_devs
,
124 ARRAY_SIZE(lp3943_devs
),
128 static const struct i2c_device_id lp3943_ids
[] = {
132 MODULE_DEVICE_TABLE(i2c
, lp3943_ids
);
135 static const struct of_device_id lp3943_of_match
[] = {
136 { .compatible
= "ti,lp3943", },
139 MODULE_DEVICE_TABLE(of
, lp3943_of_match
);
142 static struct i2c_driver lp3943_driver
= {
143 .probe
= lp3943_probe
,
146 .of_match_table
= of_match_ptr(lp3943_of_match
),
148 .id_table
= lp3943_ids
,
151 module_i2c_driver(lp3943_driver
);
153 MODULE_DESCRIPTION("LP3943 MFD Core Driver");
154 MODULE_AUTHOR("Milo Kim");
155 MODULE_LICENSE("GPL");