// SPDX-License-Identifier: GPL-2.0+ /* * EEPROM driver for RAVE SP * * Copyright (C) 2018 Zodiac Inflight Innovations * */ #include <linux/kernel.h> #include <linux/mfd/rave-sp.h> #include <linux/module.h> #include <linux/nvmem-provider.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/sizes.h> /** * enum rave_sp_eeprom_access_type - Supported types of EEPROM access * * @RAVE_SP_EEPROM_WRITE: EEPROM write * @RAVE_SP_EEPROM_READ: EEPROM read */ enum rave_sp_eeprom_access_type { … }; /** * enum rave_sp_eeprom_header_size - EEPROM command header sizes * * @RAVE_SP_EEPROM_HEADER_SMALL: EEPROM header size for "small" devices (< 8K) * @RAVE_SP_EEPROM_HEADER_BIG: EEPROM header size for "big" devices (> 8K) */ enum rave_sp_eeprom_header_size { … }; #define RAVE_SP_EEPROM_HEADER_MAX … #define RAVE_SP_EEPROM_PAGE_SIZE … /** * struct rave_sp_eeprom_page - RAVE SP EEPROM page * * @type: Access type (see enum rave_sp_eeprom_access_type) * @success: Success flag (Success = 1, Failure = 0) * @data: Read data * * Note this structure corresponds to RSP_*_EEPROM payload from RAVE * SP ICD */ struct rave_sp_eeprom_page { … } __packed; /** * struct rave_sp_eeprom - RAVE SP EEPROM device * * @sp: Pointer to parent RAVE SP device * @mutex: Lock protecting access to EEPROM * @address: EEPROM device address * @header_size: Size of EEPROM command header for this device * @dev: Pointer to corresponding struct device used for logging */ struct rave_sp_eeprom { … }; /** * rave_sp_eeprom_io - Low-level part of EEPROM page access * * @eeprom: EEPROM device to write to * @type: EEPROM access type (read or write) * @idx: number of the EEPROM page * @page: Data to write or buffer to store result (via page->data) * * This function does all of the low-level work required to perform a * EEPROM access. This includes formatting correct command payload, * sending it and checking received results. * * Returns zero in case of success or negative error code in * case of failure. */ static int rave_sp_eeprom_io(struct rave_sp_eeprom *eeprom, enum rave_sp_eeprom_access_type type, u16 idx, struct rave_sp_eeprom_page *page) { … } /** * rave_sp_eeprom_page_access - Access single EEPROM page * * @eeprom: EEPROM device to access * @type: Access type to perform (read or write) * @offset: Offset within EEPROM to access * @data: Data buffer * @data_len: Size of the data buffer * * This function performs a generic access to a single page or a * portion thereof. Requested access MUST NOT cross the EEPROM page * boundary. * * Returns zero in case of success or negative error code in * case of failure. */ static int rave_sp_eeprom_page_access(struct rave_sp_eeprom *eeprom, enum rave_sp_eeprom_access_type type, unsigned int offset, u8 *data, size_t data_len) { … } /** * rave_sp_eeprom_access - Access EEPROM data * * @eeprom: EEPROM device to access * @type: Access type to perform (read or write) * @offset: Offset within EEPROM to access * @data: Data buffer * @data_len: Size of the data buffer * * This function performs a generic access (either read or write) at * arbitrary offset (not necessary page aligned) of arbitrary length * (is not constrained by EEPROM page size). * * Returns zero in case of success or negative error code in case of * failure. */ static int rave_sp_eeprom_access(struct rave_sp_eeprom *eeprom, enum rave_sp_eeprom_access_type type, unsigned int offset, u8 *data, unsigned int data_len) { … } static int rave_sp_eeprom_reg_read(void *eeprom, unsigned int offset, void *val, size_t bytes) { … } static int rave_sp_eeprom_reg_write(void *eeprom, unsigned int offset, void *val, size_t bytes) { … } static int rave_sp_eeprom_probe(struct platform_device *pdev) { … } static const struct of_device_id rave_sp_eeprom_of_match[] = …; MODULE_DEVICE_TABLE(of, rave_sp_eeprom_of_match); static struct platform_driver rave_sp_eeprom_driver = …; module_platform_driver(…) …; MODULE_LICENSE(…) …; MODULE_AUTHOR(…) …; MODULE_AUTHOR(…) …; MODULE_AUTHOR(…) …; MODULE_DESCRIPTION(…) …;