lkml.org 
[lkml]   [2011]   [Oct]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] pata_sl82c105: add Power Management support
    Date
    From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    Subject: [PATCH] pata_sl82c105: add Power Management support

    Fixes IDE -> libata regression.

    There shouldn't be any problems with it as corresponding IDE's host
    driver (sl82c105) has been supporting PCI Power Management since
    Oct 10 2008 (commit feb22b7f "ide: add proper PCI PM support (v2)")
    and IDE PM since Jun 14 2003 (patch v2.5.73 "ide: Power Management").

    Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    ---
    earlier references:
    https://lkml.org/lkml/2009/11/25/385

    drivers/ata/pata_sl82c105.c | 37 ++++++++++++++++++++++++++++++++-----
    1 file changed, 32 insertions(+), 5 deletions(-)

    Index: b/drivers/ata/pata_sl82c105.c
    ===================================================================
    --- a/drivers/ata/pata_sl82c105.c
    +++ b/drivers/ata/pata_sl82c105.c
    @@ -1,6 +1,7 @@
    /*
    * pata_sl82c105.c - SL82C105 PATA for new ATA layer
    * (C) 2005 Red Hat Inc
    + * (C) 2011 Bartlomiej Zolnierkiewicz
    *
    * Based in part on linux/drivers/ide/pci/sl82c105.c
    * SL82C105/Winbond 553 IDE driver
    @@ -278,6 +279,14 @@ static int sl82c105_bridge_revision(stru
    return bridge->revision;
    }

    +static void sl82c105_fixup(struct pci_dev *pdev)
    +{
    + u32 val;
    +
    + pci_read_config_dword(pdev, 0x40, &val);
    + val |= CTRL_P0EN | CTRL_P0F16 | CTRL_P1F16;
    + pci_write_config_dword(pdev, 0x40, val);
    +}

    static int sl82c105_init_one(struct pci_dev *dev, const struct pci_device_id *id)
    {
    @@ -295,7 +304,6 @@ static int sl82c105_init_one(struct pci_
    /* for now use only the first port */
    const struct ata_port_info *ppi[] = { &info_early,
    NULL };
    - u32 val;
    int rev;
    int rc;

    @@ -312,13 +320,28 @@ static int sl82c105_init_one(struct pci_
    else
    ppi[0] = &info_dma;

    - pci_read_config_dword(dev, 0x40, &val);
    - val |= CTRL_P0EN | CTRL_P0F16 | CTRL_P1F16;
    - pci_write_config_dword(dev, 0x40, val);
    + sl82c105_fixup(dev);

    return ata_pci_bmdma_init_one(dev, ppi, &sl82c105_sht, NULL, 0);
    }

    +#ifdef CONFIG_PM
    +static int sl82c105_reinit_one(struct pci_dev *pdev)
    +{
    + struct ata_host *host = dev_get_drvdata(&pdev->dev);
    + int rc;
    +
    + rc = ata_pci_device_do_resume(pdev);
    + if (rc)
    + return rc;
    +
    + sl82c105_fixup(pdev);
    +
    + ata_host_resume(host);
    + return 0;
    +}
    +#endif
    +
    static const struct pci_device_id sl82c105[] = {
    { PCI_VDEVICE(WINBOND, PCI_DEVICE_ID_WINBOND_82C105), },

    @@ -329,7 +352,11 @@ static struct pci_driver sl82c105_pci_dr
    .name = DRV_NAME,
    .id_table = sl82c105,
    .probe = sl82c105_init_one,
    - .remove = ata_pci_remove_one
    + .remove = ata_pci_remove_one,
    +#ifdef CONFIG_PM
    + .suspend = ata_pci_device_suspend,
    + .resume = sl82c105_reinit_one,
    +#endif
    };

    static int __init sl82c105_init(void)

    \
     
     \ /
      Last update: 2011-10-13 13:19    [W:0.022 / U:302.628 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site