linux/include/linux/tifm.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 *  tifm.h - TI FlashMedia driver
   4 *
   5 *  Copyright (C) 2006 Alex Dubov <oakad@yahoo.com>
   6 */
   7
   8#ifndef _TIFM_H
   9#define _TIFM_H
  10
  11#include <linux/spinlock.h>
  12#include <linux/interrupt.h>
  13#include <linux/delay.h>
  14#include <linux/pci.h>
  15#include <linux/workqueue.h>
  16
  17/* Host registers (relative to pci base address): */
  18enum {
  19        FM_SET_INTERRUPT_ENABLE   = 0x008,
  20        FM_CLEAR_INTERRUPT_ENABLE = 0x00c,
  21        FM_INTERRUPT_STATUS       = 0x014
  22};
  23
  24/* Socket registers (relative to socket base address): */
  25enum {
  26        SOCK_CONTROL                   = 0x004,
  27        SOCK_PRESENT_STATE             = 0x008,
  28        SOCK_DMA_ADDRESS               = 0x00c,
  29        SOCK_DMA_CONTROL               = 0x010,
  30        SOCK_DMA_FIFO_INT_ENABLE_SET   = 0x014,
  31        SOCK_DMA_FIFO_INT_ENABLE_CLEAR = 0x018,
  32        SOCK_DMA_FIFO_STATUS           = 0x020,
  33        SOCK_FIFO_CONTROL              = 0x024,
  34        SOCK_FIFO_PAGE_SIZE            = 0x028,
  35        SOCK_MMCSD_COMMAND             = 0x104,
  36        SOCK_MMCSD_ARG_LOW             = 0x108,
  37        SOCK_MMCSD_ARG_HIGH            = 0x10c,
  38        SOCK_MMCSD_CONFIG              = 0x110,
  39        SOCK_MMCSD_STATUS              = 0x114,
  40        SOCK_MMCSD_INT_ENABLE          = 0x118,
  41        SOCK_MMCSD_COMMAND_TO          = 0x11c,
  42        SOCK_MMCSD_DATA_TO             = 0x120,
  43        SOCK_MMCSD_DATA                = 0x124,
  44        SOCK_MMCSD_BLOCK_LEN           = 0x128,
  45        SOCK_MMCSD_NUM_BLOCKS          = 0x12c,
  46        SOCK_MMCSD_BUFFER_CONFIG       = 0x130,
  47        SOCK_MMCSD_SPI_CONFIG          = 0x134,
  48        SOCK_MMCSD_SDIO_MODE_CONFIG    = 0x138,
  49        SOCK_MMCSD_RESPONSE            = 0x144,
  50        SOCK_MMCSD_SDIO_SR             = 0x164,
  51        SOCK_MMCSD_SYSTEM_CONTROL      = 0x168,
  52        SOCK_MMCSD_SYSTEM_STATUS       = 0x16c,
  53        SOCK_MS_COMMAND                = 0x184,
  54        SOCK_MS_DATA                   = 0x188,
  55        SOCK_MS_STATUS                 = 0x18c,
  56        SOCK_MS_SYSTEM                 = 0x190,
  57        SOCK_FIFO_ACCESS               = 0x200
  58};
  59
  60#define TIFM_CTRL_LED             0x00000040
  61#define TIFM_CTRL_FAST_CLK        0x00000100
  62#define TIFM_CTRL_POWER_MASK      0x00000007
  63
  64#define TIFM_SOCK_STATE_OCCUPIED  0x00000008
  65#define TIFM_SOCK_STATE_POWERED   0x00000080
  66
  67#define TIFM_FIFO_ENABLE          0x00000001
  68#define TIFM_FIFO_READY           0x00000001
  69#define TIFM_FIFO_MORE            0x00000008
  70#define TIFM_FIFO_INT_SETALL      0x0000ffff
  71#define TIFM_FIFO_INTMASK         0x00000005
  72
  73#define TIFM_DMA_RESET            0x00000002
  74#define TIFM_DMA_TX               0x00008000
  75#define TIFM_DMA_EN               0x00000001
  76#define TIFM_DMA_TSIZE            0x0000007f
  77
  78#define TIFM_TYPE_XD 1
  79#define TIFM_TYPE_MS 2
  80#define TIFM_TYPE_SD 3
  81
  82struct tifm_device_id {
  83        unsigned char type;
  84};
  85
  86struct tifm_driver;
  87struct tifm_dev {
  88        char __iomem  *addr;
  89        spinlock_t    lock;
  90        unsigned char type;
  91        unsigned int  socket_id;
  92
  93        void          (*card_event)(struct tifm_dev *sock);
  94        void          (*data_event)(struct tifm_dev *sock);
  95
  96        struct device dev;
  97};
  98
  99struct tifm_driver {
 100        struct tifm_device_id *id_table;
 101        int                   (*probe)(struct tifm_dev *dev);
 102        void                  (*remove)(struct tifm_dev *dev);
 103        int                   (*suspend)(struct tifm_dev *dev,
 104                                         pm_message_t state);
 105        int                   (*resume)(struct tifm_dev *dev);
 106
 107        struct device_driver  driver;
 108};
 109
 110struct tifm_adapter {
 111        char __iomem        *addr;
 112        spinlock_t          lock;
 113        unsigned int        irq_status;
 114        unsigned int        socket_change_set;
 115        unsigned int        id;
 116        unsigned int        num_sockets;
 117        struct completion   *finish_me;
 118
 119        struct work_struct  media_switcher;
 120        struct device       dev;
 121
 122        void                (*eject)(struct tifm_adapter *fm,
 123                                     struct tifm_dev *sock);
 124        int                 (*has_ms_pif)(struct tifm_adapter *fm,
 125                                          struct tifm_dev *sock);
 126
 127        struct tifm_dev     *sockets[0];
 128};
 129
 130struct tifm_adapter *tifm_alloc_adapter(unsigned int num_sockets,
 131                                        struct device *dev);
 132int tifm_add_adapter(struct tifm_adapter *fm);
 133void tifm_remove_adapter(struct tifm_adapter *fm);
 134void tifm_free_adapter(struct tifm_adapter *fm);
 135
 136void tifm_free_device(struct device *dev);
 137struct tifm_dev *tifm_alloc_device(struct tifm_adapter *fm, unsigned int id,
 138                                   unsigned char type);
 139
 140int tifm_register_driver(struct tifm_driver *drv);
 141void tifm_unregister_driver(struct tifm_driver *drv);
 142void tifm_eject(struct tifm_dev *sock);
 143int tifm_has_ms_pif(struct tifm_dev *sock);
 144int tifm_map_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
 145                int direction);
 146void tifm_unmap_sg(struct tifm_dev *sock, struct scatterlist *sg, int nents,
 147                   int direction);
 148void tifm_queue_work(struct work_struct *work);
 149
 150static inline void *tifm_get_drvdata(struct tifm_dev *dev)
 151{
 152        return dev_get_drvdata(&dev->dev);
 153}
 154
 155static inline void tifm_set_drvdata(struct tifm_dev *dev, void *data)
 156{
 157        dev_set_drvdata(&dev->dev, data);
 158}
 159
 160#endif
 161