Skip to content

Commit 3abdc89

Browse files
svenpeter42wsakernel
authored andcommitted
i2c: pasemi: Set enable bit for Apple variant
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 <[email protected]> Signed-off-by: Sven Peter <[email protected]> Acked-by: Olof Johansson <[email protected]> Tested-by: Christian Zigotzky <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent d88ae29 commit 3abdc89

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

drivers/i2c/busses/i2c-pasemi-core.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#define REG_MRXFIFO 0x04
2323
#define REG_SMSTA 0x14
2424
#define REG_CTL 0x1c
25+
#define REG_REV 0x28
2526

2627
/* Register defs */
2728
#define MTXFIFO_READ 0x00000400
@@ -37,6 +38,7 @@
3738

3839
#define CTL_MRR 0x00000400
3940
#define CTL_MTR 0x00000200
41+
#define CTL_EN 0x00000800
4042
#define CTL_CLK_M 0x000000ff
4143

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

65+
if (smbus->hw_rev >= 6)
66+
val |= CTL_EN;
67+
6368
reg_write(smbus, REG_CTL, val);
6469
}
6570

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

343+
if (smbus->hw_rev != PASEMI_HW_REV_PCI)
344+
smbus->hw_rev = reg_read(smbus, REG_REV);
345+
338346
pasemi_reset(smbus);
339347

340348
error = devm_i2c_add_adapter(smbus->dev, &smbus->adapter);

drivers/i2c/busses/i2c-pasemi-core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
#include <linux/io.h>
99
#include <linux/kernel.h>
1010

11+
#define PASEMI_HW_REV_PCI -1
12+
1113
struct pasemi_smbus {
1214
struct device *dev;
1315
struct i2c_adapter adapter;
1416
void __iomem *ioaddr;
1517
unsigned int clk_div;
18+
int hw_rev;
1619
};
1720

1821
int pasemi_i2c_common_probe(struct pasemi_smbus *smbus);

drivers/i2c/busses/i2c-pasemi-pci.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ static int pasemi_smb_pci_probe(struct pci_dev *dev,
4242
size = pci_resource_len(dev, 0);
4343
smbus->clk_div = CLK_100K_DIV;
4444

45+
/*
46+
* The original PASemi PCI controllers don't have a register for
47+
* their HW revision.
48+
*/
49+
smbus->hw_rev = PASEMI_HW_REV_PCI;
50+
4551
if (!devm_request_region(&dev->dev, base, size,
4652
pasemi_smb_pci_driver.name))
4753
return -EBUSY;

0 commit comments

Comments
 (0)