162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * tifm.h - TI FlashMedia driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2006 Alex Dubov <oakad@yahoo.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _TIFM_H 962306a36Sopenharmony_ci#define _TIFM_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/spinlock.h> 1262306a36Sopenharmony_ci#include <linux/interrupt.h> 1362306a36Sopenharmony_ci#include <linux/delay.h> 1462306a36Sopenharmony_ci#include <linux/pci.h> 1562306a36Sopenharmony_ci#include <linux/workqueue.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* Host registers (relative to pci base address): */ 1862306a36Sopenharmony_cienum { 1962306a36Sopenharmony_ci FM_SET_INTERRUPT_ENABLE = 0x008, 2062306a36Sopenharmony_ci FM_CLEAR_INTERRUPT_ENABLE = 0x00c, 2162306a36Sopenharmony_ci FM_INTERRUPT_STATUS = 0x014 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Socket registers (relative to socket base address): */ 2562306a36Sopenharmony_cienum { 2662306a36Sopenharmony_ci SOCK_CONTROL = 0x004, 2762306a36Sopenharmony_ci SOCK_PRESENT_STATE = 0x008, 2862306a36Sopenharmony_ci SOCK_DMA_ADDRESS = 0x00c, 2962306a36Sopenharmony_ci SOCK_DMA_CONTROL = 0x010, 3062306a36Sopenharmony_ci SOCK_DMA_FIFO_INT_ENABLE_SET = 0x014, 3162306a36Sopenharmony_ci SOCK_DMA_FIFO_INT_ENABLE_CLEAR = 0x018, 3262306a36Sopenharmony_ci SOCK_DMA_FIFO_STATUS = 0x020, 3362306a36Sopenharmony_ci SOCK_FIFO_CONTROL = 0x024, 3462306a36Sopenharmony_ci SOCK_FIFO_PAGE_SIZE = 0x028, 3562306a36Sopenharmony_ci SOCK_MMCSD_COMMAND = 0x104, 3662306a36Sopenharmony_ci SOCK_MMCSD_ARG_LOW = 0x108, 3762306a36Sopenharmony_ci SOCK_MMCSD_ARG_HIGH = 0x10c, 3862306a36Sopenharmony_ci SOCK_MMCSD_CONFIG = 0x110, 3962306a36Sopenharmony_ci SOCK_MMCSD_STATUS = 0x114, 4062306a36Sopenharmony_ci SOCK_MMCSD_INT_ENABLE = 0x118, 4162306a36Sopenharmony_ci SOCK_MMCSD_COMMAND_TO = 0x11c, 4262306a36Sopenharmony_ci SOCK_MMCSD_DATA_TO = 0x120, 4362306a36Sopenharmony_ci SOCK_MMCSD_DATA = 0x124, 4462306a36Sopenharmony_ci SOCK_MMCSD_BLOCK_LEN = 0x128, 4562306a36Sopenharmony_ci SOCK_MMCSD_NUM_BLOCKS = 0x12c, 4662306a36Sopenharmony_ci SOCK_MMCSD_BUFFER_CONFIG = 0x130, 4762306a36Sopenharmony_ci SOCK_MMCSD_SPI_CONFIG = 0x134, 4862306a36Sopenharmony_ci SOCK_MMCSD_SDIO_MODE_CONFIG = 0x138, 4962306a36Sopenharmony_ci SOCK_MMCSD_RESPONSE = 0x144, 5062306a36Sopenharmony_ci SOCK_MMCSD_SDIO_SR = 0x164, 5162306a36Sopenharmony_ci SOCK_MMCSD_SYSTEM_CONTROL = 0x168, 5262306a36Sopenharmony_ci SOCK_MMCSD_SYSTEM_STATUS = 0x16c, 5362306a36Sopenharmony_ci SOCK_MS_COMMAND = 0x184, 5462306a36Sopenharmony_ci SOCK_MS_DATA = 0x188, 5562306a36Sopenharmony_ci SOCK_MS_STATUS = 0x18c, 5662306a36Sopenharmony_ci SOCK_MS_SYSTEM = 0x190, 5762306a36Sopenharmony_ci SOCK_FIFO_ACCESS = 0x200 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define TIFM_CTRL_LED 0x00000040 6162306a36Sopenharmony_ci#define TIFM_CTRL_FAST_CLK 0x00000100 6262306a36Sopenharmony_ci#define TIFM_CTRL_POWER_MASK 0x00000007 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#define TIFM_SOCK_STATE_OCCUPIED 0x00000008 6562306a36Sopenharmony_ci#define TIFM_SOCK_STATE_POWERED 0x00000080 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#define TIFM_FIFO_ENABLE 0x00000001 6862306a36Sopenharmony_ci#define TIFM_FIFO_READY 0x00000001 6962306a36Sopenharmony_ci#define TIFM_FIFO_MORE 0x00000008 7062306a36Sopenharmony_ci#define TIFM_FIFO_INT_SETALL 0x0000ffff 7162306a36Sopenharmony_ci#define TIFM_FIFO_INTMASK 0x00000005 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define TIFM_DMA_RESET 0x00000002 7462306a36Sopenharmony_ci#define TIFM_DMA_TX 0x00008000 7562306a36Sopenharmony_ci#define TIFM_DMA_EN 0x00000001 7662306a36Sopenharmony_ci#define TIFM_DMA_TSIZE 0x0000007f 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define TIFM_TYPE_XD 1 7962306a36Sopenharmony_ci#define TIFM_TYPE_MS 2 8062306a36Sopenharmony_ci#define TIFM_TYPE_SD 3 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct tifm_device_id { 8362306a36Sopenharmony_ci unsigned char type; 8462306a36Sopenharmony_ci}; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct tifm_driver; 8762306a36Sopenharmony_cistruct tifm_dev { 8862306a36Sopenharmony_ci char __iomem *addr; 8962306a36Sopenharmony_ci spinlock_t lock; 9062306a36Sopenharmony_ci unsigned char type; 9162306a36Sopenharmony_ci unsigned int socket_id; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci void (*card_event)(struct tifm_dev *sock); 9462306a36Sopenharmony_ci void (*data_event)(struct tifm_dev *sock); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci struct device dev; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct tifm_driver { 10062306a36Sopenharmony_ci struct tifm_device_id *id_table; 10162306a36Sopenharmony_ci int (*probe)(struct tifm_dev *dev); 10262306a36Sopenharmony_ci void (*remove)(struct tifm_dev *dev); 10362306a36Sopenharmony_ci int (*suspend)(struct tifm_dev *dev, 10462306a36Sopenharmony_ci pm_message_t state); 10562306a36Sopenharmony_ci int (*resume)(struct tifm_dev *dev); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci struct device_driver driver; 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistruct tifm_adapter { 11162306a36Sopenharmony_ci char __iomem *addr; 11262306a36Sopenharmony_ci spinlock_t lock; 11362306a36Sopenharmony_ci unsigned int irq_status; 11462306a36Sopenharmony_ci unsigned int socket_change_set; 11562306a36Sopenharmony_ci unsigned int id; 11662306a36Sopenharmony_ci unsigned int num_sockets; 11762306a36Sopenharmony_ci struct completion *finish_me; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci struct work_struct media_switcher; 12062306a36Sopenharmony_ci struct device dev; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci void (*eject)(struct tifm_adapter *fm, 12362306a36Sopenharmony_ci struct tifm_dev *sock); 12462306a36Sopenharmony_ci int (*has_ms_pif)(struct tifm_adapter *fm, 12562306a36Sopenharmony_ci struct tifm_dev *sock); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci struct tifm_dev *sockets[]; 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cistruct tifm_adapter *tifm_alloc_adapter(unsigned int num_sockets, 13162306a36Sopenharmony_ci struct device *dev); 13262306a36Sopenharmony_ciint tifm_add_adapter(struct tifm_adapter *fm); 13362306a36Sopenharmony_civoid tifm_remove_adapter(struct tifm_adapter *fm); 13462306a36Sopenharmony_civoid tifm_free_adapter(struct tifm_adapter *fm); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_civoid tifm_free_device(struct device *dev); 13762306a36Sopenharmony_cistruct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id, 13862306a36Sopenharmony_ci unsigned char type); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciint tifm_register_driver(struct tifm_driver *drv); 14162306a36Sopenharmony_civoid tifm_unregister_driver(struct tifm_driver *drv); 14262306a36Sopenharmony_civoid tifm_eject(struct tifm_dev *sock); 14362306a36Sopenharmony_ciint tifm_has_ms_pif(struct tifm_dev *sock); 14462306a36Sopenharmony_ciint tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents, 14562306a36Sopenharmony_ci int direction); 14662306a36Sopenharmony_civoid tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents, 14762306a36Sopenharmony_ci int direction); 14862306a36Sopenharmony_civoid tifm_queue_work(struct work_struct *work); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic inline void *tifm_get_drvdata(struct tifm_dev *dev) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci return dev_get_drvdata(&dev->dev); 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic inline void tifm_set_drvdata(struct tifm_dev *dev, void *data) 15662306a36Sopenharmony_ci{ 15762306a36Sopenharmony_ci dev_set_drvdata(&dev->dev, data); 15862306a36Sopenharmony_ci} 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#endif 161