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
83 * Arrow Lake-H (SOC) 0x7722 32 hard yes yes yes
84 * Panther Lake-H (SOC) 0xe322 32 hard yes yes yes
85 * Panther Lake-P (SOC) 0xe422 32 hard yes yes yes
94 * SMBus Host Notify yes
97 * See the file Documentation/i2c/busses/i2c-i801.rst for details.
111 #include <linux/i2c-smbus.h>
127 #include <linux/platform_data/i2c-mux-gpio.h>
130 /* I801 SMBus address offsets */
131 #define SMBHSTSTS(p) (0 + (p)->smba)
132 #define SMBHSTCNT(p) (2 + (p)->smba)
133 #define SMBHSTCMD(p) (3 + (p)->smba)
134 #define SMBHSTADD(p) (4 + (p)->smba)
135 #define SMBHSTDAT0(p) (5 + (p)->smba)
136 #define SMBHSTDAT1(p) (6 + (p)->smba)
137 #define SMBBLKDAT(p) (7 + (p)->smba)
138 #define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */
139 #define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */
140 #define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */
141 #define SMBSLVSTS(p) (16 + (p)->smba) /* ICH3 and later */
142 #define SMBSLVCMD(p) (17 + (p)->smba) /* ICH3 and later */
143 #define SMBNTFDADD(p) (20 + (p)->smba) /* ICH3 and later */
220 /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
271 unsigned gpios[2]; /* Relative to gpio_chip->base */
288 /* Command state used by isr for byte-by-byte block transactions */
322 "SMBus PEC",
327 "SMBus Host Notify",
332 MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n"
333 "\t\t 0x01 disable SMBus PEC\n"
334 "\t\t 0x02 disable the block buffer\n"
335 "\t\t 0x08 disable the I2C block read functionality\n"
337 "\t\t 0x20 disable SMBus Host Notify ");
339 /* Make sure the SMBus host is ready to start transmitting.
340 Return 0 if it is, -EBUSY if it is not. */
347 pci_err(priv->pci_dev, "SMBus is busy, can't use it!\n"); in i801_check_pre()
348 return -EBUSY; in i801_check_pre()
353 pci_dbg(priv->pci_dev, "Clearing status flags (%02x)\n", status); in i801_check_pre()
364 if (priv->features & FEATURE_SMBUS_PEC) { in i801_check_pre()
367 pci_dbg(priv->pci_dev, "Clearing aux status flags (%02x)\n", status); in i801_check_pre()
380 * If the SMBus is still busy, we give up in i801_check_post()
383 dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); in i801_check_post()
385 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); in i801_check_post()
394 dev_err(&priv->pci_dev->dev, in i801_check_post()
396 return -ETIMEDOUT; in i801_check_post()
400 result = -EIO; in i801_check_post()
401 dev_err(&priv->pci_dev->dev, "Transaction failed\n"); in i801_check_post()
419 if ((priv->features & FEATURE_SMBUS_PEC) && in i801_check_post()
422 result = -EBADMSG; in i801_check_post()
423 dev_dbg(&priv->pci_dev->dev, "PEC error\n"); in i801_check_post()
425 result = -ENXIO; in i801_check_post()
426 dev_dbg(&priv->pci_dev->dev, "No response\n"); in i801_check_post()
430 result = -EAGAIN; in i801_check_post()
431 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); in i801_check_post()
440 unsigned long timeout = jiffies + priv->adapter.timeout; in i801_wait_intr() local
450 } while (time_is_after_eq_jiffies(timeout)); in i801_wait_intr()
452 return -ETIMEDOUT; in i801_wait_intr()
458 unsigned long timeout = jiffies + priv->adapter.timeout; in i801_wait_byte_done() local
466 } while (time_is_after_eq_jiffies(timeout)); in i801_wait_byte_done()
468 return -ETIMEDOUT; in i801_wait_byte_done()
474 const struct i2c_adapter *adap = &priv->adapter; in i801_transaction()
476 if (priv->features & FEATURE_IRQ) { in i801_transaction()
477 reinit_completion(&priv->done); in i801_transaction()
480 result = wait_for_completion_timeout(&priv->done, adap->timeout); in i801_transaction()
481 return result ? priv->status : -ETIMEDOUT; in i801_transaction()
503 return -EOPNOTSUPP; in i801_block_transaction_by_block()
510 len = data->block[0]; in i801_block_transaction_by_block()
514 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_by_block()
525 status = -EPROTO; in i801_block_transaction_by_block()
529 data->block[0] = len; in i801_block_transaction_by_block()
532 data->block[i + 1] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_by_block()
541 if (priv->is_read) { in i801_isr_byte_done()
542 /* For SMBus block reads, length is received with first byte */ in i801_isr_byte_done()
543 if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && in i801_isr_byte_done()
544 (priv->count == 0)) { in i801_isr_byte_done()
545 priv->len = inb_p(SMBHSTDAT0(priv)); in i801_isr_byte_done()
546 if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { in i801_isr_byte_done()
547 dev_err(&priv->pci_dev->dev, in i801_isr_byte_done()
548 "Illegal SMBus block read size %d\n", in i801_isr_byte_done()
549 priv->len); in i801_isr_byte_done()
551 priv->len = I2C_SMBUS_BLOCK_MAX; in i801_isr_byte_done()
553 priv->data[-1] = priv->len; in i801_isr_byte_done()
557 if (priv->count < priv->len) in i801_isr_byte_done()
558 priv->data[priv->count++] = inb(SMBBLKDAT(priv)); in i801_isr_byte_done()
560 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
564 if (priv->count == priv->len - 1) in i801_isr_byte_done()
565 outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, in i801_isr_byte_done()
567 } else if (priv->count < priv->len - 1) { in i801_isr_byte_done()
569 outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); in i801_isr_byte_done()
580 * With the tested platforms, reading SMBNTFDDAT (22 + (p)->smba) in i801_host_notify_isr()
584 i2c_handle_smbus_host_notify(&priv->adapter, addr); in i801_host_notify_isr()
595 * INTR - Success
596 * DEV_ERR - Invalid command, NAK or communication timeout
597 * BUS_ERR - SMI# transaction collision
598 * FAILED - transaction was canceled due to a KILL request
599 * When any of these occur, update ->status and signal completion.
601 * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
602 * occurs for each byte of a byte-by-byte to prepare the next byte.
613 pci_read_config_word(priv->pci_dev, PCI_STATUS, &pcists); in i801_isr()
617 if (priv->features & FEATURE_HOST_NOTIFY) { in i801_isr()
637 priv->status = status & STATUS_ERROR_FLAGS; in i801_isr()
638 complete(&priv->done); in i801_isr()
645 * For "byte-by-byte" block transactions:
657 const struct i2c_adapter *adap = &priv->adapter; in i801_block_transaction_byte_by_byte()
660 return -EOPNOTSUPP; in i801_block_transaction_byte_by_byte()
662 len = data->block[0]; in i801_block_transaction_byte_by_byte()
666 outb_p(data->block[1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
675 if (priv->features & FEATURE_IRQ) { in i801_block_transaction_byte_by_byte()
676 priv->is_read = (read_write == I2C_SMBUS_READ); in i801_block_transaction_byte_by_byte()
677 if (len == 1 && priv->is_read) in i801_block_transaction_byte_by_byte()
679 priv->cmd = smbcmd | SMBHSTCNT_INTREN; in i801_block_transaction_byte_by_byte()
680 priv->len = len; in i801_block_transaction_byte_by_byte()
681 priv->count = 0; in i801_block_transaction_byte_by_byte()
682 priv->data = &data->block[1]; in i801_block_transaction_byte_by_byte()
684 reinit_completion(&priv->done); in i801_block_transaction_byte_by_byte()
685 outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
686 result = wait_for_completion_timeout(&priv->done, adap->timeout); in i801_block_transaction_byte_by_byte()
687 return result ? priv->status : -ETIMEDOUT; in i801_block_transaction_byte_by_byte()
703 dev_err(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
704 "Illegal SMBus block read size %d\n", in i801_block_transaction_byte_by_byte()
712 return -EPROTO; in i801_block_transaction_byte_by_byte()
714 data->block[0] = len; in i801_block_transaction_byte_by_byte()
718 data->block[i] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
719 if (i == len - 1) in i801_block_transaction_byte_by_byte()
724 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
758 outb_p(data->byte, SMBHSTDAT0(priv)); in i801_simple_transaction()
765 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_simple_transaction()
766 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_simple_transaction()
773 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_simple_transaction()
774 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_simple_transaction()
780 pci_err(priv->pci_dev, "Unsupported transaction %d\n", command); in i801_simple_transaction()
781 return -EOPNOTSUPP; in i801_simple_transaction()
791 data->byte = inb_p(SMBHSTDAT0(priv)); in i801_simple_transaction()
795 data->word = inb_p(SMBHSTDAT0(priv)) + in i801_simple_transaction()
811 data->block[0] = I2C_SMBUS_BLOCK_MAX; in i801_block_transaction()
812 else if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) in i801_block_transaction()
813 return -EPROTO; in i801_block_transaction()
824 * However if SPD Write Disable is set (Lynx Point and later), in i801_block_transaction()
828 priv->original_hstcfg & SMBHSTCFG_SPD_WD ? in i801_block_transaction()
840 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); in i801_block_transaction()
841 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, in i801_block_transaction()
843 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { in i801_block_transaction()
844 dev_err(&priv->pci_dev->dev, in i801_block_transaction()
846 return -EOPNOTSUPP; in i801_block_transaction()
857 SMBus (not I2C) block transactions, even though the datasheet in i801_block_transaction()
859 if ((priv->features & FEATURE_BLOCK_BUFFER) && in i801_block_transaction()
872 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); in i801_block_transaction()
885 mutex_lock(&priv->acpi_lock); in i801_access()
886 if (priv->acpi_reserved) { in i801_access()
887 mutex_unlock(&priv->acpi_lock); in i801_access()
888 return -EBUSY; in i801_access()
891 pm_runtime_get_sync(&priv->pci_dev->dev); in i801_access()
897 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) in i801_access()
901 if (hwpec) /* enable/disable hardware PEC */ in i801_access()
917 * time, so we forcibly disable it after every transaction. in i801_access()
923 * Unlock the SMBus device for use by BIOS/ACPI, in i801_access()
928 pm_runtime_mark_last_busy(&priv->pci_dev->dev); in i801_access()
929 pm_runtime_put_autosuspend(&priv->pci_dev->dev); in i801_access()
930 mutex_unlock(&priv->acpi_lock); in i801_access()
943 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | in i801_func()
944 ((priv->features & FEATURE_BLOCK_PROC) ? in i801_func()
946 ((priv->features & FEATURE_I2C_BLOCK_READ) ? in i801_func()
948 ((priv->features & FEATURE_HOST_NOTIFY) ? in i801_func()
956 if (!(priv->features & FEATURE_HOST_NOTIFY)) in i801_enable_host_notify()
962 * SMBus Alert. in i801_enable_host_notify()
965 priv->original_slvcmd, SMBSLVCMD(priv)); in i801_enable_host_notify()
973 if (!(priv->features & FEATURE_HOST_NOTIFY)) in i801_disable_host_notify()
976 outb_p(priv->original_slvcmd, SMBSLVCMD(priv)); in i801_disable_host_notify()
1074 sizeof(signature)-1)) in bios_signature()
1135 if (dm->type != 10) in dmi_check_onboard_devices()
1138 count = (dm->length - sizeof(struct dmi_header)) / 2; in dmi_check_onboard_devices()
1141 const char *name = ((char *) dm) + dm->length; in dmi_check_onboard_devices()
1147 s--; in dmi_check_onboard_devices()
1150 s--; in dmi_check_onboard_devices()
1159 /* NOTE: Keep this list in sync with drivers/platform/x86/dell-smo8800.c */
1185 if (!(info->valid & ACPI_VALID_HID)) in check_acpi_smo88xx_device()
1188 hid = info->hardware_id.string; in check_acpi_smo88xx_device()
1208 void *err = ERR_PTR(-ENOENT); in is_dell_system_with_lis3lv02d()
1266 dev_warn(&priv->pci_dev->dev, in register_dell_lis3lv02d_i2c_device()
1267 "Accelerometer lis3lv02d is present on SMBus but its" in register_dell_lis3lv02d_i2c_device()
1275 i2c_new_client_device(&priv->adapter, &info); in register_dell_lis3lv02d_i2c_device()
1281 /* Only register slaves on main SMBus channel */ in i801_probe_optional_slaves()
1282 if (priv->features & FEATURE_IDF) in i801_probe_optional_slaves()
1291 i2c_new_client_device(&priv->adapter, &info); in i801_probe_optional_slaves()
1295 dmi_walk(dmi_check_onboard_devices, &priv->adapter); in i801_probe_optional_slaves()
1300 /* Instantiate SPD EEPROMs unless the SMBus is multiplexed */ in i801_probe_optional_slaves()
1302 if (!priv->mux_drvdata) in i801_probe_optional_slaves()
1304 i2c_register_spd(&priv->adapter); in i801_probe_optional_slaves()
1334 DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"),
1341 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"),
1348 DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"),
1355 DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"),
1362 DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"),
1369 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"),
1376 DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"),
1383 DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"),
1390 DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"),
1400 struct device *dev = &priv->adapter.dev; in i801_add_mux()
1406 if (!priv->mux_drvdata) in i801_add_mux()
1408 mux_config = priv->mux_drvdata; in i801_add_mux()
1412 gpio_data.parent = priv->adapter.nr; in i801_add_mux()
1413 gpio_data.values = mux_config->values; in i801_add_mux()
1414 gpio_data.n_values = mux_config->n_values; in i801_add_mux()
1415 gpio_data.classes = mux_config->classes; in i801_add_mux()
1420 struct_size(lookup, table, mux_config->n_gpios + 1), in i801_add_mux()
1424 lookup->dev_id = "i2c-mux-gpio"; in i801_add_mux()
1425 for (i = 0; i < mux_config->n_gpios; i++) in i801_add_mux()
1426 lookup->table[i] = GPIO_LOOKUP(mux_config->gpio_chip, in i801_add_mux()
1427 mux_config->gpios[i], "mux", 0); in i801_add_mux()
1437 priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", in i801_add_mux()
1440 if (IS_ERR(priv->mux_pdev)) { in i801_add_mux()
1443 dev_err(dev, "Failed to register i2c-mux-gpio device\n"); in i801_add_mux()
1445 priv->lookup = lookup; in i801_add_mux()
1451 platform_device_unregister(priv->mux_pdev); in i801_del_mux()
1452 gpiod_remove_lookup_table(priv->lookup); in i801_del_mux()
1465 mux_config = id->driver_data; in i801_get_adapter_class()
1466 for (i = 0; i < mux_config->n_values; i++) in i801_get_adapter_class()
1467 class &= ~mux_config->classes[i]; in i801_get_adapter_class()
1470 priv->mux_drvdata = mux_config; in i801_get_adapter_class()
1502 ret = p2sb_bar(pci_dev->bus, 0, res); in i801_add_tco_spt()
1506 if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS) in i801_add_tco_spt()
1507 res->start += SBREG_SMBCTRL_DNV; in i801_add_tco_spt()
1509 res->start += SBREG_SMBCTRL; in i801_add_tco_spt()
1511 res->end = res->start + 3; in i801_add_tco_spt()
1513 return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, in i801_add_tco_spt()
1526 return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1, in i801_add_tco_cnl()
1532 struct pci_dev *pci_dev = priv->pci_dev; in i801_add_tco()
1540 if (!(priv->features & (FEATURE_TCO_SPT | FEATURE_TCO_CNL))) in i801_add_tco()
1554 res->start = tco_base & ~1; in i801_add_tco()
1555 res->end = res->start + 32 - 1; in i801_add_tco()
1556 res->flags = IORESOURCE_IO; in i801_add_tco()
1558 if (priv->features & FEATURE_TCO_CNL) in i801_add_tco()
1559 priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res); in i801_add_tco()
1561 priv->tco_pdev = i801_add_tco_spt(priv, pci_dev, tco_res); in i801_add_tco()
1563 if (IS_ERR(priv->tco_pdev)) in i801_add_tco()
1564 dev_warn(&pci_dev->dev, "failed to create iTCO device\n"); in i801_add_tco()
1571 return address >= priv->smba && in i801_acpi_is_smbus_ioport()
1572 address <= pci_resource_end(priv->pci_dev, SMBBAR); in i801_acpi_is_smbus_ioport()
1580 struct pci_dev *pdev = priv->pci_dev; in i801_acpi_io_handler()
1588 mutex_lock(&priv->acpi_lock); in i801_acpi_io_handler()
1590 if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) { in i801_acpi_io_handler()
1591 priv->acpi_reserved = true; in i801_acpi_io_handler()
1593 dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n"); in i801_acpi_io_handler()
1594 dev_warn(&pdev->dev, "Driver SMBus register access inhibited\n"); in i801_acpi_io_handler()
1600 pm_runtime_get_sync(&pdev->dev); in i801_acpi_io_handler()
1608 mutex_unlock(&priv->acpi_lock); in i801_acpi_io_handler()
1615 acpi_handle ah = ACPI_HANDLE(&priv->pci_dev->dev); in i801_acpi_probe()
1623 return acpi_check_resource_conflict(&priv->pci_dev->resource[SMBBAR]); in i801_acpi_probe()
1628 acpi_handle ah = ACPI_HANDLE(&priv->pci_dev->dev); in i801_acpi_remove()
1639 unsigned char hstcfg = priv->original_hstcfg; in i801_setup_hstcfg()
1641 hstcfg &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */ in i801_setup_hstcfg()
1643 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg); in i801_setup_hstcfg()
1651 priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); in i801_probe()
1653 return -ENOMEM; in i801_probe()
1655 i2c_set_adapdata(&priv->adapter, priv); in i801_probe()
1656 priv->adapter.owner = THIS_MODULE; in i801_probe()
1657 priv->adapter.class = i801_get_adapter_class(priv); in i801_probe()
1658 priv->adapter.algo = &smbus_algorithm; in i801_probe()
1659 priv->adapter.dev.parent = &dev->dev; in i801_probe()
1660 ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev)); in i801_probe()
1661 priv->adapter.retries = 3; in i801_probe()
1662 mutex_init(&priv->acpi_lock); in i801_probe()
1664 priv->pci_dev = dev; in i801_probe()
1665 priv->features = id->driver_data; in i801_probe()
1667 /* Disable features on user request */ in i801_probe()
1669 if (priv->features & disable_features & (1 << i)) in i801_probe()
1670 dev_notice(&dev->dev, "%s disabled by user\n", in i801_probe()
1673 priv->features &= ~disable_features; in i801_probe()
1676 if (!(priv->features & FEATURE_BLOCK_BUFFER)) in i801_probe()
1677 priv->features &= ~FEATURE_BLOCK_PROC; in i801_probe()
1681 dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n", in i801_probe()
1687 /* Determine the address of the SMBus area */ in i801_probe()
1688 priv->smba = pci_resource_start(dev, SMBBAR); in i801_probe()
1689 if (!priv->smba) { in i801_probe()
1690 dev_err(&dev->dev, in i801_probe()
1691 "SMBus base address uninitialized, upgrade BIOS\n"); in i801_probe()
1692 return -ENODEV; in i801_probe()
1696 return -ENODEV; in i801_probe()
1700 dev_err(&dev->dev, in i801_probe()
1701 "Failed to request SMBus region 0x%lx-0x%Lx\n", in i801_probe()
1702 priv->smba, in i801_probe()
1708 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg); in i801_probe()
1710 if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN)) in i801_probe()
1711 dev_info(&dev->dev, "Enabling SMBus device\n"); in i801_probe()
1713 if (priv->original_hstcfg & SMBHSTCFG_SMB_SMI_EN) { in i801_probe()
1714 dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n"); in i801_probe()
1715 /* Disable SMBus interrupt feature if SMBus using SMI# */ in i801_probe()
1716 priv->features &= ~FEATURE_IRQ; in i801_probe()
1718 if (priv->original_hstcfg & SMBHSTCFG_SPD_WD) in i801_probe()
1719 dev_info(&dev->dev, "SPD Write Disable is set\n"); in i801_probe()
1722 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) in i801_probe()
1726 /* Default timeout in interrupt mode: 200 ms */ in i801_probe()
1727 priv->adapter.timeout = HZ / 5; in i801_probe()
1729 if (dev->irq == IRQ_NOTCONNECTED) in i801_probe()
1730 priv->features &= ~FEATURE_IRQ; in i801_probe()
1732 if (priv->features & FEATURE_IRQ) { in i801_probe()
1736 pci_read_config_word(priv->pci_dev, PCI_STATUS, &pcists); in i801_probe()
1738 dev_warn(&dev->dev, "An interrupt is pending!\n"); in i801_probe()
1741 if (priv->features & FEATURE_IRQ) { in i801_probe()
1742 init_completion(&priv->done); in i801_probe()
1744 err = devm_request_irq(&dev->dev, dev->irq, i801_isr, in i801_probe()
1747 dev_err(&dev->dev, "Failed to allocate irq %d: %d\n", in i801_probe()
1748 dev->irq, err); in i801_probe()
1749 priv->features &= ~FEATURE_IRQ; in i801_probe()
1752 dev_info(&dev->dev, "SMBus using %s\n", in i801_probe()
1753 priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); in i801_probe()
1756 if (!(priv->features & FEATURE_IRQ)) in i801_probe()
1757 priv->features &= ~FEATURE_HOST_NOTIFY; in i801_probe()
1760 priv->original_hstcnt = inb_p(SMBHSTCNT(priv)) & ~SMBHSTCNT_KILL; in i801_probe()
1761 if (priv->features & FEATURE_HOST_NOTIFY) in i801_probe()
1762 priv->original_slvcmd = inb_p(SMBSLVCMD(priv)); in i801_probe()
1770 snprintf(priv->adapter.name, sizeof(priv->adapter.name), in i801_probe()
1771 "SMBus %s adapter at %04lx", in i801_probe()
1772 (priv->features & FEATURE_IDF) ? "I801 IDF" : "I801", in i801_probe()
1773 priv->smba); in i801_probe()
1775 err = i2c_add_adapter(&priv->adapter); in i801_probe()
1777 platform_device_unregister(priv->tco_pdev); in i801_probe()
1782 i801_enable_host_notify(&priv->adapter); in i801_probe()
1785 /* We ignore errors - multiplexing is optional */ in i801_probe()
1790 dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE); in i801_probe()
1791 pm_runtime_set_autosuspend_delay(&dev->dev, 1000); in i801_probe()
1792 pm_runtime_use_autosuspend(&dev->dev); in i801_probe()
1793 pm_runtime_put_autosuspend(&dev->dev); in i801_probe()
1794 pm_runtime_allow(&dev->dev); in i801_probe()
1803 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_remove()
1806 i2c_del_adapter(&priv->adapter); in i801_remove()
1808 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_remove()
1810 platform_device_unregister(priv->tco_pdev); in i801_remove()
1813 if (!priv->acpi_reserved) in i801_remove()
1814 pm_runtime_get_noresume(&dev->dev); in i801_remove()
1818 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010) in i801_remove()
1827 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_shutdown()
1829 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_shutdown()
1836 outb_p(priv->original_hstcnt, SMBHSTCNT(priv)); in i801_suspend()
1837 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, priv->original_hstcfg); in i801_suspend()
1846 i801_enable_host_notify(&priv->adapter); in i801_resume()
1879 MODULE_DESCRIPTION("I801 SMBus driver");