i2c: designware_i2c: Read device-tree properties
authorSimon Glass <sjg@chromium.org>
Thu, 23 Jan 2020 18:48:11 +0000 (11:48 -0700)
committerHeiko Schocher <hs@denx.de>
Mon, 27 Jan 2020 06:21:05 +0000 (07:21 +0100)
The i2c controller defines a few timing properties. Read these in and
store them for use by the driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Heiko Schocher <hs@denx.de>
drivers/i2c/designware_i2c.c
drivers/i2c/designware_i2c.h
drivers/i2c/designware_i2c_pci.c

index 0a1df8015fee86c4df2282e2e9dd065d4a59283a..34b6816545f375bd4264c3bc633d2fafe11e9b12 100644 (file)
@@ -535,11 +535,15 @@ static int designware_i2c_probe_chip(struct udevice *bus, uint chip_addr,
        return ret;
 }
 
-static int designware_i2c_ofdata_to_platdata(struct udevice *bus)
+int designware_i2c_ofdata_to_platdata(struct udevice *bus)
 {
        struct dw_i2c *priv = dev_get_priv(bus);
 
-       priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus);
+       if (!priv->regs)
+               priv->regs = (struct i2c_regs *)devfdt_get_addr_ptr(bus);
+       dev_read_u32(bus, "i2c-scl-rising-time-ns", &priv->scl_rise_time_ns);
+       dev_read_u32(bus, "i2c-scl-falling-time-ns", &priv->scl_fall_time_ns);
+       dev_read_u32(bus, "i2c-sda-hold-time-ns", &priv->sda_hold_time_ns);
 
        return 0;
 }
index 5b477830d4fafc5bcdcd5d182d694e1e12c2cb0a..f32dc0f85429538eb69ac1e53d3be2e1f1ef59e6 100644 (file)
@@ -167,10 +167,24 @@ struct dw_scl_sda_cfg {
        u32 sda_hold;
 };
 
+/**
+ * struct dw_i2c - private information for the bus
+ *
+ * @regs: Registers pointer
+ * @scl_sda_cfg: Deprecated information for x86 (should move to device tree)
+ * @resets: Resets for the I2C controller
+ * @scl_rise_time_ns: Configured SCL rise time in nanoseconds
+ * @scl_fall_time_ns: Configured SCL fall time in nanoseconds
+ * @sda_hold_time_ns: Configured SDA hold time in nanoseconds
+ * @clk: Clock input to the I2C controller
+ */
 struct dw_i2c {
        struct i2c_regs *regs;
        struct dw_scl_sda_cfg *scl_sda_cfg;
        struct reset_ctl_bulk resets;
+       u32 scl_rise_time_ns;
+       u32 scl_fall_time_ns;
+       u32 sda_hold_time_ns;
 #if CONFIG_IS_ENABLED(CLK)
        struct clk clk;
 #endif
@@ -180,5 +194,6 @@ extern const struct dm_i2c_ops designware_i2c_ops;
 
 int designware_i2c_probe(struct udevice *bus);
 int designware_i2c_remove(struct udevice *dev);
+int designware_i2c_ofdata_to_platdata(struct udevice *bus);
 
 #endif /* __DW_I2C_H_ */
index 7f0625df66b5bc754a0fd06a1a44b15025942bfa..2b974a07c3334d57f3e5f46a2a66751a4bb1a85e 100644 (file)
@@ -63,7 +63,7 @@ static int designware_i2c_pci_ofdata_to_platdata(struct udevice *dev)
                /* Use BayTrail specific timing values */
                priv->scl_sda_cfg = &byt_config;
 
-       return 0;
+       return designware_i2c_ofdata_to_platdata(dev);
 }
 
 static int designware_i2c_pci_probe(struct udevice *dev)