hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/drivers/i2c/busses/i2c-riic.c
....@@ -43,6 +43,7 @@
4343 #include <linux/module.h>
4444 #include <linux/of.h>
4545 #include <linux/platform_device.h>
46
+#include <linux/pm_runtime.h>
4647
4748 #define RIIC_ICCR1 0x00
4849 #define RIIC_ICCR2 0x04
....@@ -112,12 +113,10 @@
112113 {
113114 struct riic_dev *riic = i2c_get_adapdata(adap);
114115 unsigned long time_left;
115
- int i, ret;
116
+ int i;
116117 u8 start_bit;
117118
118
- ret = clk_prepare_enable(riic->clk);
119
- if (ret)
120
- return ret;
119
+ pm_runtime_get_sync(adap->dev.parent);
121120
122121 if (readb(riic->base + RIIC_ICCR2) & ICCR2_BBSY) {
123122 riic->err = -EBUSY;
....@@ -150,7 +149,7 @@
150149 }
151150
152151 out:
153
- clk_disable_unprepare(riic->clk);
152
+ pm_runtime_put(adap->dev.parent);
154153
155154 return riic->err ?: num;
156155 }
....@@ -282,20 +281,18 @@
282281
283282 static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t)
284283 {
285
- int ret;
284
+ int ret = 0;
286285 unsigned long rate;
287286 int total_ticks, cks, brl, brh;
288287
289
- ret = clk_prepare_enable(riic->clk);
290
- if (ret)
291
- return ret;
288
+ pm_runtime_get_sync(riic->adapter.dev.parent);
292289
293
- if (t->bus_freq_hz > 400000) {
290
+ if (t->bus_freq_hz > I2C_MAX_FAST_MODE_FREQ) {
294291 dev_err(&riic->adapter.dev,
295
- "unsupported bus speed (%dHz). 400000 max\n",
296
- t->bus_freq_hz);
297
- clk_disable_unprepare(riic->clk);
298
- return -EINVAL;
292
+ "unsupported bus speed (%dHz). %d max\n",
293
+ t->bus_freq_hz, I2C_MAX_FAST_MODE_FREQ);
294
+ ret = -EINVAL;
295
+ goto out;
299296 }
300297
301298 rate = clk_get_rate(riic->clk);
....@@ -333,8 +330,8 @@
333330 if (brl > (0x1F + 3)) {
334331 dev_err(&riic->adapter.dev, "invalid speed (%lu). Too slow.\n",
335332 (unsigned long)t->bus_freq_hz);
336
- clk_disable_unprepare(riic->clk);
337
- return -EINVAL;
333
+ ret = -EINVAL;
334
+ goto out;
338335 }
339336
340337 brh = total_ticks - brl;
....@@ -379,9 +376,9 @@
379376
380377 riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1);
381378
382
- clk_disable_unprepare(riic->clk);
383
-
384
- return 0;
379
+out:
380
+ pm_runtime_put(riic->adapter.dev.parent);
381
+ return ret;
385382 }
386383
387384 static struct riic_irq_desc riic_irqs[] = {
....@@ -440,28 +437,36 @@
440437
441438 i2c_parse_fw_timings(&pdev->dev, &i2c_t, true);
442439
440
+ pm_runtime_enable(&pdev->dev);
441
+
443442 ret = riic_init_hw(riic, &i2c_t);
444443 if (ret)
445
- return ret;
446
-
444
+ goto out;
447445
448446 ret = i2c_add_adapter(adap);
449447 if (ret)
450
- return ret;
448
+ goto out;
451449
452450 platform_set_drvdata(pdev, riic);
453451
454452 dev_info(&pdev->dev, "registered with %dHz bus speed\n",
455453 i2c_t.bus_freq_hz);
456454 return 0;
455
+
456
+out:
457
+ pm_runtime_disable(&pdev->dev);
458
+ return ret;
457459 }
458460
459461 static int riic_i2c_remove(struct platform_device *pdev)
460462 {
461463 struct riic_dev *riic = platform_get_drvdata(pdev);
462464
465
+ pm_runtime_get_sync(&pdev->dev);
463466 writeb(0, riic->base + RIIC_ICIER);
467
+ pm_runtime_put(&pdev->dev);
464468 i2c_del_adapter(&riic->adapter);
469
+ pm_runtime_disable(&pdev->dev);
465470
466471 return 0;
467472 }