Lines Matching refs:priv

276 static int i801_check_pre(struct i801_priv *priv)  in i801_check_pre()  argument
280 status = inb_p(SMBHSTSTS(priv)); in i801_check_pre()
282 dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n"); in i801_check_pre()
288 dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n", in i801_check_pre()
290 outb_p(status, SMBHSTSTS(priv)); in i801_check_pre()
291 status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS; in i801_check_pre()
293 dev_err(&priv->pci_dev->dev, in i801_check_pre()
308 static int i801_check_post(struct i801_priv *priv, int status) in i801_check_post() argument
319 dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); in i801_check_post()
321 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); in i801_check_post()
322 outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL, in i801_check_post()
323 SMBHSTCNT(priv)); in i801_check_post()
325 outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL), in i801_check_post()
326 SMBHSTCNT(priv)); in i801_check_post()
329 status = inb_p(SMBHSTSTS(priv)); in i801_check_post()
332 dev_err(&priv->pci_dev->dev, in i801_check_post()
334 outb_p(STATUS_FLAGS, SMBHSTSTS(priv)); in i801_check_post()
340 dev_err(&priv->pci_dev->dev, "Transaction failed\n"); in i801_check_post()
344 dev_dbg(&priv->pci_dev->dev, "No response\n"); in i801_check_post()
348 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); in i801_check_post()
352 outb_p(status, SMBHSTSTS(priv)); in i801_check_post()
358 static int i801_wait_intr(struct i801_priv *priv) in i801_wait_intr() argument
366 status = inb_p(SMBHSTSTS(priv)); in i801_wait_intr()
372 dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n"); in i801_wait_intr()
379 static int i801_wait_byte_done(struct i801_priv *priv) in i801_wait_byte_done() argument
387 status = inb_p(SMBHSTSTS(priv)); in i801_wait_byte_done()
392 dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n"); in i801_wait_byte_done()
398 static int i801_transaction(struct i801_priv *priv, int xact) in i801_transaction() argument
402 const struct i2c_adapter *adap = &priv->adapter; in i801_transaction()
404 result = i801_check_pre(priv); in i801_transaction()
408 if (priv->features & FEATURE_IRQ) { in i801_transaction()
410 SMBHSTCNT(priv)); in i801_transaction()
411 result = wait_event_timeout(priv->waitq, in i801_transaction()
412 (status = priv->status), in i801_transaction()
416 dev_warn(&priv->pci_dev->dev, in i801_transaction()
419 priv->status = 0; in i801_transaction()
420 return i801_check_post(priv, status); in i801_transaction()
425 outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_transaction()
427 status = i801_wait_intr(priv); in i801_transaction()
428 return i801_check_post(priv, status); in i801_transaction()
431 static int i801_block_transaction_by_block(struct i801_priv *priv, in i801_block_transaction_by_block() argument
438 inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */ in i801_block_transaction_by_block()
443 outb_p(len, SMBHSTDAT0(priv)); in i801_block_transaction_by_block()
445 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_by_block()
448 status = i801_transaction(priv, I801_BLOCK_DATA | in i801_block_transaction_by_block()
454 len = inb_p(SMBHSTDAT0(priv)); in i801_block_transaction_by_block()
460 data->block[i + 1] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_by_block()
465 static void i801_isr_byte_done(struct i801_priv *priv) in i801_isr_byte_done() argument
467 if (priv->is_read) { in i801_isr_byte_done()
469 if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && in i801_isr_byte_done()
470 (priv->count == 0)) { in i801_isr_byte_done()
471 priv->len = inb_p(SMBHSTDAT0(priv)); in i801_isr_byte_done()
472 if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { in i801_isr_byte_done()
473 dev_err(&priv->pci_dev->dev, in i801_isr_byte_done()
475 priv->len); in i801_isr_byte_done()
477 priv->len = I2C_SMBUS_BLOCK_MAX; in i801_isr_byte_done()
479 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
481 priv->len); in i801_isr_byte_done()
483 priv->data[-1] = priv->len; in i801_isr_byte_done()
487 if (priv->count < priv->len) in i801_isr_byte_done()
488 priv->data[priv->count++] = inb(SMBBLKDAT(priv)); in i801_isr_byte_done()
490 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
494 if (priv->count == priv->len - 1) in i801_isr_byte_done()
495 outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, in i801_isr_byte_done()
496 SMBHSTCNT(priv)); in i801_isr_byte_done()
497 } else if (priv->count < priv->len - 1) { in i801_isr_byte_done()
499 outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); in i801_isr_byte_done()
503 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); in i801_isr_byte_done()
522 struct i801_priv *priv = dev_id; in i801_isr() local
527 pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); in i801_isr()
531 status = inb_p(SMBHSTSTS(priv)); in i801_isr()
533 i801_isr_byte_done(priv); in i801_isr()
541 outb_p(status, SMBHSTSTS(priv)); in i801_isr()
542 priv->status |= status; in i801_isr()
543 wake_up(&priv->waitq); in i801_isr()
554 static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, in i801_block_transaction_byte_by_byte() argument
563 const struct i2c_adapter *adap = &priv->adapter; in i801_block_transaction_byte_by_byte()
565 result = i801_check_pre(priv); in i801_block_transaction_byte_by_byte()
572 outb_p(len, SMBHSTDAT0(priv)); in i801_block_transaction_byte_by_byte()
573 outb_p(data->block[1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
582 if (priv->features & FEATURE_IRQ) { in i801_block_transaction_byte_by_byte()
583 priv->is_read = (read_write == I2C_SMBUS_READ); in i801_block_transaction_byte_by_byte()
584 if (len == 1 && priv->is_read) in i801_block_transaction_byte_by_byte()
586 priv->cmd = smbcmd | SMBHSTCNT_INTREN; in i801_block_transaction_byte_by_byte()
587 priv->len = len; in i801_block_transaction_byte_by_byte()
588 priv->count = 0; in i801_block_transaction_byte_by_byte()
589 priv->data = &data->block[1]; in i801_block_transaction_byte_by_byte()
591 outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
592 result = wait_event_timeout(priv->waitq, in i801_block_transaction_byte_by_byte()
593 (status = priv->status), in i801_block_transaction_byte_by_byte()
597 dev_warn(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
600 priv->status = 0; in i801_block_transaction_byte_by_byte()
601 return i801_check_post(priv, status); in i801_block_transaction_byte_by_byte()
607 outb_p(smbcmd, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
610 outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START, in i801_block_transaction_byte_by_byte()
611 SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
613 status = i801_wait_byte_done(priv); in i801_block_transaction_byte_by_byte()
619 len = inb_p(SMBHSTDAT0(priv)); in i801_block_transaction_byte_by_byte()
621 dev_err(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
625 while (inb_p(SMBHSTSTS(priv)) & in i801_block_transaction_byte_by_byte()
628 SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
629 outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
637 data->block[i] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
639 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
642 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
645 status = i801_wait_intr(priv); in i801_block_transaction_byte_by_byte()
647 return i801_check_post(priv, status); in i801_block_transaction_byte_by_byte()
650 static int i801_set_block_buffer_mode(struct i801_priv *priv) in i801_set_block_buffer_mode() argument
652 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv)); in i801_set_block_buffer_mode()
653 if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0) in i801_set_block_buffer_mode()
659 static int i801_block_transaction(struct i801_priv *priv, in i801_block_transaction() argument
669 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); in i801_block_transaction()
670 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, in i801_block_transaction()
672 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { in i801_block_transaction()
673 dev_err(&priv->pci_dev->dev, in i801_block_transaction()
692 if ((priv->features & FEATURE_BLOCK_BUFFER) in i801_block_transaction()
694 && i801_set_block_buffer_mode(priv) == 0) in i801_block_transaction()
695 result = i801_block_transaction_by_block(priv, data, in i801_block_transaction()
698 result = i801_block_transaction_byte_by_byte(priv, data, in i801_block_transaction()
705 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); in i801_block_transaction()
718 struct i801_priv *priv = i2c_get_adapdata(adap); in i801_access() local
720 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) in i801_access()
727 SMBHSTADD(priv)); in i801_access()
732 SMBHSTADD(priv)); in i801_access()
734 outb_p(command, SMBHSTCMD(priv)); in i801_access()
739 SMBHSTADD(priv)); in i801_access()
740 outb_p(command, SMBHSTCMD(priv)); in i801_access()
742 outb_p(data->byte, SMBHSTDAT0(priv)); in i801_access()
747 SMBHSTADD(priv)); in i801_access()
748 outb_p(command, SMBHSTCMD(priv)); in i801_access()
750 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_access()
751 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_access()
757 SMBHSTADD(priv)); in i801_access()
758 outb_p(command, SMBHSTCMD(priv)); in i801_access()
764 outb_p((addr & 0x7f) << 1, SMBHSTADD(priv)); in i801_access()
768 outb_p(command, SMBHSTDAT1(priv)); in i801_access()
770 outb_p(command, SMBHSTCMD(priv)); in i801_access()
774 dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n", in i801_access()
780 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv)); in i801_access()
782 outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC), in i801_access()
783 SMBAUXCTL(priv)); in i801_access()
786 ret = i801_block_transaction(priv, data, read_write, size, in i801_access()
789 ret = i801_transaction(priv, xact); in i801_access()
795 outb_p(inb_p(SMBAUXCTL(priv)) & in i801_access()
796 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); in i801_access()
808 data->byte = inb_p(SMBHSTDAT0(priv)); in i801_access()
811 data->word = inb_p(SMBHSTDAT0(priv)) + in i801_access()
812 (inb_p(SMBHSTDAT1(priv)) << 8); in i801_access()
821 struct i801_priv *priv = i2c_get_adapdata(adapter); in i801_func() local
826 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | in i801_func()
827 ((priv->features & FEATURE_I2C_BLOCK_READ) ? in i801_func()
980 static void i801_probe_optional_slaves(struct i801_priv *priv) in i801_probe_optional_slaves() argument
983 if (priv->features & FEATURE_IDF) in i801_probe_optional_slaves()
992 i2c_new_device(&priv->adapter, &info); in i801_probe_optional_slaves()
996 dmi_walk(dmi_check_onboard_devices, &priv->adapter); in i801_probe_optional_slaves()
1000 static void i801_probe_optional_slaves(struct i801_priv *priv) {} in i801_probe_optional_slaves() argument
1091 static int i801_add_mux(struct i801_priv *priv) in i801_add_mux() argument
1093 struct device *dev = &priv->adapter.dev; in i801_add_mux()
1098 if (!priv->mux_drvdata) in i801_add_mux()
1100 mux_config = priv->mux_drvdata; in i801_add_mux()
1104 gpio_data.parent = priv->adapter.nr; in i801_add_mux()
1114 priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", in i801_add_mux()
1117 if (IS_ERR(priv->mux_pdev)) { in i801_add_mux()
1118 err = PTR_ERR(priv->mux_pdev); in i801_add_mux()
1119 priv->mux_pdev = NULL; in i801_add_mux()
1127 static void i801_del_mux(struct i801_priv *priv) in i801_del_mux() argument
1129 if (priv->mux_pdev) in i801_del_mux()
1130 platform_device_unregister(priv->mux_pdev); in i801_del_mux()
1133 static unsigned int i801_get_adapter_class(struct i801_priv *priv) in i801_get_adapter_class() argument
1148 priv->mux_drvdata = mux_config; in i801_get_adapter_class()
1154 static inline int i801_add_mux(struct i801_priv *priv) { return 0; } in i801_add_mux() argument
1155 static inline void i801_del_mux(struct i801_priv *priv) { } in i801_del_mux() argument
1157 static inline unsigned int i801_get_adapter_class(struct i801_priv *priv) in i801_get_adapter_class() argument
1170 static void i801_add_tco(struct i801_priv *priv) in i801_add_tco() argument
1172 struct pci_dev *pci_dev = priv->pci_dev; in i801_add_tco()
1180 if (!(priv->features & FEATURE_TCO)) in i801_add_tco()
1249 priv->tco_pdev = pdev; in i801_add_tco()
1256 struct i801_priv *priv; in i801_probe() local
1258 priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); in i801_probe()
1259 if (!priv) in i801_probe()
1262 i2c_set_adapdata(&priv->adapter, priv); in i801_probe()
1263 priv->adapter.owner = THIS_MODULE; in i801_probe()
1264 priv->adapter.class = i801_get_adapter_class(priv); in i801_probe()
1265 priv->adapter.algo = &smbus_algorithm; in i801_probe()
1266 priv->adapter.dev.parent = &dev->dev; in i801_probe()
1267 ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev)); in i801_probe()
1268 priv->adapter.retries = 3; in i801_probe()
1270 priv->pci_dev = dev; in i801_probe()
1277 priv->features |= FEATURE_I2C_BLOCK_READ; in i801_probe()
1278 priv->features |= FEATURE_IRQ; in i801_probe()
1279 priv->features |= FEATURE_SMBUS_PEC; in i801_probe()
1280 priv->features |= FEATURE_BLOCK_BUFFER; in i801_probe()
1281 priv->features |= FEATURE_TCO; in i801_probe()
1290 priv->features |= FEATURE_IDF; in i801_probe()
1293 priv->features |= FEATURE_I2C_BLOCK_READ; in i801_probe()
1294 priv->features |= FEATURE_IRQ; in i801_probe()
1297 priv->features |= FEATURE_SMBUS_PEC; in i801_probe()
1298 priv->features |= FEATURE_BLOCK_BUFFER; in i801_probe()
1309 if (priv->features & disable_features & (1 << i)) in i801_probe()
1313 priv->features &= ~disable_features; in i801_probe()
1324 priv->smba = pci_resource_start(dev, SMBBAR); in i801_probe()
1325 if (!priv->smba) { in i801_probe()
1341 priv->smba, in i801_probe()
1346 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp); in i801_probe()
1347 priv->original_hstcfg = temp; in i801_probe()
1353 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp); in i801_probe()
1358 priv->features &= ~FEATURE_IRQ; in i801_probe()
1362 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) in i801_probe()
1363 outb_p(inb_p(SMBAUXCTL(priv)) & in i801_probe()
1364 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); in i801_probe()
1367 priv->adapter.timeout = HZ / 5; in i801_probe()
1369 if (priv->features & FEATURE_IRQ) { in i801_probe()
1373 pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); in i801_probe()
1378 pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); in i801_probe()
1381 priv->features &= ~FEATURE_IRQ; in i801_probe()
1385 if (priv->features & FEATURE_IRQ) { in i801_probe()
1386 init_waitqueue_head(&priv->waitq); in i801_probe()
1390 dev_driver_string(&dev->dev), priv); in i801_probe()
1394 priv->features &= ~FEATURE_IRQ; in i801_probe()
1398 priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); in i801_probe()
1400 i801_add_tco(priv); in i801_probe()
1402 snprintf(priv->adapter.name, sizeof(priv->adapter.name), in i801_probe()
1403 "SMBus I801 adapter at %04lx", priv->smba); in i801_probe()
1404 err = i2c_add_adapter(&priv->adapter); in i801_probe()
1410 i801_probe_optional_slaves(priv); in i801_probe()
1412 i801_add_mux(priv); in i801_probe()
1414 pci_set_drvdata(dev, priv); in i801_probe()
1421 struct i801_priv *priv = pci_get_drvdata(dev); in i801_remove() local
1423 i801_del_mux(priv); in i801_remove()
1424 i2c_del_adapter(&priv->adapter); in i801_remove()
1425 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_remove()
1427 platform_device_unregister(priv->tco_pdev); in i801_remove()
1438 struct i801_priv *priv = pci_get_drvdata(dev); in i801_suspend() local
1441 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_suspend()