lkml.org 
[lkml]   [2008]   [Dec]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRFC: pci_write_bits*() convenience functions v.2
    This is a version of the pci_write_bits*() with error checking included.

    I don't know if you like the #defined function generator, but at
    least this avoids copy-and-paste errors in case this needs some
    changes in the future.

    Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>

    diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h
    index 4b55ec6..f1f8b94 100644
    --- a/drivers/edac/edac_core.h
    +++ b/drivers/edac/edac_core.h
    @@ -722,54 +722,6 @@ struct edac_pci_ctl_info {
    #define to_edac_pci_ctl_work(w) \
    container_of(w, struct edac_pci_ctl_info,work)

    -/* write all or some bits in a byte-register*/
    -static inline void pci_write_bits8(struct pci_dev *pdev, int offset, u8 value,
    - u8 mask)
    -{
    - if (mask != 0xff) {
    - u8 buf;
    -
    - pci_read_config_byte(pdev, offset, &buf);
    - value &= mask;
    - buf &= ~mask;
    - value |= buf;
    - }
    -
    - pci_write_config_byte(pdev, offset, value);
    -}
    -
    -/* write all or some bits in a word-register*/
    -static inline void pci_write_bits16(struct pci_dev *pdev, int offset,
    - u16 value, u16 mask)
    -{
    - if (mask != 0xffff) {
    - u16 buf;
    -
    - pci_read_config_word(pdev, offset, &buf);
    - value &= mask;
    - buf &= ~mask;
    - value |= buf;
    - }
    -
    - pci_write_config_word(pdev, offset, value);
    -}
    -
    -/* write all or some bits in a dword-register*/
    -static inline void pci_write_bits32(struct pci_dev *pdev, int offset,
    - u32 value, u32 mask)
    -{
    - if (mask != 0xffff) {
    - u32 buf;
    -
    - pci_read_config_dword(pdev, offset, &buf);
    - value &= mask;
    - buf &= ~mask;
    - value |= buf;
    - }
    -
    - pci_write_config_dword(pdev, offset, value);
    -}
    -
    #endif /* CONFIG_PCI */

    extern struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
    diff --git a/include/linux/pci.h b/include/linux/pci.h
    index feb4657..f5a4112 100644
    --- a/include/linux/pci.h
    +++ b/include/linux/pci.h
    @@ -610,6 +610,28 @@ static inline int pci_write_config_dword(struct pci_dev *dev, int where,
    return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);
    }

    +#define GEN_PCI_UPDATE_FUNC(t,b) \
    +static inline int pci_write_bits##b(struct pci_dev *dev, int where, \
    + u##b value, u##b mask) \
    +{ \
    + u##b buf; \
    + int err; \
    + \
    + err = pci_read_config_##t(dev, where, &buf); \
    + if (err) \
    + return err; \
    + \
    + buf &= ~mask; \
    + buf |= value; \
    + \
    + return pci_write_config_##t(dev, where, buf); \
    +}
    +
    +GEN_PCI_UPDATE_FUNC(byte, 8)
    +GEN_PCI_UPDATE_FUNC(word, 16)
    +GEN_PCI_UPDATE_FUNC(dword, 32)
    +#undef GEN_PCI_UPDATE_FUNC
    +
    int __must_check pci_enable_device(struct pci_dev *dev);
    int __must_check pci_enable_device_io(struct pci_dev *dev);
    int __must_check pci_enable_device_mem(struct pci_dev *dev);
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2008-12-30 22:43    [W:0.032 / U:0.772 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site