diff options
| -rw-r--r-- | arch/powerpc/include/asm/mpc5121.h | 32 | ||||
| -rw-r--r-- | arch/powerpc/platforms/512x/mpc5121_ads.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/512x/mpc5121_generic.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/512x/mpc512x.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/platforms/512x/mpc512x_shared.c | 284 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_soc.h | 1 | ||||
| -rw-r--r-- | drivers/video/fsl-diu-fb.c | 17 |
7 files changed, 338 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/mpc5121.h b/arch/powerpc/include/asm/mpc5121.h index e6a30bb1d16a..8c0ab2ca689c 100644 --- a/arch/powerpc/include/asm/mpc5121.h +++ b/arch/powerpc/include/asm/mpc5121.h | |||
| @@ -21,4 +21,36 @@ struct mpc512x_reset_module { | |||
| 21 | u32 rcer; /* Reset Control Enable Register */ | 21 | u32 rcer; /* Reset Control Enable Register */ |
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | /* | ||
| 25 | * Clock Control Module | ||
| 26 | */ | ||
| 27 | struct mpc512x_ccm { | ||
| 28 | u32 spmr; /* System PLL Mode Register */ | ||
| 29 | u32 sccr1; /* System Clock Control Register 1 */ | ||
| 30 | u32 sccr2; /* System Clock Control Register 2 */ | ||
| 31 | u32 scfr1; /* System Clock Frequency Register 1 */ | ||
| 32 | u32 scfr2; /* System Clock Frequency Register 2 */ | ||
| 33 | u32 scfr2s; /* System Clock Frequency Shadow Register 2 */ | ||
| 34 | u32 bcr; /* Bread Crumb Register */ | ||
| 35 | u32 p0ccr; /* PSC0 Clock Control Register */ | ||
| 36 | u32 p1ccr; /* PSC1 CCR */ | ||
| 37 | u32 p2ccr; /* PSC2 CCR */ | ||
| 38 | u32 p3ccr; /* PSC3 CCR */ | ||
| 39 | u32 p4ccr; /* PSC4 CCR */ | ||
| 40 | u32 p5ccr; /* PSC5 CCR */ | ||
| 41 | u32 p6ccr; /* PSC6 CCR */ | ||
| 42 | u32 p7ccr; /* PSC7 CCR */ | ||
| 43 | u32 p8ccr; /* PSC8 CCR */ | ||
| 44 | u32 p9ccr; /* PSC9 CCR */ | ||
| 45 | u32 p10ccr; /* PSC10 CCR */ | ||
| 46 | u32 p11ccr; /* PSC11 CCR */ | ||
| 47 | u32 spccr; /* SPDIF Clock Control Register */ | ||
| 48 | u32 cccr; /* CFM Clock Control Register */ | ||
| 49 | u32 dccr; /* DIU Clock Control Register */ | ||
| 50 | u32 m1ccr; /* MSCAN1 CCR */ | ||
| 51 | u32 m2ccr; /* MSCAN2 CCR */ | ||
| 52 | u32 m3ccr; /* MSCAN3 CCR */ | ||
| 53 | u32 m4ccr; /* MSCAN4 CCR */ | ||
| 54 | u8 res[0x98]; /* Reserved */ | ||
| 55 | }; | ||
| 24 | #endif /* __ASM_POWERPC_MPC5121_H__ */ | 56 | #endif /* __ASM_POWERPC_MPC5121_H__ */ |
diff --git a/arch/powerpc/platforms/512x/mpc5121_ads.c b/arch/powerpc/platforms/512x/mpc5121_ads.c index ee6ae129c25c..dcef6ade48e1 100644 --- a/arch/powerpc/platforms/512x/mpc5121_ads.c +++ b/arch/powerpc/platforms/512x/mpc5121_ads.c | |||
| @@ -42,6 +42,7 @@ static void __init mpc5121_ads_setup_arch(void) | |||
| 42 | for_each_compatible_node(np, "pci", "fsl,mpc5121-pci") | 42 | for_each_compatible_node(np, "pci", "fsl,mpc5121-pci") |
| 43 | mpc83xx_add_bridge(np); | 43 | mpc83xx_add_bridge(np); |
| 44 | #endif | 44 | #endif |
| 45 | mpc512x_setup_diu(); | ||
| 45 | } | 46 | } |
| 46 | 47 | ||
| 47 | static void __init mpc5121_ads_init_IRQ(void) | 48 | static void __init mpc5121_ads_init_IRQ(void) |
| @@ -65,6 +66,7 @@ define_machine(mpc5121_ads) { | |||
| 65 | .probe = mpc5121_ads_probe, | 66 | .probe = mpc5121_ads_probe, |
| 66 | .setup_arch = mpc5121_ads_setup_arch, | 67 | .setup_arch = mpc5121_ads_setup_arch, |
| 67 | .init = mpc512x_init, | 68 | .init = mpc512x_init, |
| 69 | .init_early = mpc512x_init_diu, | ||
| 68 | .init_IRQ = mpc5121_ads_init_IRQ, | 70 | .init_IRQ = mpc5121_ads_init_IRQ, |
| 69 | .get_irq = ipic_get_irq, | 71 | .get_irq = ipic_get_irq, |
| 70 | .calibrate_decr = generic_calibrate_decr, | 72 | .calibrate_decr = generic_calibrate_decr, |
diff --git a/arch/powerpc/platforms/512x/mpc5121_generic.c b/arch/powerpc/platforms/512x/mpc5121_generic.c index a6c0e3a2615d..e487eb06ec6b 100644 --- a/arch/powerpc/platforms/512x/mpc5121_generic.c +++ b/arch/powerpc/platforms/512x/mpc5121_generic.c | |||
| @@ -52,6 +52,8 @@ define_machine(mpc5121_generic) { | |||
| 52 | .name = "MPC5121 generic", | 52 | .name = "MPC5121 generic", |
| 53 | .probe = mpc5121_generic_probe, | 53 | .probe = mpc5121_generic_probe, |
| 54 | .init = mpc512x_init, | 54 | .init = mpc512x_init, |
| 55 | .init_early = mpc512x_init_diu, | ||
| 56 | .setup_arch = mpc512x_setup_diu, | ||
| 55 | .init_IRQ = mpc512x_init_IRQ, | 57 | .init_IRQ = mpc512x_init_IRQ, |
| 56 | .get_irq = ipic_get_irq, | 58 | .get_irq = ipic_get_irq, |
| 57 | .calibrate_decr = generic_calibrate_decr, | 59 | .calibrate_decr = generic_calibrate_decr, |
diff --git a/arch/powerpc/platforms/512x/mpc512x.h b/arch/powerpc/platforms/512x/mpc512x.h index b2daca0d1488..1ab6d11d0b19 100644 --- a/arch/powerpc/platforms/512x/mpc512x.h +++ b/arch/powerpc/platforms/512x/mpc512x.h | |||
| @@ -16,4 +16,6 @@ extern void __init mpc512x_init(void); | |||
| 16 | extern int __init mpc5121_clk_init(void); | 16 | extern int __init mpc5121_clk_init(void); |
| 17 | void __init mpc512x_declare_of_platform_devices(void); | 17 | void __init mpc512x_declare_of_platform_devices(void); |
| 18 | extern void mpc512x_restart(char *cmd); | 18 | extern void mpc512x_restart(char *cmd); |
| 19 | extern void mpc512x_init_diu(void); | ||
| 20 | extern void mpc512x_setup_diu(void); | ||
| 19 | #endif /* __MPC512X_H__ */ | 21 | #endif /* __MPC512X_H__ */ |
diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c index 707e572b7c40..e41ebbdb3e12 100644 --- a/arch/powerpc/platforms/512x/mpc512x_shared.c +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c | |||
| @@ -16,7 +16,11 @@ | |||
| 16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
| 17 | #include <linux/irq.h> | 17 | #include <linux/irq.h> |
| 18 | #include <linux/of_platform.h> | 18 | #include <linux/of_platform.h> |
| 19 | #include <linux/fsl-diu-fb.h> | ||
| 20 | #include <linux/bootmem.h> | ||
| 21 | #include <sysdev/fsl_soc.h> | ||
| 19 | 22 | ||
| 23 | #include <asm/cacheflush.h> | ||
| 20 | #include <asm/machdep.h> | 24 | #include <asm/machdep.h> |
| 21 | #include <asm/ipic.h> | 25 | #include <asm/ipic.h> |
| 22 | #include <asm/prom.h> | 26 | #include <asm/prom.h> |
| @@ -54,6 +58,286 @@ void mpc512x_restart(char *cmd) | |||
| 54 | ; | 58 | ; |
| 55 | } | 59 | } |
| 56 | 60 | ||
| 61 | struct fsl_diu_shared_fb { | ||
| 62 | u8 gamma[0x300]; /* 32-bit aligned! */ | ||
| 63 | struct diu_ad ad0; /* 32-bit aligned! */ | ||
| 64 | phys_addr_t fb_phys; | ||
| 65 | size_t fb_len; | ||
| 66 | bool in_use; | ||
| 67 | }; | ||
| 68 | |||
| 69 | unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel, | ||
| 70 | int monitor_port) | ||
| 71 | { | ||
| 72 | switch (bits_per_pixel) { | ||
| 73 | case 32: | ||
| 74 | return 0x88883316; | ||
| 75 | case 24: | ||
| 76 | return 0x88082219; | ||
| 77 | case 16: | ||
| 78 | return 0x65053118; | ||
| 79 | } | ||
| 80 | return 0x00000400; | ||
| 81 | } | ||
| 82 | |||
| 83 | void mpc512x_set_gamma_table(int monitor_port, char *gamma_table_base) | ||
| 84 | { | ||
| 85 | } | ||
| 86 | |||
| 87 | void mpc512x_set_monitor_port(int monitor_port) | ||
| 88 | { | ||
| 89 | } | ||
| 90 | |||
| 91 | #define DIU_DIV_MASK 0x000000ff | ||
| 92 | void mpc512x_set_pixel_clock(unsigned int pixclock) | ||
| 93 | { | ||
| 94 | unsigned long bestval, bestfreq, speed, busfreq; | ||
| 95 | unsigned long minpixclock, maxpixclock, pixval; | ||
| 96 | struct mpc512x_ccm __iomem *ccm; | ||
| 97 | struct device_node *np; | ||
| 98 | u32 temp; | ||
| 99 | long err; | ||
| 100 | int i; | ||
| 101 | |||
| 102 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-clock"); | ||
| 103 | if (!np) { | ||
| 104 | pr_err("Can't find clock control module.\n"); | ||
| 105 | return; | ||
| 106 | } | ||
| 107 | |||
| 108 | ccm = of_iomap(np, 0); | ||
| 109 | of_node_put(np); | ||
| 110 | if (!ccm) { | ||
| 111 | pr_err("Can't map clock control module reg.\n"); | ||
| 112 | return; | ||
| 113 | } | ||
| 114 | |||
| 115 | np = of_find_node_by_type(NULL, "cpu"); | ||
| 116 | if (np) { | ||
| 117 | const unsigned int *prop = | ||
| 118 | of_get_property(np, "bus-frequency", NULL); | ||
| 119 | |||
| 120 | of_node_put(np); | ||
| 121 | if (prop) { | ||
| 122 | busfreq = *prop; | ||
| 123 | } else { | ||
| 124 | pr_err("Can't get bus-frequency property\n"); | ||
| 125 | return; | ||
| 126 | } | ||
| 127 | } else { | ||
| 128 | pr_err("Can't find 'cpu' node.\n"); | ||
| 129 | return; | ||
| 130 | } | ||
| 131 | |||
| 132 | /* Pixel Clock configuration */ | ||
| 133 | pr_debug("DIU: Bus Frequency = %lu\n", busfreq); | ||
| 134 | speed = busfreq * 4; /* DIU_DIV ratio is 4 * CSB_CLK / DIU_CLK */ | ||
| 135 | |||
| 136 | /* Calculate the pixel clock with the smallest error */ | ||
| 137 | /* calculate the following in steps to avoid overflow */ | ||
| 138 | pr_debug("DIU pixclock in ps - %d\n", pixclock); | ||
| 139 | temp = (1000000000 / pixclock) * 1000; | ||
| 140 | pixclock = temp; | ||
| 141 | pr_debug("DIU pixclock freq - %u\n", pixclock); | ||
| 142 | |||
| 143 | temp = temp / 20; /* pixclock * 0.05 */ | ||
| 144 | pr_debug("deviation = %d\n", temp); | ||
| 145 | minpixclock = pixclock - temp; | ||
| 146 | maxpixclock = pixclock + temp; | ||
