All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
@ 2016-08-09  5:41 Stefan Roese
  2016-08-10  2:59 ` Simon Glass
  0 siblings, 1 reply; 8+ messages in thread
From: Stefan Roese @ 2016-08-09  5:41 UTC (permalink / raw)
  To: u-boot

This patch adds support for the SMBus block read/write functionality.
Other protocols like the SMBus quick command need to get added
if this is needed.

This patch also removed the SMBus related defines from the Ivybridge
pch.h header. As they are integrated in this driver and should be
used from here. This change is added in this patch to avoid compile
breakage to keep the source git bisectable.

Tested on a congatec BayTrail board to configure the SMSC2513 USB
hub.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Heiko Schocher <hs@denx.de>
Cc: George McCollister <george.mccollister@gmail.com>
---
v2:
- Avoid using BSS. Patch from Simon intergrated to fix problem before
  relocation.
- Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
  PCH).
- Add overrun check to smbus_block_read() as suggested by George

 arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
 drivers/i2c/intel_i2c.c                   | 290 +++++++++++++++++++++++++++---
 2 files changed, 269 insertions(+), 47 deletions(-)

diff --git a/arch/x86/include/asm/arch-ivybridge/pch.h b/arch/x86/include/asm/arch-ivybridge/pch.h
index 4725250..9c51f63 100644
--- a/arch/x86/include/asm/arch-ivybridge/pch.h
+++ b/arch/x86/include/asm/arch-ivybridge/pch.h
@@ -134,32 +134,6 @@
 #define SATA_IOBP_SP0G3IR	0xea000151
 #define SATA_IOBP_SP1G3IR	0xea000051
 
-/* PCI Configuration Space (D31:F3): SMBus */
-#define PCH_SMBUS_DEV		PCI_BDF(0, 0x1f, 3)
-#define SMB_BASE		0x20
-#define HOSTC			0x40
-#define SMB_RCV_SLVA		0x09
-
-/* HOSTC bits */
-#define I2C_EN			(1 << 2)
-#define SMB_SMI_EN		(1 << 1)
-#define HST_EN			(1 << 0)
-
-/* SMBus I/O bits. */
-#define SMBHSTSTAT		0x0
-#define SMBHSTCTL		0x2
-#define SMBHSTCMD		0x3
-#define SMBXMITADD		0x4
-#define SMBHSTDAT0		0x5
-#define SMBHSTDAT1		0x6
-#define SMBBLKDAT		0x7
-#define SMBTRNSADD		0x9
-#define SMBSLVDATA		0xa
-#define SMLINK_PIN_CTL		0xe
-#define SMBUS_PIN_CTL		0xf
-
-#define SMBUS_TIMEOUT		(10 * 1000 * 100)
-
 #define VCH		0x0000	/* 32bit */
 #define VCAP1		0x0004	/* 32bit */
 #define VCAP2		0x0008	/* 32bit */
diff --git a/drivers/i2c/intel_i2c.c b/drivers/i2c/intel_i2c.c
index 3d777ff..1ef6024 100644
--- a/drivers/i2c/intel_i2c.c
+++ b/drivers/i2c/intel_i2c.c
@@ -2,54 +2,290 @@
  * Copyright (c) 2015 Google, Inc
  * Written by Simon Glass <sjg@chromium.org>
  *
+ * SMBus block read/write support added by Stefan Roese:
+ * Copyright (C) 2016 Stefan Roese <sr@denx.de>
+ *
  * SPDX-License-Identifier:     GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
 #include <i2c.h>
+#include <pci.h>
 #include <asm/io.h>
-#include <asm/arch/pch.h>
 
-int intel_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
+/* PCI Configuration Space (D31:F3): SMBus */
+#define SMB_BASE		0x20
+#define HOSTC			0x40
+#define  HST_EN			(1 << 0)
+#define SMB_RCV_SLVA		0x09
+
+/* SMBus I/O bits. */
+#define SMBHSTSTAT		0x0
+#define SMBHSTCTL		0x2
+#define SMBHSTCMD		0x3
+#define SMBXMITADD		0x4
+#define SMBHSTDAT0		0x5
+#define SMBHSTDAT1		0x6
+#define SMBBLKDAT		0x7
+#define SMBTRNSADD		0x9
+#define SMBSLVDATA		0xa
+#define SMBAUXCTL		0xd
+#define SMLINK_PIN_CTL		0xe
+#define SMBUS_PIN_CTL		0xf
+
+/* I801 Hosts Status register bits */
+#define SMBHSTSTS_BYTE_DONE	0x80
+#define SMBHSTSTS_INUSE_STS	0x40
+#define SMBHSTSTS_SMBALERT_STS	0x20
+#define SMBHSTSTS_FAILED	0x10
+#define SMBHSTSTS_BUS_ERR	0x08
+#define SMBHSTSTS_DEV_ERR	0x04
+#define SMBHSTSTS_INTR		0x02
+#define SMBHSTSTS_HOST_BUSY	0x01
+
+/* I801 Host Control register bits */
+#define SMBHSTCNT_INTREN	0x01
+#define SMBHSTCNT_KILL		0x02
+#define SMBHSTCNT_LAST_BYTE	0x20
+#define SMBHSTCNT_START		0x40
+#define SMBHSTCNT_PEC_EN	0x80	/* ICH3 and later */
+
+/* Auxiliary control register bits, ICH4+ only */
+#define SMBAUXCTL_CRC		1
+#define SMBAUXCTL_E32B		2
+
+#define SMBUS_TIMEOUT	100	/* 100 ms */
+
+struct intel_i2c {
+	u32 base;
+	int running;
+};
+
+static int smbus_wait_until_ready(u32 base)
 {
-	return -ENOSYS;
+	unsigned long ts;
+	u8 byte;
+
+	ts = get_timer(0);
+	do {
+		byte = inb(base + SMBHSTSTAT);
+		if (!(byte & 1))
+			return 0;
+	} while (get_timer(ts) < SMBUS_TIMEOUT);
+
+	return -ETIMEDOUT;
 }
 
-int intel_i2c_probe_chip(struct udevice *bus, uint chip_addr, uint chip_flags)
+static int smbus_wait_until_done(u32 base)
 {
-	return -ENOSYS;
+	unsigned long ts;
+	u8 byte;
+
+	ts = get_timer(0);
+	do {
+		byte = inb(base + SMBHSTSTAT);
+		if (!((byte & 1) || (byte & ~((1 << 6) | (1 << 0))) == 0))
+			return 0;
+	} while (get_timer(ts) < SMBUS_TIMEOUT);
+
+	return -ETIMEDOUT;
 }
 
-int intel_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
+static int smbus_block_read(u32 base, u8 dev, u8 *buffer,
+			    int offset, int len)
 {
+	u8 buf_temp[32];
+	int count;
+	int i;
+
+	debug("%s (%d): dev=0x%x offs=0x%x len=0x%x\n",
+	      __func__, __LINE__, dev, offset, len);
+	if (smbus_wait_until_ready(base) < 0)
+		return -ETIMEDOUT;
+
+	/* Setup transaction */
+
+	/* Reset the data buffer index */
+	inb(base + SMBHSTCTL);
+
+	/* Set the device I'm talking too */
+	outb(((dev & 0x7f) << 1) | 1, base + SMBXMITADD);
+	/* Set the command/address... */
+	outb(offset & 0xff, base + SMBHSTCMD);
+	/* Set up for a block read */
+	outb((inb(base + SMBHSTCTL) & (~(0x7) << 2)) | (0x5 << 2),
+	     (base + SMBHSTCTL));
+	/* Clear any lingering errors, so the transaction will run */
+	outb(inb(base + SMBHSTSTAT), base + SMBHSTSTAT);
+
+	/* Start the command */
+	outb((inb(base + SMBHSTCTL) | SMBHSTCNT_START), base + SMBHSTCTL);
+
+	/* Poll for transaction completion */
+	if (smbus_wait_until_done(base) < 0) {
+		printf("SMBUS read transaction timeout (dev=0x%x)\n", dev);
+		return -ETIMEDOUT;
+	}
+
+	count = inb(base + SMBHSTDAT0);
+	debug("%s (%d): count=%d (len=%d)\n", __func__, __LINE__, count, len);
+	if (count == 0) {
+		debug("ERROR: len=0 on read\n");
+		return -EIO;
+	}
+
+	if (count < len) {
+		debug("ERROR: too few bytes read\n");
+		return -EIO;
+	}
+
+	if (count > 32) {
+		debug("ERROR: count=%d too high\n", count);
+		return -EIO;
+	}
+
+	/* Read all available bytes from buffer */
+	for (i = 0; i < count; i++)
+		buf_temp[i] = inb(base + SMBBLKDAT);
+
+	memcpy(buffer, buf_temp, len);
+
+	/* Return results of transaction */
+	if (!(inb(base + SMBHSTSTAT) & SMBHSTSTS_INTR))
+		return -EIO;
+
 	return 0;
 }
 
-static int intel_i2c_probe(struct udevice *dev)
+static int smbus_block_write(u32 base, u8 dev, u8 *buffer,
+			     int offset, int len)
 {
+	int i;
+
+	debug("%s (%d): dev=0x%x offs=0x%x len=0x%x\n",
+	      __func__, __LINE__, dev, offset, len);
+	if (smbus_wait_until_ready(base) < 0)
+		return -ETIMEDOUT;
+
+	/* Setup transaction */
+	/* Set the device I'm talking too */
+	outb(((dev & 0x7f) << 1) & ~0x01, base + SMBXMITADD);
+	/* Set the command/address... */
+	outb(offset, base + SMBHSTCMD);
+	/* Set up for a block write */
+	outb((inb(base + SMBHSTCTL) & (~(0x7) << 2)) | (0x5 << 2),
+	     (base + SMBHSTCTL));
+	/* Clear any lingering errors, so the transaction will run */
+	outb(inb(base + SMBHSTSTAT), base + SMBHSTSTAT);
+
+	/* Write count in DAT0 register */
+	outb(len, base + SMBHSTDAT0);
+
+	/* Write data bytes... */
+	for (i = 0; i < len; i++)
+		outb(*buffer++, base + SMBBLKDAT);
+
+	/* Start the command */
+	outb((inb(base + SMBHSTCTL) | SMBHSTCNT_START), base + SMBHSTCTL);
+
+	/* Poll for transaction completion */
+	if (smbus_wait_until_done(base) < 0) {
+		printf("SMBUS write transaction timeout (dev=0x%x)\n", dev);
+		return -ETIMEDOUT;
+	}
+
+	/* Return results of transaction */
+	if (!(inb(base + SMBHSTSTAT) & SMBHSTSTS_INTR))
+		return -EIO;
+
+	return 0;
+}
+
+static int intel_i2c_xfer(struct udevice *bus, struct i2c_msg *msg, int nmsgs)
+{
+	struct intel_i2c *i2c = dev_get_priv(bus);
+	struct i2c_msg *dmsg, *omsg, dummy;
+
+	debug("i2c_xfer: %d messages\n", nmsgs);
+
+	memset(&dummy, 0, sizeof(struct i2c_msg));
+
 	/*
-	 * So far this is just setup code for ivybridge SMbus. When we have
-	 * a full I2C driver this may need to be moved, generalised or made
-	 * dependant on a particular compatible string.
-	 *
-	 * Set SMBus I/O base
+	 * We expect either two messages (one with an offset and one with the
+	 * actucal data) or one message (just data)
 	 */
-	dm_pci_write_config32(dev, SMB_BASE,
-			      SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
+	if (nmsgs > 2 || nmsgs == 0) {
+		debug("%s: Only one or two messages are supported", __func__);
+		return -EIO;
+	}
+
+	omsg = nmsgs == 1 ? &dummy : msg;
+	dmsg = nmsgs == 1 ? msg : msg + 1;
+
+	if (dmsg->flags & I2C_M_RD)
+		return smbus_block_read(i2c->base, dmsg->addr, &dmsg->buf[0],
+					omsg->buf[0], dmsg->len);
+	else
+		return smbus_block_write(i2c->base, dmsg->addr, &dmsg->buf[1],
+					 dmsg->buf[0], dmsg->len - 1);
+}
+
+static int intel_i2c_probe_chip(struct udevice *bus, uint chip_addr,
+				uint chip_flags)
+{
+	struct intel_i2c *i2c = dev_get_priv(bus);
+	u8 buf[4];
+
+	return smbus_block_read(i2c->base, chip_addr, buf, 0, 1);
+}
+
+static int intel_i2c_set_bus_speed(struct udevice *bus, unsigned int speed)
+{
+	return 0;
+}
+
+static int intel_i2c_probe(struct udevice *dev)
+{
+	struct intel_i2c *priv = dev_get_priv(dev);
+	u32 base;
+
+	/* Save base address from PCI BAR */
+	priv->base = (u32)dm_pci_map_bar(dev, PCI_BASE_ADDRESS_4,
+					 PCI_REGION_IO);
+	base = priv->base;
 
 	/* Set SMBus enable. */
 	dm_pci_write_config8(dev, HOSTC, HST_EN);
 
-	/* Set SMBus I/O space enable. */
-	dm_pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
+	/* Disable interrupts */
+	outb(inb(base + SMBHSTCTL) & ~SMBHSTCNT_INTREN, base + SMBHSTCTL);
 
-	/* Disable interrupt generation. */
-	outb(0, SMBUS_IO_BASE + SMBHSTCTL);
+	/* Set 32-byte data buffer mode */
+	outb(inb(base + SMBAUXCTL) | SMBAUXCTL_E32B, base + SMBAUXCTL);
 
-	/* Clear any lingering errors, so transactions can run. */
-	outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
-	debug("SMBus controller enabled\n");
+	return 0;
+}
+
+static int intel_i2c_bind(struct udevice *dev)
+{
+	static int num_cards __attribute__ ((section(".data")));
+	char name[20];
+
+	/* Create a unique device name for PCI type devices */
+	if (device_is_on_pci_bus(dev)) {
+		/*
+		 * ToDo:
+		 * Setting req_seq in the driver is probably not recommended.
+		 * But without a DT alias the number is not configured. And
+		 * using this driver is impossible for PCIe I2C devices.
+		 * This can be removed, once a better (correct) way for this
+		 * is found and implemented.
+		 */
+		dev->req_seq = num_cards;
+		sprintf(name, "intel_i2c#%u", num_cards++);
+		device_set_name(dev, name);
+	}
 
 	return 0;
 }
@@ -71,5 +307,17 @@ U_BOOT_DRIVER(intel_i2c) = {
 	.of_match = intel_i2c_ids,
 	.per_child_auto_alloc_size = sizeof(struct dm_i2c_chip),
 	.ops	= &intel_i2c_ops,
+	.priv_auto_alloc_size = sizeof(struct intel_i2c),
+	.bind	= intel_i2c_bind,
 	.probe	= intel_i2c_probe,
 };
+
+static struct pci_device_id intel_smbus_pci_supported[] = {
+	/* Intel BayTrail SMBus on the PCI bus */
+	{ PCI_VDEVICE(INTEL, 0x0f12) },
+	/* Intel IvyBridge (Panther Point PCH) SMBus on the PCI bus */
+	{ PCI_VDEVICE(INTEL, 0x1e22) },
+	{},
+};
+
+U_BOOT_PCI_DEVICE(intel_i2c, intel_smbus_pci_supported);
-- 
2.9.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-09  5:41 [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail) Stefan Roese
@ 2016-08-10  2:59 ` Simon Glass
  2016-08-12  1:41   ` Bin Meng
  2016-08-15 10:02   ` Stefan Roese
  0 siblings, 2 replies; 8+ messages in thread
From: Simon Glass @ 2016-08-10  2:59 UTC (permalink / raw)
  To: u-boot

Hi Stefan,

On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
> This patch adds support for the SMBus block read/write functionality.
> Other protocols like the SMBus quick command need to get added
> if this is needed.
>
> This patch also removed the SMBus related defines from the Ivybridge
> pch.h header. As they are integrated in this driver and should be
> used from here. This change is added in this patch to avoid compile
> breakage to keep the source git bisectable.
>
> Tested on a congatec BayTrail board to configure the SMSC2513 USB
> hub.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Bin Meng <bmeng.cn@gmail.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Heiko Schocher <hs@denx.de>
> Cc: George McCollister <george.mccollister@gmail.com>
> ---
> v2:
> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>   relocation.
> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>   PCH).
> - Add overrun check to smbus_block_read() as suggested by George
>
>  arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>  drivers/i2c/intel_i2c.c                   | 290 +++++++++++++++++++++++++++---
>  2 files changed, 269 insertions(+), 47 deletions(-)
>

This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
probe'. Is that expected?

Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-10  2:59 ` Simon Glass
@ 2016-08-12  1:41   ` Bin Meng
  2016-08-15 10:02   ` Stefan Roese
  1 sibling, 0 replies; 8+ messages in thread
From: Bin Meng @ 2016-08-12  1:41 UTC (permalink / raw)
  To: u-boot

On Wed, Aug 10, 2016 at 10:59 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Stefan,
>
> On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
>> This patch adds support for the SMBus block read/write functionality.
>> Other protocols like the SMBus quick command need to get added
>> if this is needed.
>>
>> This patch also removed the SMBus related defines from the Ivybridge
>> pch.h header. As they are integrated in this driver and should be
>> used from here. This change is added in this patch to avoid compile
>> breakage to keep the source git bisectable.
>>
>> Tested on a congatec BayTrail board to configure the SMSC2513 USB
>> hub.
>>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Bin Meng <bmeng.cn@gmail.com>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Heiko Schocher <hs@denx.de>
>> Cc: George McCollister <george.mccollister@gmail.com>
>> ---
>> v2:
>> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>>   relocation.
>> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>>   PCH).
>> - Add overrun check to smbus_block_read() as suggested by George
>>
>>  arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>>  drivers/i2c/intel_i2c.c                   | 290 +++++++++++++++++++++++++++---
>>  2 files changed, 269 insertions(+), 47 deletions(-)
>>
>
> This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
> probe'. Is that expected?
>
> Reviewed-by: Simon Glass <sjg@chromium.org>

applied to u-boot-x86, thanks!

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-10  2:59 ` Simon Glass
  2016-08-12  1:41   ` Bin Meng
@ 2016-08-15 10:02   ` Stefan Roese
  2016-08-16  4:50     ` Simon Glass
  1 sibling, 1 reply; 8+ messages in thread
From: Stefan Roese @ 2016-08-15 10:02 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 10.08.2016 04:59, Simon Glass wrote:
> On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
>> This patch adds support for the SMBus block read/write functionality.
>> Other protocols like the SMBus quick command need to get added
>> if this is needed.
>>
>> This patch also removed the SMBus related defines from the Ivybridge
>> pch.h header. As they are integrated in this driver and should be
>> used from here. This change is added in this patch to avoid compile
>> breakage to keep the source git bisectable.
>>
>> Tested on a congatec BayTrail board to configure the SMSC2513 USB
>> hub.
>>
>> Signed-off-by: Stefan Roese <sr@denx.de>
>> Cc: Bin Meng <bmeng.cn@gmail.com>
>> Cc: Simon Glass <sjg@chromium.org>
>> Cc: Heiko Schocher <hs@denx.de>
>> Cc: George McCollister <george.mccollister@gmail.com>
>> ---
>> v2:
>> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>>   relocation.
>> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>>   PCH).
>> - Add overrun check to smbus_block_read() as suggested by George
>>
>>  arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>>  drivers/i2c/intel_i2c.c                   | 290 +++++++++++++++++++++++++++---
>>  2 files changed, 269 insertions(+), 47 deletions(-)
>>
>
> This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
> probe'. Is that expected?

This depends on the devices available on the I2C bus. As SMBus defines
multiples protocols (byte read/write, block read/write...), and your
I2C devices probably don't support the currently implemented block
read/write protocol, we need to find a way configure / switch the SMBus
protocol. Do you have an idea on how to do this? Perhaps we need to add
a config call for this to switch between the different protocols? And
also add a way to do this from the cmdline. Perhaps "i2c flags" can be
used for this?

Thanks,
Stefan

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-15 10:02   ` Stefan Roese
@ 2016-08-16  4:50     ` Simon Glass
  2016-08-16  5:03       ` Heiko Schocher
  0 siblings, 1 reply; 8+ messages in thread
From: Simon Glass @ 2016-08-16  4:50 UTC (permalink / raw)
  To: u-boot

Hi Stefan,

On 15 August 2016 at 04:02, Stefan Roese <sr@denx.de> wrote:
> Hi Simon,
>
>
> On 10.08.2016 04:59, Simon Glass wrote:
>>
>> On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
>>>
>>> This patch adds support for the SMBus block read/write functionality.
>>> Other protocols like the SMBus quick command need to get added
>>> if this is needed.
>>>
>>> This patch also removed the SMBus related defines from the Ivybridge
>>> pch.h header. As they are integrated in this driver and should be
>>> used from here. This change is added in this patch to avoid compile
>>> breakage to keep the source git bisectable.
>>>
>>> Tested on a congatec BayTrail board to configure the SMSC2513 USB
>>> hub.
>>>
>>> Signed-off-by: Stefan Roese <sr@denx.de>
>>> Cc: Bin Meng <bmeng.cn@gmail.com>
>>> Cc: Simon Glass <sjg@chromium.org>
>>> Cc: Heiko Schocher <hs@denx.de>
>>> Cc: George McCollister <george.mccollister@gmail.com>
>>> ---
>>> v2:
>>> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>>>   relocation.
>>> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>>>   PCH).
>>> - Add overrun check to smbus_block_read() as suggested by George
>>>
>>>  arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>>>  drivers/i2c/intel_i2c.c                   | 290
>>> +++++++++++++++++++++++++++---
>>>  2 files changed, 269 insertions(+), 47 deletions(-)
>>>
>>
>> This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
>> probe'. Is that expected?
>
>
> This depends on the devices available on the I2C bus. As SMBus defines
> multiples protocols (byte read/write, block read/write...), and your
> I2C devices probably don't support the currently implemented block
> read/write protocol, we need to find a way configure / switch the SMBus
> protocol. Do you have an idea on how to do this? Perhaps we need to add
> a config call for this to switch between the different protocols? And
> also add a way to do this from the cmdline. Perhaps "i2c flags" can be
> used for this?

Yes I suppose a flag is the best idea. You should be able to add one
to the existing flags. Then it can be configured from the device or
via the command line 'i2c flags'.

Regards,
Simon

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-16  4:50     ` Simon Glass
@ 2016-08-16  5:03       ` Heiko Schocher
  2016-08-18  3:44         ` Simon Glass
  0 siblings, 1 reply; 8+ messages in thread
From: Heiko Schocher @ 2016-08-16  5:03 UTC (permalink / raw)
  To: u-boot

Hello Simon, Stefan,

Am 16.08.2016 um 06:50 schrieb Simon Glass:
> Hi Stefan,
>
> On 15 August 2016 at 04:02, Stefan Roese <sr@denx.de> wrote:
>> Hi Simon,
>>
>>
>> On 10.08.2016 04:59, Simon Glass wrote:
>>>
>>> On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
>>>>
>>>> This patch adds support for the SMBus block read/write functionality.
>>>> Other protocols like the SMBus quick command need to get added
>>>> if this is needed.
>>>>
>>>> This patch also removed the SMBus related defines from the Ivybridge
>>>> pch.h header. As they are integrated in this driver and should be
>>>> used from here. This change is added in this patch to avoid compile
>>>> breakage to keep the source git bisectable.
>>>>
>>>> Tested on a congatec BayTrail board to configure the SMSC2513 USB
>>>> hub.
>>>>
>>>> Signed-off-by: Stefan Roese <sr@denx.de>
>>>> Cc: Bin Meng <bmeng.cn@gmail.com>
>>>> Cc: Simon Glass <sjg@chromium.org>
>>>> Cc: Heiko Schocher <hs@denx.de>
>>>> Cc: George McCollister <george.mccollister@gmail.com>
>>>> ---
>>>> v2:
>>>> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>>>>    relocation.
>>>> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>>>>    PCH).
>>>> - Add overrun check to smbus_block_read() as suggested by George
>>>>
>>>>   arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>>>>   drivers/i2c/intel_i2c.c                   | 290
>>>> +++++++++++++++++++++++++++---
>>>>   2 files changed, 269 insertions(+), 47 deletions(-)
>>>>
>>>
>>> This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
>>> probe'. Is that expected?
>>
>>
>> This depends on the devices available on the I2C bus. As SMBus defines
>> multiples protocols (byte read/write, block read/write...), and your
>> I2C devices probably don't support the currently implemented block
>> read/write protocol, we need to find a way configure / switch the SMBus
>> protocol. Do you have an idea on how to do this? Perhaps we need to add
>> a config call for this to switch between the different protocols? And
>> also add a way to do this from the cmdline. Perhaps "i2c flags" can be
>> used for this?
>
> Yes I suppose a flag is the best idea. You should be able to add one
> to the existing flags. Then it can be configured from the device or
> via the command line 'i2c flags'.

Yes, an "i2c flag" seems a good solution.

Hmm.. thinking about it ...

May we need such a functionality like in linux:/include/uapi/linux/i2c.h
I2C_FUNC_* and i2c_check_functionality() ?

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
  2016-08-16  5:03       ` Heiko Schocher
@ 2016-08-18  3:44         ` Simon Glass
  0 siblings, 0 replies; 8+ messages in thread
From: Simon Glass @ 2016-08-18  3:44 UTC (permalink / raw)
  To: u-boot

Hi,

On 15 August 2016 at 23:03, Heiko Schocher <hs@denx.de> wrote:
> Hello Simon, Stefan,
>
>
> Am 16.08.2016 um 06:50 schrieb Simon Glass:
>>
>> Hi Stefan,
>>
>> On 15 August 2016 at 04:02, Stefan Roese <sr@denx.de> wrote:
>>>
>>> Hi Simon,
>>>
>>>
>>> On 10.08.2016 04:59, Simon Glass wrote:
>>>>
>>>>
>>>> On 8 August 2016 at 23:41, Stefan Roese <sr@denx.de> wrote:
>>>>>
>>>>>
>>>>> This patch adds support for the SMBus block read/write functionality.
>>>>> Other protocols like the SMBus quick command need to get added
>>>>> if this is needed.
>>>>>
>>>>> This patch also removed the SMBus related defines from the Ivybridge
>>>>> pch.h header. As they are integrated in this driver and should be
>>>>> used from here. This change is added in this patch to avoid compile
>>>>> breakage to keep the source git bisectable.
>>>>>
>>>>> Tested on a congatec BayTrail board to configure the SMSC2513 USB
>>>>> hub.
>>>>>
>>>>> Signed-off-by: Stefan Roese <sr@denx.de>
>>>>> Cc: Bin Meng <bmeng.cn@gmail.com>
>>>>> Cc: Simon Glass <sjg@chromium.org>
>>>>> Cc: Heiko Schocher <hs@denx.de>
>>>>> Cc: George McCollister <george.mccollister@gmail.com>
>>>>> ---
>>>>> v2:
>>>>> - Avoid using BSS. Patch from Simon intergrated to fix problem before
>>>>>    relocation.
>>>>> - Remove IvyBridge code and add PCI device for IvyBridge (Panther Point
>>>>>    PCH).
>>>>> - Add overrun check to smbus_block_read() as suggested by George
>>>>>
>>>>>   arch/x86/include/asm/arch-ivybridge/pch.h |  26 ---
>>>>>   drivers/i2c/intel_i2c.c                   | 290
>>>>> +++++++++++++++++++++++++++---
>>>>>   2 files changed, 269 insertions(+), 47 deletions(-)
>>>>>
>>>>
>>>> This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
>>>> probe'. Is that expected?
>>>
>>>
>>>
>>> This depends on the devices available on the I2C bus. As SMBus defines
>>> multiples protocols (byte read/write, block read/write...), and your
>>> I2C devices probably don't support the currently implemented block
>>> read/write protocol, we need to find a way configure / switch the SMBus
>>> protocol. Do you have an idea on how to do this? Perhaps we need to add
>>> a config call for this to switch between the different protocols? And
>>> also add a way to do this from the cmdline. Perhaps "i2c flags" can be
>>> used for this?
>>
>>
>> Yes I suppose a flag is the best idea. You should be able to add one
>> to the existing flags. Then it can be configured from the device or
>> via the command line 'i2c flags'.
>
>
> Yes, an "i2c flag" seems a good solution.
>
> Hmm.. thinking about it ...
>
> May we need such a functionality like in linux:/include/uapi/linux/i2c.h
> I2C_FUNC_* and i2c_check_functionality() ?

Possibly. I wonder if struct dm_i2c_bus could have a capability flags value?

Regards,
Simon

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail)
@ 2016-08-10  8:37 Yaroslav K.
  0 siblings, 0 replies; 8+ messages in thread
From: Yaroslav K. @ 2016-08-10  8:37 UTC (permalink / raw)
  To: u-boot

Hello, Stefan.

I've tried your patch on Atom C2000 board (which is not supported by
U-boot, but I use U-boot
as the Coreboot payload).

I've added
    /* Intel Atom processor C2000 PCU SMBus */
    { PCI_VDEVICE(INTEL, 0x1f3c) },
to intel_smbus_pci_supported for it to work.

It works and works exactly like Linux's driver in SMBus block mode
(testing with i2ctools 's' option'),
but my I2C devices don't work well with it. Since Linux's and your
drivers behave identically, it must
be just because devices don't support block mode.

Simon's issue with

>This does not crash, but I see nothing on the bus with 'i2c dev 0; i2c
>probe'. Is that expected?

probably caused by the fact that his devices doesn't support block mode too.



Also, isn't it better to put PCI device IDs in pci_ids.h as defines?

-- 
Yaroslav

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-08-18  3:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-09  5:41 [U-Boot] [PATCH v2] i2c: intel_i2c: SMBus driver PCI addition (e.g. BayTrail) Stefan Roese
2016-08-10  2:59 ` Simon Glass
2016-08-12  1:41   ` Bin Meng
2016-08-15 10:02   ` Stefan Roese
2016-08-16  4:50     ` Simon Glass
2016-08-16  5:03       ` Heiko Schocher
2016-08-18  3:44         ` Simon Glass
2016-08-10  8:37 Yaroslav K.

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.