Blame view
drivers/mfd/da9063-core.c
4.78 KB
9efbc6f17 mfd: da9063: Conv... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
8e685483b mfd: da9063: Add ... |
2 |
/* |
9efbc6f17 mfd: da9063: Conv... |
3 |
* Device access for Dialog DA9063 modules |
8e685483b mfd: da9063: Add ... |
4 5 6 7 |
* * Copyright 2012 Dialog Semiconductors Ltd. * Copyright 2013 Philipp Zabel, Pengutronix * |
37778d83a mfd: da9063: Upda... |
8 9 |
* Author: Krystian Garbaciak, Dialog Semiconductor * Author: Michal Hajduk, Dialog Semiconductor |
8e685483b mfd: da9063: Add ... |
10 |
* |
8e685483b mfd: da9063: Add ... |
11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
*/ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/device.h> #include <linux/delay.h> #include <linux/interrupt.h> #include <linux/mutex.h> #include <linux/mfd/core.h> #include <linux/regmap.h> #include <linux/mfd/da9063/core.h> |
8e685483b mfd: da9063: Add ... |
25 26 27 28 29 |
#include <linux/mfd/da9063/registers.h> #include <linux/proc_fs.h> #include <linux/kthread.h> #include <linux/uaccess.h> |
a0e08b860 mfd: da9063: Add ... |
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
static struct resource da9063_regulators_resources[] = { { .name = "LDO_LIM", .start = DA9063_IRQ_LDO_LIM, .end = DA9063_IRQ_LDO_LIM, .flags = IORESOURCE_IRQ, }, }; static struct resource da9063_rtc_resources[] = { { .name = "ALARM", .start = DA9063_IRQ_ALARM, .end = DA9063_IRQ_ALARM, .flags = IORESOURCE_IRQ, }, { .name = "TICK", .start = DA9063_IRQ_TICK, .end = DA9063_IRQ_TICK, .flags = IORESOURCE_IRQ, } }; static struct resource da9063_onkey_resources[] = { { |
9011e4a8a mfd: da9063: Add ... |
56 |
.name = "ONKEY", |
a0e08b860 mfd: da9063: Add ... |
57 58 59 60 61 62 63 64 65 66 67 68 69 |
.start = DA9063_IRQ_ONKEY, .end = DA9063_IRQ_ONKEY, .flags = IORESOURCE_IRQ, }, }; static struct resource da9063_hwmon_resources[] = { { .start = DA9063_IRQ_ADC_RDY, .end = DA9063_IRQ_ADC_RDY, .flags = IORESOURCE_IRQ, }, }; |
c2ffec5e4 mfd: da9063: Regi... |
70 |
static const struct mfd_cell da9063_common_devs[] = { |
8e685483b mfd: da9063: Add ... |
71 72 |
{ .name = DA9063_DRVNAME_REGULATORS, |
a0e08b860 mfd: da9063: Add ... |
73 74 |
.num_resources = ARRAY_SIZE(da9063_regulators_resources), .resources = da9063_regulators_resources, |
8e685483b mfd: da9063: Add ... |
75 76 77 78 79 80 |
}, { .name = DA9063_DRVNAME_LEDS, }, { .name = DA9063_DRVNAME_WATCHDOG, |
71e03de46 mfd: da9063: Add ... |
81 |
.of_compatible = "dlg,da9063-watchdog", |
8e685483b mfd: da9063: Add ... |
82 83 84 |
}, { .name = DA9063_DRVNAME_HWMON, |
a0e08b860 mfd: da9063: Add ... |
85 86 |
.num_resources = ARRAY_SIZE(da9063_hwmon_resources), .resources = da9063_hwmon_resources, |
8e685483b mfd: da9063: Add ... |
87 88 89 |
}, { .name = DA9063_DRVNAME_ONKEY, |
a0e08b860 mfd: da9063: Add ... |
90 91 |
.num_resources = ARRAY_SIZE(da9063_onkey_resources), .resources = da9063_onkey_resources, |
9011e4a8a mfd: da9063: Add ... |
92 |
.of_compatible = "dlg,da9063-onkey", |
8e685483b mfd: da9063: Add ... |
93 94 |
}, { |
c2ffec5e4 mfd: da9063: Regi... |
95 96 97 98 99 100 101 |
.name = DA9063_DRVNAME_VIBRATION, }, }; /* Only present on DA9063 , not on DA9063L */ static const struct mfd_cell da9063_devs[] = { { |
8e685483b mfd: da9063: Add ... |
102 |
.name = DA9063_DRVNAME_RTC, |
a0e08b860 mfd: da9063: Add ... |
103 104 |
.num_resources = ARRAY_SIZE(da9063_rtc_resources), .resources = da9063_rtc_resources, |
71e03de46 mfd: da9063: Add ... |
105 |
.of_compatible = "dlg,da9063-rtc", |
8e685483b mfd: da9063: Add ... |
106 |
}, |
8e685483b mfd: da9063: Add ... |
107 |
}; |
9011e4a8a mfd: da9063: Add ... |
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
static int da9063_clear_fault_log(struct da9063 *da9063) { int ret = 0; int fault_log = 0; ret = regmap_read(da9063->regmap, DA9063_REG_FAULT_LOG, &fault_log); if (ret < 0) { dev_err(da9063->dev, "Cannot read FAULT_LOG. "); return -EIO; } if (fault_log) { if (fault_log & DA9063_TWD_ERROR) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_TWD_ERROR "); if (fault_log & DA9063_POR) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_POR "); if (fault_log & DA9063_VDD_FAULT) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_VDD_FAULT "); if (fault_log & DA9063_VDD_START) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_VDD_START "); if (fault_log & DA9063_TEMP_CRIT) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_TEMP_CRIT "); if (fault_log & DA9063_KEY_RESET) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_KEY_RESET "); if (fault_log & DA9063_NSHUTDOWN) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_NSHUTDOWN "); if (fault_log & DA9063_WAIT_SHUT) dev_dbg(da9063->dev, "Fault log entry detected: DA9063_WAIT_SHUT "); } ret = regmap_write(da9063->regmap, DA9063_REG_FAULT_LOG, fault_log); if (ret < 0) dev_err(da9063->dev, "Cannot reset FAULT_LOG values %d ", ret); return ret; } |
8e685483b mfd: da9063: Add ... |
165 166 |
int da9063_device_init(struct da9063 *da9063, unsigned int irq) { |
8e685483b mfd: da9063: Add ... |
167 |
int ret; |
9011e4a8a mfd: da9063: Add ... |
168 169 170 171 |
ret = da9063_clear_fault_log(da9063); if (ret < 0) dev_err(da9063->dev, "Cannot clear fault log "); |
c6b9605f5 mfd: da9063: Remo... |
172 173 |
da9063->flags = 0; da9063->irq_base = -1; |
8e685483b mfd: da9063: Add ... |
174 |
da9063->chip_irq = irq; |
a0e08b860 mfd: da9063: Add ... |
175 176 177 178 179 180 |
ret = da9063_irq_init(da9063); if (ret) { dev_err(da9063->dev, "Cannot initialize interrupts. "); return ret; } |
439b8bdda mfd: da9063: Get ... |
181 |
da9063->irq_base = regmap_irq_chip_get_base(da9063->regmap_irq); |
152bed762 mfd: da9063: Use ... |
182 |
ret = devm_mfd_add_devices(da9063->dev, PLATFORM_DEVID_NONE, |
c2ffec5e4 mfd: da9063: Regi... |
183 184 |
da9063_common_devs, ARRAY_SIZE(da9063_common_devs), |
152bed762 mfd: da9063: Use ... |
185 |
NULL, da9063->irq_base, NULL); |
c2ffec5e4 mfd: da9063: Regi... |
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
if (ret) { dev_err(da9063->dev, "Failed to add child devices "); return ret; } if (da9063->type == PMIC_TYPE_DA9063) { ret = devm_mfd_add_devices(da9063->dev, PLATFORM_DEVID_NONE, da9063_devs, ARRAY_SIZE(da9063_devs), NULL, da9063->irq_base, NULL); if (ret) { dev_err(da9063->dev, "Failed to add child devices "); return ret; } } |
8e685483b mfd: da9063: Add ... |
202 203 204 |
return ret; } |
8e685483b mfd: da9063: Add ... |
205 |
MODULE_DESCRIPTION("PMIC driver for Dialog DA9063"); |
37778d83a mfd: da9063: Upda... |
206 207 |
MODULE_AUTHOR("Krystian Garbaciak"); MODULE_AUTHOR("Michal Hajduk"); |
8e685483b mfd: da9063: Add ... |
208 |
MODULE_LICENSE("GPL"); |