Skip to content

Commit

Permalink
memstick: set PMOS values propery for JMicron 38x controllers
Browse files Browse the repository at this point in the history
Add a function jmb38x_ms_pmos() to enable / disable PMOS setups for
JMicron 38x controllers.

Signed-off-by: Aries Lee <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
Cc: Alex Dubov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
tiwai authored and torvalds committed Jan 13, 2011
1 parent 23c5947 commit 68860b9
Showing 1 changed file with 33 additions and 4 deletions.
37 changes: 33 additions & 4 deletions drivers/memstick/host/jmb38x_ms.c
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,35 @@ static int jmb38x_ms_set_param(struct memstick_host *msh,
return 0;
}

#define PCI_PMOS0_CONTROL 0xae
#define PMOS0_ENABLE 0x01
#define PMOS0_OVERCURRENT_LEVEL_2_4V 0x06
#define PMOS0_EN_OVERCURRENT_DEBOUNCE 0x40
#define PMOS0_SW_LED_POLARITY_ENABLE 0x80
#define PMOS0_ACTIVE_BITS (PMOS0_ENABLE | PMOS0_EN_OVERCURRENT_DEBOUNCE | \
PMOS0_OVERCURRENT_LEVEL_2_4V)
#define PCI_CLOCK_CTL 0xb9

static int jmb38x_ms_pmos(struct pci_dev *pdev, int flag)
{
unsigned char val;

pci_read_config_byte(pdev, PCI_PMOS0_CONTROL, &val);
if (flag)
val |= PMOS0_ACTIVE_BITS;
else
val &= ~PMOS0_ACTIVE_BITS;
pci_write_config_byte(pdev, PCI_PMOS0_CONTROL, val);
dev_dbg(&pdev->dev, "JMB38x: set PMOS0 val 0x%x\n", val);

pci_read_config_byte(pdev, PCI_CLOCK_CTL, &val);
pci_write_config_byte(pdev, PCI_CLOCK_CTL, val & ~0x0f);
pci_write_config_byte(pdev, PCI_CLOCK_CTL, val | 0x01);
dev_dbg(&pdev->dev, "Clock Control by PCI config is disabled!\n");

return 0;
}

#ifdef CONFIG_PM

static int jmb38x_ms_suspend(struct pci_dev *dev, pm_message_t state)
Expand Down Expand Up @@ -790,8 +819,7 @@ static int jmb38x_ms_resume(struct pci_dev *dev)
return rc;
pci_set_master(dev);

pci_read_config_dword(dev, 0xac, &rc);
pci_write_config_dword(dev, 0xac, rc | 0x00470000);
jmb38x_ms_pmos(dev, 1);

for (rc = 0; rc < jm->host_cnt; ++rc) {
if (!jm->hosts[rc])
Expand Down Expand Up @@ -900,8 +928,7 @@ static int jmb38x_ms_probe(struct pci_dev *pdev,
goto err_out;
}

pci_read_config_dword(pdev, 0xac, &rc);
pci_write_config_dword(pdev, 0xac, rc | 0x00470000);
jmb38x_ms_pmos(pdev, 1);

cnt = jmb38x_ms_count_slots(pdev);
if (!cnt) {
Expand Down Expand Up @@ -982,6 +1009,8 @@ static void jmb38x_ms_remove(struct pci_dev *dev)
jmb38x_ms_free_host(jm->hosts[cnt]);
}

jmb38x_ms_pmos(dev, 0);

pci_set_drvdata(dev, NULL);
pci_release_regions(dev);
pci_disable_device(dev);
Expand Down

0 comments on commit 68860b9

Please sign in to comment.