1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright (C) 2019 Texas Instruments Incorporated - https://www.ti.com/ 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __LINUX_MTD_HYPERBUS_H__ 7*4882a593Smuzhiyun #define __LINUX_MTD_HYPERBUS_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/mtd/map.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* HyperBus command bits */ 12*4882a593Smuzhiyun #define HYPERBUS_RW 0x80 /* R/W# */ 13*4882a593Smuzhiyun #define HYPERBUS_RW_WRITE 0 14*4882a593Smuzhiyun #define HYPERBUS_RW_READ 0x80 15*4882a593Smuzhiyun #define HYPERBUS_AS 0x40 /* Address Space */ 16*4882a593Smuzhiyun #define HYPERBUS_AS_MEM 0 17*4882a593Smuzhiyun #define HYPERBUS_AS_REG 0x40 18*4882a593Smuzhiyun #define HYPERBUS_BT 0x20 /* Burst Type */ 19*4882a593Smuzhiyun #define HYPERBUS_BT_WRAPPED 0 20*4882a593Smuzhiyun #define HYPERBUS_BT_LINEAR 0x20 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum hyperbus_memtype { 23*4882a593Smuzhiyun HYPERFLASH, 24*4882a593Smuzhiyun HYPERRAM, 25*4882a593Smuzhiyun }; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /** 28*4882a593Smuzhiyun * struct hyperbus_device - struct representing HyperBus slave device 29*4882a593Smuzhiyun * @map: map_info struct for accessing MMIO HyperBus flash memory 30*4882a593Smuzhiyun * @np: pointer to HyperBus slave device node 31*4882a593Smuzhiyun * @mtd: pointer to MTD struct 32*4882a593Smuzhiyun * @ctlr: pointer to HyperBus controller struct 33*4882a593Smuzhiyun * @memtype: type of memory device: HyperFlash or HyperRAM 34*4882a593Smuzhiyun * @priv: pointer to controller specific per device private data 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct hyperbus_device { 38*4882a593Smuzhiyun struct map_info map; 39*4882a593Smuzhiyun struct device_node *np; 40*4882a593Smuzhiyun struct mtd_info *mtd; 41*4882a593Smuzhiyun struct hyperbus_ctlr *ctlr; 42*4882a593Smuzhiyun enum hyperbus_memtype memtype; 43*4882a593Smuzhiyun void *priv; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /** 47*4882a593Smuzhiyun * struct hyperbus_ops - struct representing custom HyperBus operations 48*4882a593Smuzhiyun * @read16: read 16 bit of data from flash in a single burst. Used to read 49*4882a593Smuzhiyun * from non default address space, such as ID/CFI space 50*4882a593Smuzhiyun * @write16: write 16 bit of data to flash in a single burst. Used to 51*4882a593Smuzhiyun * send cmd to flash or write single 16 bit word at a time. 52*4882a593Smuzhiyun * @copy_from: copy data from flash memory 53*4882a593Smuzhiyun * @copy_to: copy data to flash memory 54*4882a593Smuzhiyun * @calibrate: calibrate HyperBus controller 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun struct hyperbus_ops { 58*4882a593Smuzhiyun u16 (*read16)(struct hyperbus_device *hbdev, unsigned long addr); 59*4882a593Smuzhiyun void (*write16)(struct hyperbus_device *hbdev, 60*4882a593Smuzhiyun unsigned long addr, u16 val); 61*4882a593Smuzhiyun void (*copy_from)(struct hyperbus_device *hbdev, void *to, 62*4882a593Smuzhiyun unsigned long from, ssize_t len); 63*4882a593Smuzhiyun void (*copy_to)(struct hyperbus_device *dev, unsigned long to, 64*4882a593Smuzhiyun const void *from, ssize_t len); 65*4882a593Smuzhiyun int (*calibrate)(struct hyperbus_device *dev); 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /** 69*4882a593Smuzhiyun * struct hyperbus_ctlr - struct representing HyperBus controller 70*4882a593Smuzhiyun * @dev: pointer to HyperBus controller device 71*4882a593Smuzhiyun * @calibrated: flag to indicate ctlr calibration sequence is complete 72*4882a593Smuzhiyun * @ops: HyperBus controller ops 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun struct hyperbus_ctlr { 75*4882a593Smuzhiyun struct device *dev; 76*4882a593Smuzhiyun bool calibrated; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun const struct hyperbus_ops *ops; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /** 82*4882a593Smuzhiyun * hyperbus_register_device - probe and register a HyperBus slave memory device 83*4882a593Smuzhiyun * @hbdev: hyperbus_device struct with dev, np and ctlr field populated 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * Return: 0 for success, others for failure. 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun int hyperbus_register_device(struct hyperbus_device *hbdev); 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /** 90*4882a593Smuzhiyun * hyperbus_unregister_device - deregister HyperBus slave memory device 91*4882a593Smuzhiyun * @hbdev: hyperbus_device to be unregistered 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * Return: 0 for success, others for failure. 94*4882a593Smuzhiyun */ 95*4882a593Smuzhiyun int hyperbus_unregister_device(struct hyperbus_device *hbdev); 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #endif /* __LINUX_MTD_HYPERBUS_H__ */ 98