return clk_get_rate(dev->clk) / HZ_PER_KHZ;
}
-#ifdef CONFIG_OF
-#define BT1_I2C_CTL 0x100
-#define BT1_I2C_CTL_ADDR_MASK GENMASK(7, 0)
-#define BT1_I2C_CTL_WR BIT(8)
-#define BT1_I2C_CTL_GO BIT(31)
-#define BT1_I2C_DI 0x104
-#define BT1_I2C_DO 0x108
-
-static int bt1_i2c_read(void *context, unsigned int reg, unsigned int *val)
-{
- struct dw_i2c_dev *dev = context;
- int ret;
-
- /*
- * Note these methods shouldn't ever fail because the system controller
- * registers are memory mapped. We check the return value just in case.
- */
- ret = regmap_write(dev->sysmap, BT1_I2C_CTL,
- BT1_I2C_CTL_GO | (reg & BT1_I2C_CTL_ADDR_MASK));
- if (ret)
- return ret;
-
- return regmap_read(dev->sysmap, BT1_I2C_DO, val);
-}
-
-static int bt1_i2c_write(void *context, unsigned int reg, unsigned int val)
-{
- struct dw_i2c_dev *dev = context;
- int ret;
-
- ret = regmap_write(dev->sysmap, BT1_I2C_DI, val);
- if (ret)
- return ret;
-
- return regmap_write(dev->sysmap, BT1_I2C_CTL,
- BT1_I2C_CTL_GO | BT1_I2C_CTL_WR | (reg & BT1_I2C_CTL_ADDR_MASK));
-}
-
-static const struct regmap_config bt1_i2c_cfg = {
- .reg_bits = 32,
- .val_bits = 32,
- .reg_stride = 4,
- .fast_io = true,
- .reg_read = bt1_i2c_read,
- .reg_write = bt1_i2c_write,
- .max_register = DW_IC_COMP_TYPE,
-};
-
-static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
-{
- dev->sysmap = syscon_node_to_regmap(dev->dev->of_node->parent);
- if (IS_ERR(dev->sysmap))
- return PTR_ERR(dev->sysmap);
-
- dev->map = devm_regmap_init(dev->dev, NULL, dev, &bt1_i2c_cfg);
- return PTR_ERR_OR_ZERO(dev->map);
-}
-#else
-static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
-{
- return -ENODEV;
-}
-#endif
-
static int dw_i2c_get_parent_regmap(struct dw_i2c_dev *dev)
{
dev->map = dev_get_regmap(dev->dev->parent, NULL);
return dw_i2c_get_parent_regmap(dev);
switch (dev->flags & MODEL_MASK) {
- case MODEL_BAIKAL_BT1:
- ret = bt1_i2c_request_regs(dev);
- break;
case MODEL_WANGXUN_SP:
ret = dw_i2c_get_parent_regmap(dev);
break;
}
static const struct of_device_id dw_i2c_of_match[] = {
- { .compatible = "baikal,bt1-sys-i2c", .data = (void *)MODEL_BAIKAL_BT1 },
{ .compatible = "mscc,ocelot-i2c", .data = (void *)MODEL_MSCC_OCELOT },
{ .compatible = "snps,designware-i2c" },
{}