Lines Matching +full:parent +full:- +full:locked

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * wm831x-core.c -- Device access for Wolfson WM831x PMICs
29 /* Current settings - values are 2*2^(reg_val/4) microamps. These are
94 if (!wm831x->locked) in wm831x_reg_locked()
126 dev_vdbg(wm831x->dev, "Registers locked\n"); in wm831x_reg_lock()
128 mutex_lock(&wm831x->io_lock); in wm831x_reg_lock()
129 WARN_ON(wm831x->locked); in wm831x_reg_lock()
130 wm831x->locked = 1; in wm831x_reg_lock()
131 mutex_unlock(&wm831x->io_lock); in wm831x_reg_lock()
133 dev_err(wm831x->dev, "Failed to lock registers: %d\n", ret); in wm831x_reg_lock()
155 dev_vdbg(wm831x->dev, "Registers unlocked\n"); in wm831x_reg_unlock()
157 mutex_lock(&wm831x->io_lock); in wm831x_reg_unlock()
158 WARN_ON(!wm831x->locked); in wm831x_reg_unlock()
159 wm831x->locked = 0; in wm831x_reg_unlock()
160 mutex_unlock(&wm831x->io_lock); in wm831x_reg_unlock()
524 ret = regmap_read(wm831x->regmap, reg, &val); in wm831x_reg_read()
544 return regmap_bulk_read(wm831x->regmap, reg, buf, count); in wm831x_bulk_read()
559 return -EPERM; in wm831x_write()
561 dev_vdbg(wm831x->dev, "Write %04x to R%d(0x%x)\n", in wm831x_write()
563 ret = regmap_write(wm831x->regmap, reg + i, buf[i]); in wm831x_write()
583 mutex_lock(&wm831x->io_lock); in wm831x_reg_write()
587 mutex_unlock(&wm831x->io_lock); in wm831x_reg_write()
606 mutex_lock(&wm831x->io_lock); in wm831x_set_bits()
609 ret = regmap_update_bits(wm831x->regmap, reg, mask, val); in wm831x_set_bits()
611 ret = -EPERM; in wm831x_set_bits()
613 mutex_unlock(&wm831x->io_lock); in wm831x_set_bits()
842 .name = "wm831x-backup",
845 .name = "wm831x-buckv",
851 .name = "wm831x-buckv",
857 .name = "wm831x-buckp",
863 .name = "wm831x-boostp",
869 .name = "wm831x-clk",
872 .name = "wm831x-epe",
876 .name = "wm831x-epe",
880 .name = "wm831x-gpio",
885 .name = "wm831x-hwmon",
888 .name = "wm831x-isink",
894 .name = "wm831x-isink",
900 .name = "wm831x-ldo",
906 .name = "wm831x-ldo",
912 .name = "wm831x-ldo",
918 .name = "wm831x-ldo",
924 .name = "wm831x-ldo",
930 .name = "wm831x-ldo",
936 .name = "wm831x-aldo",
942 .name = "wm831x-aldo",
948 .name = "wm831x-aldo",
954 .name = "wm831x-aldo",
960 .name = "wm831x-alive-ldo",
966 .name = "wm831x-on",
971 .name = "wm831x-power",
976 .name = "wm831x-status",
982 .name = "wm831x-status",
988 .name = "wm831x-watchdog",
996 .name = "wm831x-backup",
999 .name = "wm831x-buckv",
1005 .name = "wm831x-buckv",
1011 .name = "wm831x-buckp",
1017 .name = "wm831x-boostp",
1023 .name = "wm831x-clk",
1026 .name = "wm831x-epe",
1030 .name = "wm831x-epe",
1034 .name = "wm831x-gpio",
1039 .name = "wm831x-hwmon",
1042 .name = "wm831x-isink",
1048 .name = "wm831x-isink",
1054 .name = "wm831x-ldo",
1060 .name = "wm831x-ldo",
1066 .name = "wm831x-ldo",
1072 .name = "wm831x-ldo",
1078 .name = "wm831x-ldo",
1084 .name = "wm831x-aldo",
1090 .name = "wm831x-alive-ldo",
1096 .name = "wm831x-on",
1101 .name = "wm831x-power",
1106 .name = "wm831x-status",
1112 .name = "wm831x-status",
1118 .name = "wm831x-watchdog",
1126 .name = "wm831x-backup",
1129 .name = "wm831x-buckv",
1135 .name = "wm831x-buckv",
1141 .name = "wm831x-buckp",
1147 .name = "wm831x-boostp",
1153 .name = "wm831x-clk",
1156 .name = "wm831x-epe",
1160 .name = "wm831x-epe",
1164 .name = "wm831x-gpio",
1169 .name = "wm831x-hwmon",
1172 .name = "wm831x-isink",
1178 .name = "wm831x-isink",
1184 .name = "wm831x-ldo",
1190 .name = "wm831x-ldo",
1196 .name = "wm831x-ldo",
1202 .name = "wm831x-ldo",
1208 .name = "wm831x-ldo",
1214 .name = "wm831x-ldo",
1220 .name = "wm831x-aldo",
1226 .name = "wm831x-aldo",
1232 .name = "wm831x-aldo",
1238 .name = "wm831x-aldo",
1244 .name = "wm831x-alive-ldo",
1250 .name = "wm831x-on",
1255 .name = "wm831x-power",
1260 .name = "wm831x-status",
1266 .name = "wm831x-status",
1272 .name = "wm831x-watchdog",
1280 .name = "wm831x-backup",
1283 .name = "wm831x-buckv",
1289 .name = "wm831x-buckv",
1295 .name = "wm831x-buckp",
1301 .name = "wm831x-buckp",
1307 .name = "wm831x-clk",
1310 .name = "wm831x-gpio",
1315 .name = "wm831x-hwmon",
1318 .name = "wm831x-ldo",
1324 .name = "wm831x-ldo",
1330 .name = "wm831x-ldo",
1336 .name = "wm831x-ldo",
1342 .name = "wm831x-ldo",
1348 .name = "wm831x-ldo",
1354 .name = "wm831x-aldo",
1360 .name = "wm831x-aldo",
1366 .name = "wm831x-aldo",
1372 .name = "wm831x-aldo",
1378 .name = "wm831x-alive-ldo",
1384 .name = "wm831x-on",
1389 .name = "wm831x-status",
1395 .name = "wm831x-status",
1401 .name = "wm831x-watchdog",
1409 .name = "wm831x-touch",
1417 .name = "wm831x-rtc",
1425 .name = "wm831x-backlight",
1455 * Instantiate the generic non-control parts of the device.
1459 struct wm831x_pdata *pdata = &wm831x->pdata; in wm831x_device_init()
1461 enum wm831x_parent parent; in wm831x_device_init() local
1464 mutex_init(&wm831x->io_lock); in wm831x_device_init()
1465 mutex_init(&wm831x->key_lock); in wm831x_device_init()
1466 dev_set_drvdata(wm831x->dev, wm831x); in wm831x_device_init()
1468 wm831x->soft_shutdown = pdata->soft_shutdown; in wm831x_device_init()
1472 dev_err(wm831x->dev, "Failed to read parent ID: %d\n", ret); in wm831x_device_init()
1480 dev_err(wm831x->dev, "Device is not a WM831x: ID %x\n", ret); in wm831x_device_init()
1481 ret = -EINVAL; in wm831x_device_init()
1487 dev_err(wm831x->dev, "Failed to read revision: %d\n", ret); in wm831x_device_init()
1494 dev_err(wm831x->dev, "Failed to read device ID: %d\n", ret); in wm831x_device_init()
1502 dev_info(wm831x->dev, "Device is an engineering sample\n"); in wm831x_device_init()
1503 ret = wm831x->type; in wm831x_device_init()
1508 parent = WM8310; in wm831x_device_init()
1509 wm831x->num_gpio = 16; in wm831x_device_init()
1510 wm831x->charger_irq_wake = 1; in wm831x_device_init()
1512 wm831x->has_gpio_ena = 1; in wm831x_device_init()
1513 wm831x->has_cs_sts = 1; in wm831x_device_init()
1516 dev_info(wm831x->dev, "WM8310 revision %c\n", 'A' + rev); in wm831x_device_init()
1520 parent = WM8311; in wm831x_device_init()
1521 wm831x->num_gpio = 16; in wm831x_device_init()
1522 wm831x->charger_irq_wake = 1; in wm831x_device_init()
1524 wm831x->has_gpio_ena = 1; in wm831x_device_init()
1525 wm831x->has_cs_sts = 1; in wm831x_device_init()
1528 dev_info(wm831x->dev, "WM8311 revision %c\n", 'A' + rev); in wm831x_device_init()
1532 parent = WM8312; in wm831x_device_init()
1533 wm831x->num_gpio = 16; in wm831x_device_init()
1534 wm831x->charger_irq_wake = 1; in wm831x_device_init()
1536 wm831x->has_gpio_ena = 1; in wm831x_device_init()
1537 wm831x->has_cs_sts = 1; in wm831x_device_init()
1540 dev_info(wm831x->dev, "WM8312 revision %c\n", 'A' + rev); in wm831x_device_init()
1544 parent = WM8320; in wm831x_device_init()
1545 wm831x->num_gpio = 12; in wm831x_device_init()
1546 dev_info(wm831x->dev, "WM8320 revision %c\n", 'A' + rev); in wm831x_device_init()
1550 parent = WM8321; in wm831x_device_init()
1551 wm831x->num_gpio = 12; in wm831x_device_init()
1552 dev_info(wm831x->dev, "WM8321 revision %c\n", 'A' + rev); in wm831x_device_init()
1556 parent = WM8325; in wm831x_device_init()
1557 wm831x->num_gpio = 12; in wm831x_device_init()
1558 dev_info(wm831x->dev, "WM8325 revision %c\n", 'A' + rev); in wm831x_device_init()
1562 parent = WM8326; in wm831x_device_init()
1563 wm831x->num_gpio = 12; in wm831x_device_init()
1564 dev_info(wm831x->dev, "WM8326 revision %c\n", 'A' + rev); in wm831x_device_init()
1568 dev_err(wm831x->dev, "Unknown WM831x device %04x\n", ret); in wm831x_device_init()
1569 ret = -EINVAL; in wm831x_device_init()
1576 if (parent != wm831x->type) in wm831x_device_init()
1577 dev_warn(wm831x->dev, "Device was registered as a WM%x\n", in wm831x_device_init()
1578 wm831x->type); in wm831x_device_init()
1583 dev_err(wm831x->dev, "Failed to read security key: %d\n", ret); in wm831x_device_init()
1587 dev_warn(wm831x->dev, "Security key had non-zero value %x\n", in wm831x_device_init()
1591 wm831x->locked = 1; in wm831x_device_init()
1593 if (pdata->pre_init) { in wm831x_device_init()
1594 ret = pdata->pre_init(wm831x); in wm831x_device_init()
1596 dev_err(wm831x->dev, "pre_init() failed: %d\n", ret); in wm831x_device_init()
1601 for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) { in wm831x_device_init()
1602 if (!pdata->gpio_defaults[i]) in wm831x_device_init()
1607 pdata->gpio_defaults[i] & 0xffff); in wm831x_device_init()
1611 if (pdata->wm831x_num) in wm831x_device_init()
1612 wm831x_num = pdata->wm831x_num * 10; in wm831x_device_init()
1614 wm831x_num = -1; in wm831x_device_init()
1623 switch (parent) { in wm831x_device_init()
1625 ret = mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1631 ret = mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1634 if (!pdata->disable_touch) in wm831x_device_init()
1635 mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1641 ret = mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1644 if (!pdata->disable_touch) in wm831x_device_init()
1645 mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1654 ret = mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1665 dev_err(wm831x->dev, "Failed to add children\n"); in wm831x_device_init()
1674 dev_err(wm831x->dev, "Failed to read clock status: %d\n", ret); in wm831x_device_init()
1679 ret = mfd_add_devices(wm831x->dev, wm831x_num, in wm831x_device_init()
1683 dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); in wm831x_device_init()
1687 dev_info(wm831x->dev, "32.768kHz clock disabled, no RTC\n"); in wm831x_device_init()
1690 if (pdata->backlight) { in wm831x_device_init()
1691 /* Treat errors as non-critical */ in wm831x_device_init()
1692 ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs, in wm831x_device_init()
1696 dev_err(wm831x->dev, "Failed to add backlight: %d\n", in wm831x_device_init()
1702 if (pdata->post_init) { in wm831x_device_init()
1703 ret = pdata->post_init(wm831x); in wm831x_device_init()
1705 dev_err(wm831x->dev, "post_init() failed: %d\n", ret); in wm831x_device_init()
1715 mfd_remove_devices(wm831x->dev); in wm831x_device_init()
1728 if (wm831x->charger_irq_wake) { in wm831x_device_suspend()
1744 dev_info(wm831x->dev, in wm831x_device_suspend()
1757 if (wm831x->soft_shutdown) { in wm831x_device_shutdown()
1758 dev_info(wm831x->dev, "Initiating shutdown...\n"); in wm831x_device_shutdown()