aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2009-01-27 21:44:18 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-02-08 12:50:30 -0500
commit46e0ccf8ae32e53dc34a274977e2c6256b2deddc (patch)
tree65c26ce0872444a047bc9bf9e6f29958b5f5a086 /arch/arm
parent15b52bc4cb2b4cc93047b957a6c7b9dbd910a6fa (diff)
[ARM] OMAP3 PRCM: add DPLL1-5 powerdomains, clockdomains; mark clocks
Each DPLL exists in its own powerdomain (cf 34xx TRM figure 4-18) and clockdomain; so, create powerdomain and clockdomain structures for them. Mark each DPLL clock as belonging to their respective DPLL clockdomain. cf. 34xx TRM Table 4-27 (among other references). linux-omap source commits are acdb615850b9b4f7d1ab68133a16be8c8c0e7419 and a8798a48f33e9268dcc7f30a4b4a3ce4220fe0c9. Signed-off-by: Paul Walmsley <paul@pwsan.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-omap2/clock34xx.h27
-rw-r--r--arch/arm/mach-omap2/clockdomains.h35
-rw-r--r--arch/arm/mach-omap2/powerdomains.h5
-rw-r--r--arch/arm/mach-omap2/powerdomains34xx.h31
4 files changed, 98 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h
index baed53f6952b..9dec69860ba7 100644
--- a/arch/arm/mach-omap2/clock34xx.h
+++ b/arch/arm/mach-omap2/clock34xx.h
@@ -280,6 +280,7 @@ static struct clk dpll1_ck = {
280 .flags = RATE_PROPAGATES, 280 .flags = RATE_PROPAGATES,
281 .round_rate = &omap2_dpll_round_rate, 281 .round_rate = &omap2_dpll_round_rate,
282 .set_rate = &omap3_noncore_dpll_set_rate, 282 .set_rate = &omap3_noncore_dpll_set_rate,
283 .clkdm_name = "dpll1_clkdm",
283 .recalc = &omap3_dpll_recalc, 284 .recalc = &omap3_dpll_recalc,
284}; 285};
285 286
@@ -292,6 +293,7 @@ static struct clk dpll1_x2_ck = {
292 .ops = &clkops_null, 293 .ops = &clkops_null,
293 .parent = &dpll1_ck, 294 .parent = &dpll1_ck,
294 .flags = RATE_PROPAGATES, 295 .flags = RATE_PROPAGATES,
296 .clkdm_name = "dpll1_clkdm",
295 .recalc = &omap3_clkoutx2_recalc, 297 .recalc = &omap3_clkoutx2_recalc,
296}; 298};
297 299
@@ -314,6 +316,7 @@ static struct clk dpll1_x2m2_ck = {
314 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK, 316 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK,
315 .clksel = div16_dpll1_x2m2_clksel, 317 .clksel = div16_dpll1_x2m2_clksel,
316 .flags = RATE_PROPAGATES, 318 .flags = RATE_PROPAGATES,
319 .clkdm_name = "dpll1_clkdm",
317 .recalc = &omap2_clksel_recalc, 320 .recalc = &omap2_clksel_recalc,
318}; 321};
319 322
@@ -350,6 +353,7 @@ static struct clk dpll2_ck = {
350 .flags = RATE_PROPAGATES, 353 .flags = RATE_PROPAGATES,
351 .round_rate = &omap2_dpll_round_rate, 354 .round_rate = &omap2_dpll_round_rate,
352 .set_rate = &omap3_noncore_dpll_set_rate, 355 .set_rate = &omap3_noncore_dpll_set_rate,
356 .clkdm_name = "dpll2_clkdm",
353 .recalc = &omap3_dpll_recalc, 357 .recalc = &omap3_dpll_recalc,
354}; 358};
355 359
@@ -372,6 +376,7 @@ static struct clk dpll2_m2_ck = {
372 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK, 376 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK,
373 .clksel = div16_dpll2_m2x2_clksel, 377 .clksel = div16_dpll2_m2x2_clksel,
374 .flags = RATE_PROPAGATES, 378 .flags = RATE_PROPAGATES,
379 .clkdm_name = "dpll2_clkdm",
375 .recalc = &omap2_clksel_recalc, 380 .recalc = &omap2_clksel_recalc,
376}; 381};
377 382
@@ -404,6 +409,7 @@ static struct clk dpll3_ck = {
404 .dpll_data = &dpll3_dd, 409 .dpll_data = &dpll3_dd,
405 .flags = RATE_PROPAGATES, 410 .flags = RATE_PROPAGATES,
406 .round_rate = &omap2_dpll_round_rate, 411 .round_rate = &omap2_dpll_round_rate,
412 .clkdm_name = "dpll3_clkdm",
407 .recalc = &omap3_dpll_recalc, 413 .recalc = &omap3_dpll_recalc,
408}; 414};
409 415
@@ -416,6 +422,7 @@ static struct clk dpll3_x2_ck = {
416 .ops = &clkops_null, 422 .ops = &clkops_null,
417 .parent = &dpll3_ck, 423 .parent = &dpll3_ck,
418 .flags = RATE_PROPAGATES, 424 .flags = RATE_PROPAGATES,
425 .clkdm_name = "dpll3_clkdm",
419 .recalc = &omap3_clkoutx2_recalc, 426 .recalc = &omap3_clkoutx2_recalc,
420}; 427};
421 428
@@ -473,6 +480,7 @@ static struct clk dpll3_m2_ck = {
473 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK, 480 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK,
474 .clksel = div31_dpll3m2_clksel, 481 .clksel = div31_dpll3m2_clksel,
475 .flags = RATE_PROPAGATES, 482 .flags = RATE_PROPAGATES,
483 .clkdm_name = "dpll3_clkdm",
476 .recalc = &omap2_clksel_recalc, 484 .recalc = &omap2_clksel_recalc,
477}; 485};
478 486
@@ -507,6 +515,7 @@ static struct clk dpll3_m2x2_ck = {
507 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK, 515 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK,
508 .clksel = dpll3_m2x2_ck_clksel, 516 .clksel = dpll3_m2x2_ck_clksel,
509 .flags = RATE_PROPAGATES, 517 .flags = RATE_PROPAGATES,
518 .clkdm_name = "dpll3_clkdm",
510 .recalc = &omap2_clksel_recalc, 519 .recalc = &omap2_clksel_recalc,
511}; 520};
512 521
@@ -526,6 +535,7 @@ static struct clk dpll3_m3_ck = {
526 .clksel_mask = OMAP3430_DIV_DPLL3_MASK, 535 .clksel_mask = OMAP3430_DIV_DPLL3_MASK,
527 .clksel = div16_dpll3_clksel, 536 .clksel = div16_dpll3_clksel,
528 .flags = RATE_PROPAGATES, 537 .flags = RATE_PROPAGATES,
538 .clkdm_name = "dpll3_clkdm",
529 .recalc = &omap2_clksel_recalc, 539 .recalc = &omap2_clksel_recalc,
530}; 540};
531 541
@@ -537,6 +547,7 @@ static struct clk dpll3_m3x2_ck = {
537 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 547 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
538 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT, 548 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT,
539 .flags = RATE_PROPAGATES | INVERT_ENABLE, 549 .flags = RATE_PROPAGATES | INVERT_ENABLE,
550 .clkdm_name = "dpll3_clkdm",
540 .recalc = &omap3_clkoutx2_recalc, 551 .recalc = &omap3_clkoutx2_recalc,
541}; 552};
542 553
@@ -555,6 +566,7 @@ static struct clk emu_core_alwon_ck = {
555 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK, 566 .clksel_mask = OMAP3430_ST_CORE_CLK_MASK,
556 .clksel = emu_core_alwon_ck_clksel, 567 .clksel = emu_core_alwon_ck_clksel,
557 .flags = RATE_PROPAGATES, 568 .flags = RATE_PROPAGATES,
569 .clkdm_name = "dpll3_clkdm",
558 .recalc = &omap2_clksel_recalc, 570 .recalc = &omap2_clksel_recalc,
559}; 571};
560 572
@@ -589,6 +601,7 @@ static struct clk dpll4_ck = {
589 .flags = RATE_PROPAGATES, 601 .flags = RATE_PROPAGATES,
590 .round_rate = &omap2_dpll_round_rate, 602 .round_rate = &omap2_dpll_round_rate,
591 .set_rate = &omap3_dpll4_set_rate, 603 .set_rate = &omap3_dpll4_set_rate,
604 .clkdm_name = "dpll4_clkdm",
592 .recalc = &omap3_dpll_recalc, 605 .recalc = &omap3_dpll_recalc,
593}; 606};
594 607
@@ -602,6 +615,7 @@ static struct clk dpll4_x2_ck = {
602 .ops = &clkops_null, 615 .ops = &clkops_null,
603 .parent = &dpll4_ck, 616 .parent = &dpll4_ck,
604 .flags = RATE_PROPAGATES, 617 .flags = RATE_PROPAGATES,
618 .clkdm_name = "dpll4_clkdm",
605 .recalc = &omap3_clkoutx2_recalc, 619 .recalc = &omap3_clkoutx2_recalc,
606}; 620};
607 621
@@ -620,6 +634,7 @@ static struct clk dpll4_m2_ck = {
620 .clksel_mask = OMAP3430_DIV_96M_MASK, 634 .clksel_mask = OMAP3430_DIV_96M_MASK,
621 .clksel = div16_dpll4_clksel, 635 .clksel = div16_dpll4_clksel,
622 .flags = RATE_PROPAGATES, 636 .flags = RATE_PROPAGATES,
637 .clkdm_name = "dpll4_clkdm",
623 .recalc = &omap2_clksel_recalc, 638 .recalc = &omap2_clksel_recalc,
624}; 639};
625 640
@@ -631,6 +646,7 @@ static struct clk dpll4_m2x2_ck = {
631 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 646 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
632 .enable_bit = OMAP3430_PWRDN_96M_SHIFT, 647 .enable_bit = OMAP3430_PWRDN_96M_SHIFT,
633 .flags = RATE_PROPAGATES | INVERT_ENABLE, 648 .flags = RATE_PROPAGATES | INVERT_ENABLE,
649 .clkdm_name = "dpll4_clkdm",
634 .recalc = &omap3_clkoutx2_recalc, 650 .recalc = &omap3_clkoutx2_recalc,
635}; 651};
636 652
@@ -704,6 +720,7 @@ static struct clk dpll4_m3_ck = {
704 .clksel_mask = OMAP3430_CLKSEL_TV_MASK, 720 .clksel_mask = OMAP3430_CLKSEL_TV_MASK,
705 .clksel = div16_dpll4_clksel, 721 .clksel = div16_dpll4_clksel,
706 .flags = RATE_PROPAGATES, 722 .flags = RATE_PROPAGATES,
723 .clkdm_name = "dpll4_clkdm",
707 .recalc = &omap2_clksel_recalc, 724 .recalc = &omap2_clksel_recalc,
708}; 725};
709 726
@@ -716,6 +733,7 @@ static struct clk dpll4_m3x2_ck = {
716 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 733 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
717 .enable_bit = OMAP3430_PWRDN_TV_SHIFT, 734 .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
718 .flags = RATE_PROPAGATES | INVERT_ENABLE, 735 .flags = RATE_PROPAGATES | INVERT_ENABLE,
736 .clkdm_name = "dpll4_clkdm",
719 .recalc = &omap3_clkoutx2_recalc, 737 .recalc = &omap3_clkoutx2_recalc,
720}; 738};
721 739
@@ -810,6 +828,7 @@ static struct clk dpll4_m4_ck = {
810 .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK, 828 .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK,
811 .clksel = div16_dpll4_clksel, 829 .clksel = div16_dpll4_clksel,
812 .flags = RATE_PROPAGATES, 830 .flags = RATE_PROPAGATES,
831 .clkdm_name = "dpll4_clkdm",
813 .recalc = &omap2_clksel_recalc, 832 .recalc = &omap2_clksel_recalc,
814 .set_rate = &omap2_clksel_set_rate, 833 .set_rate = &omap2_clksel_set_rate,
815 .round_rate = &omap2_clksel_round_rate, 834 .round_rate = &omap2_clksel_round_rate,
@@ -823,6 +842,7 @@ static struct clk dpll4_m4x2_ck = {
823 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 842 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
824 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, 843 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
825 .flags = RATE_PROPAGATES | INVERT_ENABLE, 844 .flags = RATE_PROPAGATES | INVERT_ENABLE,
845 .clkdm_name = "dpll4_clkdm",
826 .recalc = &omap3_clkoutx2_recalc, 846 .recalc = &omap3_clkoutx2_recalc,
827}; 847};
828 848
@@ -836,6 +856,7 @@ static struct clk dpll4_m5_ck = {
836 .clksel_mask = OMAP3430_CLKSEL_CAM_MASK, 856 .clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
837 .clksel = div16_dpll4_clksel, 857 .clksel = div16_dpll4_clksel,
838 .flags = RATE_PROPAGATES, 858 .flags = RATE_PROPAGATES,
859 .clkdm_name = "dpll4_clkdm",
839 .recalc = &omap2_clksel_recalc, 860 .recalc = &omap2_clksel_recalc,
840}; 861};
841 862
@@ -847,6 +868,7 @@ static struct clk dpll4_m5x2_ck = {
847 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 868 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
848 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT, 869 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
849 .flags = RATE_PROPAGATES | INVERT_ENABLE, 870 .flags = RATE_PROPAGATES | INVERT_ENABLE,
871 .clkdm_name = "dpll4_clkdm",
850 .recalc = &omap3_clkoutx2_recalc, 872 .recalc = &omap3_clkoutx2_recalc,
851}; 873};
852 874
@@ -860,6 +882,7 @@ static struct clk dpll4_m6_ck = {
860 .clksel_mask = OMAP3430_DIV_DPLL4_MASK, 882 .clksel_mask = OMAP3430_DIV_DPLL4_MASK,
861 .clksel = div16_dpll4_clksel, 883 .clksel = div16_dpll4_clksel,
862 .flags = RATE_PROPAGATES, 884 .flags = RATE_PROPAGATES,
885 .clkdm_name = "dpll4_clkdm",
863 .recalc = &omap2_clksel_recalc, 886 .recalc = &omap2_clksel_recalc,
864}; 887};
865 888
@@ -872,6 +895,7 @@ static struct clk dpll4_m6x2_ck = {
872 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 895 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
873 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, 896 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
874 .flags = RATE_PROPAGATES | INVERT_ENABLE, 897 .flags = RATE_PROPAGATES | INVERT_ENABLE,
898 .clkdm_name = "dpll4_clkdm",
875 .recalc = &omap3_clkoutx2_recalc, 899 .recalc = &omap3_clkoutx2_recalc,
876}; 900};
877 901
@@ -880,6 +904,7 @@ static struct clk emu_per_alwon_ck = {
880 .ops = &clkops_null, 904 .ops = &clkops_null,
881 .parent = &dpll4_m6x2_ck, 905 .parent = &dpll4_m6x2_ck,
882 .flags = RATE_PROPAGATES, 906 .flags = RATE_PROPAGATES,
907 .clkdm_name = "dpll4_clkdm",
883 .recalc = &followparent_recalc, 908 .recalc = &followparent_recalc,
884}; 909};
885 910
@@ -915,6 +940,7 @@ static struct clk dpll5_ck = {
915 .flags = RATE_PROPAGATES, 940 .flags = RATE_PROPAGATES,
916 .round_rate = &omap2_dpll_round_rate, 941 .round_rate = &omap2_dpll_round_rate,
917 .set_rate = &omap3_noncore_dpll_set_rate, 942 .set_rate = &omap3_noncore_dpll_set_rate,
943 .clkdm_name = "dpll5_clkdm",
918 .recalc = &omap3_dpll_recalc, 944 .recalc = &omap3_dpll_recalc,
919}; 945};
920 946
@@ -932,6 +958,7 @@ static struct clk dpll5_m2_ck = {
932 .clksel_mask = OMAP3430ES2_DIV_120M_MASK, 958 .clksel_mask = OMAP3430ES2_DIV_120M_MASK,
933 .clksel = div16_dpll5_clksel, 959 .clksel = div16_dpll5_clksel,
934 .flags = RATE_PROPAGATES, 960 .flags = RATE_PROPAGATES,
961 .clkdm_name = "dpll5_clkdm",
935 .recalc = &omap2_clksel_recalc, 962 .recalc = &omap2_clksel_recalc,
936}; 963};
937 964
diff --git a/arch/arm/mach-omap2/clockdomains.h b/arch/arm/mach-omap2/clockdomains.h
index ec5a72090993..9eb734328107 100644
--- a/arch/arm/mach-omap2/clockdomains.h
+++ b/arch/arm/mach-omap2/clockdomains.h
@@ -256,6 +256,36 @@ static struct clockdomain emu_clkdm = {
256 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 256 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
257}; 257};
258 258
259static struct clockdomain dpll1_clkdm = {
260 .name = "dpll1_clkdm",
261 .pwrdm = { .name = "dpll1_pwrdm" },
262 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
263};
264
265static struct clockdomain dpll2_clkdm = {
266 .name = "dpll2_clkdm",
267 .pwrdm = { .name = "dpll2_pwrdm" },
268 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
269};
270
271static struct clockdomain dpll3_clkdm = {
272 .name = "dpll3_clkdm",
273 .pwrdm = { .name = "dpll3_pwrdm" },
274 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
275};
276
277static struct clockdomain dpll4_clkdm = {
278 .name = "dpll4_clkdm",
279 .pwrdm = { .name = "dpll4_pwrdm" },
280 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
281};
282
283static struct clockdomain dpll5_clkdm = {
284 .name = "dpll5_clkdm",
285 .pwrdm = { .name = "dpll5_pwrdm" },
286 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2),
287};
288
259#endif /* CONFIG_ARCH_OMAP34XX */ 289#endif /* CONFIG_ARCH_OMAP34XX */
260 290
261/* 291/*
@@ -318,6 +348,11 @@ static struct clockdomain *clockdomains_omap[] = {
318 &usbhost_clkdm, 348 &usbhost_clkdm,
319 &per_clkdm, 349 &per_clkdm,
320 &emu_clkdm, 350 &emu_clkdm,
351 &dpll1_clkdm,
352 &dpll2_clkdm,
353 &dpll3_clkdm,
354 &dpll4_clkdm,
355 &dpll5_clkdm,
321#endif 356#endif
322 357
323 NULL, 358 NULL,
diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
index 1e151faebbd3..1329443f2cd5 100644
--- a/arch/arm/mach-omap2/powerdomains.h
+++ b/arch/arm/mach-omap2/powerdomains.h
@@ -178,6 +178,11 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
178 &emu_pwrdm, 178 &emu_pwrdm,
179 &sgx_pwrdm, 179 &sgx_pwrdm,
180 &usbhost_pwrdm, 180 &usbhost_pwrdm,
181 &dpll1_pwrdm,
182 &dpll2_pwrdm,
183 &dpll3_pwrdm,
184 &dpll4_pwrdm,
185 &dpll5_pwrdm,
181#endif 186#endif
182 187
183 NULL 188 NULL
diff --git a/arch/arm/mach-omap2/powerdomains34xx.h b/arch/arm/mach-omap2/powerdomains34xx.h
index 3a8e4fbea5f2..7b63fa074b71 100644
--- a/arch/arm/mach-omap2/powerdomains34xx.h
+++ b/arch/arm/mach-omap2/powerdomains34xx.h
@@ -322,6 +322,37 @@ static struct powerdomain usbhost_pwrdm = {
322 }, 322 },
323}; 323};
324 324
325static struct powerdomain dpll1_pwrdm = {
326 .name = "dpll1_pwrdm",
327 .prcm_offs = MPU_MOD,
328 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
329};
330
331static struct powerdomain dpll2_pwrdm = {
332 .name = "dpll2_pwrdm",
333 .prcm_offs = OMAP3430_IVA2_MOD,
334 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
335};
336
337static struct powerdomain dpll3_pwrdm = {
338 .name = "dpll3_pwrdm",
339 .prcm_offs = PLL_MOD,
340 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
341};
342
343static struct powerdomain dpll4_pwrdm = {
344 .name = "dpll4_pwrdm",
345 .prcm_offs = PLL_MOD,
346 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
347};
348
349static struct powerdomain dpll5_pwrdm = {
350 .name = "dpll5_pwrdm",
351 .prcm_offs = PLL_MOD,
352 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES2),
353};
354
355
325#endif /* CONFIG_ARCH_OMAP34XX */ 356#endif /* CONFIG_ARCH_OMAP34XX */
326 357
327 358