diff options
author | Ingo Molnar <mingo@elte.hu> | 2011-05-26 07:51:31 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2011-05-26 07:51:35 -0400 |
commit | de66ee979d0ea45171cc2501750e9f9f22f5a690 (patch) | |
tree | 5ab1a5c6b596b9b786902fb380274e1e1f4ceb13 /arch/arm/mach-shmobile/board-mackerel.c | |
parent | 916f676f8dc016103f983c7ec54c18ecdbb6e349 (diff) | |
parent | 4db70f73e56961b9bcdfd0c36c62847a18b7dbb5 (diff) |
Merge branch 'linus' into x86/urgent
Merge reason: we want to queue up a dependent patch.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/arm/mach-shmobile/board-mackerel.c')
-rw-r--r-- | arch/arm/mach-shmobile/board-mackerel.c | 272 |
1 files changed, 238 insertions, 34 deletions
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 7da2ca24229d..448ddbe43335 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/sh_intc.h> | 43 | #include <linux/sh_intc.h> |
44 | #include <linux/tca6416_keypad.h> | 44 | #include <linux/tca6416_keypad.h> |
45 | #include <linux/usb/r8a66597.h> | 45 | #include <linux/usb/r8a66597.h> |
46 | #include <linux/usb/renesas_usbhs.h> | ||
46 | 47 | ||
47 | #include <video/sh_mobile_hdmi.h> | 48 | #include <video/sh_mobile_hdmi.h> |
48 | #include <video/sh_mobile_lcdc.h> | 49 | #include <video/sh_mobile_lcdc.h> |
@@ -143,7 +144,30 @@ | |||
143 | * open | external VBUS | Function | 144 | * open | external VBUS | Function |
144 | * | 145 | * |
145 | * *1 | 146 | * *1 |
146 | * CN31 is used as Host in Linux. | 147 | * CN31 is used as |
148 | * CONFIG_USB_R8A66597_HCD Host | ||
149 | * CONFIG_USB_RENESAS_USBHS Function | ||
150 | * | ||
151 | * CAUTION | ||
152 | * | ||
153 | * renesas_usbhs driver can use external interrupt mode | ||
154 | * (which come from USB-PHY) or autonomy mode (it use own interrupt) | ||
155 | * for detecting connection/disconnection when Function. | ||
156 | * USB will be power OFF while it has been disconnecting | ||
157 | * if external interrupt mode, and it is always power ON if autonomy mode, | ||
158 | * | ||
159 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", | ||
160 | * because Touchscreen is using IRQ7-PORT40. | ||
161 | * It is impossible to use IRQ7 demux on this board. | ||
162 | * | ||
163 | * We can use external interrupt mode USB-Function on "USB1". | ||
164 | * USB1 can become Host by r8a66597, and become Function by renesas_usbhs. | ||
165 | * But don't select both drivers in same time. | ||
166 | * These uses same IRQ number for request_irq(), and aren't supporting | ||
167 | * IRQF_SHARD / IORESOURCE_IRQ_SHAREABLE. | ||
168 | * | ||
169 | * Actually these are old/new version of USB driver. | ||
170 | * This mean its register will be broken if it supports SHARD IRQ, | ||
147 | */ | 171 | */ |
148 | 172 | ||
149 | /* | 173 | /* |
@@ -185,6 +209,7 @@ | |||
185 | * FIXME !! | 209 | * FIXME !! |
186 | * | 210 | * |
187 | * gpio_no_direction | 211 | * gpio_no_direction |
212 | * gpio_pull_down | ||
188 | * are quick_hack. | 213 | * are quick_hack. |
189 | * | 214 | * |
190 | * current gpio frame work doesn't have | 215 | * current gpio frame work doesn't have |
@@ -196,6 +221,16 @@ static void __init gpio_no_direction(u32 addr) | |||
196 | __raw_writeb(0x00, addr); | 221 | __raw_writeb(0x00, addr); |
197 | } | 222 | } |
198 | 223 | ||
224 | static void __init gpio_pull_down(u32 addr) | ||
225 | { | ||
226 | u8 data = __raw_readb(addr); | ||
227 | |||
228 | data &= 0x0F; | ||
229 | data |= 0xA0; | ||
230 | |||
231 | __raw_writeb(data, addr); | ||
232 | } | ||
233 | |||
199 | /* MTD */ | 234 | /* MTD */ |
200 | static struct mtd_partition nor_flash_partitions[] = { | 235 | static struct mtd_partition nor_flash_partitions[] = { |
201 | { | 236 | { |
@@ -458,12 +493,6 @@ static void __init hdmi_init_pm_clock(void) | |||
458 | goto out; | 493 | goto out; |
459 | } | 494 | } |
460 | 495 | ||
461 | ret = clk_enable(&sh7372_pllc2_clk); | ||
462 | if (ret < 0) { | ||
463 | pr_err("Cannot enable pllc2 clock\n"); | ||
464 | goto out; | ||
465 | } | ||
466 | |||
467 | pr_debug("PLLC2 set frequency %lu\n", rate); | 496 | pr_debug("PLLC2 set frequency %lu\n", rate); |
468 | 497 | ||
469 | ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk); | 498 | ret = clk_set_parent(hdmi_ick, &sh7372_pllc2_clk); |
@@ -515,6 +544,157 @@ static struct platform_device usb1_host_device = { | |||
515 | .resource = usb1_host_resources, | 544 | .resource = usb1_host_resources, |
516 | }; | 545 | }; |
517 | 546 | ||
547 | /* USB1 (Function) */ | ||
548 | #define USB_PHY_MODE (1 << 4) | ||
549 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) | ||
550 | #define USB_PHY_ON (1 << 1) | ||
551 | #define USB_PHY_OFF (1 << 0) | ||
552 | #define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF) | ||
553 | |||
554 | struct usbhs_private { | ||
555 | unsigned int irq; | ||
556 | unsigned int usbphyaddr; | ||
557 | unsigned int usbcrcaddr; | ||
558 | struct renesas_usbhs_platform_info info; | ||
559 | }; | ||
560 | |||
561 | #define usbhs_get_priv(pdev) \ | ||
562 | container_of(renesas_usbhs_get_info(pdev), \ | ||
563 | struct usbhs_private, info) | ||
564 | |||
565 | #define usbhs_is_connected(priv) \ | ||
566 | (!((1 << 7) & __raw_readw(priv->usbcrcaddr))) | ||
567 | |||
568 | static int usbhs1_get_id(struct platform_device *pdev) | ||
569 | { | ||
570 | return USBHS_GADGET; | ||
571 | } | ||
572 | |||
573 | static int usbhs1_get_vbus(struct platform_device *pdev) | ||
574 | { | ||
575 | return usbhs_is_connected(usbhs_get_priv(pdev)); | ||
576 | } | ||
577 | |||
578 | static irqreturn_t usbhs1_interrupt(int irq, void *data) | ||
579 | { | ||
580 | struct platform_device *pdev = data; | ||
581 | struct usbhs_private *priv = usbhs_get_priv(pdev); | ||
582 | |||
583 | dev_dbg(&pdev->dev, "%s\n", __func__); | ||
584 | |||
585 | renesas_usbhs_call_notify_hotplug(pdev); | ||
586 | |||
587 | /* clear status */ | ||
588 | __raw_writew(__raw_readw(priv->usbphyaddr) | USB_PHY_INT_CLR, | ||
589 | priv->usbphyaddr); | ||
590 | |||
591 | return IRQ_HANDLED; | ||
592 | } | ||
593 | |||
594 | static int usbhs1_hardware_init(struct platform_device *pdev) | ||
595 | { | ||
596 | struct usbhs_private *priv = usbhs_get_priv(pdev); | ||
597 | int ret; | ||
598 | |||
599 | irq_set_irq_type(priv->irq, IRQ_TYPE_LEVEL_HIGH); | ||
600 | |||
601 | /* clear interrupt status */ | ||
602 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); | ||
603 | |||
604 | ret = request_irq(priv->irq, usbhs1_interrupt, 0, | ||
605 | dev_name(&pdev->dev), pdev); | ||
606 | if (ret) { | ||
607 | dev_err(&pdev->dev, "request_irq err\n"); | ||
608 | return ret; | ||
609 | } | ||
610 | |||
611 | /* enable USB phy interrupt */ | ||
612 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_EN, priv->usbphyaddr); | ||
613 | |||
614 | return 0; | ||
615 | } | ||
616 | |||
617 | static void usbhs1_hardware_exit(struct platform_device *pdev) | ||
618 | { | ||
619 | struct usbhs_private *priv = usbhs_get_priv(pdev); | ||
620 | |||
621 | /* clear interrupt status */ | ||
622 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); | ||
623 | |||
624 | free_irq(priv->irq, pdev); | ||
625 | } | ||
626 | |||
627 | static void usbhs1_phy_reset(struct platform_device *pdev) | ||
628 | { | ||
629 | struct usbhs_private *priv = usbhs_get_priv(pdev); | ||
630 | |||
631 | /* init phy */ | ||
632 | __raw_writew(0x8a0a, priv->usbcrcaddr); | ||
633 | } | ||
634 | |||
635 | static u32 usbhs1_pipe_cfg[] = { | ||
636 | USB_ENDPOINT_XFER_CONTROL, | ||
637 | USB_ENDPOINT_XFER_ISOC, | ||
638 | USB_ENDPOINT_XFER_ISOC, | ||
639 | USB_ENDPOINT_XFER_BULK, | ||
640 | USB_ENDPOINT_XFER_BULK, | ||
641 | USB_ENDPOINT_XFER_BULK, | ||
642 | USB_ENDPOINT_XFER_INT, | ||
643 | USB_ENDPOINT_XFER_INT, | ||
644 | USB_ENDPOINT_XFER_INT, | ||
645 | USB_ENDPOINT_XFER_BULK, | ||
646 | USB_ENDPOINT_XFER_BULK, | ||
647 | USB_ENDPOINT_XFER_BULK, | ||
648 | USB_ENDPOINT_XFER_BULK, | ||
649 | USB_ENDPOINT_XFER_BULK, | ||
650 | USB_ENDPOINT_XFER_BULK, | ||
651 | USB_ENDPOINT_XFER_BULK, | ||
652 | }; | ||
653 | |||
654 | static struct usbhs_private usbhs1_private = { | ||
655 | .irq = evt2irq(0x0300), /* IRQ8 */ | ||
656 | .usbphyaddr = 0xE60581E2, /* USBPHY1INTAP */ | ||
657 | .usbcrcaddr = 0xE6058130, /* USBCR4 */ | ||
658 | .info = { | ||
659 | .platform_callback = { | ||
660 | .hardware_init = usbhs1_hardware_init, | ||
661 | .hardware_exit = usbhs1_hardware_exit, | ||
662 | .phy_reset = usbhs1_phy_reset, | ||
663 | .get_id = usbhs1_get_id, | ||
664 | .get_vbus = usbhs1_get_vbus, | ||
665 | }, | ||
666 | .driver_param = { | ||
667 | .buswait_bwait = 4, | ||
668 | .pipe_type = usbhs1_pipe_cfg, | ||
669 | .pipe_size = ARRAY_SIZE(usbhs1_pipe_cfg), | ||
670 | }, | ||
671 | }, | ||
672 | }; | ||
673 | |||
674 | static struct resource usbhs1_resources[] = { | ||
675 | [0] = { | ||
676 | .name = "USBHS", | ||
677 | .start = 0xE68B0000, | ||
678 | .end = 0xE68B00E6 - 1, | ||
679 | .flags = IORESOURCE_MEM, | ||
680 | }, | ||
681 | [1] = { | ||
682 | .start = evt2irq(0x1ce0) /* USB1_USB1I0 */, | ||
683 | .flags = IORESOURCE_IRQ, | ||
684 | }, | ||
685 | }; | ||
686 | |||
687 | static struct platform_device usbhs1_device = { | ||
688 | .name = "renesas_usbhs", | ||
689 | .id = 1, | ||
690 | .dev = { | ||
691 | .platform_data = &usbhs1_private.info, | ||
692 | }, | ||
693 | .num_resources = ARRAY_SIZE(usbhs1_resources), | ||
694 | .resource = usbhs1_resources, | ||
695 | }; | ||
696 | |||
697 | |||
518 | /* LED */ | 698 | /* LED */ |
519 | static struct gpio_led mackerel_leds[] = { | 699 | static struct gpio_led mackerel_leds[] = { |
520 | { | 700 | { |
@@ -690,7 +870,15 @@ static struct resource sdhi0_resources[] = { | |||
690 | .flags = IORESOURCE_MEM, | 870 | .flags = IORESOURCE_MEM, |
691 | }, | 871 | }, |
692 | [1] = { | 872 | [1] = { |
693 | .start = evt2irq(0x0e00) /* SDHI0 */, | 873 | .start = evt2irq(0x0e00) /* SDHI0_SDHI0I0 */, |
874 | .flags = IORESOURCE_IRQ, | ||
875 | }, | ||
876 | [2] = { | ||
877 | .start = evt2irq(0x0e20) /* SDHI0_SDHI0I1 */, | ||
878 | .flags = IORESOURCE_IRQ, | ||
879 | }, | ||
880 | [3] = { | ||
881 | .start = evt2irq(0x0e40) /* SDHI0_SDHI0I2 */, | ||
694 | .flags = IORESOURCE_IRQ, | 882 | .flags = IORESOURCE_IRQ, |
695 | }, | 883 | }, |
696 | }; | 884 | }; |
@@ -705,7 +893,7 @@ static struct platform_device sdhi0_device = { | |||
705 | }, | 893 | }, |
706 | }; | 894 | }; |
707 | 895 | ||
708 | #if !defined(CONFIG_MMC_SH_MMCIF) | 896 | #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) |
709 | /* SDHI1 */ | 897 | /* SDHI1 */ |
710 | static struct sh_mobile_sdhi_info sdhi1_info = { | 898 | static struct sh_mobile_sdhi_info sdhi1_info = { |
711 | .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, | 899 | .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, |
@@ -725,7 +913,15 @@ static struct resource sdhi1_resources[] = { | |||
725 | .flags = IORESOURCE_MEM, | 913 | .flags = IORESOURCE_MEM, |
726 | }, | 914 | }, |
727 | [1] = { | 915 | [1] = { |
728 | .start = evt2irq(0x0e80), | 916 | .start = evt2irq(0x0e80), /* SDHI1_SDHI1I0 */ |
917 | .flags = IORESOURCE_IRQ, | ||
918 | }, | ||
919 | [2] = { | ||
920 | .start = evt2irq(0x0ea0), /* SDHI1_SDHI1I1 */ | ||
921 | .flags = IORESOURCE_IRQ, | ||
922 | }, | ||
923 | [3] = { | ||
924 | .start = evt2irq(0x0ec0), /* SDHI1_SDHI1I2 */ | ||
729 | .flags = IORESOURCE_IRQ, | 925 | .flags = IORESOURCE_IRQ, |
730 | }, | 926 | }, |
731 | }; | 927 | }; |
@@ -768,7 +964,15 @@ static struct resource sdhi2_resources[] = { | |||
768 | .flags = IORESOURCE_MEM, | 964 | .flags = IORESOURCE_MEM, |
769 | }, | 965 | }, |
770 | [1] = { | 966 | [1] = { |
771 | .start = evt2irq(0x1200), | 967 | .start = evt2irq(0x1200), /* SDHI2_SDHI2I0 */ |
968 | .flags = IORESOURCE_IRQ, | ||
969 | }, | ||
970 | [2] = { | ||
971 | .start = evt2irq(0x1220), /* SDHI2_SDHI2I1 */ | ||
972 | .flags = IORESOURCE_IRQ, | ||
973 | }, | ||
974 | [3] = { | ||
975 | .start = evt2irq(0x1240), /* SDHI2_SDHI2I2 */ | ||
772 | .flags = IORESOURCE_IRQ, | 976 | .flags = IORESOURCE_IRQ, |
773 | }, | 977 | }, |
774 | }; | 978 | }; |
@@ -803,6 +1007,15 @@ static struct resource sh_mmcif_resources[] = { | |||
803 | }, | 1007 | }, |
804 | }; | 1008 | }; |
805 | 1009 | ||
1010 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
1011 | .chan_priv_rx = { | ||
1012 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
1013 | }, | ||
1014 | .chan_priv_tx = { | ||
1015 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
1016 | }, | ||
1017 | }; | ||
1018 | |||
806 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 1019 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
807 | .sup_pclk = 0, | 1020 | .sup_pclk = 0, |
808 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 1021 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
@@ -810,6 +1023,7 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
810 | MMC_CAP_8_BIT_DATA | | 1023 | MMC_CAP_8_BIT_DATA | |
811 | MMC_CAP_NEEDS_POLL, | 1024 | MMC_CAP_NEEDS_POLL, |
812 | .get_cd = slot_cn7_get_cd, | 1025 | .get_cd = slot_cn7_get_cd, |
1026 | .dma = &sh_mmcif_dma, | ||
813 | }; | 1027 | }; |
814 | 1028 | ||
815 | static struct platform_device sh_mmcif_device = { | 1029 | static struct platform_device sh_mmcif_device = { |
@@ -858,37 +1072,23 @@ static struct soc_camera_link camera_link = { | |||
858 | .priv = &camera_info, | 1072 | .priv = &camera_info, |
859 | }; | 1073 | }; |
860 | 1074 | ||
861 | static void dummy_release(struct device *dev) | 1075 | static struct platform_device *camera_device; |
1076 | |||
1077 | static void mackerel_camera_release(struct device *dev) | ||
862 | { | 1078 | { |
1079 | soc_camera_platform_release(&camera_device); | ||
863 | } | 1080 | } |
864 | 1081 | ||
865 | static struct platform_device camera_device = { | ||
866 | .name = "soc_camera_platform", | ||
867 | .dev = { | ||
868 | .platform_data = &camera_info, | ||
869 | .release = dummy_release, | ||
870 | }, | ||
871 | }; | ||
872 | |||
873 | static int mackerel_camera_add(struct soc_camera_link *icl, | 1082 | static int mackerel_camera_add(struct soc_camera_link *icl, |
874 | struct device *dev) | 1083 | struct device *dev) |
875 | { | 1084 | { |
876 | if (icl != &camera_link) | 1085 | return soc_camera_platform_add(icl, dev, &camera_device, &camera_link, |
877 | return -ENODEV; | 1086 | mackerel_camera_release, 0); |
878 | |||
879 | camera_info.dev = dev; | ||
880 | |||
881 | return platform_device_register(&camera_device); | ||
882 | } | 1087 | } |
883 | 1088 | ||
884 | static void mackerel_camera_del(struct soc_camera_link *icl) | 1089 | static void mackerel_camera_del(struct soc_camera_link *icl) |
885 | { | 1090 | { |
886 | if (icl != &camera_link) | 1091 | soc_camera_platform_del(icl, camera_device, &camera_link); |
887 | return; | ||
888 | |||
889 | platform_device_unregister(&camera_device); | ||
890 | memset(&camera_device.dev.kobj, 0, | ||
891 | sizeof(camera_device.dev.kobj)); | ||
892 | } | 1092 | } |
893 | 1093 | ||
894 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { | 1094 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { |
@@ -935,12 +1135,13 @@ static struct platform_device *mackerel_devices[] __initdata = { | |||
935 | &smc911x_device, | 1135 | &smc911x_device, |
936 | &lcdc_device, | 1136 | &lcdc_device, |
937 | &usb1_host_device, | 1137 | &usb1_host_device, |
1138 | &usbhs1_device, | ||
938 | &leds_device, | 1139 | &leds_device, |
939 | &fsi_device, | 1140 | &fsi_device, |
940 | &fsi_ak4643_device, | 1141 | &fsi_ak4643_device, |
941 | &fsi_hdmi_device, | 1142 | &fsi_hdmi_device, |
942 | &sdhi0_device, | 1143 | &sdhi0_device, |
943 | #if !defined(CONFIG_MMC_SH_MMCIF) | 1144 | #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) |
944 | &sdhi1_device, | 1145 | &sdhi1_device, |
945 | #endif | 1146 | #endif |
946 | &sdhi2_device, | 1147 | &sdhi2_device, |
@@ -1030,6 +1231,7 @@ static void __init mackerel_map_io(void) | |||
1030 | 1231 | ||
1031 | #define GPIO_PORT9CR 0xE6051009 | 1232 | #define GPIO_PORT9CR 0xE6051009 |
1032 | #define GPIO_PORT10CR 0xE605100A | 1233 | #define GPIO_PORT10CR 0xE605100A |
1234 | #define GPIO_PORT168CR 0xE60520A8 | ||
1033 | #define SRCR4 0xe61580bc | 1235 | #define SRCR4 0xe61580bc |
1034 | #define USCCR1 0xE6058144 | 1236 | #define USCCR1 0xE6058144 |
1035 | static void __init mackerel_init(void) | 1237 | static void __init mackerel_init(void) |
@@ -1088,6 +1290,7 @@ static void __init mackerel_init(void) | |||
1088 | gpio_request(GPIO_FN_OVCN_1_114, NULL); | 1290 | gpio_request(GPIO_FN_OVCN_1_114, NULL); |
1089 | gpio_request(GPIO_FN_EXTLP_1, NULL); | 1291 | gpio_request(GPIO_FN_EXTLP_1, NULL); |
1090 | gpio_request(GPIO_FN_OVCN2_1, NULL); | 1292 | gpio_request(GPIO_FN_OVCN2_1, NULL); |
1293 | gpio_pull_down(GPIO_PORT168CR); | ||
1091 | 1294 | ||
1092 | /* setup USB phy */ | 1295 | /* setup USB phy */ |
1093 | __raw_writew(0x8a0a, 0xE6058130); /* USBCR4 */ | 1296 | __raw_writew(0x8a0a, 0xE6058130); /* USBCR4 */ |
@@ -1140,7 +1343,7 @@ static void __init mackerel_init(void) | |||
1140 | gpio_request(GPIO_FN_SDHID0_1, NULL); | 1343 | gpio_request(GPIO_FN_SDHID0_1, NULL); |
1141 | gpio_request(GPIO_FN_SDHID0_0, NULL); | 1344 | gpio_request(GPIO_FN_SDHID0_0, NULL); |
1142 | 1345 | ||
1143 | #if !defined(CONFIG_MMC_SH_MMCIF) | 1346 | #if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) |
1144 | /* enable SDHI1 */ | 1347 | /* enable SDHI1 */ |
1145 | gpio_request(GPIO_FN_SDHICMD1, NULL); | 1348 | gpio_request(GPIO_FN_SDHICMD1, NULL); |
1146 | gpio_request(GPIO_FN_SDHICLK1, NULL); | 1349 | gpio_request(GPIO_FN_SDHICLK1, NULL); |
@@ -1216,6 +1419,7 @@ static void __init mackerel_init(void) | |||
1216 | platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices)); | 1419 | platform_add_devices(mackerel_devices, ARRAY_SIZE(mackerel_devices)); |
1217 | 1420 | ||
1218 | hdmi_init_pm_clock(); | 1421 | hdmi_init_pm_clock(); |
1422 | sh7372_pm_init(); | ||
1219 | } | 1423 | } |
1220 | 1424 | ||
1221 | static void __init mackerel_timer_init(void) | 1425 | static void __init mackerel_timer_init(void) |