• Home
  • Raw
  • Download

Lines Matching +full:designware +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Synopsys DesignWare I2C adapter driver.
5 * Based on the TI DAVINCI I2C adapter driver.
12 #include <linux/clk-provider.h>
18 #include <linux/i2c.h>
25 #include <linux/platform_data/i2c-designware.h>
37 #include "i2c-designware-core.h"
41 return clk_get_rate(dev->clk) / KILO; in i2c_dw_get_clk_rate_khz()
82 ret = regmap_write(dev->sysmap, BT1_I2C_CTL, in bt1_i2c_read()
87 return regmap_read(dev->sysmap, BT1_I2C_DO, val); in bt1_i2c_read()
95 ret = regmap_write(dev->sysmap, BT1_I2C_DI, val); in bt1_i2c_write()
99 return regmap_write(dev->sysmap, BT1_I2C_CTL, in bt1_i2c_write()
115 dev->sysmap = syscon_node_to_regmap(dev->dev->of_node->parent); in bt1_i2c_request_regs()
116 if (IS_ERR(dev->sysmap)) in bt1_i2c_request_regs()
117 return PTR_ERR(dev->sysmap); in bt1_i2c_request_regs()
119 dev->map = devm_regmap_init(dev->dev, NULL, dev, &bt1_i2c_cfg); in bt1_i2c_request_regs()
120 return PTR_ERR_OR_ZERO(dev->map); in bt1_i2c_request_regs()
129 writel((dev->sda_hold_time << 1) | MSCC_ICPU_CFG_TWI_DELAY_ENABLE, in mscc_twi_set_sda_hold_time()
130 dev->ext + MSCC_ICPU_CFG_TWI_DELAY); in mscc_twi_set_sda_hold_time()
139 switch (dev->flags & MODEL_MASK) { in dw_i2c_of_configure()
141 dev->ext = devm_platform_ioremap_resource(pdev, 1); in dw_i2c_of_configure()
142 if (!IS_ERR(dev->ext)) in dw_i2c_of_configure()
143 dev->set_sda_hold_time = mscc_twi_set_sda_hold_time; in dw_i2c_of_configure()
153 { .compatible = "snps,designware-i2c", },
154 { .compatible = "mscc,ocelot-i2c", .data = (void *)MODEL_MSCC_OCELOT },
155 { .compatible = "baikal,bt1-sys-i2c", .data = (void *)MODEL_BAIKAL_BT1 },
162 return -ENODEV; in bt1_i2c_request_regs()
167 return -ENODEV; in dw_i2c_of_configure()
173 pm_runtime_disable(dev->dev); in dw_i2c_plat_pm_cleanup()
175 if (dev->shared_with_punit) in dw_i2c_plat_pm_cleanup()
176 pm_runtime_put_noidle(dev->dev); in dw_i2c_plat_pm_cleanup()
181 struct platform_device *pdev = to_platform_device(dev->dev); in dw_i2c_plat_request_regs()
184 switch (dev->flags & MODEL_MASK) { in dw_i2c_plat_request_regs()
189 dev->base = devm_platform_ioremap_resource(pdev, 0); in dw_i2c_plat_request_regs()
190 ret = PTR_ERR_OR_ZERO(dev->base); in dw_i2c_plat_request_regs()
210 struct dw_i2c_platform_data *pdata = dev_get_platdata(&pdev->dev); in dw_i2c_plat_probe()
220 dev = devm_kzalloc(&pdev->dev, sizeof(struct dw_i2c_dev), GFP_KERNEL); in dw_i2c_plat_probe()
222 return -ENOMEM; in dw_i2c_plat_probe()
224 dev->flags = (uintptr_t)device_get_match_data(&pdev->dev); in dw_i2c_plat_probe()
225 dev->dev = &pdev->dev; in dw_i2c_plat_probe()
226 dev->irq = irq; in dw_i2c_plat_probe()
233 dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); in dw_i2c_plat_probe()
234 if (IS_ERR(dev->rst)) in dw_i2c_plat_probe()
235 return PTR_ERR(dev->rst); in dw_i2c_plat_probe()
237 reset_control_deassert(dev->rst); in dw_i2c_plat_probe()
239 t = &dev->timings; in dw_i2c_plat_probe()
241 t->bus_freq_hz = pdata->i2c_scl_freq; in dw_i2c_plat_probe()
243 i2c_parse_fw_timings(&pdev->dev, t, false); in dw_i2c_plat_probe()
247 if (pdev->dev.of_node) in dw_i2c_plat_probe()
250 if (has_acpi_companion(&pdev->dev)) in dw_i2c_plat_probe()
251 i2c_dw_acpi_configure(&pdev->dev); in dw_i2c_plat_probe()
264 dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); in dw_i2c_plat_probe()
265 if (IS_ERR(dev->pclk)) { in dw_i2c_plat_probe()
266 ret = PTR_ERR(dev->pclk); in dw_i2c_plat_probe()
270 dev->clk = devm_clk_get_optional(&pdev->dev, NULL); in dw_i2c_plat_probe()
271 if (IS_ERR(dev->clk)) { in dw_i2c_plat_probe()
272 ret = PTR_ERR(dev->clk); in dw_i2c_plat_probe()
280 if (dev->clk) { in dw_i2c_plat_probe()
283 dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz; in dw_i2c_plat_probe()
284 clk_khz = dev->get_clk_rate_khz(dev); in dw_i2c_plat_probe()
286 if (!dev->sda_hold_time && t->sda_hold_ns) in dw_i2c_plat_probe()
287 dev->sda_hold_time = in dw_i2c_plat_probe()
288 DIV_S64_ROUND_CLOSEST(clk_khz * t->sda_hold_ns, MICRO); in dw_i2c_plat_probe()
291 adap = &dev->adapter; in dw_i2c_plat_probe()
292 adap->owner = THIS_MODULE; in dw_i2c_plat_probe()
293 adap->class = dmi_check_system(dw_i2c_hwmon_class_dmi) ? in dw_i2c_plat_probe()
295 ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev)); in dw_i2c_plat_probe()
296 adap->dev.of_node = pdev->dev.of_node; in dw_i2c_plat_probe()
297 adap->nr = -1; in dw_i2c_plat_probe()
299 if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { in dw_i2c_plat_probe()
300 dev_pm_set_driver_flags(&pdev->dev, in dw_i2c_plat_probe()
304 dev_pm_set_driver_flags(&pdev->dev, in dw_i2c_plat_probe()
311 WARN_ON(pm_runtime_enabled(&pdev->dev)); in dw_i2c_plat_probe()
313 pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); in dw_i2c_plat_probe()
314 pm_runtime_use_autosuspend(&pdev->dev); in dw_i2c_plat_probe()
315 pm_runtime_set_active(&pdev->dev); in dw_i2c_plat_probe()
317 if (dev->shared_with_punit) in dw_i2c_plat_probe()
318 pm_runtime_get_noresume(&pdev->dev); in dw_i2c_plat_probe()
320 pm_runtime_enable(&pdev->dev); in dw_i2c_plat_probe()
331 reset_control_assert(dev->rst); in dw_i2c_plat_probe()
339 pm_runtime_get_sync(&pdev->dev); in dw_i2c_plat_remove()
341 i2c_del_adapter(&dev->adapter); in dw_i2c_plat_remove()
343 dev->disable(dev); in dw_i2c_plat_remove()
345 pm_runtime_dont_use_autosuspend(&pdev->dev); in dw_i2c_plat_remove()
346 pm_runtime_put_sync(&pdev->dev); in dw_i2c_plat_remove()
349 reset_control_assert(dev->rst); in dw_i2c_plat_remove()
359 * may be accessed during suspend and resume of other devices via I2C in dw_i2c_plat_prepare()
387 i_dev->suspended = true; in dw_i2c_plat_suspend()
389 if (i_dev->shared_with_punit) in dw_i2c_plat_suspend()
392 i_dev->disable(i_dev); in dw_i2c_plat_suspend()
402 if (!i_dev->shared_with_punit) in dw_i2c_plat_resume()
405 i_dev->init(i_dev); in dw_i2c_plat_resume()
406 i_dev->suspended = false; in dw_i2c_plat_resume()
450 MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter");