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_MAPLE
,
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
,
299 stmfx
->irq
= client
->irq
;
304 stmfx_irq_exit(client
);
309 static int stmfx_chip_reset(struct stmfx
*stmfx
)
313 ret
= regmap_write(stmfx
->map
, STMFX_REG_SYS_CTRL
,
314 STMFX_REG_SYS_CTRL_SWRST
);
318 msleep(STMFX_BOOT_TIME_MS
);
323 static int stmfx_chip_init(struct i2c_client
*client
)
325 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
330 stmfx
->vdd
= devm_regulator_get_optional(&client
->dev
, "vdd");
331 ret
= PTR_ERR_OR_ZERO(stmfx
->vdd
);
335 return dev_err_probe(&client
->dev
, ret
, "Failed to get VDD regulator\n");
339 ret
= regulator_enable(stmfx
->vdd
);
341 dev_err(&client
->dev
, "VDD enable failed: %d\n", ret
);
346 ret
= regmap_read(stmfx
->map
, STMFX_REG_CHIP_ID
, &id
);
348 dev_err(&client
->dev
, "Error reading chip ID: %d\n", ret
);
353 * Check that ID is the complement of the I2C address:
354 * STMFX I2C address follows the 7-bit format (MSB), that's why
355 * client->addr is shifted.
357 * STMFX_I2C_ADDR| STMFX | Linux
358 * input pin | I2C device address | I2C device address
359 *---------------------------------------------------------
360 * 0 | b: 1000 010x h:0x84 | 0x42
361 * 1 | b: 1000 011x h:0x86 | 0x43
363 if (FIELD_GET(STMFX_REG_CHIP_ID_MASK
, ~id
) != (client
->addr
<< 1)) {
364 dev_err(&client
->dev
, "Unknown chip ID: %#x\n", id
);
369 ret
= regmap_bulk_read(stmfx
->map
, STMFX_REG_FW_VERSION_MSB
,
370 version
, ARRAY_SIZE(version
));
372 dev_err(&client
->dev
, "Error reading FW version: %d\n", ret
);
376 dev_info(&client
->dev
, "STMFX id: %#x, fw version: %x.%02x\n",
377 id
, version
[0], version
[1]);
379 ret
= stmfx_chip_reset(stmfx
);
381 dev_err(&client
->dev
, "Failed to reset chip: %d\n", ret
);
389 regulator_disable(stmfx
->vdd
);
394 static void stmfx_chip_exit(struct i2c_client
*client
)
396 struct stmfx
*stmfx
= i2c_get_clientdata(client
);
398 regmap_write(stmfx
->map
, STMFX_REG_IRQ_SRC_EN
, 0);
399 regmap_write(stmfx
->map
, STMFX_REG_SYS_CTRL
, 0);
404 ret
= regulator_disable(stmfx
->vdd
);
406 dev_err(&client
->dev
,
407 "Failed to disable vdd regulator: %pe\n",
412 static int stmfx_probe(struct i2c_client
*client
)
414 struct device
*dev
= &client
->dev
;
418 stmfx
= devm_kzalloc(dev
, sizeof(*stmfx
), GFP_KERNEL
);
422 i2c_set_clientdata(client
, stmfx
);
426 stmfx
->map
= devm_regmap_init_i2c(client
, &stmfx_regmap_config
);
427 if (IS_ERR(stmfx
->map
)) {
428 ret
= PTR_ERR(stmfx
->map
);
429 dev_err(dev
, "Failed to allocate register map: %d\n", ret
);
433 mutex_init(&stmfx
->lock
);
435 ret
= stmfx_chip_init(client
);
437 if (ret
== -ETIMEDOUT
)
438 return -EPROBE_DEFER
;
442 if (client
->irq
< 0) {
443 dev_err(dev
, "Failed to get IRQ: %d\n", client
->irq
);
448 ret
= stmfx_irq_init(client
);
452 ret
= devm_mfd_add_devices(dev
, PLATFORM_DEVID_NONE
,
453 stmfx_cells
, ARRAY_SIZE(stmfx_cells
), NULL
,
454 0, stmfx
->irq_domain
);
461 stmfx_irq_exit(client
);
463 stmfx_chip_exit(client
);
468 static void stmfx_remove(struct i2c_client
*client
)
470 stmfx_irq_exit(client
);
472 stmfx_chip_exit(client
);
475 static int stmfx_suspend(struct device
*dev
)
477 struct stmfx
*stmfx
= dev_get_drvdata(dev
);
480 ret
= regmap_raw_read(stmfx
->map
, STMFX_REG_SYS_CTRL
,
481 &stmfx
->bkp_sysctrl
, sizeof(stmfx
->bkp_sysctrl
));
485 ret
= regmap_raw_read(stmfx
->map
, STMFX_REG_IRQ_OUT_PIN
,
486 &stmfx
->bkp_irqoutpin
,
487 sizeof(stmfx
->bkp_irqoutpin
));
491 disable_irq(stmfx
->irq
);
494 return regulator_disable(stmfx
->vdd
);
499 static int stmfx_resume(struct device
*dev
)
501 struct stmfx
*stmfx
= dev_get_drvdata(dev
);
505 ret
= regulator_enable(stmfx
->vdd
);
508 "VDD enable failed: %d\n", ret
);
513 /* Reset STMFX - supply has been stopped during suspend */
514 ret
= stmfx_chip_reset(stmfx
);
516 dev_err(stmfx
->dev
, "Failed to reset chip: %d\n", ret
);
520 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_SYS_CTRL
,
521 &stmfx
->bkp_sysctrl
, sizeof(stmfx
->bkp_sysctrl
));
525 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_IRQ_OUT_PIN
,
526 &stmfx
->bkp_irqoutpin
,
527 sizeof(stmfx
->bkp_irqoutpin
));
531 ret
= regmap_raw_write(stmfx
->map
, STMFX_REG_IRQ_SRC_EN
,
532 &stmfx
->irq_src
, sizeof(stmfx
->irq_src
));
536 enable_irq(stmfx
->irq
);
541 static DEFINE_SIMPLE_DEV_PM_OPS(stmfx_dev_pm_ops
, stmfx_suspend
, stmfx_resume
);
543 static const struct of_device_id stmfx_of_match
[] = {
544 { .compatible
= "st,stmfx-0300", },
547 MODULE_DEVICE_TABLE(of
, stmfx_of_match
);
549 static struct i2c_driver stmfx_driver
= {
551 .name
= "stmfx-core",
552 .of_match_table
= stmfx_of_match
,
553 .pm
= pm_sleep_ptr(&stmfx_dev_pm_ops
),
555 .probe
= stmfx_probe
,
556 .remove
= stmfx_remove
,
558 module_i2c_driver(stmfx_driver
);
560 MODULE_DESCRIPTION("STMFX core driver");
561 MODULE_AUTHOR("Amelie Delaunay <amelie.delaunay@st.com>");
562 MODULE_LICENSE("GPL v2");