aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/sm501.c
diff options
context:
space:
mode:
authorBen Dooks <ben-linux@fluff.org>2007-06-23 20:16:30 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-06-24 11:59:11 -0400
commit819062219abf8a78e54cad5c1c8716e6c8e7b870 (patch)
tree8cb4618513e172c61abf1a23bd9416bbb7b3abf5 /drivers/mfd/sm501.c
parent5136237bc392413332b02e69ada158c307da658f (diff)
SM501: Clock updates and checks
Ensure that the M1XCLK and MCLK are sourced from the same PLL (and refuse to bind the driver if they are not). Update the PCI to safe initialisation values, as 72MHz is the maximum clock for 33MHz PCI bus mastering. Signed-off-by: Ben Dooks <ben-linux@fluff.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/mfd/sm501.c')
-rw-r--r--drivers/mfd/sm501.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c
index 3a0ecfc404e9..e14d70e07418 100644
--- a/drivers/mfd/sm501.c
+++ b/drivers/mfd/sm501.c
@@ -855,6 +855,24 @@ static void sm501_init_regs(struct sm501_devdata *sm,
855 dev_info(sm->dev, "setting MCLK to %ld\n", init->mclk); 855 dev_info(sm->dev, "setting MCLK to %ld\n", init->mclk);
856 sm501_set_clock(sm->dev, SM501_CLOCK_MCLK, init->mclk); 856 sm501_set_clock(sm->dev, SM501_CLOCK_MCLK, init->mclk);
857 } 857 }
858
859}
860
861/* Check the PLL sources for the M1CLK and M1XCLK
862 *
863 * If the M1CLK and M1XCLKs are not sourced from the same PLL, then
864 * there is a risk (see errata AB-5) that the SM501 will cease proper
865 * function. If this happens, then it is likely the SM501 will
866 * hang the system.
867*/
868
869static int sm501_check_clocks(struct sm501_devdata *sm)
870{
871 unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK);
872 unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC);
873 unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC);
874
875 return ((msrc == 0 && m1src != 0) || (msrc != 0 && m1src == 0));
858} 876}
859 877
860static unsigned int sm501_mem_local[] = { 878static unsigned int sm501_mem_local[] = {
@@ -911,6 +929,13 @@ static int sm501_init_dev(struct sm501_devdata *sm)
911 } 929 }
912 } 930 }
913 931
932 ret = sm501_check_clocks(sm);
933 if (ret) {
934 dev_err(sm->dev, "M1X and M clocks sourced from different "
935 "PLLs\n");
936 return -EINVAL;
937 }
938
914 /* always create a framebuffer */ 939 /* always create a framebuffer */
915 sm501_register_display(sm, &mem_avail); 940 sm501_register_display(sm, &mem_avail);
916 941
@@ -1048,8 +1073,12 @@ static struct sm501_initdata sm501_pci_initdata = {
1048 }, 1073 },
1049 1074
1050 .devices = SM501_USE_ALL, 1075 .devices = SM501_USE_ALL,
1051 .mclk = 100 * MHZ, 1076
1052 .m1xclk = 160 * MHZ, 1077 /* Errata AB-3 says that 72MHz is the fastest available
1078 * for 33MHZ PCI with proper bus-mastering operation */
1079
1080 .mclk = 72 * MHZ,
1081 .m1xclk = 144 * MHZ,
1053}; 1082};
1054 1083
1055static struct sm501_platdata_fbsub sm501_pdata_fbsub = { 1084static struct sm501_platdata_fbsub sm501_pdata_fbsub = {