Skip to content

Commit

Permalink
i2c: pasemi: Set enable bit for Apple variant
Browse files Browse the repository at this point in the history
Some later revisions after the original PASemi I2C controller introduce
what likely is an enable bit to the CTL register. Without setting it the
actual i2c transmission is never started.

Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Sven Peter <sven@svenpeter.dev>
Acked-by: Olof Johansson <olof@lixom.net>
Tested-by: Christian Zigotzky <chzigotzky@xenosoft.de>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
  • Loading branch information
svenpeter42 authored and wsakernel committed Oct 11, 2021
1 parent d88ae29 commit 3abdc89
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
8 changes: 8 additions & 0 deletions drivers/i2c/busses/i2c-pasemi-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#define REG_MRXFIFO 0x04
#define REG_SMSTA 0x14
#define REG_CTL 0x1c
#define REG_REV 0x28

/* Register defs */
#define MTXFIFO_READ 0x00000400
Expand All @@ -37,6 +38,7 @@

#define CTL_MRR 0x00000400
#define CTL_MTR 0x00000200
#define CTL_EN 0x00000800
#define CTL_CLK_M 0x000000ff

static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)
Expand All @@ -60,6 +62,9 @@ static void pasemi_reset(struct pasemi_smbus *smbus)
{
u32 val = (CTL_MTR | CTL_MRR | (smbus->clk_div & CTL_CLK_M));

if (smbus->hw_rev >= 6)
val |= CTL_EN;

reg_write(smbus, REG_CTL, val);
}

Expand Down Expand Up @@ -335,6 +340,9 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus)
/* set up the sysfs linkage to our parent device */
smbus->adapter.dev.parent = smbus->dev;

if (smbus->hw_rev != PASEMI_HW_REV_PCI)
smbus->hw_rev = reg_read(smbus, REG_REV);

pasemi_reset(smbus);

error = devm_i2c_add_adapter(smbus->dev, &smbus->adapter);
Expand Down
3 changes: 3 additions & 0 deletions drivers/i2c/busses/i2c-pasemi-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@
#include <linux/io.h>
#include <linux/kernel.h>

#define PASEMI_HW_REV_PCI -1

struct pasemi_smbus {
struct device *dev;
struct i2c_adapter adapter;
void __iomem *ioaddr;
unsigned int clk_div;
int hw_rev;
};

int pasemi_i2c_common_probe(struct pasemi_smbus *smbus);
6 changes: 6 additions & 0 deletions drivers/i2c/busses/i2c-pasemi-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ static int pasemi_smb_pci_probe(struct pci_dev *dev,
size = pci_resource_len(dev, 0);
smbus->clk_div = CLK_100K_DIV;

/*
* The original PASemi PCI controllers don't have a register for
* their HW revision.
*/
smbus->hw_rev = PASEMI_HW_REV_PCI;

if (!devm_request_region(&dev->dev, base, size,
pasemi_smb_pci_driver.name))
return -EBUSY;
Expand Down

0 comments on commit 3abdc89

Please sign in to comment.