Lines Matching refs:priv
252 static int i801_check_pre(struct i801_priv *priv) in i801_check_pre() argument
256 status = inb_p(SMBHSTSTS(priv)); in i801_check_pre()
258 dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n"); in i801_check_pre()
264 dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n", in i801_check_pre()
266 outb_p(status, SMBHSTSTS(priv)); in i801_check_pre()
267 status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS; in i801_check_pre()
269 dev_err(&priv->pci_dev->dev, in i801_check_pre()
284 static int i801_check_post(struct i801_priv *priv, int status) in i801_check_post() argument
295 dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); in i801_check_post()
297 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); in i801_check_post()
298 outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL, in i801_check_post()
299 SMBHSTCNT(priv)); in i801_check_post()
301 outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL), in i801_check_post()
302 SMBHSTCNT(priv)); in i801_check_post()
305 status = inb_p(SMBHSTSTS(priv)); in i801_check_post()
308 dev_err(&priv->pci_dev->dev, in i801_check_post()
310 outb_p(STATUS_FLAGS, SMBHSTSTS(priv)); in i801_check_post()
316 dev_err(&priv->pci_dev->dev, "Transaction failed\n"); in i801_check_post()
320 dev_dbg(&priv->pci_dev->dev, "No response\n"); in i801_check_post()
324 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n"); in i801_check_post()
328 outb_p(status, SMBHSTSTS(priv)); in i801_check_post()
334 static int i801_wait_intr(struct i801_priv *priv) in i801_wait_intr() argument
342 status = inb_p(SMBHSTSTS(priv)); in i801_wait_intr()
348 dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n"); in i801_wait_intr()
355 static int i801_wait_byte_done(struct i801_priv *priv) in i801_wait_byte_done() argument
363 status = inb_p(SMBHSTSTS(priv)); in i801_wait_byte_done()
368 dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n"); in i801_wait_byte_done()
374 static int i801_transaction(struct i801_priv *priv, int xact) in i801_transaction() argument
378 const struct i2c_adapter *adap = &priv->adapter; in i801_transaction()
380 result = i801_check_pre(priv); in i801_transaction()
384 if (priv->features & FEATURE_IRQ) { in i801_transaction()
386 SMBHSTCNT(priv)); in i801_transaction()
387 result = wait_event_timeout(priv->waitq, in i801_transaction()
388 (status = priv->status), in i801_transaction()
392 dev_warn(&priv->pci_dev->dev, in i801_transaction()
395 priv->status = 0; in i801_transaction()
396 return i801_check_post(priv, status); in i801_transaction()
401 outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_transaction()
403 status = i801_wait_intr(priv); in i801_transaction()
404 return i801_check_post(priv, status); in i801_transaction()
407 static int i801_block_transaction_by_block(struct i801_priv *priv, in i801_block_transaction_by_block() argument
414 inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */ in i801_block_transaction_by_block()
419 outb_p(len, SMBHSTDAT0(priv)); in i801_block_transaction_by_block()
421 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_by_block()
424 status = i801_transaction(priv, I801_BLOCK_DATA | in i801_block_transaction_by_block()
430 len = inb_p(SMBHSTDAT0(priv)); in i801_block_transaction_by_block()
436 data->block[i + 1] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_by_block()
441 static void i801_isr_byte_done(struct i801_priv *priv) in i801_isr_byte_done() argument
443 if (priv->is_read) { in i801_isr_byte_done()
445 if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) && in i801_isr_byte_done()
446 (priv->count == 0)) { in i801_isr_byte_done()
447 priv->len = inb_p(SMBHSTDAT0(priv)); in i801_isr_byte_done()
448 if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) { in i801_isr_byte_done()
449 dev_err(&priv->pci_dev->dev, in i801_isr_byte_done()
451 priv->len); in i801_isr_byte_done()
453 priv->len = I2C_SMBUS_BLOCK_MAX; in i801_isr_byte_done()
455 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
457 priv->len); in i801_isr_byte_done()
459 priv->data[-1] = priv->len; in i801_isr_byte_done()
463 if (priv->count < priv->len) in i801_isr_byte_done()
464 priv->data[priv->count++] = inb(SMBBLKDAT(priv)); in i801_isr_byte_done()
466 dev_dbg(&priv->pci_dev->dev, in i801_isr_byte_done()
470 if (priv->count == priv->len - 1) in i801_isr_byte_done()
471 outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE, in i801_isr_byte_done()
472 SMBHSTCNT(priv)); in i801_isr_byte_done()
473 } else if (priv->count < priv->len - 1) { in i801_isr_byte_done()
475 outb_p(priv->data[++priv->count], SMBBLKDAT(priv)); in i801_isr_byte_done()
479 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); in i801_isr_byte_done()
498 struct i801_priv *priv = dev_id; in i801_isr() local
503 pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); in i801_isr()
507 status = inb_p(SMBHSTSTS(priv)); in i801_isr()
509 i801_isr_byte_done(priv); in i801_isr()
517 outb_p(status, SMBHSTSTS(priv)); in i801_isr()
518 priv->status |= status; in i801_isr()
519 wake_up(&priv->waitq); in i801_isr()
530 static int i801_block_transaction_byte_by_byte(struct i801_priv *priv, in i801_block_transaction_byte_by_byte() argument
539 const struct i2c_adapter *adap = &priv->adapter; in i801_block_transaction_byte_by_byte()
541 result = i801_check_pre(priv); in i801_block_transaction_byte_by_byte()
548 outb_p(len, SMBHSTDAT0(priv)); in i801_block_transaction_byte_by_byte()
549 outb_p(data->block[1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
558 if (priv->features & FEATURE_IRQ) { in i801_block_transaction_byte_by_byte()
559 priv->is_read = (read_write == I2C_SMBUS_READ); in i801_block_transaction_byte_by_byte()
560 if (len == 1 && priv->is_read) in i801_block_transaction_byte_by_byte()
562 priv->cmd = smbcmd | SMBHSTCNT_INTREN; in i801_block_transaction_byte_by_byte()
563 priv->len = len; in i801_block_transaction_byte_by_byte()
564 priv->count = 0; in i801_block_transaction_byte_by_byte()
565 priv->data = &data->block[1]; in i801_block_transaction_byte_by_byte()
567 outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
568 result = wait_event_timeout(priv->waitq, in i801_block_transaction_byte_by_byte()
569 (status = priv->status), in i801_block_transaction_byte_by_byte()
573 dev_warn(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
576 priv->status = 0; in i801_block_transaction_byte_by_byte()
577 return i801_check_post(priv, status); in i801_block_transaction_byte_by_byte()
583 outb_p(smbcmd, SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
586 outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START, in i801_block_transaction_byte_by_byte()
587 SMBHSTCNT(priv)); in i801_block_transaction_byte_by_byte()
589 status = i801_wait_byte_done(priv); in i801_block_transaction_byte_by_byte()
595 len = inb_p(SMBHSTDAT0(priv)); in i801_block_transaction_byte_by_byte()
597 dev_err(&priv->pci_dev->dev, in i801_block_transaction_byte_by_byte()
601 while (inb_p(SMBHSTSTS(priv)) & in i801_block_transaction_byte_by_byte()
604 SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
605 outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
613 data->block[i] = inb_p(SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
615 outb_p(data->block[i+1], SMBBLKDAT(priv)); in i801_block_transaction_byte_by_byte()
618 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv)); in i801_block_transaction_byte_by_byte()
621 status = i801_wait_intr(priv); in i801_block_transaction_byte_by_byte()
623 return i801_check_post(priv, status); in i801_block_transaction_byte_by_byte()
626 static int i801_set_block_buffer_mode(struct i801_priv *priv) in i801_set_block_buffer_mode() argument
628 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv)); in i801_set_block_buffer_mode()
629 if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0) in i801_set_block_buffer_mode()
635 static int i801_block_transaction(struct i801_priv *priv, in i801_block_transaction() argument
645 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc); in i801_block_transaction()
646 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, in i801_block_transaction()
648 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) { in i801_block_transaction()
649 dev_err(&priv->pci_dev->dev, in i801_block_transaction()
668 if ((priv->features & FEATURE_BLOCK_BUFFER) in i801_block_transaction()
670 && i801_set_block_buffer_mode(priv) == 0) in i801_block_transaction()
671 result = i801_block_transaction_by_block(priv, data, in i801_block_transaction()
674 result = i801_block_transaction_byte_by_byte(priv, data, in i801_block_transaction()
681 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc); in i801_block_transaction()
694 struct i801_priv *priv = i2c_get_adapdata(adap); in i801_access() local
696 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC) in i801_access()
703 SMBHSTADD(priv)); in i801_access()
708 SMBHSTADD(priv)); in i801_access()
710 outb_p(command, SMBHSTCMD(priv)); in i801_access()
715 SMBHSTADD(priv)); in i801_access()
716 outb_p(command, SMBHSTCMD(priv)); in i801_access()
718 outb_p(data->byte, SMBHSTDAT0(priv)); in i801_access()
723 SMBHSTADD(priv)); in i801_access()
724 outb_p(command, SMBHSTCMD(priv)); in i801_access()
726 outb_p(data->word & 0xff, SMBHSTDAT0(priv)); in i801_access()
727 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv)); in i801_access()
733 SMBHSTADD(priv)); in i801_access()
734 outb_p(command, SMBHSTCMD(priv)); in i801_access()
740 outb_p((addr & 0x7f) << 1, SMBHSTADD(priv)); in i801_access()
744 outb_p(command, SMBHSTDAT1(priv)); in i801_access()
746 outb_p(command, SMBHSTCMD(priv)); in i801_access()
750 dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n", in i801_access()
756 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv)); in i801_access()
758 outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC), in i801_access()
759 SMBAUXCTL(priv)); in i801_access()
762 ret = i801_block_transaction(priv, data, read_write, size, in i801_access()
765 ret = i801_transaction(priv, xact); in i801_access()
771 outb_p(inb_p(SMBAUXCTL(priv)) & in i801_access()
772 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); in i801_access()
784 data->byte = inb_p(SMBHSTDAT0(priv)); in i801_access()
787 data->word = inb_p(SMBHSTDAT0(priv)) + in i801_access()
788 (inb_p(SMBHSTDAT1(priv)) << 8); in i801_access()
797 struct i801_priv *priv = i2c_get_adapdata(adapter); in i801_func() local
802 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) | in i801_func()
803 ((priv->features & FEATURE_I2C_BLOCK_READ) ? in i801_func()
952 static void i801_probe_optional_slaves(struct i801_priv *priv) in i801_probe_optional_slaves() argument
955 if (priv->features & FEATURE_IDF) in i801_probe_optional_slaves()
964 i2c_new_device(&priv->adapter, &info); in i801_probe_optional_slaves()
968 dmi_walk(dmi_check_onboard_devices, &priv->adapter); in i801_probe_optional_slaves()
972 static void i801_probe_optional_slaves(struct i801_priv *priv) {} in i801_probe_optional_slaves() argument
1063 static int i801_add_mux(struct i801_priv *priv) in i801_add_mux() argument
1065 struct device *dev = &priv->adapter.dev; in i801_add_mux()
1070 if (!priv->mux_drvdata) in i801_add_mux()
1072 mux_config = priv->mux_drvdata; in i801_add_mux()
1076 gpio_data.parent = priv->adapter.nr; in i801_add_mux()
1086 priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio", in i801_add_mux()
1089 if (IS_ERR(priv->mux_pdev)) { in i801_add_mux()
1090 err = PTR_ERR(priv->mux_pdev); in i801_add_mux()
1091 priv->mux_pdev = NULL; in i801_add_mux()
1099 static void i801_del_mux(struct i801_priv *priv) in i801_del_mux() argument
1101 if (priv->mux_pdev) in i801_del_mux()
1102 platform_device_unregister(priv->mux_pdev); in i801_del_mux()
1105 static unsigned int i801_get_adapter_class(struct i801_priv *priv) in i801_get_adapter_class() argument
1120 priv->mux_drvdata = mux_config; in i801_get_adapter_class()
1126 static inline int i801_add_mux(struct i801_priv *priv) { return 0; } in i801_add_mux() argument
1127 static inline void i801_del_mux(struct i801_priv *priv) { } in i801_del_mux() argument
1129 static inline unsigned int i801_get_adapter_class(struct i801_priv *priv) in i801_get_adapter_class() argument
1139 struct i801_priv *priv; in i801_probe() local
1141 priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); in i801_probe()
1142 if (!priv) in i801_probe()
1145 i2c_set_adapdata(&priv->adapter, priv); in i801_probe()
1146 priv->adapter.owner = THIS_MODULE; in i801_probe()
1147 priv->adapter.class = i801_get_adapter_class(priv); in i801_probe()
1148 priv->adapter.algo = &smbus_algorithm; in i801_probe()
1150 priv->pci_dev = dev; in i801_probe()
1158 priv->features |= FEATURE_IDF; in i801_probe()
1161 priv->features |= FEATURE_I2C_BLOCK_READ; in i801_probe()
1162 priv->features |= FEATURE_IRQ; in i801_probe()
1165 priv->features |= FEATURE_SMBUS_PEC; in i801_probe()
1166 priv->features |= FEATURE_BLOCK_BUFFER; in i801_probe()
1177 if (priv->features & disable_features & (1 << i)) in i801_probe()
1181 priv->features &= ~disable_features; in i801_probe()
1192 priv->smba = pci_resource_start(dev, SMBBAR); in i801_probe()
1193 if (!priv->smba) { in i801_probe()
1209 priv->smba, in i801_probe()
1214 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp); in i801_probe()
1215 priv->original_hstcfg = temp; in i801_probe()
1221 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp); in i801_probe()
1226 priv->features &= ~FEATURE_IRQ; in i801_probe()
1230 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER)) in i801_probe()
1231 outb_p(inb_p(SMBAUXCTL(priv)) & in i801_probe()
1232 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv)); in i801_probe()
1235 priv->adapter.timeout = HZ / 5; in i801_probe()
1237 if (priv->features & FEATURE_IRQ) { in i801_probe()
1241 pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists); in i801_probe()
1246 pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl); in i801_probe()
1249 priv->features &= ~FEATURE_IRQ; in i801_probe()
1253 if (priv->features & FEATURE_IRQ) { in i801_probe()
1254 init_waitqueue_head(&priv->waitq); in i801_probe()
1258 dev_driver_string(&dev->dev), priv); in i801_probe()
1262 priv->features &= ~FEATURE_IRQ; in i801_probe()
1266 priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling"); in i801_probe()
1269 priv->adapter.dev.parent = &dev->dev; in i801_probe()
1272 priv->adapter.retries = 3; in i801_probe()
1274 snprintf(priv->adapter.name, sizeof(priv->adapter.name), in i801_probe()
1275 "SMBus I801 adapter at %04lx", priv->smba); in i801_probe()
1276 err = i2c_add_adapter(&priv->adapter); in i801_probe()
1282 i801_probe_optional_slaves(priv); in i801_probe()
1284 i801_add_mux(priv); in i801_probe()
1286 pci_set_drvdata(dev, priv); in i801_probe()
1293 struct i801_priv *priv = pci_get_drvdata(dev); in i801_remove() local
1295 i801_del_mux(priv); in i801_remove()
1296 i2c_del_adapter(&priv->adapter); in i801_remove()
1297 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_remove()
1308 struct i801_priv *priv = pci_get_drvdata(dev); in i801_suspend() local
1311 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg); in i801_suspend()