Merge tag 'armsoc-dt' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[cascardo/linux.git] / drivers / net / wireless / ath / ath9k / eeprom.c
index a794157..a449588 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "hw.h"
+#include <linux/ath9k_platform.h>
 
 void ath9k_hw_analog_shift_regwrite(struct ath_hw *ah, u32 reg, u32 val)
 {
@@ -108,26 +109,42 @@ void ath9k_hw_usb_gen_fill_eeprom(struct ath_hw *ah, u16 *eep_data,
        }
 }
 
-static bool ath9k_hw_nvram_read_blob(struct ath_hw *ah, u32 off,
-                                    u16 *data)
+static bool ath9k_hw_nvram_read_array(u16 *blob, size_t blob_size,
+                                     off_t offset, u16 *data)
 {
-       u16 *blob_data;
-
-       if (off * sizeof(u16) > ah->eeprom_blob->size)
+       if (offset > blob_size)
                return false;
 
-       blob_data = (u16 *)ah->eeprom_blob->data;
-       *data =  blob_data[off];
+       *data =  blob[offset];
        return true;
 }
 
+static bool ath9k_hw_nvram_read_pdata(struct ath9k_platform_data *pdata,
+                                     off_t offset, u16 *data)
+{
+       return ath9k_hw_nvram_read_array(pdata->eeprom_data,
+                                        ARRAY_SIZE(pdata->eeprom_data),
+                                        offset, data);
+}
+
+static bool ath9k_hw_nvram_read_firmware(const struct firmware *eeprom_blob,
+                                        off_t offset, u16 *data)
+{
+       return ath9k_hw_nvram_read_array((u16 *) eeprom_blob->data,
+                                        eeprom_blob->size / sizeof(u16),
+                                        offset, data);
+}
+
 bool ath9k_hw_nvram_read(struct ath_hw *ah, u32 off, u16 *data)
 {
        struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_platform_data *pdata = ah->dev->platform_data;
        bool ret;
 
        if (ah->eeprom_blob)
-               ret = ath9k_hw_nvram_read_blob(ah, off, data);
+               ret = ath9k_hw_nvram_read_firmware(ah->eeprom_blob, off, data);
+       else if (pdata && !pdata->use_eeprom && pdata->eeprom_data)
+               ret = ath9k_hw_nvram_read_pdata(pdata, off, data);
        else
                ret = common->bus_ops->eeprom_read(common, off, data);