diff options
| -rw-r--r-- | arch/arm/mach-shmobile/board-ag5evm.c | 29 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 12 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-kota2.c | 3 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/board-mackerel.c | 95 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/clock-sh73a0.c | 113 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/include/mach/sh73a0.h | 6 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/intc-sh73a0.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/pfc-r8a7779.c | 2 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/pfc-sh7372.c | 41 | ||||
| -rw-r--r-- | arch/arm/mach-shmobile/smp-sh73a0.c | 2 |
10 files changed, 200 insertions, 105 deletions
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index eff8a96c75ee..068b754bc348 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/serial_sci.h> | 30 | #include <linux/serial_sci.h> |
| 31 | #include <linux/smsc911x.h> | 31 | #include <linux/smsc911x.h> |
| 32 | #include <linux/gpio.h> | 32 | #include <linux/gpio.h> |
| 33 | #include <linux/videodev2.h> | ||
| 33 | #include <linux/input.h> | 34 | #include <linux/input.h> |
| 34 | #include <linux/input/sh_keysc.h> | 35 | #include <linux/input/sh_keysc.h> |
| 35 | #include <linux/mmc/host.h> | 36 | #include <linux/mmc/host.h> |
| @@ -37,7 +38,6 @@ | |||
| 37 | #include <linux/mmc/sh_mobile_sdhi.h> | 38 | #include <linux/mmc/sh_mobile_sdhi.h> |
| 38 | #include <linux/mfd/tmio.h> | 39 | #include <linux/mfd/tmio.h> |
| 39 | #include <linux/sh_clk.h> | 40 | #include <linux/sh_clk.h> |
| 40 | #include <linux/dma-mapping.h> | ||
| 41 | #include <video/sh_mobile_lcdc.h> | 41 | #include <video/sh_mobile_lcdc.h> |
| 42 | #include <video/sh_mipi_dsi.h> | 42 | #include <video/sh_mipi_dsi.h> |
| 43 | #include <sound/sh_fsi.h> | 43 | #include <sound/sh_fsi.h> |
| @@ -159,19 +159,12 @@ static struct resource sh_mmcif_resources[] = { | |||
| 159 | }, | 159 | }, |
| 160 | }; | 160 | }; |
| 161 | 161 | ||
| 162 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 163 | .chan_priv_rx = { | ||
| 164 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 165 | }, | ||
| 166 | .chan_priv_tx = { | ||
| 167 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { | 162 | static struct sh_mmcif_plat_data sh_mmcif_platdata = { |
| 171 | .sup_pclk = 0, | 163 | .sup_pclk = 0, |
| 172 | .ocr = MMC_VDD_165_195, | 164 | .ocr = MMC_VDD_165_195, |
| 173 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, | 165 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, |
| 174 | .dma = &sh_mmcif_dma, | 166 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 167 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 175 | }; | 168 | }; |
| 176 | 169 | ||
| 177 | static struct platform_device mmc_device = { | 170 | static struct platform_device mmc_device = { |
| @@ -321,12 +314,11 @@ static struct resource mipidsi0_resources[] = { | |||
| 321 | }, | 314 | }, |
| 322 | }; | 315 | }; |
| 323 | 316 | ||
| 324 | #define DSI0PHYCR 0xe615006c | ||
| 325 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, | 317 | static int sh_mipi_set_dot_clock(struct platform_device *pdev, |
| 326 | void __iomem *base, | 318 | void __iomem *base, |
| 327 | int enable) | 319 | int enable) |
| 328 | { | 320 | { |
| 329 | struct clk *pck; | 321 | struct clk *pck, *phy; |
| 330 | int ret; | 322 | int ret; |
| 331 | 323 | ||
| 332 | pck = clk_get(&pdev->dev, "dsip_clk"); | 324 | pck = clk_get(&pdev->dev, "dsip_clk"); |
| @@ -335,18 +327,27 @@ static int sh_mipi_set_dot_clock(struct platform_device *pdev, | |||
| 335 | goto sh_mipi_set_dot_clock_pck_err; | 327 | goto sh_mipi_set_dot_clock_pck_err; |
| 336 | } | 328 | } |
| 337 | 329 | ||
| 330 | phy = clk_get(&pdev->dev, "dsiphy_clk"); | ||
| 331 | if (IS_ERR(phy)) { | ||
| 332 | ret = PTR_ERR(phy); | ||
| 333 | goto sh_mipi_set_dot_clock_phy_err; | ||
| 334 | } | ||
| 335 | |||
| 338 | if (enable) { | 336 | if (enable) { |
| 339 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); | 337 | clk_set_rate(pck, clk_round_rate(pck, 24000000)); |
| 340 | __raw_writel(0x2a809010, DSI0PHYCR); | 338 | clk_set_rate(phy, clk_round_rate(pck, 510000000)); |
| 341 | clk_enable(pck); | 339 | clk_enable(pck); |
| 340 | clk_enable(phy); | ||
| 342 | } else { | 341 | } else { |
| 343 | clk_disable(pck); | 342 | clk_disable(pck); |
| 343 | clk_disable(phy); | ||
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | ret = 0; | 346 | ret = 0; |
| 347 | 347 | ||
| 348 | clk_put(phy); | ||
| 349 | sh_mipi_set_dot_clock_phy_err: | ||
| 348 | clk_put(pck); | 350 | clk_put(pck); |
| 349 | |||
| 350 | sh_mipi_set_dot_clock_pck_err: | 351 | sh_mipi_set_dot_clock_pck_err: |
| 351 | return ret; | 352 | return ret; |
| 352 | } | 353 | } |
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index aab0a349f759..eeb4d9664584 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
| @@ -295,15 +295,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 295 | }, | 295 | }, |
| 296 | }; | 296 | }; |
| 297 | 297 | ||
| 298 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 299 | .chan_priv_rx = { | ||
| 300 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 301 | }, | ||
| 302 | .chan_priv_tx = { | ||
| 303 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 304 | }, | ||
| 305 | }; | ||
| 306 | |||
| 307 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 298 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 308 | .sup_pclk = 0, | 299 | .sup_pclk = 0, |
| 309 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 300 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -311,7 +302,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 311 | MMC_CAP_8_BIT_DATA | | 302 | MMC_CAP_8_BIT_DATA | |
| 312 | MMC_CAP_NEEDS_POLL, | 303 | MMC_CAP_NEEDS_POLL, |
| 313 | .get_cd = slot_cn7_get_cd, | 304 | .get_cd = slot_cn7_get_cd, |
| 314 | .dma = &sh_mmcif_dma, | 305 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 306 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 315 | }; | 307 | }; |
| 316 | 308 | ||
| 317 | static struct platform_device sh_mmcif_device = { | 309 | static struct platform_device sh_mmcif_device = { |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index 857ceeec1bb0..c8e7ca23fc06 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
| @@ -143,11 +143,10 @@ static struct gpio_keys_button gpio_buttons[] = { | |||
| 143 | static struct gpio_keys_platform_data gpio_key_info = { | 143 | static struct gpio_keys_platform_data gpio_key_info = { |
| 144 | .buttons = gpio_buttons, | 144 | .buttons = gpio_buttons, |
| 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), | 145 | .nbuttons = ARRAY_SIZE(gpio_buttons), |
| 146 | .poll_interval = 250, /* polled for now */ | ||
| 147 | }; | 146 | }; |
| 148 | 147 | ||
| 149 | static struct platform_device gpio_keys_device = { | 148 | static struct platform_device gpio_keys_device = { |
| 150 | .name = "gpio-keys-polled", /* polled for now */ | 149 | .name = "gpio-keys", |
| 151 | .id = -1, | 150 | .id = -1, |
| 152 | .dev = { | 151 | .dev = { |
| 153 | .platform_data = &gpio_key_info, | 152 | .platform_data = &gpio_key_info, |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 9b42fbd10f8e..a2813247b455 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <linux/smsc911x.h> | 43 | #include <linux/smsc911x.h> |
| 44 | #include <linux/sh_intc.h> | 44 | #include <linux/sh_intc.h> |
| 45 | #include <linux/tca6416_keypad.h> | 45 | #include <linux/tca6416_keypad.h> |
| 46 | #include <linux/usb/r8a66597.h> | ||
| 47 | #include <linux/usb/renesas_usbhs.h> | 46 | #include <linux/usb/renesas_usbhs.h> |
| 48 | #include <linux/dma-mapping.h> | 47 | #include <linux/dma-mapping.h> |
| 49 | 48 | ||
| @@ -145,11 +144,6 @@ | |||
| 145 | * 1-2 short | VBUS 5V | Host | 144 | * 1-2 short | VBUS 5V | Host |
| 146 | * open | external VBUS | Function | 145 | * open | external VBUS | Function |
| 147 | * | 146 | * |
| 148 | * *1 | ||
| 149 | * CN31 is used as | ||
| 150 | * CONFIG_USB_R8A66597_HCD Host | ||
| 151 | * CONFIG_USB_RENESAS_USBHS Function | ||
| 152 | * | ||
| 153 | * CAUTION | 147 | * CAUTION |
| 154 | * | 148 | * |
| 155 | * renesas_usbhs driver can use external interrupt mode | 149 | * renesas_usbhs driver can use external interrupt mode |
| @@ -161,15 +155,6 @@ | |||
| 161 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", | 155 | * mackerel can not use external interrupt (IRQ7-PORT167) mode on "USB0", |
| 162 | * because Touchscreen is using IRQ7-PORT40. | 156 | * because Touchscreen is using IRQ7-PORT40. |
| 163 | * It is impossible to use IRQ7 demux on this board. | 157 | * It is impossible to use IRQ7 demux on this board. |
| 164 | * | ||
| 165 | * We can use external interrupt mode USB-Function on "USB1". | ||
| 166 | * USB1 can become Host by r8a66597, and become Function by renesas_usbhs. | ||
| 167 | * But don't select both drivers in same time. | ||
| 168 | * These uses same IRQ number for request_irq(), and aren't supporting | ||
| 169 | * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE. | ||
| 170 | * | ||
| 171 | * Actually these are old/new version of USB driver. | ||
| 172 | * This mean its register will be broken if it supports shared IRQ, | ||
| 173 | */ | 158 | */ |
| 174 | 159 | ||
| 175 | /* | 160 | /* |
| @@ -208,6 +193,16 @@ | |||
| 208 | */ | 193 | */ |
| 209 | 194 | ||
| 210 | /* | 195 | /* |
| 196 | * FSI - AK4642 | ||
| 197 | * | ||
| 198 | * it needs amixer settings for playing | ||
| 199 | * | ||
| 200 | * amixer set "Headphone" on | ||
| 201 | * amixer set "HPOUTL Mixer DACH" on | ||
| 202 | * amixer set "HPOUTR Mixer DACH" on | ||
| 203 | */ | ||
| 204 | |||
| 205 | /* | ||
| 211 | * FIXME !! | 206 | * FIXME !! |
| 212 | * | 207 | * |
| 213 | * gpio_no_direction | 208 | * gpio_no_direction |
| @@ -676,51 +671,16 @@ static struct platform_device usbhs0_device = { | |||
| 676 | * Use J30 to select between Host and Function. This setting | 671 | * Use J30 to select between Host and Function. This setting |
| 677 | * can however not be detected by software. Hotplug of USBHS1 | 672 | * can however not be detected by software. Hotplug of USBHS1 |
| 678 | * is provided via IRQ8. | 673 | * is provided via IRQ8. |
| 674 | * | ||
| 675 | * Current USB1 works as "USB Host". | ||
| 676 | * - set J30 "short" | ||
| 677 | * | ||
| 678 | * If you want to use it as "USB gadget", | ||
| 679 | * - J30 "open" | ||
| 680 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET | ||
| 681 | * - add .get_vbus = usbhs_get_vbus in usbhs1_private | ||
| 679 | */ | 682 | */ |
| 680 | #define IRQ8 evt2irq(0x0300) | 683 | #define IRQ8 evt2irq(0x0300) |
| 681 | |||
| 682 | /* USBHS1 USB Host support via r8a66597_hcd */ | ||
| 683 | static void usb1_host_port_power(int port, int power) | ||
| 684 | { | ||
| 685 | if (!power) /* only power-on is supported for now */ | ||
| 686 | return; | ||
| 687 | |||
| 688 | /* set VBOUT/PWEN and EXTLP1 in DVSTCTR */ | ||
| 689 | __raw_writew(__raw_readw(0xE68B0008) | 0x600, 0xE68B0008); | ||
| 690 | } | ||
| 691 | |||
| 692 | static struct r8a66597_platdata usb1_host_data = { | ||
| 693 | .on_chip = 1, | ||
| 694 | .port_power = usb1_host_port_power, | ||
| 695 | }; | ||
| 696 | |||
| 697 | static struct resource usb1_host_resources[] = { | ||
| 698 | [0] = { | ||
| 699 | .name = "USBHS1", | ||
| 700 | .start = 0xe68b0000, | ||
| 701 | .end = 0xe68b00e6 - 1, | ||
| 702 | .flags = IORESOURCE_MEM, | ||
| 703 | }, | ||
| 704 | [1] = { | ||
| 705 | .start = evt2irq(0x1ce0) /* USB1_USB1I0 */, | ||
| 706 | .flags = IORESOURCE_IRQ, | ||
| 707 | }, | ||
| 708 | }; | ||
| 709 | |||
| 710 | static struct platform_device usb1_host_device = { | ||
| 711 | .name = "r8a66597_hcd", | ||
| 712 | .id = 1, | ||
| 713 | .dev = { | ||
| 714 | .dma_mask = NULL, /* not use dma */ | ||
| 715 | .coherent_dma_mask = 0xffffffff, | ||
| 716 | .platform_data = &usb1_host_data, | ||
| 717 | }, | ||
| 718 | .num_resources = ARRAY_SIZE(usb1_host_resources), | ||
| 719 | .resource = usb1_host_resources, | ||
| 720 | }; | ||
| 721 | |||
| 722 | /* USBHS1 USB Function support via renesas_usbhs */ | ||
| 723 | |||
| 724 | #define USB_PHY_MODE (1 << 4) | 684 | #define USB_PHY_MODE (1 << 4) |
| 725 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) | 685 | #define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) |
| 726 | #define USB_PHY_ON (1 << 1) | 686 | #define USB_PHY_ON (1 << 1) |
| @@ -776,7 +736,7 @@ static void usbhs1_hardware_exit(struct platform_device *pdev) | |||
| 776 | 736 | ||
| 777 | static int usbhs1_get_id(struct platform_device *pdev) | 737 | static int usbhs1_get_id(struct platform_device *pdev) |
| 778 | { | 738 | { |
| 779 | return USBHS_GADGET; | 739 | return USBHS_HOST; |
| 780 | } | 740 | } |
| 781 | 741 | ||
| 782 | static u32 usbhs1_pipe_cfg[] = { | 742 | static u32 usbhs1_pipe_cfg[] = { |
| @@ -807,7 +767,6 @@ static struct usbhs_private usbhs1_private = { | |||
| 807 | .hardware_exit = usbhs1_hardware_exit, | 767 | .hardware_exit = usbhs1_hardware_exit, |
| 808 | .get_id = usbhs1_get_id, | 768 | .get_id = usbhs1_get_id, |
| 809 | .phy_reset = usbhs_phy_reset, | 769 | .phy_reset = usbhs_phy_reset, |
| 810 | .get_vbus = usbhs_get_vbus, | ||
| 811 | }, | 770 | }, |
| 812 | .driver_param = { | 771 | .driver_param = { |
| 813 | .buswait_bwait = 4, | 772 | .buswait_bwait = 4, |
| @@ -1184,15 +1143,6 @@ static struct resource sh_mmcif_resources[] = { | |||
| 1184 | }, | 1143 | }, |
| 1185 | }; | 1144 | }; |
| 1186 | 1145 | ||
| 1187 | static struct sh_mmcif_dma sh_mmcif_dma = { | ||
| 1188 | .chan_priv_rx = { | ||
| 1189 | .slave_id = SHDMA_SLAVE_MMCIF_RX, | ||
| 1190 | }, | ||
| 1191 | .chan_priv_tx = { | ||
| 1192 | .slave_id = SHDMA_SLAVE_MMCIF_TX, | ||
| 1193 | }, | ||
| 1194 | }; | ||
| 1195 | |||
| 1196 | static struct sh_mmcif_plat_data sh_mmcif_plat = { | 1146 | static struct sh_mmcif_plat_data sh_mmcif_plat = { |
| 1197 | .sup_pclk = 0, | 1147 | .sup_pclk = 0, |
| 1198 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, | 1148 | .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, |
| @@ -1200,7 +1150,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = { | |||
| 1200 | MMC_CAP_8_BIT_DATA | | 1150 | MMC_CAP_8_BIT_DATA | |
| 1201 | MMC_CAP_NEEDS_POLL, | 1151 | MMC_CAP_NEEDS_POLL, |
| 1202 | .get_cd = slot_cn7_get_cd, | 1152 | .get_cd = slot_cn7_get_cd, |
| 1203 | .dma = &sh_mmcif_dma, | 1153 | .slave_id_tx = SHDMA_SLAVE_MMCIF_TX, |
| 1154 | .slave_id_rx = SHDMA_SLAVE_MMCIF_RX, | ||
| 1204 | }; | 1155 | }; |
| 1205 | 1156 | ||
| 1206 | static struct platform_device sh_mmcif_device = { | 1157 | static struct platform_device sh_mmcif_device = { |
| @@ -1311,7 +1262,6 @@ static struct platform_device *mackerel_devices[] __initdata = { | |||
| 1311 | &nor_flash_device, | 1262 | &nor_flash_device, |
| 1312 | &smc911x_device, | 1263 | &smc911x_device, |
| 1313 | &lcdc_device, | 1264 | &lcdc_device, |
| 1314 | &usb1_host_device, | ||
| 1315 | &usbhs1_device, | 1265 | &usbhs1_device, |
| 1316 | &usbhs0_device, | 1266 | &usbhs0_device, |
| 1317 | &leds_device, | 1267 | &leds_device, |
| @@ -1473,9 +1423,6 @@ static void __init mackerel_init(void) | |||
| 1473 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ | 1423 | gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */ |
| 1474 | gpio_request(GPIO_FN_IDIN_1_113, NULL); | 1424 | gpio_request(GPIO_FN_IDIN_1_113, NULL); |
| 1475 | 1425 | ||
| 1476 | /* USB phy tweak to make the r8a66597_hcd host driver work */ | ||
| 1477 | __raw_writew(0x8a0a, 0xe6058130); /* USBCR4 */ | ||
| 1478 | |||
| 1479 | /* enable FSI2 port A (ak4643) */ | 1426 | /* enable FSI2 port A (ak4643) */ |
| 1480 | gpio_request(GPIO_FN_FSIAIBT, NULL); | 1427 | gpio_request(GPIO_FN_FSIAIBT, NULL); |
| 1481 | gpio_request(GPIO_FN_FSIAILR, NULL); | 1428 | gpio_request(GPIO_FN_FSIAILR, NULL); |
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c index afbead6a6e17..7727cca6136c 100644 --- a/arch/arm/mach-shmobile/clock-sh73a0.c +++ b/arch/arm/mach-shmobile/clock-sh73a0.c | |||
| @@ -365,6 +365,114 @@ static struct clk div6_clks[DIV6_NR] = { | |||
| 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), | 365 | dsi_parent, ARRAY_SIZE(dsi_parent), 12, 3), |
| 366 | }; | 366 | }; |
| 367 | 367 | ||
| 368 | /* DSI DIV */ | ||
| 369 | static unsigned long dsiphy_recalc(struct clk *clk) | ||
| 370 | { | ||
| 371 | u32 value; | ||
| 372 | |||
| 373 | value = __raw_readl(clk->mapping->base); | ||
| 374 | |||
| 375 | /* FIXME */ | ||
| 376 | if (!(value & 0x000B8000)) | ||
| 377 | return clk->parent->rate; | ||
| 378 | |||
| 379 | value &= 0x3f; | ||
| 380 | value += 1; | ||
| 381 | |||
| 382 | if ((value < 12) || | ||
| 383 | (value > 33)) { | ||
| 384 | pr_err("DSIPHY has wrong value (%d)", value); | ||
| 385 | return 0; | ||
| 386 | } | ||
| 387 | |||
| 388 | return clk->parent->rate / value; | ||
| 389 | } | ||
| 390 | |||
| 391 | static long dsiphy_round_rate(struct clk *clk, unsigned long rate) | ||
| 392 | { | ||
| 393 | return clk_rate_mult_range_round(clk, 12, 33, rate); | ||
| 394 | } | ||
| 395 | |||
| 396 | static void dsiphy_disable(struct clk *clk) | ||
| 397 | { | ||
| 398 | u32 value; | ||
| 399 | |||
| 400 | value = __raw_readl(clk->mapping->base); | ||
| 401 | value &= ~0x000B8000; | ||
| 402 | |||
| 403 | __raw_writel(value , clk->mapping->base); | ||
| 404 | } | ||
| 405 | |||
| 406 | static int dsiphy_enable(struct clk *clk) | ||
| 407 | { | ||
| 408 | u32 value; | ||
| 409 | int multi; | ||
| 410 | |||
| 411 | value = __raw_readl(clk->mapping->base); | ||
| 412 | multi = (value & 0x3f) + 1; | ||
| 413 | |||
| 414 | if ((multi < 12) || (multi > 33)) | ||
| 415 | return -EIO; | ||
| 416 | |||
| 417 | __raw_writel(value | 0x000B8000, clk->mapping->base); | ||
| 418 | |||
| 419 | return 0; | ||
| 420 | } | ||
| 421 | |||
| 422 | static int dsiphy_set_rate(struct clk *clk, unsigned long rate) | ||
| 423 | { | ||
| 424 | u32 value; | ||
| 425 | int idx; | ||
| 426 | |||
| 427 | idx = rate / clk->parent->rate; | ||
| 428 | if ((idx < 12) || (idx > 33)) | ||
| 429 | return -EINVAL; | ||
| 430 | |||
| 431 | idx += -1; | ||
| 432 | |||
| 433 | value = __raw_readl(clk->mapping->base); | ||
| 434 | value = (value & ~0x3f) + idx; | ||
| 435 | |||
| 436 | __raw_writel(value, clk->mapping->base); | ||
| 437 | |||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | |||
| 441 | static struct clk_ops dsiphy_clk_ops = { | ||
| 442 | .recalc = dsiphy_recalc, | ||
| 443 | .round_rate = dsiphy_round_rate, | ||
| 444 | .set_rate = dsiphy_set_rate, | ||
| 445 | .enable = dsiphy_enable, | ||
| 446 | .disable = dsiphy_disable, | ||
| 447 | }; | ||
| 448 | |||
| 449 | static struct clk_mapping dsi0phy_clk_mapping = { | ||
| 450 | .phys = DSI0PHYCR, | ||
| 451 | .len = 4, | ||
| 452 | }; | ||
| 453 | |||
| 454 | static struct clk_mapping dsi1phy_clk_mapping = { | ||
| 455 | .phys = DSI1PHYCR, | ||
| 456 | .len = 4, | ||
| 457 | }; | ||
| 458 | |||
| 459 | static struct clk dsi0phy_clk = { | ||
| 460 | .ops = &dsiphy_clk_ops, | ||
| 461 | .parent = &div6_clks[DIV6_DSI0P], /* late install */ | ||
| 462 | .mapping = &dsi0phy_clk_mapping, | ||
| 463 | }; | ||
| 464 | |||
| 465 | static struct clk dsi1phy_clk = { | ||
| 466 | .ops = &dsiphy_clk_ops, | ||
| 467 | .parent = &div6_clks[DIV6_DSI1P], /* late install */ | ||
| 468 | .mapping = &dsi1phy_clk_mapping, | ||
| 469 | }; | ||
| 470 | |||
| 471 | static struct clk *late_main_clks[] = { | ||
| 472 | &dsi0phy_clk, | ||
| 473 | &dsi1phy_clk, | ||
| 474 | }; | ||
| 475 | |||
| 368 | enum { MSTP001, | 476 | enum { MSTP001, |
| 369 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, | 477 | MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100, |
| 370 | MSTP219, | 478 | MSTP219, |
| @@ -429,6 +537,8 @@ static struct clk_lookup lookups[] = { | |||
| 429 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), | 537 | CLKDEV_ICK_ID("dsit_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSIT]), |
| 430 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), | 538 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.0", &div6_clks[DIV6_DSI0P]), |
| 431 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), | 539 | CLKDEV_ICK_ID("dsip_clk", "sh-mipi-dsi.1", &div6_clks[DIV6_DSI1P]), |
| 540 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.0", &dsi0phy_clk), | ||
| 541 | CLKDEV_ICK_ID("dsiphy_clk", "sh-mipi-dsi.1", &dsi1phy_clk), | ||
| 432 | 542 | ||
| 433 | /* MSTP32 clocks */ | 543 | /* MSTP32 clocks */ |
| 434 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ | 544 | CLKDEV_DEV_ID("i2c-sh_mobile.2", &mstp_clks[MSTP001]), /* I2C2 */ |
| @@ -504,6 +614,9 @@ void __init sh73a0_clock_init(void) | |||
| 504 | if (!ret) | 614 | if (!ret) |
| 505 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); | 615 | ret = sh_clk_mstp32_register(mstp_clks, MSTP_NR); |
| 506 | 616 | ||
| 617 | for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++) | ||
| 618 | ret = clk_register(late_main_clks[k]); | ||
| 619 | |||
| 507 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 620 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
| 508 | 621 | ||
| 509 | if (!ret) | 622 | if (!ret) |
diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h index 881d515a9686..cad57578ceed 100644 --- a/arch/arm/mach-shmobile/include/mach/sh73a0.h +++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h | |||
| @@ -515,8 +515,8 @@ enum { | |||
| 515 | SHDMA_SLAVE_MMCIF_RX, | 515 | SHDMA_SLAVE_MMCIF_RX, |
| 516 | }; | 516 | }; |
| 517 | 517 | ||
| 518 | /* PINT interrupts are located at Linux IRQ 768 and up */ | 518 | /* PINT interrupts are located at Linux IRQ 800 and up */ |
| 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 768) | 519 | #define SH73A0_PINT0_IRQ(irq) ((irq) + 800) |
| 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 800) | 520 | #define SH73A0_PINT1_IRQ(irq) ((irq) + 832) |
| 521 | 521 | ||
| 522 | #endif /* __ASM_SH73A0_H__ */ | 522 | #endif /* __ASM_SH73A0_H__ */ |
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index 1eda6b0b69e3..9857595eaa79 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| 20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
| 21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 22 | #include <linux/module.h> | ||
| 22 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
| 23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 24 | #include <linux/sh_intc.h> | 25 | #include <linux/sh_intc.h> |
| @@ -445,6 +446,7 @@ void __init sh73a0_init_irq(void) | |||
| 445 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); | 446 | setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]); |
| 446 | 447 | ||
| 447 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); | 448 | n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k))); |
| 449 | WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n); | ||
| 448 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, | 450 | irq_set_chip_and_handler_name(n, &intca_gic_irq_chip, |
| 449 | handle_level_irq, "level"); | 451 | handle_level_irq, "level"); |
| 450 | set_irq_flags(n, IRQF_VALID); /* yuck */ | 452 | set_irq_flags(n, IRQF_VALID); /* yuck */ |
diff --git a/arch/arm/mach-shmobile/pfc-r8a7779.c b/arch/arm/mach-shmobile/pfc-r8a7779.c index 963532f2b2c4..d14c9b048077 100644 --- a/arch/arm/mach-shmobile/pfc-r8a7779.c +++ b/arch/arm/mach-shmobile/pfc-r8a7779.c | |||
| @@ -2120,7 +2120,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = { | |||
| 2120 | FN_AUDATA3, 0, 0, 0 } | 2120 | FN_AUDATA3, 0, 0, 0 } |
| 2121 | }, | 2121 | }, |
| 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, | 2122 | { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32, |
| 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, | 2123 | 3, 1, 1, 1, 1, 1, 1, 3, 3, |
| 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { | 2124 | 1, 1, 1, 1, 1, 1, 3, 3, 3, 2) { |
| 2125 | /* IP4_31_29 [3] */ | 2125 | /* IP4_31_29 [3] */ |
| 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, | 2126 | FN_DU1_DB0, FN_VI2_DATA4_VI2_B4, FN_SCL2_B, FN_SD3_DAT0, |
diff --git a/arch/arm/mach-shmobile/pfc-sh7372.c b/arch/arm/mach-shmobile/pfc-sh7372.c index 1bd6585a6acf..336093f9210a 100644 --- a/arch/arm/mach-shmobile/pfc-sh7372.c +++ b/arch/arm/mach-shmobile/pfc-sh7372.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
| 24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <mach/irqs.h> | ||
| 26 | #include <mach/sh7372.h> | 27 | #include <mach/sh7372.h> |
| 27 | 28 | ||
| 28 | #define CPU_ALL_PORT(fn, pfx, sfx) \ | 29 | #define CPU_ALL_PORT(fn, pfx, sfx) \ |
| @@ -1594,6 +1595,43 @@ static struct pinmux_data_reg pinmux_data_regs[] = { | |||
| 1594 | { }, | 1595 | { }, |
| 1595 | }; | 1596 | }; |
| 1596 | 1597 | ||
| 1598 | #define EXT_IRQ16L(n) evt2irq(0x200 + ((n) << 5)) | ||
| 1599 | #define EXT_IRQ16H(n) evt2irq(0x3200 + (((n) - 16) << 5)) | ||
| 1600 | static struct pinmux_irq pinmux_irqs[] = { | ||
| 1601 | PINMUX_IRQ(EXT_IRQ16L(0), PORT6_FN0, PORT162_FN0), | ||
| 1602 | PINMUX_IRQ(EXT_IRQ16L(1), PORT12_FN0), | ||
| 1603 | PINMUX_IRQ(EXT_IRQ16L(2), PORT4_FN0, PORT5_FN0), | ||
| 1604 | PINMUX_IRQ(EXT_IRQ16L(3), PORT8_FN0, PORT16_FN0), | ||
| 1605 | PINMUX_IRQ(EXT_IRQ16L(4), PORT17_FN0, PORT163_FN0), | ||
| 1606 | PINMUX_IRQ(EXT_IRQ16L(5), PORT18_FN0), | ||
| 1607 | PINMUX_IRQ(EXT_IRQ16L(6), PORT39_FN0, PORT164_FN0), | ||
| 1608 | PINMUX_IRQ(EXT_IRQ16L(7), PORT40_FN0, PORT167_FN0), | ||
| 1609 | PINMUX_IRQ(EXT_IRQ16L(8), PORT41_FN0, PORT168_FN0), | ||
| 1610 | PINMUX_IRQ(EXT_IRQ16L(9), PORT42_FN0, PORT169_FN0), | ||
| 1611 | PINMUX_IRQ(EXT_IRQ16L(10), PORT65_FN0), | ||
| 1612 | PINMUX_IRQ(EXT_IRQ16L(11), PORT67_FN0), | ||
| 1613 | PINMUX_IRQ(EXT_IRQ16L(12), PORT80_FN0, PORT137_FN0), | ||
| 1614 | PINMUX_IRQ(EXT_IRQ16L(13), PORT81_FN0, PORT145_FN0), | ||
| 1615 | PINMUX_IRQ(EXT_IRQ16L(14), PORT82_FN0, PORT146_FN0), | ||
| 1616 | PINMUX_IRQ(EXT_IRQ16L(15), PORT83_FN0, PORT147_FN0), | ||
| 1617 | PINMUX_IRQ(EXT_IRQ16H(16), PORT84_FN0, PORT170_FN0), | ||
| 1618 | PINMUX_IRQ(EXT_IRQ16H(17), PORT85_FN0), | ||
| 1619 | PINMUX_IRQ(EXT_IRQ16H(18), PORT86_FN0), | ||
| 1620 | PINMUX_IRQ(EXT_IRQ16H(19), PORT87_FN0), | ||
| 1621 | PINMUX_IRQ(EXT_IRQ16H(20), PORT92_FN0), | ||
| 1622 | PINMUX_IRQ(EXT_IRQ16H(21), PORT93_FN0), | ||
| 1623 | PINMUX_IRQ(EXT_IRQ16H(22), PORT94_FN0), | ||
| 1624 | PINMUX_IRQ(EXT_IRQ16H(23), PORT95_FN0), | ||
| 1625 | PINMUX_IRQ(EXT_IRQ16H(24), PORT112_FN0), | ||
| 1626 | PINMUX_IRQ(EXT_IRQ16H(25), PORT119_FN0), | ||
| 1627 | PINMUX_IRQ(EXT_IRQ16H(26), PORT121_FN0, PORT172_FN0), | ||
| 1628 | PINMUX_IRQ(EXT_IRQ16H(27), PORT122_FN0, PORT180_FN0), | ||
| 1629 | PINMUX_IRQ(EXT_IRQ16H(28), PORT123_FN0, PORT181_FN0), | ||
| 1630 | PINMUX_IRQ(EXT_IRQ16H(29), PORT129_FN0, PORT182_FN0), | ||
| 1631 | PINMUX_IRQ(EXT_IRQ16H(30), PORT130_FN0, PORT183_FN0), | ||
| 1632 | PINMUX_IRQ(EXT_IRQ16H(31), PORT138_FN0, PORT184_FN0), | ||
| 1633 | }; | ||
| 1634 | |||
| 1597 | static struct pinmux_info sh7372_pinmux_info = { | 1635 | static struct pinmux_info sh7372_pinmux_info = { |
| 1598 | .name = "sh7372_pfc", | 1636 | .name = "sh7372_pfc", |
| 1599 | .reserved_id = PINMUX_RESERVED, | 1637 | .reserved_id = PINMUX_RESERVED, |
| @@ -1614,6 +1652,9 @@ static struct pinmux_info sh7372_pinmux_info = { | |||
| 1614 | 1652 | ||
| 1615 | .gpio_data = pinmux_data, | 1653 | .gpio_data = pinmux_data, |
| 1616 | .gpio_data_size = ARRAY_SIZE(pinmux_data), | 1654 | .gpio_data_size = ARRAY_SIZE(pinmux_data), |
| 1655 | |||
| 1656 | .gpio_irq = pinmux_irqs, | ||
| 1657 | .gpio_irq_size = ARRAY_SIZE(pinmux_irqs), | ||
| 1617 | }; | 1658 | }; |
| 1618 | 1659 | ||
| 1619 | void sh7372_pinmux_init(void) | 1660 | void sh7372_pinmux_init(void) |
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c index 0d159d64a345..2d0d4212be41 100644 --- a/arch/arm/mach-shmobile/smp-sh73a0.c +++ b/arch/arm/mach-shmobile/smp-sh73a0.c | |||
| @@ -80,7 +80,7 @@ int __cpuinit sh73a0_boot_secondary(unsigned int cpu) | |||
| 80 | /* enable cache coherency */ | 80 | /* enable cache coherency */ |
| 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); | 81 | modify_scu_cpu_psr(0, 3 << (cpu * 8)); |
| 82 | 82 | ||
| 83 | if (((__raw_readw(__io(PSTR)) >> (4 * cpu)) & 3) == 3) | 83 | if (((__raw_readl(__io(PSTR)) >> (4 * cpu)) & 3) == 3) |
| 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ | 84 | __raw_writel(1 << cpu, __io(WUPCR)); /* wake up */ |
| 85 | else | 85 | else |
| 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ | 86 | __raw_writel(1 << cpu, __io(SRESCR)); /* reset */ |
