.. | .. |
---|
| 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)) |
---|