/* * Broadcom specific AMBA * SPROM reading * * Copyright 2011, 2012, Hauke Mehrtens <[email protected]> * * Licensed under the GNU/GPL. See COPYING for details. */ #include "bcma_private.h" #include <linux/bcma/bcma.h> #include <linux/bcma/bcma_regs.h> #include <linux/pci.h> #include <linux/io.h> #include <linux/dma-mapping.h> #include <linux/slab.h> static int(*get_fallback_sprom)(struct bcma_bus *dev, struct ssb_sprom *out); /** * bcma_arch_register_fallback_sprom - Registers a method providing a * fallback SPROM if no SPROM is found. * * @sprom_callback: The callback function. * * With this function the architecture implementation may register a * callback handler which fills the SPROM data structure. The fallback is * used for PCI based BCMA devices, where no valid SPROM can be found * in the shadow registers and to provide the SPROM for SoCs where BCMA is * to control the system bus. * * This function is useful for weird architectures that have a half-assed * BCMA device hardwired to their PCI bus. * * This function is available for architecture code, only. So it is not * exported. */ int bcma_arch_register_fallback_sprom(int (*sprom_callback)(struct bcma_bus *bus, struct ssb_sprom *out)) { … } static int bcma_fill_sprom_with_fallback(struct bcma_bus *bus, struct ssb_sprom *out) { … } /************************************************** * R/W ops. **************************************************/ static void bcma_sprom_read(struct bcma_bus *bus, u16 offset, u16 *sprom, size_t words) { … } /************************************************** * Validation. **************************************************/ static inline u8 bcma_crc8(u8 crc, u8 data) { … } static u8 bcma_sprom_crc(const u16 *sprom, size_t words) { … } static int bcma_sprom_check_crc(const u16 *sprom, size_t words) { … } static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom, size_t words) { … } /************************************************** * SPROM extraction. **************************************************/ #define SPOFF(offset) … #define SPEX(_field, _offset, _mask, _shift) … #define SPEX32(_field, _offset, _mask, _shift) … #define SPEX_ARRAY8(_field, _offset, _mask, _shift) … static s8 sprom_extract_antgain(const u16 *in, u16 offset, u16 mask, u16 shift) { … } static void bcma_sprom_extract_r8(struct bcma_bus *bus, const u16 *sprom) { … } /* * Indicates the presence of external SPROM. */ static bool bcma_sprom_ext_available(struct bcma_bus *bus) { … } /* * Indicates that on-chip OTP memory is present and enabled. */ static bool bcma_sprom_onchip_available(struct bcma_bus *bus) { … } /* * Verify OTP is filled and determine the byte * offset where SPROM data is located. * * On error, returns 0; byte offset otherwise. */ static int bcma_sprom_onchip_offset(struct bcma_bus *bus) { … } int bcma_sprom_get(struct bcma_bus *bus) { … }