diff options
author | Beomho Seo <beomho.seo@samsung.com> | 2014-12-09 07:03:51 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2015-01-22 10:55:47 -0500 |
commit | 0b271258544b3f89f9a14fa3b53e20ec9ce75392 (patch) | |
tree | 67dd466700c717574443f6c46e6e382c94581713 /drivers/mfd | |
parent | 52a98dcd3727dee2c75a0353b42b210570ee7911 (diff) |
mfd: rt5033: Add Richtek RT5033 driver core.
This patch adds a new driver for Richtek RT5033 driver.
RT5033 is a Multifunction device which includes battery charger, fuel gauge,
flash LED current source, LDO and synchronous Buck converter. It is interfaced
to host controller using I2C interface.
Signed-off-by: Beomho Seo <beomho.seo@samsung.com>
Acked-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/Kconfig | 12 | ||||
-rw-r--r-- | drivers/mfd/Makefile | 1 | ||||
-rw-r--r-- | drivers/mfd/rt5033.c | 142 |
3 files changed, 155 insertions, 0 deletions
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 2e6b7311fabc..9cd2af660cc5 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
@@ -623,6 +623,18 @@ config MFD_RTSX_PCI | |||
623 | types of memory cards, such as Memory Stick, Memory Stick Pro, | 623 | types of memory cards, such as Memory Stick, Memory Stick Pro, |
624 | Secure Digital and MultiMediaCard. | 624 | Secure Digital and MultiMediaCard. |
625 | 625 | ||
626 | config MFD_RT5033 | ||
627 | tristate "Richtek RT5033 Power Management IC" | ||
628 | depends on I2C=y | ||
629 | select MFD_CORE | ||
630 | select REGMAP_I2C | ||
631 | help | ||
632 | This driver provides for the Richtek RT5033 Power Management IC, | ||
633 | which includes the I2C driver and the Core APIs. This driver provides | ||
634 | common support for accessing the device. The device supports multiple | ||
635 | sub-devices like charger, fuel gauge, flash LED, current source, | ||
636 | LDO and Buck. | ||
637 | |||
626 | config MFD_RTSX_USB | 638 | config MFD_RTSX_USB |
627 | tristate "Realtek USB card reader" | 639 | tristate "Realtek USB card reader" |
628 | depends on USB | 640 | depends on USB |
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 53467e211381..4059c247c59a 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile | |||
@@ -176,6 +176,7 @@ obj-$(CONFIG_MFD_IPAQ_MICRO) += ipaq-micro.o | |||
176 | obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o | 176 | obj-$(CONFIG_MFD_MENF21BMC) += menf21bmc.o |
177 | obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o | 177 | obj-$(CONFIG_MFD_HI6421_PMIC) += hi6421-pmic-core.o |
178 | obj-$(CONFIG_MFD_DLN2) += dln2.o | 178 | obj-$(CONFIG_MFD_DLN2) += dln2.o |
179 | obj-$(CONFIG_MFD_RT5033) += rt5033.o | ||
179 | 180 | ||
180 | intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o | 181 | intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o |
181 | obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o | 182 | obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o |
diff --git a/drivers/mfd/rt5033.c b/drivers/mfd/rt5033.c new file mode 100644 index 000000000000..db395a6c52bc --- /dev/null +++ b/drivers/mfd/rt5033.c | |||
@@ -0,0 +1,142 @@ | |||
1 | /* | ||
2 | * MFD core driver for the Richtek RT5033. | ||
3 | * | ||
4 | * RT5033 comprises multiple sub-devices switcing charger, fuel gauge, | ||
5 | * flash LED, current source, LDO and BUCK regulators. | ||
6 | * | ||
7 | * Copyright (C) 2014 Samsung Electronics, Co., Ltd. | ||
8 | * Author: Beomho Seo <beomho.seo@samsung.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published bythe Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/err.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/of_device.h> | ||
19 | #include <linux/mfd/core.h> | ||
20 | #include <linux/mfd/rt5033.h> | ||
21 | #include <linux/mfd/rt5033-private.h> | ||
22 | |||
23 | static const struct regmap_irq rt5033_irqs[] = { | ||
24 | { .mask = RT5033_PMIC_IRQ_BUCKOCP, }, | ||
25 | { .mask = RT5033_PMIC_IRQ_BUCKLV, }, | ||
26 | { .mask = RT5033_PMIC_IRQ_SAFELDOLV, }, | ||
27 | { .mask = RT5033_PMIC_IRQ_LDOLV, }, | ||
28 | { .mask = RT5033_PMIC_IRQ_OT, }, | ||
29 | { .mask = RT5033_PMIC_IRQ_VDDA_UV, }, | ||
30 | }; | ||
31 | |||
32 | static const struct regmap_irq_chip rt5033_irq_chip = { | ||
33 | .name = "rt5033", | ||
34 | .status_base = RT5033_REG_PMIC_IRQ_STAT, | ||
35 | .mask_base = RT5033_REG_PMIC_IRQ_CTRL, | ||
36 | .mask_invert = true, | ||
37 | .num_regs = 1, | ||
38 | .irqs = rt5033_irqs, | ||
39 | .num_irqs = ARRAY_SIZE(rt5033_irqs), | ||
40 | }; | ||
41 | |||
42 | static const struct mfd_cell rt5033_devs[] = { | ||
43 | { .name = "rt5033-regulator", }, | ||
44 | { | ||
45 | .name = "rt5033-charger", | ||
46 | .of_compatible = "richtek,rt5033-charger", | ||
47 | }, { | ||
48 | .name = "rt5033-battery", | ||
49 | .of_compatible = "richtek,rt5033-battery", | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | static const struct regmap_config rt5033_regmap_config = { | ||
54 | .reg_bits = 8, | ||
55 | .val_bits = 8, | ||
56 | .max_register = RT5033_REG_END, | ||
57 | }; | ||
58 | |||
59 | static int rt5033_i2c_probe(struct i2c_client *i2c, | ||
60 | const struct i2c_device_id *id) | ||
61 | { | ||
62 | struct rt5033_dev *rt5033; | ||
63 | unsigned int dev_id; | ||
64 | int ret; | ||
65 | |||
66 | rt5033 = devm_kzalloc(&i2c->dev, sizeof(*rt5033), GFP_KERNEL); | ||
67 | if (!rt5033) | ||
68 | return -ENOMEM; | ||
69 | |||
70 | i2c_set_clientdata(i2c, rt5033); | ||
71 | rt5033->dev = &i2c->dev; | ||
72 | rt5033->irq = i2c->irq; | ||
73 | rt5033->wakeup = true; | ||
74 | |||
75 | rt5033->regmap = devm_regmap_init_i2c(i2c, &rt5033_regmap_config); | ||
76 | if (IS_ERR(rt5033->regmap)) { | ||
77 | dev_err(&i2c->dev, "Failed to allocate register map.\n"); | ||
78 | return PTR_ERR(rt5033->regmap); | ||
79 | } | ||
80 | |||
81 | ret = regmap_read(rt5033->regmap, RT5033_REG_DEVICE_ID, &dev_id); | ||
82 | if (ret) { | ||
83 | dev_err(&i2c->dev, "Device not found\n"); | ||
84 | return -ENODEV; | ||
85 | } | ||
86 | dev_info(&i2c->dev, "Device found Device ID: %04x\n", dev_id); | ||
87 | |||
88 | ret = regmap_add_irq_chip(rt5033->regmap, rt5033->irq, | ||
89 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | ||
90 | 0, &rt5033_irq_chip, &rt5033->irq_data); | ||
91 | if (ret) { | ||
92 | dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n", | ||
93 | rt5033->irq, ret); | ||
94 | return ret; | ||
95 | } | ||
96 | |||
97 | ret = mfd_add_devices(rt5033->dev, -1, rt5033_devs, | ||
98 | ARRAY_SIZE(rt5033_devs), NULL, 0, | ||
99 | regmap_irq_get_domain(rt5033->irq_data)); | ||
100 | if (ret < 0) { | ||
101 | dev_err(&i2c->dev, "Failed to add RT5033 child devices.\n"); | ||
102 | return ret; | ||
103 | } | ||
104 | |||
105 | device_init_wakeup(rt5033->dev, rt5033->wakeup); | ||
106 | |||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | static int rt5033_i2c_remove(struct i2c_client *i2c) | ||
111 | { | ||
112 | mfd_remove_devices(&i2c->dev); | ||
113 | |||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | static const struct i2c_device_id rt5033_i2c_id[] = { | ||
118 | { "rt5033", }, | ||
119 | { } | ||
120 | }; | ||
121 | MODULE_DEVICE_TABLE(i2c, rt5033_i2c_id); | ||
122 | |||
123 | static const struct of_device_id rt5033_dt_match[] = { | ||
124 | { .compatible = "richtek,rt5033", }, | ||
125 | { } | ||
126 | }; | ||
127 | |||
128 | static struct i2c_driver rt5033_driver = { | ||
129 | .driver = { | ||
130 | .name = "rt5033", | ||
131 | .of_match_table = of_match_ptr(rt5033_dt_match), | ||
132 | }, | ||
133 | .probe = rt5033_i2c_probe, | ||
134 | .remove = rt5033_i2c_remove, | ||
135 | .id_table = rt5033_i2c_id, | ||
136 | }; | ||
137 | module_i2c_driver(rt5033_driver); | ||
138 | |||
139 | MODULE_ALIAS("i2c:rt5033"); | ||
140 | MODULE_DESCRIPTION("Richtek RT5033 multi-function core driver"); | ||
141 | MODULE_AUTHOR("Beomho Seo <beomho.seo@samsung.com>"); | ||
142 | MODULE_LICENSE("GPL"); | ||