diff mbox series

i2c: ocores: convert to ioport_map() for IORESOURCE_IO

Message ID 20240408092923.2816928-1-arnd@kernel.org
State Accepted
Headers show
Series i2c: ocores: convert to ioport_map() for IORESOURCE_IO | expand

Commit Message

Arnd Bergmann April 8, 2024, 9:28 a.m. UTC
From: Arnd Bergmann <arnd@arndb.de>

There is at least one machine that uses this driver but does not
have support for inb()/outb() instructions.

Convert this to using ioport_map() so it can build on architectures
that don't provide these but work correctly on machines that require
using port I/O.

Fixes: 53f44c1005ba ("i2c: add HAS_IOPORT dependencies")
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/lkml/CAMuHMdVUQ2WgtpYPYfO2T=itMmZ7w=geREqDtsP8Q3ODh9rxdw@mail.gmail.com/
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 drivers/i2c/busses/Kconfig      |  1 -
 drivers/i2c/busses/i2c-ocores.c | 21 +++++++--------------
 2 files changed, 7 insertions(+), 15 deletions(-)

Comments

Peter Korsgaard April 9, 2024, 10:38 a.m. UTC | #1
>>>>> "Arnd" == Arnd Bergmann <arnd@kernel.org> writes:

 > From: Arnd Bergmann <arnd@arndb.de>
 > There is at least one machine that uses this driver but does not
 > have support for inb()/outb() instructions.

 > Convert this to using ioport_map() so it can build on architectures
 > that don't provide these but work correctly on machines that require
 > using port I/O.

 > Fixes: 53f44c1005ba ("i2c: add HAS_IOPORT dependencies")
 > Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
 > Link:
 > https://lore.kernel.org/lkml/CAMuHMdVUQ2WgtpYPYfO2T=itMmZ7w=geREqDtsP8Q3ODh9rxdw@mail.gmail.com/
 > Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Acked-by: Peter Korsgaard <peter@korsgaard.com>
Andi Shyti April 10, 2024, 1:31 p.m. UTC | #2
Hi Arnd,

On Mon, Apr 08, 2024 at 11:28:36AM +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> There is at least one machine that uses this driver but does not
> have support for inb()/outb() instructions.
> 
> Convert this to using ioport_map() so it can build on architectures
> that don't provide these but work correctly on machines that require
> using port I/O.
> 
> Fixes: 53f44c1005ba ("i2c: add HAS_IOPORT dependencies")

I had to update this Fixes tag as I have done a rebase.

> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Link: https://lore.kernel.org/lkml/CAMuHMdVUQ2WgtpYPYfO2T=itMmZ7w=geREqDtsP8Q3ODh9rxdw@mail.gmail.com/
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

This will go through i2c/i2c-host and sent in the merge window
pull request.

Applied to i2c/i2c-host on

git://git.kernel.org/pub/scm/linux/kernel/git/andi.shyti/linux.git

Thank you,
Andi

Patches applied
===============
[1/1] i2c: ocores: convert to ioport_map() for IORESOURCE_IO
      commit: a43939d2d96aec5fcb77d0abd75bab5e6ab006d3
Arnd Bergmann April 11, 2024, 8:07 a.m. UTC | #3
On Wed, Apr 10, 2024, at 15:31, Andi Shyti wrote:
> Hi Arnd,
>
> On Mon, Apr 08, 2024 at 11:28:36AM +0200, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>> 
>> There is at least one machine that uses this driver but does not
>> have support for inb()/outb() instructions.
>> 
>> Convert this to using ioport_map() so it can build on architectures
>> that don't provide these but work correctly on machines that require
>> using port I/O.
>> 
>> Fixes: 53f44c1005ba ("i2c: add HAS_IOPORT dependencies")
>
> I had to update this Fixes tag as I have done a rebase.
>

Ok, thanks for merging.

In case you do another rebase, you could also move this patch
ahead of the other one to avoid adding and then removing the
dependency again.

    Arnd
diff mbox series

Patch

diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 2d5e74ac9ea0..64c985ec0fae 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -886,7 +886,6 @@  config I2C_NPCM
 
 config I2C_OCORES
 	tristate "OpenCores I2C Controller"
-	depends on HAS_IOPORT
 	help
 	  If you say yes to this option, support will be included for the
 	  OpenCores I2C controller. For details see
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c
index e106af83cef4..56a4dabf5a38 100644
--- a/drivers/i2c/busses/i2c-ocores.c
+++ b/drivers/i2c/busses/i2c-ocores.c
@@ -32,7 +32,6 @@ 
  */
 struct ocores_i2c {
 	void __iomem *base;
-	int iobase;
 	u32 reg_shift;
 	u32 reg_io_width;
 	unsigned long flags;
@@ -136,16 +135,6 @@  static inline u8 oc_getreg_32be(struct ocores_i2c *i2c, int reg)
 	return ioread32be(i2c->base + (reg << i2c->reg_shift));
 }
 
-static void oc_setreg_io_8(struct ocores_i2c *i2c, int reg, u8 value)
-{
-	outb(value, i2c->iobase + reg);
-}
-
-static inline u8 oc_getreg_io_8(struct ocores_i2c *i2c, int reg)
-{
-	return inb(i2c->iobase + reg);
-}
-
 static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value)
 {
 	i2c->setreg(i2c, reg, value);
@@ -618,15 +607,19 @@  static int ocores_i2c_probe(struct platform_device *pdev)
 		res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 		if (!res)
 			return -EINVAL;
-		i2c->iobase = res->start;
 		if (!devm_request_region(&pdev->dev, res->start,
 					 resource_size(res),
 					 pdev->name)) {
 			dev_err(&pdev->dev, "Can't get I/O resource.\n");
 			return -EBUSY;
 		}
-		i2c->setreg = oc_setreg_io_8;
-		i2c->getreg = oc_getreg_io_8;
+		i2c->base = devm_ioport_map(&pdev->dev, res->start,
+					    resource_size(res));
+		if (!i2c->base) {
+			dev_err(&pdev->dev, "Can't map I/O resource.\n");
+			return -EBUSY;
+		}
+		i2c->reg_io_width = 1;
 	}
 
 	pdata = dev_get_platdata(&pdev->dev);