Lines Matching +full:ocelot +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>
36 #include "i2c-designware-core.h"
40 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 dev->map = dev_get_regmap(dev->dev->parent, NULL); in txgbe_i2c_request_regs()
174 if (!dev->map) in txgbe_i2c_request_regs()
175 return -ENODEV; in txgbe_i2c_request_regs()
182 pm_runtime_disable(dev->dev); in dw_i2c_plat_pm_cleanup()
184 if (dev->shared_with_punit) in dw_i2c_plat_pm_cleanup()
185 pm_runtime_put_noidle(dev->dev); in dw_i2c_plat_pm_cleanup()
190 struct platform_device *pdev = to_platform_device(dev->dev); in dw_i2c_plat_request_regs()
193 switch (dev->flags & MODEL_MASK) { in dw_i2c_plat_request_regs()
201 dev->base = devm_platform_ioremap_resource(pdev, 0); in dw_i2c_plat_request_regs()
202 ret = PTR_ERR_OR_ZERO(dev->base); in dw_i2c_plat_request_regs()
242 dev->semaphore_idx = -1; in i2c_dw_probe_lock_support()
244 while (ptr->probe) { in i2c_dw_probe_lock_support()
245 ret = ptr->probe(dev); in i2c_dw_probe_lock_support()
252 if (ret != -ENODEV) in i2c_dw_probe_lock_support()
260 dev->semaphore_idx = i; in i2c_dw_probe_lock_support()
269 if (dev->semaphore_idx < 0) in i2c_dw_remove_lock_support()
272 if (i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove) in i2c_dw_remove_lock_support()
273 i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove(dev); in i2c_dw_remove_lock_support()
287 dev = devm_kzalloc(&pdev->dev, sizeof(struct dw_i2c_dev), GFP_KERNEL); in dw_i2c_plat_probe()
289 return -ENOMEM; in dw_i2c_plat_probe()
291 dev->flags = (uintptr_t)device_get_match_data(&pdev->dev); in dw_i2c_plat_probe()
292 if (device_property_present(&pdev->dev, "wx,i2c-snps-model")) in dw_i2c_plat_probe()
293 dev->flags = MODEL_WANGXUN_SP; in dw_i2c_plat_probe()
295 dev->dev = &pdev->dev; in dw_i2c_plat_probe()
296 dev->irq = irq; in dw_i2c_plat_probe()
303 dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); in dw_i2c_plat_probe()
304 if (IS_ERR(dev->rst)) in dw_i2c_plat_probe()
305 return PTR_ERR(dev->rst); in dw_i2c_plat_probe()
307 reset_control_deassert(dev->rst); in dw_i2c_plat_probe()
309 t = &dev->timings; in dw_i2c_plat_probe()
310 i2c_parse_fw_timings(&pdev->dev, t, false); in dw_i2c_plat_probe()
314 if (pdev->dev.of_node) in dw_i2c_plat_probe()
317 if (has_acpi_companion(&pdev->dev)) in dw_i2c_plat_probe()
318 i2c_dw_acpi_configure(&pdev->dev); in dw_i2c_plat_probe()
331 dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk"); in dw_i2c_plat_probe()
332 if (IS_ERR(dev->pclk)) { in dw_i2c_plat_probe()
333 ret = PTR_ERR(dev->pclk); in dw_i2c_plat_probe()
337 dev->clk = devm_clk_get_optional(&pdev->dev, NULL); in dw_i2c_plat_probe()
338 if (IS_ERR(dev->clk)) { in dw_i2c_plat_probe()
339 ret = PTR_ERR(dev->clk); in dw_i2c_plat_probe()
347 if (dev->clk) { in dw_i2c_plat_probe()
350 dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz; in dw_i2c_plat_probe()
351 clk_khz = dev->get_clk_rate_khz(dev); in dw_i2c_plat_probe()
353 if (!dev->sda_hold_time && t->sda_hold_ns) in dw_i2c_plat_probe()
354 dev->sda_hold_time = in dw_i2c_plat_probe()
355 DIV_S64_ROUND_CLOSEST(clk_khz * t->sda_hold_ns, MICRO); in dw_i2c_plat_probe()
358 adap = &dev->adapter; in dw_i2c_plat_probe()
359 adap->owner = THIS_MODULE; in dw_i2c_plat_probe()
360 adap->class = dmi_check_system(dw_i2c_hwmon_class_dmi) ? in dw_i2c_plat_probe()
362 ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev)); in dw_i2c_plat_probe()
363 adap->dev.of_node = pdev->dev.of_node; in dw_i2c_plat_probe()
364 adap->nr = -1; in dw_i2c_plat_probe()
366 if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { in dw_i2c_plat_probe()
367 dev_pm_set_driver_flags(&pdev->dev, in dw_i2c_plat_probe()
370 dev_pm_set_driver_flags(&pdev->dev, in dw_i2c_plat_probe()
375 device_enable_async_suspend(&pdev->dev); in dw_i2c_plat_probe()
378 WARN_ON(pm_runtime_enabled(&pdev->dev)); in dw_i2c_plat_probe()
380 pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); in dw_i2c_plat_probe()
381 pm_runtime_use_autosuspend(&pdev->dev); in dw_i2c_plat_probe()
382 pm_runtime_set_active(&pdev->dev); in dw_i2c_plat_probe()
384 if (dev->shared_with_punit) in dw_i2c_plat_probe()
385 pm_runtime_get_noresume(&pdev->dev); in dw_i2c_plat_probe()
387 pm_runtime_enable(&pdev->dev); in dw_i2c_plat_probe()
398 reset_control_assert(dev->rst); in dw_i2c_plat_probe()
406 pm_runtime_get_sync(&pdev->dev); in dw_i2c_plat_remove()
408 i2c_del_adapter(&dev->adapter); in dw_i2c_plat_remove()
410 dev->disable(dev); in dw_i2c_plat_remove()
412 pm_runtime_dont_use_autosuspend(&pdev->dev); in dw_i2c_plat_remove()
413 pm_runtime_put_sync(&pdev->dev); in dw_i2c_plat_remove()
418 reset_control_assert(dev->rst); in dw_i2c_plat_remove()
425 * may be accessed during suspend and resume of other devices via I2C in dw_i2c_plat_prepare()
436 if (i_dev->shared_with_punit) in dw_i2c_plat_runtime_suspend()
439 i_dev->disable(i_dev); in dw_i2c_plat_runtime_suspend()
449 i2c_mark_adapter_suspended(&i_dev->adapter); in dw_i2c_plat_suspend()
458 if (!i_dev->shared_with_punit) in dw_i2c_plat_runtime_resume()
461 i_dev->init(i_dev); in dw_i2c_plat_runtime_resume()
471 i2c_mark_adapter_resumed(&i_dev->adapter); in dw_i2c_plat_resume()
509 MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter");