• Home
  • Raw
  • Download

Lines Matching +full:smbus +full:- +full:timeout +full:- +full:disable

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 Copyright (c) 1998 - 2002 Frodo Looijaard <frodol@dds.nl>,
6 Copyright (C) 2007 - 2014 Jean Delvare <jdelvare@suse.de>
16 * region SMBus Block proc. block
18 * ---------------------------------------------------------------------------
43 * Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes
51 * Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes
54 * Sunrise Point-H (PCH) 0xa123 32 hard yes yes yes
55 * Sunrise Point-LP (PCH) 0x9d23 32 hard yes yes yes
61 * Kaby Lake PCH-H (PCH) 0xa2a3 32 hard yes yes yes
63 * Cannon Lake-H (PCH) 0xa323 32 hard yes yes yes
64 * Cannon Lake-LP (PCH) 0x9da3 32 hard yes yes yes
66 * Ice Lake-LP (PCH) 0x34a3 32 hard yes yes yes
67 * Ice Lake-N (PCH) 0x38a3 32 hard yes yes yes
69 * Comet Lake-H (PCH) 0x06a3 32 hard yes yes yes
71 * Tiger Lake-LP (PCH) 0xa0a3 32 hard yes yes yes
72 * Tiger Lake-H (PCH) 0x43a3 32 hard yes yes yes
74 * Comet Lake-V (PCH) 0xa3a3 32 hard yes yes yes
75 * Alder Lake-S (PCH) 0x7aa3 32 hard yes yes yes
76 * Alder Lake-P (PCH) 0x51a3 32 hard yes yes yes
77 * Alder Lake-M (PCH) 0x54a3 32 hard yes yes yes
78 * Raptor Lake-S (PCH) 0x7a23 32 hard yes yes yes
79 * Meteor Lake-P (SOC) 0x7e22 32 hard yes yes yes
80 * Meteor Lake SoC-S (SOC) 0xae22 32 hard yes yes yes
81 * Meteor Lake PCH-S (PCH) 0x7f23 32 hard yes yes yes
91 * SMBus Host Notify yes
94 * See the file Documentation/i2c/busses/i2c-i801.rst for details.
108 #include <linux/i2c-smbus.h>
124 #include <linux/platform_data/i2c-mux-gpio.h>
127 /* I801 SMBus address offsets */
128 #define SMBHSTSTS(p) (0 + (p)->smba)
129 #define SMBHSTCNT(p) (2 + (p)->smba)
130 #define SMBHSTCMD(p) (3 + (p)->smba)
131 #define SMBHSTADD(p) (4 + (p)->smba)
132 #define SMBHSTDAT0(p) (5 + (p)->smba)
133 #define SMBHSTDAT1(p) (6 + (p)->smba)
134 #define SMBBLKDAT(p) (7 + (p)->smba)
135 #define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */
136 #define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */
137 #define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */
138 #define SMBSLVSTS(p) (16 + (p)->smba) /* ICH3 and later */
139 #define SMBSLVCMD(p) (17 + (p)->smba) /* ICH3 and later */
140 #define SMBNTFDADD(p) (20 + (p)->smba) /* ICH3 and later */
217 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
265 unsigned gpios[2]; /* Relative to gpio_chip->base */
282 /* Command state used by isr for byte-by-byte block transactions */
316 "SMBus PEC",
321 "SMBus Host Notify",
326 MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n"
327 "\t\t 0x01 disable SMBus PEC\n"
328 "\t\t 0x02 disable the block buffer\n"
329 "\t\t 0x08 disable the I2C block read functionality\n"
331 "\t\t 0x20 disable SMBus Host Notify ");
333 /* Make sure the SMBus host is ready to start transmitting.
334 Return 0 if it is, -EBUSY if it is not. */
341 pci_err(priv->pci_dev, "SMBus is busy, can't use it!\n"); in i801_check_pre()
342 return -EBUSY; in i801_check_pre()
347 pci_dbg(priv->pci_dev, "Clearing status flags (%02x)\n", status); in i801_check_pre()
358 if (priv->features & FEATURE_SMBUS_PEC) { in i801_check_pre()
361 pci_dbg(priv->pci_dev, "Clearing aux status flags (%02x)\n", status); in i801_check_pre()
374 * If the SMBus is still busy, we give up in i801_check_post()
377 dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); in i801_check_post()
379 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); in i801_check_post()
388 dev_err(&priv->pci_dev->dev, in i801_check_post()
390 return -ETIMEDOUT; in i801_check_post()
394 result = -EIO; in i801_check_post()
395 dev_err(&priv->pci_dev->dev, "Transaction failed\n"); in i801_check_post()
413 if ((priv->features & FEATURE_SMBUS_PEC) && in i801_check_post()
416 result = -EBADMSG; in i801_check_post()
417 dev_dbg(&priv->pci_dev->dev, "PEC error\n"); in i801_check_post()
419 result = -ENXIO; in i801_check_post()
420 dev_dbg(&priv->pci_dev->dev, "No response\n"); in i801_check_post()
424 result = -EAGAIN; in i801_check_post()
425 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); in i801_check_post()
434 unsigned long timeout = jiffies + priv->adapter.timeout; in i801_wait_intr() local
444 } while (time_is_after_eq_jiffies(timeout)); in i801_wait_intr()
446 return -ETIMEDOUT; in i801_wait_intr()
452 unsigned long timeout = jiffies + priv->adapter.timeout; in i801_wait_byte_done() local
460 } while (time_is_after_eq_jiffies(timeout)); in i801_wait_byte_done()
462 return -ETIMEDOUT; in i801_wait_byte_done()
468 const struct i2c_adapter *adap = &priv->adapter; in i801_transaction()
470 if (priv->features & FEATURE_IRQ) { in i801_transaction()
471 reinit_completion(&priv->done); in i801_transaction()
474 result = wait_for_completion_timeout(&priv->done, adap->timeout); in i801_transaction()
475 return result ? priv->status : -ETIMEDOUT; in i801_transaction()
497 return -EOPNOTSUPP; in i801_block_transaction_by_block()
504 len = data->block[0]; in i801_block_transaction_by_block()
508 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_by_block()
519 status = -EPROTO; in i801_block_transaction_by_block()
523 data->block[0] = len; in i801_block_transaction_by_block()
526 data->block[i + 1] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_by_block()
535 if (priv->is_read) { in i801_isr_byte_done()
536 /* For SMBus block reads, length is received with first byte */ in i801_isr_byte_done()
537 if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && in i801_isr_byte_done()
538 (priv->count == 0)) { in i801_isr_byte_done()
539 priv->len = inb_p(SMBHSTDAT0(priv)); in i801_isr_byte_done()
540 if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { in i801_isr_byte_done()
541 dev_err(&priv->pci_dev->dev, in i801_isr_byte_done()
542 "Illegal SMBus block read size %d\n", in i801_isr_byte_done()
543 priv->len); in i801_isr_byte_done()
545 priv->len = I2C_SMBUS_BLOCK_MAX; in i801_isr_byte_done()
547 priv->data[-1] = priv->len; in i801_isr_byte_done()
551 if (priv->count < priv->len) in i801_isr_byte_done()
552 priv->data[priv->count++] = inb(SMBBLKDAT(priv)); in i801_isr_byte_done()
554 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
558 if (priv->count == priv->len - 1) in i801_isr_byte_done()
559 outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, in i801_isr_byte_done()
561 } else if (priv->count < priv->len - 1) { in i801_isr_byte_done()
563 outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); in i801_isr_byte_done()
574 * With the tested platforms, reading SMBNTFDDAT (22 + (p)->smba) in i801_host_notify_isr()
578 i2c_handle_smbus_host_notify(&priv->adapter, addr); in i801_host_notify_isr()
589 * INTR - Success
590 * DEV_ERR - Invalid command, NAK or communication timeout
591 * BUS_ERR - SMI# transaction collision
592 * FAILED - transaction was canceled due to a KILL request
593 * When any of these occur, update ->status and signal completion.
595 * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
596 * occurs for each byte of a byte-by-byte to prepare the next byte.
607 pci_read_config_word(priv->pci_dev, PCI_STATUS, &pcists); in i801_isr()
611 if (priv->features & FEATURE_HOST_NOTIFY) { in i801_isr()
631 priv->status = status & STATUS_ERROR_FLAGS; in i801_isr()
632 complete(&priv->done); in i801_isr()
639 * For "byte-by-byte" block transactions:
651 const struct i2c_adapter *adap = &priv->adapter; in i801_block_transaction_byte_by_byte()
654 return -EOPNOTSUPP; in i801_block_transaction_byte_by_byte()
656 len = data->block[0]; in i801_block_transaction_byte_by_byte()
660 outb_p(data->block[1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
669 if (priv->features & FEATURE_IRQ) { in i801_block_transaction_byte_by_byte()
670 priv->is_read = (read_write == I2C_SMBUS_READ); in i801_block_transaction_byte_by_byte()
671 if (len == 1 && priv->is_read) in i801_block_transaction_byte_by_byte()
673 priv->cmd = smbcmd | SMBHSTCNT_INTREN; in i801_block_transaction_byte_by_byte()
674 priv->len = len; in i801_block_transaction_byte_by_byte()
675 priv->count = 0; in i801_block_transaction_byte_by_byte()
676 priv->data = &data->block[1]; in i801_block_transaction_byte_by_byte()
678 reinit_completion(&priv->done); in i801_block_transaction_byte_by_byte()
679 outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
680 result = wait_for_completion_timeout(&priv->done, adap->timeout); in i801_block_transaction_byte_by_byte()
681 return result ? priv->status : -ETIMEDOUT; in i801_block_transaction_byte_by_byte()
697 dev_err(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
698 "Illegal SMBus block read size %d\n", in i801_block_transaction_byte_by_byte()
706 return -EPROTO; in i801_block_transaction_byte_by_byte()
708 data->block[0] = len; in i801_block_transaction_byte_by_byte()
712 data->block[i] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
713 if (i == len - 1) in i801_block_transaction_byte_by_byte()
718 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
752 outb_p(data->byte, SMBHSTDAT0(priv)); in i801_simple_transaction()
759 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_simple_transaction()
760 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_simple_transaction()
767 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_simple_transaction()
768 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_simple_transaction()
774 pci_err(priv->pci_dev, "Unsupported transaction %d\n", command); in i801_simple_transaction()
775 return -EOPNOTSUPP; in i801_simple_transaction()
785 data->byte = inb_p(SMBHSTDAT0(priv)); in i801_simple_transaction()
789 data->word = inb_p(SMBHSTDAT0(priv)) + in i801_simple_transaction()
805 data->block[0] = I2C_SMBUS_BLOCK_MAX; in i801_block_transaction()
806 else if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) in i801_block_transaction()
807 return -EPROTO; in i801_block_transaction()
818 * However if SPD Write Disable is set (Lynx Point and later), in i801_block_transaction()
822 priv->original_hstcfg & SMBHSTCFG_SPD_WD ? in i801_block_transaction()
834 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); in i801_block_transaction()
835 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, in i801_block_transaction()
837 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { in i801_block_transaction()
838 dev_err(&priv->pci_dev->dev, in i801_block_transaction()
840 return -EOPNOTSUPP; in i801_block_transaction()
851 SMBus (not I2C) block transactions, even though the datasheet in i801_block_transaction()
853 if ((priv->features & FEATURE_BLOCK_BUFFER) && in i801_block_transaction()
866 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); in i801_block_transaction()
879 mutex_lock(&priv->acpi_lock); in i801_access()
880 if (priv->acpi_reserved) { in i801_access()
881 mutex_unlock(&priv->acpi_lock); in i801_access()
882 return -EBUSY; in i801_access()
885 pm_runtime_get_sync(&priv->pci_dev->dev); in i801_access()
891 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) in i801_access()
895 if (hwpec) /* enable/disable hardware PEC */ in i801_access()
911 * time, so we forcibly disable it after every transaction. in i801_access()
917 * Unlock the SMBus device for use by BIOS/ACPI, in i801_access()
922 pm_runtime_mark_last_busy(&priv->pci_dev->dev); in i801_access()
923 pm_runtime_put_autosuspend(&priv->pci_dev->dev); in i801_access()
924 mutex_unlock(&priv->acpi_lock); in i801_access()
937 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | in i801_func()
938 ((priv->features & FEATURE_BLOCK_PROC) ? in i801_func()
940 ((priv->features & FEATURE_I2C_BLOCK_READ) ? in i801_func()
942 ((priv->features & FEATURE_HOST_NOTIFY) ? in i801_func()
950 if (!(priv->features & FEATURE_HOST_NOTIFY)) in i801_enable_host_notify()
956 * SMBus Alert. in i801_enable_host_notify()
959 priv->original_slvcmd, SMBSLVCMD(priv)); in i801_enable_host_notify()
967 if (!(priv->features & FEATURE_HOST_NOTIFY)) in i801_disable_host_notify()
970 outb_p(priv->original_slvcmd, SMBSLVCMD(priv)); in i801_disable_host_notify()
1065 sizeof(signature)-1)) in bios_signature()
1126 if (dm->type != 10) in dmi_check_onboard_devices()
1129 count = (dm->length - sizeof(struct dmi_header)) / 2; in dmi_check_onboard_devices()
1132 const char *name = ((char *) dm) + dm->length; in dmi_check_onboard_devices()
1138 s--; in dmi_check_onboard_devices()
1141 s--; in dmi_check_onboard_devices()
1150 /* NOTE: Keep this list in sync with drivers/platform/x86/dell-smo8800.c */
1176 if (!(info->valid & ACPI_VALID_HID)) in check_acpi_smo88xx_device()
1179 hid = info->hardware_id.string; in check_acpi_smo88xx_device()
1199 void *err = ERR_PTR(-ENOENT); in is_dell_system_with_lis3lv02d()
1257 dev_warn(&priv->pci_dev->dev, in register_dell_lis3lv02d_i2c_device()
1258 "Accelerometer lis3lv02d is present on SMBus but its" in register_dell_lis3lv02d_i2c_device()
1266 i2c_new_client_device(&priv->adapter, &info); in register_dell_lis3lv02d_i2c_device()
1272 /* Only register slaves on main SMBus channel */ in i801_probe_optional_slaves()
1273 if (priv->features & FEATURE_IDF) in i801_probe_optional_slaves()
1282 i2c_new_client_device(&priv->adapter, &info); in i801_probe_optional_slaves()
1286 dmi_walk(dmi_check_onboard_devices, &priv->adapter); in i801_probe_optional_slaves()
1291 /* Instantiate SPD EEPROMs unless the SMBus is multiplexed */ in i801_probe_optional_slaves()
1293 if (!priv->mux_drvdata) in i801_probe_optional_slaves()
1295 i2c_register_spd(&priv->adapter); in i801_probe_optional_slaves()
1325 DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"),
1332 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"),
1339 DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"),
1346 DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"),
1353 DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"),
1360 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"),
1367 DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"),
1374 DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"),
1381 DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"),
1391 struct device *dev = &priv->adapter.dev; in i801_add_mux()
1397 if (!priv->mux_drvdata) in i801_add_mux()
1399 mux_config = priv->mux_drvdata; in i801_add_mux()
1403 gpio_data.parent = priv->adapter.nr; in i801_add_mux()
1404 gpio_data.values = mux_config->values; in i801_add_mux()
1405 gpio_data.n_values = mux_config->n_values; in i801_add_mux()
1406 gpio_data.classes = mux_config->classes; in i801_add_mux()
1411 struct_size(lookup, table, mux_config->n_gpios + 1), in i801_add_mux()
1415 lookup->dev_id = "i2c-mux-gpio"; in i801_add_mux()
1416 for (i = 0; i < mux_config->n_gpios; i++) in i801_add_mux()
1417 lookup->table[i] = GPIO_LOOKUP(mux_config->gpio_chip, in i801_add_mux()
1418 mux_config->gpios[i], "mux", 0); in i801_add_mux()
1420 priv->lookup = lookup; in i801_add_mux()
1429 priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", in i801_add_mux()
1432 if (IS_ERR(priv->mux_pdev)) { in i801_add_mux()
1434 dev_err(dev, "Failed to register i2c-mux-gpio device\n"); in i801_add_mux()
1440 platform_device_unregister(priv->mux_pdev); in i801_del_mux()
1441 gpiod_remove_lookup_table(priv->lookup); in i801_del_mux()
1454 mux_config = id->driver_data; in i801_get_adapter_class()
1455 for (i = 0; i < mux_config->n_values; i++) in i801_get_adapter_class()
1456 class &= ~mux_config->classes[i]; in i801_get_adapter_class()
1459 priv->mux_drvdata = mux_config; in i801_get_adapter_class()
1491 ret = p2sb_bar(pci_dev->bus, 0, res); in i801_add_tco_spt()
1495 if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) in i801_add_tco_spt()
1496 res->start += SBREG_SMBCTRL_DNV; in i801_add_tco_spt()
1498 res->start += SBREG_SMBCTRL; in i801_add_tco_spt()
1500 res->end = res->start + 3; in i801_add_tco_spt()
1502 return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, in i801_add_tco_spt()
1515 return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, in i801_add_tco_cnl()
1521 struct pci_dev *pci_dev = priv->pci_dev; in i801_add_tco()
1529 if (!(priv->features & (FEATURE_TCO_SPT | FEATURE_TCO_CNL))) in i801_add_tco()
1543 res->start = tco_base & ~1; in i801_add_tco()
1544 res->end = res->start + 32 - 1; in i801_add_tco()
1545 res->flags = IORESOURCE_IO; in i801_add_tco()
1547 if (priv->features & FEATURE_TCO_CNL) in i801_add_tco()
1548 priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); in i801_add_tco()
1550 priv->tco_pdev = i801_add_tco_spt(priv, pci_dev, tco_res); in i801_add_tco()
1552 if (IS_ERR(priv->tco_pdev)) in i801_add_tco()
1553 dev_warn(&pci_dev->dev, "failed to create iTCO device\n"); in i801_add_tco()
1560 return address >= priv->smba && in i801_acpi_is_smbus_ioport()
1561 address <= pci_resource_end(priv->pci_dev, SMBBAR); in i801_acpi_is_smbus_ioport()
1569 struct pci_dev *pdev = priv->pci_dev; in i801_acpi_io_handler()
1577 mutex_lock(&priv->acpi_lock); in i801_acpi_io_handler()
1579 if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) { in i801_acpi_io_handler()
1580 priv->acpi_reserved = true; in i801_acpi_io_handler()
1582 dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); in i801_acpi_io_handler()
1583 dev_warn(&pdev->dev, "Driver SMBus register access inhibited\n"); in i801_acpi_io_handler()
1589 pm_runtime_get_sync(&pdev->dev); in i801_acpi_io_handler()
1597 mutex_unlock(&priv->acpi_lock); in i801_acpi_io_handler()
1604 acpi_handle ah = ACPI_HANDLE(&priv->pci_dev->dev); in i801_acpi_probe()
1612 return acpi_check_resource_conflict(&priv->pci_dev->resource[SMBBAR]); in i801_acpi_probe()
1617 acpi_handle ah = ACPI_HANDLE(&priv->pci_dev->dev); in i801_acpi_remove()
1628 unsigned char hstcfg = priv->original_hstcfg; in i801_setup_hstcfg()
1630 hstcfg &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ in i801_setup_hstcfg()
1632 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg); in i801_setup_hstcfg()
1640 priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); in i801_probe()
1642 return -ENOMEM; in i801_probe()
1644 i2c_set_adapdata(&priv->adapter, priv); in i801_probe()
1645 priv->adapter.owner = THIS_MODULE; in i801_probe()
1646 priv->adapter.class = i801_get_adapter_class(priv); in i801_probe()
1647 priv->adapter.algo = &smbus_algorithm; in i801_probe()
1648 priv->adapter.dev.parent = &dev->dev; in i801_probe()
1649 ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev)); in i801_probe()
1650 priv->adapter.retries = 3; in i801_probe()
1651 mutex_init(&priv->acpi_lock); in i801_probe()
1653 priv->pci_dev = dev; in i801_probe()
1654 priv->features = id->driver_data; in i801_probe()
1656 /* Disable features on user request */ in i801_probe()
1658 if (priv->features & disable_features & (1 << i)) in i801_probe()
1659 dev_notice(&dev->dev, "%s disabled by user\n", in i801_probe()
1662 priv->features &= ~disable_features; in i801_probe()
1665 if (!(priv->features & FEATURE_BLOCK_BUFFER)) in i801_probe()
1666 priv->features &= ~FEATURE_BLOCK_PROC; in i801_probe()
1670 dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n", in i801_probe()
1676 /* Determine the address of the SMBus area */ in i801_probe()
1677 priv->smba = pci_resource_start(dev, SMBBAR); in i801_probe()
1678 if (!priv->smba) { in i801_probe()
1679 dev_err(&dev->dev, in i801_probe()
1680 "SMBus base address uninitialized, upgrade BIOS\n"); in i801_probe()
1681 return -ENODEV; in i801_probe()
1685 return -ENODEV; in i801_probe()
1689 dev_err(&dev->dev, in i801_probe()
1690 "Failed to request SMBus region 0x%lx-0x%Lx\n", in i801_probe()
1691 priv->smba, in i801_probe()
1697 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg); in i801_probe()
1699 if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN)) in i801_probe()
1700 dev_info(&dev->dev, "Enabling SMBus device\n"); in i801_probe()
1702 if (priv->original_hstcfg & SMBHSTCFG_SMB_SMI_EN) { in i801_probe()
1703 dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n"); in i801_probe()
1704 /* Disable SMBus interrupt feature if SMBus using SMI# */ in i801_probe()
1705 priv->features &= ~FEATURE_IRQ; in i801_probe()
1707 if (priv->original_hstcfg & SMBHSTCFG_SPD_WD) in i801_probe()
1708 dev_info(&dev->dev, "SPD Write Disable is set\n"); in i801_probe()
1711 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) in i801_probe()
1715 /* Default timeout in interrupt mode: 200 ms */ in i801_probe()
1716 priv->adapter.timeout = HZ / 5; in i801_probe()
1718 if (dev->irq == IRQ_NOTCONNECTED) in i801_probe()
1719 priv->features &= ~FEATURE_IRQ; in i801_probe()
1721 if (priv->features & FEATURE_IRQ) { in i801_probe()
1725 pci_read_config_word(priv->pci_dev, PCI_STATUS, &pcists); in i801_probe()
1727 dev_warn(&dev->dev, "An interrupt is pending!\n"); in i801_probe()
1730 if (priv->features & FEATURE_IRQ) { in i801_probe()
1731 init_completion(&priv->done); in i801_probe()
1733 err = devm_request_irq(&dev->dev, dev->irq, i801_isr, in i801_probe()
1736 dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", in i801_probe()
1737 dev->irq, err); in i801_probe()
1738 priv->features &= ~FEATURE_IRQ; in i801_probe()
1741 dev_info(&dev->dev, "SMBus using %s\n", in i801_probe()
1742 priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); in i801_probe()
1745 if (!(priv->features & FEATURE_IRQ)) in i801_probe()
1746 priv->features &= ~FEATURE_HOST_NOTIFY; in i801_probe()
1749 priv->original_hstcnt = inb_p(SMBHSTCNT(priv)) & ~SMBHSTCNT_KILL; in i801_probe()
1750 if (priv->features & FEATURE_HOST_NOTIFY) in i801_probe()
1751 priv->original_slvcmd = inb_p(SMBSLVCMD(priv)); in i801_probe()
1755 snprintf(priv->adapter.name, sizeof(priv->adapter.name), in i801_probe()
1756 "SMBus I801 adapter at %04lx", priv->smba); in i801_probe()
1757 err = i2c_add_adapter(&priv->adapter); in i801_probe()
1759 platform_device_unregister(priv->tco_pdev); in i801_probe()
1764 i801_enable_host_notify(&priv->adapter); in i801_probe()
1767 /* We ignore errors - multiplexing is optional */ in i801_probe()
1772 dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); in i801_probe()
1773 pm_runtime_set_autosuspend_delay(&dev->dev, 1000); in i801_probe()
1774 pm_runtime_use_autosuspend(&dev->dev); in i801_probe()
1775 pm_runtime_put_autosuspend(&dev->dev); in i801_probe()
1776 pm_runtime_allow(&dev->dev); in i801_probe()
1785 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_remove()
1788 i2c_del_adapter(&priv->adapter); in i801_remove()
1790 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_remove()
1792 platform_device_unregister(priv->tco_pdev); in i801_remove()
1795 if (!priv->acpi_reserved) in i801_remove()
1796 pm_runtime_get_noresume(&dev->dev); in i801_remove()
1800 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010) in i801_remove()
1809 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_shutdown()
1811 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_shutdown()
1818 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_suspend()
1819 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, priv->original_hstcfg); in i801_suspend()
1828 i801_enable_host_notify(&priv->adapter); in i801_resume()
1861 MODULE_DESCRIPTION("I801 SMBus driver");