Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 57983
b: refs/heads/master
c: 8190622
h: refs/heads/master
i:
  57981: c9cfefd
  57979: 931d376
  57975: a2bb7c7
  57967: c392593
  57951: 5d4c6c1
  57919: 1c32185
  57855: 67805f9
v: v3
  • Loading branch information
Ben Dooks authored and Linus Torvalds committed Jun 24, 2007
1 parent d43b238 commit b9bb4f2
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5136237bc392413332b02e69ada158c307da658f
refs/heads/master: 819062219abf8a78e54cad5c1c8716e6c8e7b870
33 changes: 31 additions & 2 deletions trunk/drivers/mfd/sm501.c
Original file line number Diff line number Diff line change
Expand Up @@ -855,6 +855,24 @@ static void sm501_init_regs(struct sm501_devdata *sm,
dev_info(sm->dev, "setting MCLK to %ld\n", init->mclk);
sm501_set_clock(sm->dev, SM501_CLOCK_MCLK, init->mclk);
}

}

/* Check the PLL sources for the M1CLK and M1XCLK
*
* If the M1CLK and M1XCLKs are not sourced from the same PLL, then
* there is a risk (see errata AB-5) that the SM501 will cease proper
* function. If this happens, then it is likely the SM501 will
* hang the system.
*/

static int sm501_check_clocks(struct sm501_devdata *sm)
{
unsigned long pwrmode = readl(sm->regs + SM501_CURRENT_CLOCK);
unsigned long msrc = (pwrmode & SM501_POWERMODE_M_SRC);
unsigned long m1src = (pwrmode & SM501_POWERMODE_M1_SRC);

return ((msrc == 0 && m1src != 0) || (msrc != 0 && m1src == 0));
}

static unsigned int sm501_mem_local[] = {
Expand Down Expand Up @@ -911,6 +929,13 @@ static int sm501_init_dev(struct sm501_devdata *sm)
}
}

ret = sm501_check_clocks(sm);
if (ret) {
dev_err(sm->dev, "M1X and M clocks sourced from different "
"PLLs\n");
return -EINVAL;
}

/* always create a framebuffer */
sm501_register_display(sm, &mem_avail);

Expand Down Expand Up @@ -1048,8 +1073,12 @@ static struct sm501_initdata sm501_pci_initdata = {
},

.devices = SM501_USE_ALL,
.mclk = 100 * MHZ,
.m1xclk = 160 * MHZ,

/* Errata AB-3 says that 72MHz is the fastest available
* for 33MHZ PCI with proper bus-mastering operation */

.mclk = 72 * MHZ,
.m1xclk = 144 * MHZ,
};

static struct sm501_platdata_fbsub sm501_pdata_fbsub = {
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/sm501-regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@
#define SM501_DEBUG_CONTROL (0x000034)

/* power management */
#define SM501_POWERMODE_P2X_SRC (1<<29)
#define SM501_POWERMODE_V2X_SRC (1<<20)
#define SM501_POWERMODE_M_SRC (1<<12)
#define SM501_POWERMODE_M1_SRC (1<<4)

#define SM501_CURRENT_GATE (0x000038)
#define SM501_CURRENT_CLOCK (0x00003C)
#define SM501_POWER_MODE_0_GATE (0x000040)
Expand Down

0 comments on commit b9bb4f2

Please sign in to comment.