summaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorSven Peter <sven@svenpeter.dev>2021-10-08 18:35:29 +0200
committerWolfram Sang <wsa@kernel.org>2021-10-11 11:45:28 +0200
commitfd664ab2319fb89cba5a522995e806eb26748af6 (patch)
treeb5949a08bdfc85ed361e1a88ccd2de43addf27f1 /drivers/i2c
parenti2c: pasemi: Move common reset code to own function (diff)
downloadlinux-fd664ab2319fb89cba5a522995e806eb26748af6.tar.xz
linux-fd664ab2319fb89cba5a522995e806eb26748af6.zip
i2c: pasemi: Allow to configure bus frequency
Right now the bus frequency has always been hardcoded as 100 KHz with the specific reference clock used in the PASemi PCI controllers. Make this configurable to prepare for the platform driver. 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>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-pasemi-core.c8
-rw-r--r--drivers/i2c/busses/i2c-pasemi-core.h1
-rw-r--r--drivers/i2c/busses/i2c-pasemi-pci.c4
3 files changed, 8 insertions, 5 deletions
diff --git a/drivers/i2c/busses/i2c-pasemi-core.c b/drivers/i2c/busses/i2c-pasemi-core.c
index 232587c70a38..9fb8fac53f2b 100644
--- a/drivers/i2c/busses/i2c-pasemi-core.c
+++ b/drivers/i2c/busses/i2c-pasemi-core.c
@@ -39,9 +39,6 @@
#define CTL_MTR 0x00000200
#define CTL_CLK_M 0x000000ff
-#define CLK_100K_DIV 84
-#define CLK_400K_DIV 21
-
static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)
{
dev_dbg(smbus->dev, "smbus write reg %lx val %08x\n",
@@ -63,8 +60,9 @@ static inline int reg_read(struct pasemi_smbus *smbus, int reg)
static void pasemi_reset(struct pasemi_smbus *smbus)
{
- reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
- (CLK_100K_DIV & CTL_CLK_M)));
+ u32 val = (CTL_MTR | CTL_MRR | (smbus->clk_div & CTL_CLK_M));
+
+ reg_write(smbus, REG_CTL, val);
}
static void pasemi_smb_clear(struct pasemi_smbus *smbus)
diff --git a/drivers/i2c/busses/i2c-pasemi-core.h b/drivers/i2c/busses/i2c-pasemi-core.h
index 7acc33de6ce1..30a7990825ef 100644
--- a/drivers/i2c/busses/i2c-pasemi-core.h
+++ b/drivers/i2c/busses/i2c-pasemi-core.h
@@ -14,6 +14,7 @@ struct pasemi_smbus {
void __iomem *ioaddr;
unsigned long base;
int size;
+ unsigned int clk_div;
};
int pasemi_i2c_common_probe(struct pasemi_smbus *smbus);
diff --git a/drivers/i2c/busses/i2c-pasemi-pci.c b/drivers/i2c/busses/i2c-pasemi-pci.c
index 644656e28012..96585bbf8c24 100644
--- a/drivers/i2c/busses/i2c-pasemi-pci.c
+++ b/drivers/i2c/busses/i2c-pasemi-pci.c
@@ -17,6 +17,9 @@
#include "i2c-pasemi-core.h"
+#define CLK_100K_DIV 84
+#define CLK_400K_DIV 21
+
static struct pci_driver pasemi_smb_pci_driver;
static int pasemi_smb_pci_probe(struct pci_dev *dev,
@@ -35,6 +38,7 @@ static int pasemi_smb_pci_probe(struct pci_dev *dev,
smbus->dev = &dev->dev;
smbus->base = pci_resource_start(dev, 0);
smbus->size = pci_resource_len(dev, 0);
+ smbus->clk_div = CLK_100K_DIV;
if (!request_region(smbus->base, smbus->size,
pasemi_smb_pci_driver.name)) {