hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/soc/rockchip/rockchip_pm_config.c
....@@ -17,6 +17,7 @@
1717 #include <linux/pm.h>
1818 #include <linux/regulator/driver.h>
1919 #include <linux/regulator/machine.h>
20
+#include <linux/rockchip/rockchip_pm_config.h>
2021 #include <linux/rockchip/rockchip_sip.h>
2122 #include <linux/suspend.h>
2223 #include <dt-bindings/input/input.h>
....@@ -51,11 +52,6 @@
5152 } on_off_regs_list[RK_PM_STATE_MAX];
5253 #endif
5354
54
-static struct rk_sleep_config {
55
- u32 mode_config;
56
- u32 wakeup_config;
57
-} sleep_config[RK_PM_STATE_MAX];
58
-
5955 /* rk_tag related defines */
6056 #define sleep_tag_next(t) \
6157 ((struct rk_sleep_tag *)((__u32 *)(t) + (t)->hdr.size))
....@@ -81,7 +77,10 @@
8177 struct rk_sleep_tag slp_tags;
8278 };
8379
80
+struct rk_sleep_config *sleep_config;
81
+
8482 static const struct of_device_id pm_match_table[] = {
83
+ { .compatible = "rockchip,pm-config",},
8584 { .compatible = "rockchip,pm-px30",},
8685 { .compatible = "rockchip,pm-rk1808",},
8786 { .compatible = "rockchip,pm-rk322x",},
....@@ -253,6 +252,18 @@
253252
254253 return 0;
255254 }
255
+
256
+const struct rk_sleep_config *rockchip_get_cur_sleep_config(void)
257
+{
258
+ suspend_state_t suspend_state = mem_sleep_current;
259
+ enum rk_pm_state state = suspend_state - PM_SUSPEND_MEM;
260
+
261
+ if (state >= RK_PM_STATE_MAX)
262
+ return NULL;
263
+
264
+ return &sleep_config[state];
265
+}
266
+EXPORT_SYMBOL_GPL(rockchip_get_cur_sleep_config);
256267 #endif
257268
258269 static int parse_mcu_sleep_config(struct device_node *node)
....@@ -364,17 +375,43 @@
364375 return ret;
365376 }
366377
378
+static int parse_io_config(struct device *dev)
379
+{
380
+ int ret = 0, cnt;
381
+ struct device_node *node = dev->of_node;
382
+ struct rk_sleep_config *config = &sleep_config[RK_PM_MEM];
383
+
384
+ cnt = of_property_count_u32_elems(node, "rockchip,sleep-io-config");
385
+ if (cnt > 0) {
386
+ /* 0 as the last element of virtual_pwroff_irqs */
387
+ config->sleep_io_config =
388
+ devm_kmalloc_array(dev, cnt, sizeof(u32), GFP_KERNEL);
389
+ if (!config->sleep_io_config) {
390
+ ret = -ENOMEM;
391
+ goto out;
392
+ }
393
+
394
+ ret = of_property_read_u32_array(node, "rockchip,sleep-io-config",
395
+ config->sleep_io_config, cnt);
396
+ if (ret) {
397
+ dev_err(dev, "get rockchip,sleep-io-config error\n");
398
+ goto out;
399
+ }
400
+
401
+ config->sleep_io_config_cnt = cnt;
402
+ } else {
403
+ dev_dbg(dev, "not set sleep-pin-config\n");
404
+ }
405
+
406
+out:
407
+ return ret;
408
+}
409
+
367410 static int pm_config_probe(struct platform_device *pdev)
368411 {
369412 const struct of_device_id *match_id;
370413 struct device_node *node;
371
- struct rk_sleep_config *config = &sleep_config[RK_PM_MEM];
372
- u32 pwm_regulator_config = 0;
373
- int gpio_temp[10];
374
- u32 sleep_debug_en = 0;
375
- u32 apios_suspend = 0;
376
- u32 io_ret_config = 0;
377
- u32 sleep_pin_config[2] = {0};
414
+ struct rk_sleep_config *config;
378415
379416 enum of_gpio_flags flags;
380417 int i = 0;
....@@ -392,6 +429,14 @@
392429 return -ENODEV;
393430 }
394431
432
+ sleep_config =
433
+ devm_kmalloc_array(&pdev->dev, RK_PM_STATE_MAX,
434
+ sizeof(*sleep_config), GFP_KERNEL);
435
+ if (!sleep_config)
436
+ return -ENOMEM;
437
+
438
+ config = &sleep_config[RK_PM_MEM];
439
+
395440 if (of_property_read_u32_array(node,
396441 "rockchip,sleep-mode-config",
397442 &config->mode_config, 1))
....@@ -408,48 +453,56 @@
408453
409454 if (of_property_read_u32_array(node,
410455 "rockchip,pwm-regulator-config",
411
- &pwm_regulator_config, 1))
456
+ &config->pwm_regulator_config, 1))
412457 dev_warn(&pdev->dev, "not set pwm-regulator-config\n");
413458 else
414459 sip_smc_set_suspend_mode(PWM_REGULATOR_CONFIG,
415
- pwm_regulator_config,
460
+ config->pwm_regulator_config,
416461 0);
417462
418463 length = of_gpio_named_count(node, "rockchip,power-ctrl");
419464
420465 if (length > 0 && length < 10) {
466
+ config->power_ctrl_config_cnt = length;
467
+ config->power_ctrl_config =
468
+ devm_kmalloc_array(&pdev->dev, length,
469
+ sizeof(u32), GFP_KERNEL);
470
+ if (!config->power_ctrl_config)
471
+ return -ENOMEM;
472
+
421473 for (i = 0; i < length; i++) {
422
- gpio_temp[i] = of_get_named_gpio_flags(node,
423
- "rockchip,power-ctrl",
424
- i,
425
- &flags);
426
- if (!gpio_is_valid(gpio_temp[i]))
474
+ config->power_ctrl_config[i] =
475
+ of_get_named_gpio_flags(node,
476
+ "rockchip,power-ctrl",
477
+ i,
478
+ &flags);
479
+ if (!gpio_is_valid(config->power_ctrl_config[i]))
427480 break;
428481 sip_smc_set_suspend_mode(GPIO_POWER_CONFIG,
429482 i,
430
- gpio_temp[i]);
483
+ config->power_ctrl_config[i]);
431484 }
432485 }
433486 sip_smc_set_suspend_mode(GPIO_POWER_CONFIG, i, PM_INVALID_GPIO);
434487
435488 if (!of_property_read_u32_array(node,
436489 "rockchip,sleep-debug-en",
437
- &sleep_debug_en, 1))
490
+ &config->sleep_debug_en, 1))
438491 sip_smc_set_suspend_mode(SUSPEND_DEBUG_ENABLE,
439
- sleep_debug_en,
492
+ config->sleep_debug_en,
440493 0);
441494
442495 if (!of_property_read_u32_array(node,
443496 "rockchip,apios-suspend",
444
- &apios_suspend, 1))
497
+ &config->apios_suspend, 1))
445498 sip_smc_set_suspend_mode(APIOS_SUSPEND_CONFIG,
446
- apios_suspend,
499
+ config->apios_suspend,
447500 0);
448501
449502 if (!of_property_read_u32_array(node,
450503 "rockchip,sleep-io-ret-config",
451
- &io_ret_config, 1)) {
452
- ret = sip_smc_set_suspend_mode(SUSPEND_IO_RET_CONFIG, io_ret_config, 0);
504
+ &config->io_ret_config, 1)) {
505
+ ret = sip_smc_set_suspend_mode(SUSPEND_IO_RET_CONFIG, config->io_ret_config, 0);
453506 if (ret)
454507 dev_warn(&pdev->dev,
455508 "sleep-io-ret-config failed (%d), check parameters or update trust\n",
....@@ -458,14 +511,17 @@
458511
459512 if (!of_property_read_u32_array(node,
460513 "rockchip,sleep-pin-config",
461
- sleep_pin_config, 2)) {
462
- ret = sip_smc_set_suspend_mode(SLEEP_PIN_CONFIG, sleep_pin_config[0], sleep_pin_config[1]);
514
+ config->sleep_pin_config, 2)) {
515
+ ret = sip_smc_set_suspend_mode(SLEEP_PIN_CONFIG,
516
+ config->sleep_pin_config[0],
517
+ config->sleep_pin_config[1]);
463518 if (ret)
464519 dev_warn(&pdev->dev,
465520 "sleep-pin-config failed (%d), check parameters or update trust\n",
466521 ret);
467522 }
468523
524
+ parse_io_config(&pdev->dev);
469525 parse_mcu_sleep_config(node);
470526
471527 #ifndef MODULE