mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-29 14:55:12 +00:00
memstick: set PMOS values propery for JMicron 38x controllers
Add a function jmb38x_ms_pmos() to enable / disable PMOS setups for JMicron 38x controllers. Signed-off-by: Aries Lee <arieslee@jmicron.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Cc: Alex Dubov <oakad@yahoo.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
23c5947ac3
commit
68860b96eb
@ -758,6 +758,35 @@ static int jmb38x_ms_set_param(struct memstick_host *msh,
|
|||||||
return 0;
|
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
|
#ifdef CONFIG_PM
|
||||||
|
|
||||||
static int jmb38x_ms_suspend(struct pci_dev *dev, pm_message_t state)
|
static int jmb38x_ms_suspend(struct pci_dev *dev, pm_message_t state)
|
||||||
@ -790,8 +819,7 @@ static int jmb38x_ms_resume(struct pci_dev *dev)
|
|||||||
return rc;
|
return rc;
|
||||||
pci_set_master(dev);
|
pci_set_master(dev);
|
||||||
|
|
||||||
pci_read_config_dword(dev, 0xac, &rc);
|
jmb38x_ms_pmos(dev, 1);
|
||||||
pci_write_config_dword(dev, 0xac, rc | 0x00470000);
|
|
||||||
|
|
||||||
for (rc = 0; rc < jm->host_cnt; ++rc) {
|
for (rc = 0; rc < jm->host_cnt; ++rc) {
|
||||||
if (!jm->hosts[rc])
|
if (!jm->hosts[rc])
|
||||||
@ -900,8 +928,7 @@ static int jmb38x_ms_probe(struct pci_dev *pdev,
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_read_config_dword(pdev, 0xac, &rc);
|
jmb38x_ms_pmos(pdev, 1);
|
||||||
pci_write_config_dword(pdev, 0xac, rc | 0x00470000);
|
|
||||||
|
|
||||||
cnt = jmb38x_ms_count_slots(pdev);
|
cnt = jmb38x_ms_count_slots(pdev);
|
||||||
if (!cnt) {
|
if (!cnt) {
|
||||||
@ -982,6 +1009,8 @@ static void jmb38x_ms_remove(struct pci_dev *dev)
|
|||||||
jmb38x_ms_free_host(jm->hosts[cnt]);
|
jmb38x_ms_free_host(jm->hosts[cnt]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jmb38x_ms_pmos(dev, 0);
|
||||||
|
|
||||||
pci_set_drvdata(dev, NULL);
|
pci_set_drvdata(dev, NULL);
|
||||||
pci_release_regions(dev);
|
pci_release_regions(dev);
|
||||||
pci_disable_device(dev);
|
pci_disable_device(dev);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user