i2c-designware-platdrv.c 11.6 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
 * Synopsys DesignWare I2C adapter driver.
4 5 6 7 8 9 10
 *
 * Based on the TI DAVINCI I2C adapter driver.
 *
 * Copyright (C) 2006 Texas Instruments.
 * Copyright (C) 2007 MontaVista Software Inc.
 * Copyright (C) 2009 Provigent Ltd.
 */
11 12 13
#include <linux/acpi.h>
#include <linux/clk-provider.h>
#include <linux/clk.h>
14
#include <linux/delay.h>
15
#include <linux/dmi.h>
16
#include <linux/err.h>
17 18
#include <linux/errno.h>
#include <linux/i2c.h>
19
#include <linux/interrupt.h>
20 21
#include <linux/io.h>
#include <linux/kernel.h>
22
#include <linux/mfd/syscon.h>
23
#include <linux/module.h>
24
#include <linux/of.h>
25
#include <linux/platform_device.h>
26
#include <linux/pm.h>
27
#include <linux/pm_runtime.h>
28
#include <linux/property.h>
29
#include <linux/regmap.h>
30
#include <linux/reset.h>
31
#include <linux/sched.h>
32
#include <linux/slab.h>
33
#include <linux/suspend.h>
34
#include <linux/units.h>
35

36 37
#include "i2c-designware-core.h"

38 39
static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
{
40
	return clk_get_rate(dev->clk) / KILO;
41
}
42

43 44 45 46
#ifdef CONFIG_ACPI
static const struct acpi_device_id dw_i2c_acpi_match[] = {
	{ "INT33C2", 0 },
	{ "INT33C3", 0 },
47 48
	{ "INT3432", 0 },
	{ "INT3433", 0 },
49
	{ "80860F41", ACCESS_NO_IRQ_SUSPEND },
50
	{ "808622C1", ACCESS_NO_IRQ_SUSPEND },
51
	{ "AMD0010", ACCESS_INTR_MASK },
52
	{ "AMDI0010", ACCESS_INTR_MASK },
53
	{ "AMDI0019", ACCESS_INTR_MASK | ARBITRATION_SEMAPHORE },
54
	{ "AMDI0510", 0 },
55
	{ "APMC0D0F", 0 },
56 57
	{ "HISI02A1", 0 },
	{ "HISI02A2", 0 },
58
	{ "HISI02A3", 0 },
59
	{ "HYGO0010", ACCESS_INTR_MASK },
60 61 62 63 64
	{ }
};
MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
#endif

65
#ifdef CONFIG_OF
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
#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 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);
}

123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#define MSCC_ICPU_CFG_TWI_DELAY		0x0
#define MSCC_ICPU_CFG_TWI_DELAY_ENABLE	BIT(0)
#define MSCC_ICPU_CFG_TWI_SPIKE_FILTER	0x4

static int mscc_twi_set_sda_hold_time(struct dw_i2c_dev *dev)
{
	writel((dev->sda_hold_time << 1) | MSCC_ICPU_CFG_TWI_DELAY_ENABLE,
	       dev->ext + MSCC_ICPU_CFG_TWI_DELAY);

	return 0;
}

static int dw_i2c_of_configure(struct platform_device *pdev)
{
	struct dw_i2c_dev *dev = platform_get_drvdata(pdev);

	switch (dev->flags & MODEL_MASK) {
	case MODEL_MSCC_OCELOT:
141
		dev->ext = devm_platform_ioremap_resource(pdev, 1);
142 143 144 145 146 147 148 149 150 151
		if (!IS_ERR(dev->ext))
			dev->set_sda_hold_time = mscc_twi_set_sda_hold_time;
		break;
	default:
		break;
	}

	return 0;
}

152 153
static const struct of_device_id dw_i2c_of_match[] = {
	{ .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 },
156 157 158
	{},
};
MODULE_DEVICE_TABLE(of, dw_i2c_of_match);
159
#else
160
static int bt1_i2c_request_regs(struct dw_i2c_dev *dev)
161 162 163
{
	return -ENODEV;
}
164

165
static inline int dw_i2c_of_configure(struct platform_device *pdev)
166
{
167
	return -ENODEV;
168
}
169
#endif
170

171 172 173 174 175 176 177 178 179
static int txgbe_i2c_request_regs(struct dw_i2c_dev *dev)
{
	dev->map = dev_get_regmap(dev->dev->parent, NULL);
	if (!dev->map)
		return -ENODEV;

	return 0;
}

180 181 182 183
static void dw_i2c_plat_pm_cleanup(struct dw_i2c_dev *dev)
{
	pm_runtime_disable(dev->dev);

184
	if (dev->shared_with_punit)
185 186 187
		pm_runtime_put_noidle(dev->dev);
}

188 189 190
static int dw_i2c_plat_request_regs(struct dw_i2c_dev *dev)
{
	struct platform_device *pdev = to_platform_device(dev->dev);
191
	int ret;
192

193 194 195 196
	switch (dev->flags & MODEL_MASK) {
	case MODEL_BAIKAL_BT1:
		ret = bt1_i2c_request_regs(dev);
		break;
197 198 199
	case MODEL_WANGXUN_SP:
		ret = txgbe_i2c_request_regs(dev);
		break;
200 201 202 203 204
	default:
		dev->base = devm_platform_ioremap_resource(pdev, 0);
		ret = PTR_ERR_OR_ZERO(dev->base);
		break;
	}
205

206
	return ret;
207
}
208

209 210 211 212 213 214 215 216 217 218 219
static const struct dmi_system_id dw_i2c_hwmon_class_dmi[] = {
	{
		.ident = "Qtechnology QT5222",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Qtechnology"),
			DMI_MATCH(DMI_PRODUCT_NAME, "QT5222"),
		},
	},
	{ } /* terminate list */
};

220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
static const struct i2c_dw_semaphore_callbacks i2c_dw_semaphore_cb_table[] = {
#ifdef CONFIG_I2C_DESIGNWARE_BAYTRAIL
	{
		.probe = i2c_dw_baytrail_probe_lock_support,
	},
#endif
#ifdef CONFIG_I2C_DESIGNWARE_AMDPSP
	{
		.probe = i2c_dw_amdpsp_probe_lock_support,
	},
#endif
	{}
};

static int i2c_dw_probe_lock_support(struct dw_i2c_dev *dev)
{
	const struct i2c_dw_semaphore_callbacks *ptr;
	int i = 0;
	int ret;

	ptr = i2c_dw_semaphore_cb_table;

	dev->semaphore_idx = -1;

	while (ptr->probe) {
		ret = ptr->probe(dev);
		if (ret) {
			/*
			 * If there is no semaphore device attached to this
			 * controller, we shouldn't abort general i2c_controller
			 * probe.
			 */
			if (ret != -ENODEV)
				return ret;

			i++;
			ptr++;
			continue;
		}

		dev->semaphore_idx = i;
		break;
	}

	return 0;
}

static void i2c_dw_remove_lock_support(struct dw_i2c_dev *dev)
{
	if (dev->semaphore_idx < 0)
		return;

	if (i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove)
		i2c_dw_semaphore_cb_table[dev->semaphore_idx].remove(dev);
}

276
static int dw_i2c_plat_probe(struct platform_device *pdev)
277 278
{
	struct i2c_adapter *adap;
279
	struct dw_i2c_dev *dev;
280
	struct i2c_timings *t;
281
	int irq, ret;
282 283

	irq = platform_get_irq(pdev, 0);
284 285
	if (irq < 0)
		return irq;
286

287 288 289
	dev = devm_kzalloc(&pdev->dev, sizeof(struct dw_i2c_dev), GFP_KERNEL);
	if (!dev)
		return -ENOMEM;
290

291
	dev->flags = (uintptr_t)device_get_match_data(&pdev->dev);
292 293 294
	if (device_property_present(&pdev->dev, "wx,i2c-snps-model"))
		dev->flags = MODEL_WANGXUN_SP;

295
	dev->dev = &pdev->dev;
296 297 298
	dev->irq = irq;
	platform_set_drvdata(pdev, dev);

299 300 301 302
	ret = dw_i2c_plat_request_regs(dev);
	if (ret)
		return ret;

303
	dev->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
304 305 306 307
	if (IS_ERR(dev->rst))
		return PTR_ERR(dev->rst);

	reset_control_deassert(dev->rst);
308

309
	t = &dev->timings;
310
	i2c_parse_fw_timings(&pdev->dev, t, false);
311

312
	i2c_dw_adjust_bus_speed(dev);
313

314 315 316
	if (pdev->dev.of_node)
		dw_i2c_of_configure(pdev);

317
	if (has_acpi_companion(&pdev->dev))
318
		i2c_dw_acpi_configure(&pdev->dev);
319

320 321
	ret = i2c_dw_validate_speed(dev);
	if (ret)
322
		goto exit_reset;
323

324 325
	ret = i2c_dw_probe_lock_support(dev);
	if (ret)
326
		goto exit_reset;
327

328
	i2c_dw_configure(dev);
329

330 331
	/* Optional interface clock */
	dev->pclk = devm_clk_get_optional(&pdev->dev, "pclk");
332 333 334 335
	if (IS_ERR(dev->pclk)) {
		ret = PTR_ERR(dev->pclk);
		goto exit_reset;
	}
336

337 338 339 340 341 342 343 344 345 346 347
	dev->clk = devm_clk_get_optional(&pdev->dev, NULL);
	if (IS_ERR(dev->clk)) {
		ret = PTR_ERR(dev->clk);
		goto exit_reset;
	}

	ret = i2c_dw_prepare_clk(dev, true);
	if (ret)
		goto exit_reset;

	if (dev->clk) {
348 349
		u64 clk_khz;

350
		dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
351
		clk_khz = dev->get_clk_rate_khz(dev);
352

353 354
		if (!dev->sda_hold_time && t->sda_hold_ns)
			dev->sda_hold_time =
355
				DIV_S64_ROUND_CLOSEST(clk_khz * t->sda_hold_ns, MICRO);
356 357
	}

358 359
	adap = &dev->adapter;
	adap->owner = THIS_MODULE;
360 361
	adap->class = dmi_check_system(dw_i2c_hwmon_class_dmi) ?
					I2C_CLASS_HWMON : I2C_CLASS_DEPRECATED;
362
	ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));
363
	adap->dev.of_node = pdev->dev.of_node;
364
	adap->nr = -1;
365

366 367
	if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
		dev_pm_set_driver_flags(&pdev->dev,
368
					DPM_FLAG_SMART_PREPARE);
369 370 371
	} else {
		dev_pm_set_driver_flags(&pdev->dev,
					DPM_FLAG_SMART_PREPARE |
372
					DPM_FLAG_SMART_SUSPEND);
373
	}
374

375 376
	device_enable_async_suspend(&pdev->dev);

377 378 379 380 381 382 383
	/* The code below assumes runtime PM to be disabled. */
	WARN_ON(pm_runtime_enabled(&pdev->dev));

	pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
	pm_runtime_use_autosuspend(&pdev->dev);
	pm_runtime_set_active(&pdev->dev);

384
	if (dev->shared_with_punit)
385 386 387
		pm_runtime_get_noresume(&pdev->dev);

	pm_runtime_enable(&pdev->dev);
388

389
	ret = i2c_dw_probe(dev);
390
	if (ret)
391
		goto exit_probe;
392

393
	return ret;
394 395

exit_probe:
396
	dw_i2c_plat_pm_cleanup(dev);
397
exit_reset:
398
	reset_control_assert(dev->rst);
399
	return ret;
400 401
}

402
static void dw_i2c_plat_remove(struct platform_device *pdev)
403 404 405
{
	struct dw_i2c_dev *dev = platform_get_drvdata(pdev);

406 407
	pm_runtime_get_sync(&pdev->dev);

408 409
	i2c_del_adapter(&dev->adapter);

410
	dev->disable(dev);
411

412 413
	pm_runtime_dont_use_autosuspend(&pdev->dev);
	pm_runtime_put_sync(&pdev->dev);
414 415
	dw_i2c_plat_pm_cleanup(dev);

416 417
	i2c_dw_remove_lock_support(dev);

418
	reset_control_assert(dev->rst);
419 420
}

421
#ifdef CONFIG_PM_SLEEP
422
static int dw_i2c_plat_prepare(struct device *dev)
423
{
424 425 426 427 428 429 430
	/*
	 * If the ACPI companion device object is present for this device, it
	 * may be accessed during suspend and resume of other devices via I2C
	 * operation regions, so tell the PM core and middle layers to avoid
	 * skipping system suspend/resume callbacks for it in that case.
	 */
	return !has_acpi_companion(dev);
431 432
}
#else
433
#define dw_i2c_plat_prepare	NULL
434 435
#endif

436
#ifdef CONFIG_PM
437
static int dw_i2c_plat_runtime_suspend(struct device *dev)
438
{
439
	struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
440

441
	if (i_dev->shared_with_punit)
442 443
		return 0;

444
	i_dev->disable(i_dev);
445
	i2c_dw_prepare_clk(i_dev, false);
446 447 448 449

	return 0;
}

450
static int __maybe_unused dw_i2c_plat_suspend(struct device *dev)
451 452 453
{
	struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);

454
	i2c_mark_adapter_suspended(&i_dev->adapter);
455 456 457 458 459

	return dw_i2c_plat_runtime_suspend(dev);
}

static int dw_i2c_plat_runtime_resume(struct device *dev)
460
{
461
	struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);
462

463
	if (!i_dev->shared_with_punit)
464 465
		i2c_dw_prepare_clk(i_dev, true);

466
	i_dev->init(i_dev);
467 468 469 470

	return 0;
}

471
static int __maybe_unused dw_i2c_plat_resume(struct device *dev)
472 473 474 475
{
	struct dw_i2c_dev *i_dev = dev_get_drvdata(dev);

	dw_i2c_plat_runtime_resume(dev);
476
	i2c_mark_adapter_resumed(&i_dev->adapter);
477

478
	return 0;
479 480
}

481
static const struct dev_pm_ops dw_i2c_dev_pm_ops = {
482
	.prepare = dw_i2c_plat_prepare,
483
	SET_LATE_SYSTEM_SLEEP_PM_OPS(dw_i2c_plat_suspend, dw_i2c_plat_resume)
484
	SET_RUNTIME_PM_OPS(dw_i2c_plat_runtime_suspend, dw_i2c_plat_runtime_resume, NULL)
485 486 487 488 489 490
};

#define DW_I2C_DEV_PMOPS (&dw_i2c_dev_pm_ops)
#else
#define DW_I2C_DEV_PMOPS NULL
#endif
491

492
/* Work with hotplug and coldplug */
493 494 495
MODULE_ALIAS("platform:i2c_designware");

static struct platform_driver dw_i2c_driver = {
496
	.probe = dw_i2c_plat_probe,
497
	.remove_new = dw_i2c_plat_remove,
498 499
	.driver		= {
		.name	= "i2c_designware",
500
		.of_match_table = of_match_ptr(dw_i2c_of_match),
501
		.acpi_match_table = ACPI_PTR(dw_i2c_acpi_match),
502
		.pm	= DW_I2C_DEV_PMOPS,
503 504 505 506 507
	},
};

static int __init dw_i2c_init_driver(void)
{
508
	return platform_driver_register(&dw_i2c_driver);
509
}
510
subsys_initcall(dw_i2c_init_driver);
511 512 513 514 515 516 517 518 519 520

static void __exit dw_i2c_exit_driver(void)
{
	platform_driver_unregister(&dw_i2c_driver);
}
module_exit(dw_i2c_exit_driver);

MODULE_AUTHOR("Baruch Siach <baruch@tkos.co.il>");
MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter");
MODULE_LICENSE("GPL");