.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * ST Microelectronics MFD: stmpe's driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) ST-Ericsson SA 2010 |
---|
5 | 6 | * |
---|
6 | | - * License Terms: GNU General Public License, version 2 |
---|
7 | 7 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson |
---|
8 | 8 | */ |
---|
9 | 9 | |
---|
.. | .. |
---|
464 | 464 | }; |
---|
465 | 465 | |
---|
466 | 466 | /* |
---|
| 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 | +/* |
---|
467 | 489 | * STMPE811 or STMPE610 |
---|
468 | 490 | */ |
---|
469 | 491 | |
---|
.. | .. |
---|
497 | 519 | .irq = STMPE811_IRQ_TOUCH_DET, |
---|
498 | 520 | .block = STMPE_BLOCK_TOUCHSCREEN, |
---|
499 | 521 | }, |
---|
| 522 | + { |
---|
| 523 | + .cell = &stmpe_adc_cell, |
---|
| 524 | + .irq = STMPE811_IRQ_TEMP_SENS, |
---|
| 525 | + .block = STMPE_BLOCK_ADC, |
---|
| 526 | + }, |
---|
500 | 527 | }; |
---|
501 | 528 | |
---|
502 | 529 | static int stmpe811_enable(struct stmpe *stmpe, unsigned int blocks, |
---|
.. | .. |
---|
516 | 543 | return __stmpe_set_bits(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL2], mask, |
---|
517 | 544 | enable ? 0 : mask); |
---|
518 | 545 | } |
---|
| 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); |
---|
519 | 575 | |
---|
520 | 576 | static int stmpe811_get_altfunc(struct stmpe *stmpe, enum stmpe_block block) |
---|
521 | 577 | { |
---|
.. | .. |
---|
1302 | 1358 | pdata->autosleep = (pdata->autosleep_timeout) ? true : false; |
---|
1303 | 1359 | |
---|
1304 | 1360 | for_each_child_of_node(np, child) { |
---|
1305 | | - if (!strcmp(child->name, "stmpe_gpio")) { |
---|
| 1361 | + if (of_node_name_eq(child, "stmpe_gpio")) { |
---|
1306 | 1362 | pdata->blocks |= STMPE_BLOCK_GPIO; |
---|
1307 | | - } else if (!strcmp(child->name, "stmpe_keypad")) { |
---|
| 1363 | + } else if (of_node_name_eq(child, "stmpe_keypad")) { |
---|
1308 | 1364 | pdata->blocks |= STMPE_BLOCK_KEYPAD; |
---|
1309 | | - } else if (!strcmp(child->name, "stmpe_touchscreen")) { |
---|
| 1365 | + } else if (of_node_name_eq(child, "stmpe_touchscreen")) { |
---|
1310 | 1366 | pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN; |
---|
1311 | | - } else if (!strcmp(child->name, "stmpe_adc")) { |
---|
| 1367 | + } else if (of_node_name_eq(child, "stmpe_adc")) { |
---|
1312 | 1368 | pdata->blocks |= STMPE_BLOCK_ADC; |
---|
1313 | | - } else if (!strcmp(child->name, "stmpe_pwm")) { |
---|
| 1369 | + } else if (of_node_name_eq(child, "stmpe_pwm")) { |
---|
1314 | 1370 | pdata->blocks |= STMPE_BLOCK_PWM; |
---|
1315 | | - } else if (!strcmp(child->name, "stmpe_rotator")) { |
---|
| 1371 | + } else if (of_node_name_eq(child, "stmpe_rotator")) { |
---|
1316 | 1372 | pdata->blocks |= STMPE_BLOCK_ROTATOR; |
---|
1317 | 1373 | } |
---|
1318 | 1374 | } |
---|
.. | .. |
---|
1325 | 1381 | struct device_node *np = ci->dev->of_node; |
---|
1326 | 1382 | struct stmpe *stmpe; |
---|
1327 | 1383 | int ret; |
---|
| 1384 | + u32 val; |
---|
1328 | 1385 | |
---|
1329 | 1386 | pdata = devm_kzalloc(ci->dev, sizeof(*pdata), GFP_KERNEL); |
---|
1330 | 1387 | if (!pdata) |
---|
.. | .. |
---|
1341 | 1398 | |
---|
1342 | 1399 | mutex_init(&stmpe->irq_lock); |
---|
1343 | 1400 | 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; |
---|
1344 | 1410 | |
---|
1345 | 1411 | stmpe->dev = ci->dev; |
---|
1346 | 1412 | stmpe->client = ci->client; |
---|
.. | .. |
---|
1428 | 1494 | |
---|
1429 | 1495 | int stmpe_remove(struct stmpe *stmpe) |
---|
1430 | 1496 | { |
---|
1431 | | - if (!IS_ERR(stmpe->vio)) |
---|
| 1497 | + if (!IS_ERR(stmpe->vio) && regulator_is_enabled(stmpe->vio)) |
---|
1432 | 1498 | regulator_disable(stmpe->vio); |
---|
1433 | | - if (!IS_ERR(stmpe->vcc)) |
---|
| 1499 | + if (!IS_ERR(stmpe->vcc) && regulator_is_enabled(stmpe->vcc)) |
---|
1434 | 1500 | regulator_disable(stmpe->vcc); |
---|
1435 | 1501 | |
---|
| 1502 | + __stmpe_disable(stmpe, STMPE_BLOCK_ADC); |
---|
| 1503 | + |
---|
1436 | 1504 | mfd_remove_devices(stmpe->dev); |
---|
1437 | 1505 | |
---|
1438 | 1506 | return 0; |
---|