Blame view

drivers/mfd/da9063-core.c 4.78 KB
9efbc6f17   Wolfram Sang   mfd: da9063: Conv...
1
  // SPDX-License-Identifier: GPL-2.0+
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
2
  /*
9efbc6f17   Wolfram Sang   mfd: da9063: Conv...
3
   * Device access for Dialog DA9063 modules
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
4
5
6
7
   *
   * Copyright 2012 Dialog Semiconductors Ltd.
   * Copyright 2013 Philipp Zabel, Pengutronix
   *
37778d83a   Steve Twiss   mfd: da9063: Upda...
8
9
   * Author: Krystian Garbaciak, Dialog Semiconductor
   * Author: Michal Hajduk, Dialog Semiconductor
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
10
   *
8e685483b   Krystian Garbaciak   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   Krystian Garbaciak   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   Krystian Garbaciak   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   Steve Twiss   mfd: da9063: Add ...
56
  		.name	= "ONKEY",
a0e08b860   Krystian Garbaciak   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   Marek Vasut   mfd: da9063: Regi...
70
  static const struct mfd_cell da9063_common_devs[] = {
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
71
72
  	{
  		.name		= DA9063_DRVNAME_REGULATORS,
a0e08b860   Krystian Garbaciak   mfd: da9063: Add ...
73
74
  		.num_resources	= ARRAY_SIZE(da9063_regulators_resources),
  		.resources	= da9063_regulators_resources,
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
75
76
77
78
79
80
  	},
  	{
  		.name		= DA9063_DRVNAME_LEDS,
  	},
  	{
  		.name		= DA9063_DRVNAME_WATCHDOG,
71e03de46   Steve Twiss   mfd: da9063: Add ...
81
  		.of_compatible	= "dlg,da9063-watchdog",
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
82
83
84
  	},
  	{
  		.name		= DA9063_DRVNAME_HWMON,
a0e08b860   Krystian Garbaciak   mfd: da9063: Add ...
85
86
  		.num_resources	= ARRAY_SIZE(da9063_hwmon_resources),
  		.resources	= da9063_hwmon_resources,
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
87
88
89
  	},
  	{
  		.name		= DA9063_DRVNAME_ONKEY,
a0e08b860   Krystian Garbaciak   mfd: da9063: Add ...
90
91
  		.num_resources	= ARRAY_SIZE(da9063_onkey_resources),
  		.resources	= da9063_onkey_resources,
9011e4a8a   Steve Twiss   mfd: da9063: Add ...
92
  		.of_compatible = "dlg,da9063-onkey",
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
93
94
  	},
  	{
c2ffec5e4   Marek Vasut   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   Krystian Garbaciak   mfd: da9063: Add ...
102
  		.name		= DA9063_DRVNAME_RTC,
a0e08b860   Krystian Garbaciak   mfd: da9063: Add ...
103
104
  		.num_resources	= ARRAY_SIZE(da9063_rtc_resources),
  		.resources	= da9063_rtc_resources,
71e03de46   Steve Twiss   mfd: da9063: Add ...
105
  		.of_compatible	= "dlg,da9063-rtc",
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
106
  	},
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
107
  };
9011e4a8a   Steve Twiss   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   Krystian Garbaciak   mfd: da9063: Add ...
165
166
  int da9063_device_init(struct da9063 *da9063, unsigned int irq)
  {
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
167
  	int ret;
9011e4a8a   Steve Twiss   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   Wolfram Sang   mfd: da9063: Remo...
172
173
  	da9063->flags = 0;
  	da9063->irq_base = -1;
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
174
  	da9063->chip_irq = irq;
a0e08b860   Krystian Garbaciak   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   Dmitry Lavnikevich   mfd: da9063: Get ...
181
  	da9063->irq_base = regmap_irq_chip_get_base(da9063->regmap_irq);
152bed762   Marek Vasut   mfd: da9063: Use ...
182
  	ret = devm_mfd_add_devices(da9063->dev, PLATFORM_DEVID_NONE,
c2ffec5e4   Marek Vasut   mfd: da9063: Regi...
183
184
  				   da9063_common_devs,
  				   ARRAY_SIZE(da9063_common_devs),
152bed762   Marek Vasut   mfd: da9063: Use ...
185
  				   NULL, da9063->irq_base, NULL);
c2ffec5e4   Marek Vasut   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   Krystian Garbaciak   mfd: da9063: Add ...
202
203
204
  
  	return ret;
  }
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
205
  MODULE_DESCRIPTION("PMIC driver for Dialog DA9063");
37778d83a   Steve Twiss   mfd: da9063: Upda...
206
207
  MODULE_AUTHOR("Krystian Garbaciak");
  MODULE_AUTHOR("Michal Hajduk");
8e685483b   Krystian Garbaciak   mfd: da9063: Add ...
208
  MODULE_LICENSE("GPL");