| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2007-2012 ST-Ericsson AB |
|---|
| 3 | | - * License terms: GNU General Public License (GPL) version 2 |
|---|
| 4 | 4 | * ST DDC I2C master mode driver, used in e.g. U300 series platforms. |
|---|
| 5 | 5 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
|---|
| 6 | 6 | * Author: Jonas Aaberg <jonas.aberg@stericsson.com> |
|---|
| .. | .. |
|---|
| 132 | 132 | #define NUM_ADDR_RESEND_ATTEMPTS 12 |
|---|
| 133 | 133 | |
|---|
| 134 | 134 | /* I2C clock speed, in Hz 0-400kHz*/ |
|---|
| 135 | | -static unsigned int scl_frequency = 100000; |
|---|
| 135 | +static unsigned int scl_frequency = I2C_MAX_STANDARD_MODE_FREQ; |
|---|
| 136 | 136 | module_param(scl_frequency, uint, 0644); |
|---|
| 137 | 137 | |
|---|
| 138 | 138 | /** |
|---|
| .. | .. |
|---|
| 328 | 328 | { |
|---|
| 329 | 329 | int ret; |
|---|
| 330 | 330 | |
|---|
| 331 | | - if (unlikely(irqs_disabled())) { |
|---|
| 332 | | - /* TODO: implement polling for this case if need be. */ |
|---|
| 333 | | - WARN(1, "irqs are disabled, cannot poll for event\n"); |
|---|
| 334 | | - return -EIO; |
|---|
| 335 | | - } |
|---|
| 336 | | - |
|---|
| 337 | 331 | /* Lock command issue, fill in an event we wait for */ |
|---|
| 338 | 332 | spin_lock_irq(&dev->cmd_issue_lock); |
|---|
| 339 | 333 | init_completion(&dev->cmd_complete); |
|---|
| .. | .. |
|---|
| 379 | 373 | enum stu300_event mr_event) |
|---|
| 380 | 374 | { |
|---|
| 381 | 375 | int ret; |
|---|
| 382 | | - |
|---|
| 383 | | - if (unlikely(irqs_disabled())) { |
|---|
| 384 | | - /* TODO: implement polling for this case if need be. */ |
|---|
| 385 | | - dev_err(&dev->pdev->dev, "irqs are disabled on this " |
|---|
| 386 | | - "system!\n"); |
|---|
| 387 | | - return -EIO; |
|---|
| 388 | | - } |
|---|
| 389 | 376 | |
|---|
| 390 | 377 | /* Is it already here? */ |
|---|
| 391 | 378 | spin_lock_irq(&dev->cmd_issue_lock); |
|---|
| .. | .. |
|---|
| 457 | 444 | "Attempt: %d\n", i+1); |
|---|
| 458 | 445 | |
|---|
| 459 | 446 | dev_err(&dev->pdev->dev, "base address = " |
|---|
| 460 | | - "0x%08x, reinit hardware\n", (u32) dev->virtbase); |
|---|
| 447 | + "0x%p, reinit hardware\n", dev->virtbase); |
|---|
| 461 | 448 | |
|---|
| 462 | 449 | (void) stu300_init_hw(dev); |
|---|
| 463 | 450 | } |
|---|
| .. | .. |
|---|
| 510 | 497 | dev_dbg(&dev->pdev->dev, "Clock rate %lu Hz, I2C bus speed %d Hz " |
|---|
| 511 | 498 | "virtbase %p\n", clkrate, dev->speed, dev->virtbase); |
|---|
| 512 | 499 | |
|---|
| 513 | | - if (dev->speed > 100000) |
|---|
| 500 | + if (dev->speed > I2C_MAX_STANDARD_MODE_FREQ) |
|---|
| 514 | 501 | /* Fast Mode I2C */ |
|---|
| 515 | 502 | val = ((clkrate/dev->speed) - 9)/3 + 1; |
|---|
| 516 | 503 | else |
|---|
| .. | .. |
|---|
| 531 | 518 | return -EINVAL; |
|---|
| 532 | 519 | } |
|---|
| 533 | 520 | |
|---|
| 534 | | - if (dev->speed > 100000) { |
|---|
| 521 | + if (dev->speed > I2C_MAX_STANDARD_MODE_FREQ) { |
|---|
| 535 | 522 | /* CC6..CC0 */ |
|---|
| 536 | 523 | stu300_wr8((val & I2C_CCR_CC_MASK) | I2C_CCR_FMSM, |
|---|
| 537 | 524 | dev->virtbase + I2C_CCR); |
|---|
| .. | .. |
|---|
| 846 | 833 | return num; |
|---|
| 847 | 834 | } |
|---|
| 848 | 835 | |
|---|
| 836 | +static int stu300_xfer_todo(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) |
|---|
| 837 | +{ |
|---|
| 838 | + /* TODO: implement polling for this case if need be. */ |
|---|
| 839 | + WARN(1, "%s: atomic transfers not implemented\n", dev_name(&adap->dev)); |
|---|
| 840 | + return -EOPNOTSUPP; |
|---|
| 841 | +} |
|---|
| 842 | + |
|---|
| 849 | 843 | static u32 stu300_func(struct i2c_adapter *adap) |
|---|
| 850 | 844 | { |
|---|
| 851 | 845 | /* This is the simplest thing you can think of... */ |
|---|
| .. | .. |
|---|
| 853 | 847 | } |
|---|
| 854 | 848 | |
|---|
| 855 | 849 | static const struct i2c_algorithm stu300_algo = { |
|---|
| 856 | | - .master_xfer = stu300_xfer, |
|---|
| 857 | | - .functionality = stu300_func, |
|---|
| 850 | + .master_xfer = stu300_xfer, |
|---|
| 851 | + .master_xfer_atomic = stu300_xfer_todo, |
|---|
| 852 | + .functionality = stu300_func, |
|---|
| 858 | 853 | }; |
|---|
| 859 | 854 | |
|---|
| 860 | 855 | static const struct i2c_adapter_quirks stu300_quirks = { |
|---|
| .. | .. |
|---|
| 865 | 860 | { |
|---|
| 866 | 861 | struct stu300_dev *dev; |
|---|
| 867 | 862 | struct i2c_adapter *adap; |
|---|
| 868 | | - struct resource *res; |
|---|
| 869 | 863 | int bus_nr; |
|---|
| 870 | 864 | int ret = 0; |
|---|
| 871 | 865 | |
|---|
| .. | .. |
|---|
| 881 | 875 | } |
|---|
| 882 | 876 | |
|---|
| 883 | 877 | dev->pdev = pdev; |
|---|
| 884 | | - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 885 | | - dev->virtbase = devm_ioremap_resource(&pdev->dev, res); |
|---|
| 878 | + dev->virtbase = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 886 | 879 | dev_dbg(&pdev->dev, "initialize bus device I2C%d on virtual " |
|---|
| 887 | 880 | "base %p\n", bus_nr, dev->virtbase); |
|---|
| 888 | 881 | if (IS_ERR(dev->virtbase)) |
|---|