diff --git a/patches/fmc-sw.diff b/patches/fmc-sw.diff index 2888cbef64902535fc3416e0c76e674a580bc67d..f5cc6f76ea70f7e13a7651fed63d30b54d604f84 100644 --- a/patches/fmc-sw.diff +++ b/patches/fmc-sw.diff @@ -1,8 +1,45 @@ diff --git a/drivers/fmc/fmc-eeprom.c b/drivers/fmc/fmc-eeprom.c -index a000a0d..64fb6b6 100644 +index a000a0d..e5f96b2 100644 --- a/drivers/fmc/fmc-eeprom.c +++ b/drivers/fmc/fmc-eeprom.c -@@ -22,7 +22,11 @@ +@@ -10,6 +10,10 @@ + #include "fmc-internal.h" + #include "fmc-compat.h" + ++#if KERNEL_VERSION(4, 6, 0) <= LINUX_VERSION_CODE ++#include <linux/nvmem-consumer.h> ++#endif ++ + #define FRU_EEPROM_NAME "fru_eeprom" + + /** +@@ -17,12 +21,37 @@ + */ + #define FMC_EEPROM_TYPE_DEFAULT "24c02" + ++#if KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE ++/* static int fmc_slot_eeprom_setup(struct notifier_block *nb, */ ++/* unsigned long event, void *data) */ ++/* { */ ++/* struct nvmem_device *nvmem = data; */ ++ ++/* //dev_err(&nvmem->dev, "friendly notifier, action %ld\n", event); */ ++/* if (strcmp(nvmem_dev_name(nvmem), "1-00500") != 0) */ ++/* return NOTIFY_DONE; */ ++ ++/* return NOTIFY_OK; */ ++/* }; */ ++ ++/* static struct notifier_block fmc_eeprom_nvmem_notifier = { */ ++/* .notifier_call = fmc_slot_eeprom_setup, */ ++/* }; */ ++struct property_entry at24_properties[] = { ++ PROPERTY_ENTRY_U32("pagesize", 8), ++ { } ++}; ++#else + /** + * Setup function for the AT24C02 EEPROM. What we need to do here is to * quickly validate the EEPROM content. The EEPROM should contain a valid * FRU. */ @@ -14,7 +51,48 @@ index a000a0d..64fb6b6 100644 { struct fmc_slot *slot = context; -@@ -70,9 +74,15 @@ ssize_t fmc_slot_eeprom_read(struct fmc_slot *slot, +@@ -38,17 +67,26 @@ static const struct at24_platform_data at24_24c02 = { + .flags = 0, + .setup = fmc_slot_eeprom_setup, + }; ++#endif /* KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE */ + + /** +- * Initialize I2C EEPROM info with standad values ++ * Initialize I2C EEPROM info with standard values + */ + static void fmc_slot_eeprom_init(struct fmc_slot *slot, + struct i2c_board_info *info, + const char *name) + { ++#if KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE ++ struct property_entry **p_entry; ++#endif + strncpy(info->type, name, I2C_NAME_SIZE); + info->addr = FMC_EEPROM_ADDR_SPACE; ++#if KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE ++ p_entry = (struct property_entry **)&info->properties; ++ *p_entry = at24_properties; ++#else + info->platform_data = &slot->at24_data; ++#endif + } + + static void fmc_slot_eeprom_init_default(struct fmc_slot *slot, +@@ -56,8 +94,12 @@ static void fmc_slot_eeprom_init_default(struct fmc_slot *slot, + { + memset(info, 0, sizeof(*info)); + fmc_slot_eeprom_init(slot, info, FMC_EEPROM_TYPE_DEFAULT); ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE + memcpy(&slot->at24_data, &at24_24c02, sizeof(slot->at24_data)); + slot->at24_data.context = slot; ++/* #else */ ++/* nvmem_register_notifier(&fmc_eeprom_nvmem_notifier); */ ++#endif + } + + /** +@@ -70,9 +112,15 @@ ssize_t fmc_slot_eeprom_read(struct fmc_slot *slot, * TODO if we export this function, do we have to lock it when we * use it? Think about it */ @@ -31,6 +109,58 @@ index a000a0d..64fb6b6 100644 } EXPORT_SYMBOL(fmc_slot_eeprom_read); +@@ -176,6 +224,9 @@ int fmc_slot_eeprom_type_set(struct fmc_slot *slot, const char *type) + struct i2c_board_info i2c_info; + unsigned int len; + int ret; ++#if KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE ++ struct property_entry *p_entry; ++#endif + + if (strncmp(type, "24c", 3)) { + if (strncmp(type, "at24c", 5)) { +@@ -197,19 +248,24 @@ int fmc_slot_eeprom_type_set(struct fmc_slot *slot, const char *type) + + + memset(&i2c_info, 0, sizeof(i2c_info)); ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE + memset(&slot->at24_data, 0, sizeof(slot->at24_data)); ++#endif + + len = (len * 1024) / 8; + /* + * For sizes between 1K and 16K the EEPROM uses part of the device + * address as internal memory address + */ +- if (len > 4096) /* 32K 4KiB */ +- slot->at24_data.flags = AT24_FLAG_ADDR16; +- else if (len > 131072) /* 1024K 128KiB */ ++ if (len > 131072) /* 1024K 128KiB */ + return -EINVAL; ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE ++ else if (len > 4096) /* 32K 4KiB */ ++ slot->at24_data.flags = AT24_FLAG_ADDR16; ++#endif + + fmc_slot_eeprom_init(slot, &i2c_info, type); ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE + slot->at24_data.byte_len = len; + slot->at24_data.page_size = 1; /* 1Byte page to play safe */ + slot->at24_data.setup = fmc_slot_eeprom_setup; +@@ -219,7 +275,12 @@ int fmc_slot_eeprom_type_set(struct fmc_slot *slot, const char *type) + i2c_info.type, i2c_info.addr, + slot->at24_data.byte_len, slot->at24_data.page_size, + slot->at24_data.flags); +- ++#else ++ p_entry = (struct property_entry *)i2c_info.properties; ++ p_entry[0] = PROPERTY_ENTRY_U32("pagesize", 1); ++ dev_dbg(&slot->dev, "%s 0x%x\n", ++ i2c_info.type, i2c_info.addr); ++#endif + return fmc_slot_eeprom_replace(slot, &i2c_info); + } + EXPORT_SYMBOL(fmc_slot_eeprom_type_set); diff --git a/drivers/fmc/fru-parse.c b/drivers/fmc/fru-parse.c index 35a1380..2fd95eb 100644 --- a/drivers/fmc/fru-parse.c @@ -55,10 +185,26 @@ index 35a1380..2fd95eb 100644 - -#endif diff --git a/include/linux/fmc.h b/include/linux/fmc.h -index 3bc5c12..22bb0a7 100644 +index 3bc5c12..f99886c 100644 --- a/include/linux/fmc.h +++ b/include/linux/fmc.h -@@ -84,7 +84,11 @@ struct fmc_slot { +@@ -11,13 +11,13 @@ + #include <linux/spinlock.h> + #include <linux/version.h> + ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE + #if KERNEL_VERSION(3, 10, 0) <= LINUX_VERSION_CODE + #include <linux/platform_data/at24.h> + #else + #include <linux/i2c/at24.h> + #endif +- +- ++#endif + + #ifndef _LINUX_FMC_H + #define _LINUX_FMC_H +@@ -84,8 +84,14 @@ struct fmc_slot { struct i2c_client *eeprom; @@ -67,6 +213,9 @@ index 3bc5c12..22bb0a7 100644 +#else struct memory_accessor *macc; +#endif ++#if KERNEL_VERSION(5, 1, 0) > LINUX_VERSION_CODE struct at24_platform_data at24_data; ++#endif }; + /**