1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for STMicroelectronics Multi-Function eXpander (STMFX) core
5 * Copyright (C) 2019 STMicroelectronics
6 * Author(s): Amelie Delaunay <amelie.delaunay@st.com>.
8 #include <linux/bitfield.h>
10 #include <linux/interrupt.h>
11 #include <linux/irq.h>
12 #include <linux/mfd/core.h>
13 #include <linux/mfd/stmfx.h>
14 #include <linux/module.h>
15 #include <linux/regulator/consumer.h>
17 static bool stmfx_reg_volatile(struct device
*dev
, unsigned int reg
)
20 case STMFX_REG_SYS_CTRL
:
21 case STMFX_REG_IRQ_SRC_EN
:
22 case STMFX_REG_IRQ_PENDING
:
23 case STMFX_REG_IRQ_GPI_PENDING1
:
24 case STMFX_REG_IRQ_GPI_PENDING2
:
25 case STMFX_REG_IRQ_GPI_PENDING3
:
26 case STMFX_REG_GPIO_STATE1
:
27 case STMFX_REG_GPIO_STATE2
:
28 case STMFX_REG_GPIO_STATE3
:
29 case STMFX_REG_IRQ_GPI_SRC1
:
30 case STMFX_REG_IRQ_GPI_SRC2
:
31 case STMFX_REG_IRQ_GPI_SRC3
:
32 case STMFX_REG_GPO_SET1
:
33 case STMFX_REG_GPO_SET2
:
34 case STMFX_REG_GPO_SET3
:
35 case STMFX_REG_GPO_CLR1
:
36 case STMFX_REG_GPO_CLR2
:
37 case STMFX_REG_GPO_CLR3
:
44 static bool stmfx_reg_writeable(struct device
*dev
, unsigned int reg
)
46 return (reg
>= STMFX_REG_SYS_CTRL
);
49 static const struct regmap_config stmfx_regmap_config
= {
53 .max_register
= STMFX_REG_MAX
,
54 .volatile_reg
= stmfx_reg_volatile
,
55 .writeable_reg
= stmfx_reg_writeable
,
56 .cache_type
= REGCACHE_RBTREE
,
59 static const struct resource stmfx_pinctrl_resources
[] = {
60 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_GPIO
),
63 static const struct resource stmfx_idd_resources
[] = {
64 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_IDD
),
65 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_ERROR
),
68 static const struct resource stmfx_ts_resources
[] = {
69 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_TS_DET
),
70 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_TS_NE
),
71 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_TS_TH
),
72 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_TS_FULL
),
73 DEFINE_RES_IRQ(STMFX_REG_IRQ_SRC_EN_TS_OVF
),
76 static struct mfd_cell stmfx_cells
[] = {
78 .of_compatible
= "st,stmfx-0300-pinctrl",
79 .name
= "stmfx-pinctrl",
80 .resources
= stmfx_pinctrl_resources
,
81 .num_resources
= ARRAY_SIZE(stmfx_pinctrl_resources
),
84 .of_compatible
= "st,stmfx-0300-idd",
86 .resources
= stmfx_idd_resources
,
87 .num_resources
= ARRAY_SIZE(stmfx_idd_resources
),
90 .of_compatible
= "st,stmfx-0300-ts",
92 .resources
= stmfx_ts_resources
,
93 .num_resources
= ARRAY_SIZE(stmfx_ts_resources
),
97 static u8
stmfx_func_to_mask(u32 func
)
101 if (func
& STMFX_FUNC_GPIO
)
102 mask
|= STMFX_REG_SYS_CTRL_GPIO_EN
;
104 if ((func
& STMFX_FUNC_ALTGPIO_LOW
) || (func
& STMFX_FUNC_ALTGPIO_HIGH
))
105 mask
|= STMFX_REG_SYS_CTRL_ALTGPIO_EN
;
107 if (func
& STMFX_FUNC_TS
)
108 mask
|= STMFX_REG_SYS_CTRL_TS_EN
;
110 if (func
& STMFX_FUNC_IDD
)
111 mask
|= STMFX_REG_SYS_CTRL_IDD_EN
;
116 int stmfx_function_enable(struct stmfx
*stmfx
, u32 func
)
122 ret
= regmap_read(stmfx
->map
, STMFX_REG_SYS_CTRL
, &sys_ctrl
);
127 * IDD and TS have priority in STMFX FW, so if IDD and TS are enabled,
128 * ALTGPIO function is disabled by STMFX FW. If IDD or TS is enabled,
129 * the number of aGPIO available decreases. To avoid GPIO management
130 * disturbance, abort IDD or TS function enable in this case.
132 if (((func
& STMFX_FUNC_IDD
) || (func
& STMFX_FUNC_TS
)) &&
133 (sys_ctrl
& STMFX_REG_SYS_CTRL_ALTGPIO_EN
)) {
134 dev_err(stmfx
->dev
, "ALTGPIO function already enabled\n");
138 /* If TS is enabled, aGPIO[3:0] cannot be used */
139 if ((func
& STMFX_FUNC_ALTGPIO_LOW
) &&
140 (sys_ctrl
& STMFX_REG_SYS_CTRL_TS_EN
)) {
141 dev_err(stmfx
->dev
, "TS in use, aGPIO[3:0] unavailable\n");
145 /* If IDD is enabled, aGPIO[7:4] cannot be used */
146 if ((func
& STMFX_FUNC_ALTGPIO_HIGH
) &&
147 (sys_ctrl
& STMFX_REG_SYS_CTRL_IDD_EN
)) {
148 dev_err(stmfx
->dev
, "IDD in use, aGPIO[7:4] unavailable\n");
152 mask
= stmfx_func_to_mask(func
);
154 return regmap_update_bits(stmfx
->map
, STMFX_REG_SYS_CTRL
, mask
, mask
);
156 EXPORT_SYMBOL_GPL(stmfx_function_enable
);
158 int stmfx_function_disable(struct stmfx
*stmfx
, u32 func
)
160 u8 mask
= stmfx_func_to_mask(func
);
162 return regmap_update_bits(stmfx
->map
, STMFX_REG_SYS_CTRL
, mask
, 0);
164 EXPORT_SYMBOL_GPL(stmfx_function_disable
);
166 static void stmfx_irq_bus_lock(struct irq_data
*data
)
168 struct stmfx
*stmfx
= irq_data_get_irq_chip_data(data
);
170 mutex_lock(&stmfx
->lock
);
173 static void stmfx_irq_bus_sync_unlock(struct irq_data
*data
)
175 struct stmfx
*stmfx
= irq_data_get_irq_chip_data(data
);
177 regmap_write(stmfx
->map
, STMFX_REG_IRQ_SRC_EN
, stmfx
->irq_src
);
179 mutex_unlock(&stmfx
->lock
);
182 static void stmfx_irq_mask(struct irq_data
*data
)
184 struct stmfx
*stmfx
= irq_data_get_irq_chip_data(data
);
186 stmfx
->irq_src
&= ~BIT(data
->hwirq
% 8);
189 static void stmfx_irq_unmask(struct irq_data
*data
)
191 struct stmfx
*stmfx
= irq_data_get_irq_chip_data(data
);
193 stmfx
->irq_src
|= BIT(data
->hwirq
% 8);
196 static struct irq_chip stmfx_irq_chip
= {
197 .name
= "stmfx-core",
198 .irq_bus_lock
= stmfx_irq_bus_lock
,
199 .irq_bus_sync_unlock
= stmfx_irq_bus_sync_unlock
,
200 .irq_mask
= stmfx_irq_mask
,
201 .irq_unmask
= stmfx_irq_unmask
,
204 static irqreturn_t
stmfx_irq_handler(int irq
, void *data
)
206 struct stmfx
*stmfx
= data
;
211 ret
= regmap_read(stmfx
->map
, STMFX_REG_IRQ_PENDING
, &pending
);
216 * There is no ACK for GPIO, MFX_REG_IRQ_PENDING_GPIO is a logical OR
217 * of MFX_REG_IRQ_GPI _PENDING1/_PENDING2/_PENDING3
219 ack
= pending
& ~BIT(STMFX_REG_IRQ_SRC_EN_GPIO
);
221 ret
= regmap_write(stmfx
->map
, STMFX_REG_IRQ_ACK
, ack
);
227 for_each_set_bit(n
, &bits
, STMFX_REG_IRQ_SRC_MAX
)
228 handle_nested_irq(irq_find_mapping(stmfx
->irq_domain
, n
));
233 static int stmfx_irq_map(struct irq_domain
*d
, unsigned int virq
,
234 irq_hw_number_t hwirq
)
236 irq_set_chip_data(virq
, d
->host_data
);
237 irq_set_chip_and_handler(virq
, &stmfx_irq_chip
, handle_simple_irq
);
238 irq_set_nested_thread(virq
, 1);
239 irq_set_noprobe(virq
);
244 static void stmfx_irq_unmap(struct irq_domain
*d
, unsigned int virq
)
246 irq_set_chip_and_handler(virq
, NULL
, NULL
);
247 irq_set_chip_data(virq
, NULL
);
250 static const struct irq_domain_ops stmfx_irq_ops
= {
251 .map
= stmfx_irq_map
,
252 .unmap
= stmfx_irq_unmap
,
255 static void stmfx_irq_exit(struct i2c_client
*client
)
257 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
260 for (hwirq
= 0; hwirq
< STMFX_REG_IRQ_SRC_MAX
; hwirq
++)
261 irq_dispose_mapping(irq_find_mapping(stmfx
->irq_domain
, hwirq
));
263 irq_domain_remove(stmfx
->irq_domain
);
266 static int stmfx_irq_init(struct i2c_client
*client
)
268 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
269 u32 irqoutpin
= 0, irqtrigger
;
272 stmfx
->irq_domain
= irq_domain_add_simple(stmfx
->dev
->of_node
,
273 STMFX_REG_IRQ_SRC_MAX
, 0,
274 &stmfx_irq_ops
, stmfx
);
275 if (!stmfx
->irq_domain
) {
276 dev_err(stmfx
->dev
, "Failed to create IRQ domain\n");
280 if (!of_property_read_bool(stmfx
->dev
->of_node
, "drive-open-drain"))
281 irqoutpin
|= STMFX_REG_IRQ_OUT_PIN_TYPE
;
283 irqtrigger
= irq_get_trigger_type(client
->irq
);
284 if ((irqtrigger
& IRQ_TYPE_EDGE_RISING
) ||
285 (irqtrigger
& IRQ_TYPE_LEVEL_HIGH
))
286 irqoutpin
|= STMFX_REG_IRQ_OUT_PIN_POL
;
288 ret
= regmap_write(stmfx
->map
, STMFX_REG_IRQ_OUT_PIN
, irqoutpin
);
292 ret
= devm_request_threaded_irq(stmfx
->dev
, client
->irq
,
293 NULL
, stmfx_irq_handler
,
294 irqtrigger
| IRQF_ONESHOT
,
297 stmfx_irq_exit(client
);
302 static int stmfx_chip_reset(struct stmfx
*stmfx
)
306 ret
= regmap_write(stmfx
->map
, STMFX_REG_SYS_CTRL
,
307 STMFX_REG_SYS_CTRL_SWRST
);
311 msleep(STMFX_BOOT_TIME_MS
);
316 static int stmfx_chip_init(struct i2c_client
*client
)
318 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
323 stmfx
->vdd
= devm_regulator_get_optional(&client
->dev
, "vdd");
324 ret
= PTR_ERR_OR_ZERO(stmfx
->vdd
);
325 if (ret
== -ENODEV
) {
327 } else if (ret
== -EPROBE_DEFER
) {
330 dev_err(&client
->dev
, "Failed to get VDD regulator: %d\n", ret
);
335 ret
= regulator_enable(stmfx
->vdd
);
337 dev_err(&client
->dev
, "VDD enable failed: %d\n", ret
);
342 ret
= regmap_read(stmfx
->map
, STMFX_REG_CHIP_ID
, &id
);
344 dev_err(&client
->dev
, "Error reading chip ID: %d\n", ret
);
349 * Check that ID is the complement of the I2C address:
350 * STMFX I2C address follows the 7-bit format (MSB), that's why
351 * client->addr is shifted.
353 * STMFX_I2C_ADDR| STMFX | Linux
354 * input pin | I2C device address | I2C device address
355 *---------------------------------------------------------
356 * 0 | b: 1000 010x h:0x84 | 0x42
357 * 1 | b: 1000 011x h:0x86 | 0x43
359 if (FIELD_GET(STMFX_REG_CHIP_ID_MASK
, ~id
) != (client
->addr
<< 1)) {
360 dev_err(&client
->dev
, "Unknown chip ID: %#x\n", id
);
365 ret
= regmap_bulk_read(stmfx
->map
, STMFX_REG_FW_VERSION_MSB
,
366 version
, ARRAY_SIZE(version
));
368 dev_err(&client
->dev
, "Error reading FW version: %d\n", ret
);
372 dev_info(&client
->dev
, "STMFX id: %#x, fw version: %x.%02x\n",
373 id
, version
[0], version
[1]);
375 ret
= stmfx_chip_reset(stmfx
);
377 dev_err(&client
->dev
, "Failed to reset chip: %d\n", ret
);
385 return regulator_disable(stmfx
->vdd
);
390 static int stmfx_chip_exit(struct i2c_client
*client
)
392 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
394 regmap_write(stmfx
->map
, STMFX_REG_IRQ_SRC_EN
, 0);
395 regmap_write(stmfx
->map
, STMFX_REG_SYS_CTRL
, 0);
398 return regulator_disable(stmfx
->vdd
);
403 static int stmfx_probe(struct i2c_client
*client
,
404 const struct i2c_device_id
*id
)
406 struct device
*dev
= &client
->dev
;
410 stmfx
= devm_kzalloc(dev
, sizeof(*stmfx
), GFP_KERNEL
);
414 i2c_set_clientdata(client
, stmfx
);
418 stmfx
->map
= devm_regmap_init_i2c(client
, &stmfx_regmap_config
);
419 if (IS_ERR(stmfx
->map
)) {
420 ret
= PTR_ERR(stmfx
->map
);
421 dev_err(dev
, "Failed to allocate register map: %d\n", ret
);
425 mutex_init(&stmfx
->lock
);
427 ret
= stmfx_chip_init(client
);
429 if (ret
== -ETIMEDOUT
)
430 return -EPROBE_DEFER
;
434 if (client
->irq
< 0) {
435 dev_err(dev
, "Failed to get IRQ: %d\n", client
->irq
);
440 ret
= stmfx_irq_init(client
);
444 ret
= devm_mfd_add_devices(dev
, PLATFORM_DEVID_NONE
,
445 stmfx_cells
, ARRAY_SIZE(stmfx_cells
), NULL
,
446 0, stmfx
->irq_domain
);
453 stmfx_irq_exit(client
);
455 stmfx_chip_exit(client
);
460 static int stmfx_remove(struct i2c_client
*client
)
462 stmfx_irq_exit(client
);
464 return stmfx_chip_exit(client
);
467 #ifdef CONFIG_PM_SLEEP
468 static int stmfx_suspend(struct device
*dev
)
470 struct stmfx
*stmfx
= dev_get_drvdata(dev
);
473 ret
= regmap_raw_read(stmfx
->map
, STMFX_REG_SYS_CTRL
,
474 &stmfx
->bkp_sysctrl
, sizeof(stmfx
->bkp_sysctrl
));
478 ret
= regmap_raw_read(stmfx
->map
, STMFX_REG_IRQ_OUT_PIN
,
479 &stmfx
->bkp_irqoutpin
,
480 sizeof(stmfx
->bkp_irqoutpin
));
485 return regulator_disable(stmfx
->vdd
);
490 static int stmfx_resume(struct device
*dev
)
492 struct stmfx
*stmfx
= dev_get_drvdata(dev
);
496 ret
= regulator_enable(stmfx
->vdd
);
499 "VDD enable failed: %d\n", ret
);
504 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_SYS_CTRL
,
505 &stmfx
->bkp_sysctrl
, sizeof(stmfx
->bkp_sysctrl
));
509 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_IRQ_OUT_PIN
,
510 &stmfx
->bkp_irqoutpin
,
511 sizeof(stmfx
->bkp_irqoutpin
));
515 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_IRQ_SRC_EN
,
516 &stmfx
->irq_src
, sizeof(stmfx
->irq_src
));
524 static SIMPLE_DEV_PM_OPS(stmfx_dev_pm_ops
, stmfx_suspend
, stmfx_resume
);
526 static const struct of_device_id stmfx_of_match
[] = {
527 { .compatible
= "st,stmfx-0300", },
530 MODULE_DEVICE_TABLE(of
, stmfx_of_match
);
532 static struct i2c_driver stmfx_driver
= {
534 .name
= "stmfx-core",
535 .of_match_table
= of_match_ptr(stmfx_of_match
),
536 .pm
= &stmfx_dev_pm_ops
,
538 .probe
= stmfx_probe
,
539 .remove
= stmfx_remove
,
541 module_i2c_driver(stmfx_driver
);
543 MODULE_DESCRIPTION("STMFX core driver");
544 MODULE_AUTHOR("Amelie Delaunay <amelie.delaunay@st.com>");
545 MODULE_LICENSE("GPL v2");