hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/mfd/stmpe.c
....@@ -1,9 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ST Microelectronics MFD: stmpe's driver
34 *
45 * Copyright (C) ST-Ericsson SA 2010
56 *
6
- * License Terms: GNU General Public License, version 2
77 * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
88 */
99
....@@ -464,6 +464,28 @@
464464 };
465465
466466 /*
467
+ * ADC (STMPE811)
468
+ */
469
+
470
+static struct resource stmpe_adc_resources[] = {
471
+ {
472
+ .name = "STMPE_TEMP_SENS",
473
+ .flags = IORESOURCE_IRQ,
474
+ },
475
+ {
476
+ .name = "STMPE_ADC",
477
+ .flags = IORESOURCE_IRQ,
478
+ },
479
+};
480
+
481
+static const struct mfd_cell stmpe_adc_cell = {
482
+ .name = "stmpe-adc",
483
+ .of_compatible = "st,stmpe-adc",
484
+ .resources = stmpe_adc_resources,
485
+ .num_resources = ARRAY_SIZE(stmpe_adc_resources),
486
+};
487
+
488
+/*
467489 * STMPE811 or STMPE610
468490 */
469491
....@@ -497,6 +519,11 @@
497519 .irq = STMPE811_IRQ_TOUCH_DET,
498520 .block = STMPE_BLOCK_TOUCHSCREEN,
499521 },
522
+ {
523
+ .cell = &stmpe_adc_cell,
524
+ .irq = STMPE811_IRQ_TEMP_SENS,
525
+ .block = STMPE_BLOCK_ADC,
526
+ },
500527 };
501528
502529 static int stmpe811_enable(struct stmpe *stmpe, unsigned int blocks,
....@@ -516,6 +543,35 @@
516543 return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2], mask,
517544 enable ? 0 : mask);
518545 }
546
+
547
+int stmpe811_adc_common_init(struct stmpe *stmpe)
548
+{
549
+ int ret;
550
+ u8 adc_ctrl1, adc_ctrl1_mask;
551
+
552
+ adc_ctrl1 = STMPE_SAMPLE_TIME(stmpe->sample_time) |
553
+ STMPE_MOD_12B(stmpe->mod_12b) |
554
+ STMPE_REF_SEL(stmpe->ref_sel);
555
+ adc_ctrl1_mask = STMPE_SAMPLE_TIME(0xff) | STMPE_MOD_12B(0xff) |
556
+ STMPE_REF_SEL(0xff);
557
+
558
+ ret = stmpe_set_bits(stmpe, STMPE811_REG_ADC_CTRL1,
559
+ adc_ctrl1_mask, adc_ctrl1);
560
+ if (ret) {
561
+ dev_err(stmpe->dev, "Could not setup ADC\n");
562
+ return ret;
563
+ }
564
+
565
+ ret = stmpe_set_bits(stmpe, STMPE811_REG_ADC_CTRL2,
566
+ STMPE_ADC_FREQ(0xff), STMPE_ADC_FREQ(stmpe->adc_freq));
567
+ if (ret) {
568
+ dev_err(stmpe->dev, "Could not setup ADC\n");
569
+ return ret;
570
+ }
571
+
572
+ return 0;
573
+}
574
+EXPORT_SYMBOL_GPL(stmpe811_adc_common_init);
519575
520576 static int stmpe811_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
521577 {
....@@ -1302,17 +1358,17 @@
13021358 pdata->autosleep = (pdata->autosleep_timeout) ? true : false;
13031359
13041360 for_each_child_of_node(np, child) {
1305
- if (!strcmp(child->name, "stmpe_gpio")) {
1361
+ if (of_node_name_eq(child, "stmpe_gpio")) {
13061362 pdata->blocks |= STMPE_BLOCK_GPIO;
1307
- } else if (!strcmp(child->name, "stmpe_keypad")) {
1363
+ } else if (of_node_name_eq(child, "stmpe_keypad")) {
13081364 pdata->blocks |= STMPE_BLOCK_KEYPAD;
1309
- } else if (!strcmp(child->name, "stmpe_touchscreen")) {
1365
+ } else if (of_node_name_eq(child, "stmpe_touchscreen")) {
13101366 pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN;
1311
- } else if (!strcmp(child->name, "stmpe_adc")) {
1367
+ } else if (of_node_name_eq(child, "stmpe_adc")) {
13121368 pdata->blocks |= STMPE_BLOCK_ADC;
1313
- } else if (!strcmp(child->name, "stmpe_pwm")) {
1369
+ } else if (of_node_name_eq(child, "stmpe_pwm")) {
13141370 pdata->blocks |= STMPE_BLOCK_PWM;
1315
- } else if (!strcmp(child->name, "stmpe_rotator")) {
1371
+ } else if (of_node_name_eq(child, "stmpe_rotator")) {
13161372 pdata->blocks |= STMPE_BLOCK_ROTATOR;
13171373 }
13181374 }
....@@ -1325,6 +1381,7 @@
13251381 struct device_node *np = ci->dev->of_node;
13261382 struct stmpe *stmpe;
13271383 int ret;
1384
+ u32 val;
13281385
13291386 pdata = devm_kzalloc(ci->dev, sizeof(*pdata), GFP_KERNEL);
13301387 if (!pdata)
....@@ -1341,6 +1398,15 @@
13411398
13421399 mutex_init(&stmpe->irq_lock);
13431400 mutex_init(&stmpe->lock);
1401
+
1402
+ if (!of_property_read_u32(np, "st,sample-time", &val))
1403
+ stmpe->sample_time = val;
1404
+ if (!of_property_read_u32(np, "st,mod-12b", &val))
1405
+ stmpe->mod_12b = val;
1406
+ if (!of_property_read_u32(np, "st,ref-sel", &val))
1407
+ stmpe->ref_sel = val;
1408
+ if (!of_property_read_u32(np, "st,adc-freq", &val))
1409
+ stmpe->adc_freq = val;
13441410
13451411 stmpe->dev = ci->dev;
13461412 stmpe->client = ci->client;
....@@ -1428,11 +1494,13 @@
14281494
14291495 int stmpe_remove(struct stmpe *stmpe)
14301496 {
1431
- if (!IS_ERR(stmpe->vio))
1497
+ if (!IS_ERR(stmpe->vio) && regulator_is_enabled(stmpe->vio))
14321498 regulator_disable(stmpe->vio);
1433
- if (!IS_ERR(stmpe->vcc))
1499
+ if (!IS_ERR(stmpe->vcc) && regulator_is_enabled(stmpe->vcc))
14341500 regulator_disable(stmpe->vcc);
14351501
1502
+ __stmpe_disable(stmpe, STMPE_BLOCK_ADC);
1503
+
14361504 mfd_remove_devices(stmpe->dev);
14371505
14381506 return 0;