linux/drivers/usb/isp1760/isp1760-hcd.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ISP1760_HCD_H_
   3#define _ISP1760_HCD_H_
   4
   5#include <linux/spinlock.h>
   6#include <linux/regmap.h>
   7
   8#include "isp1760-regs.h"
   9
  10struct isp1760_qh;
  11struct isp1760_qtd;
  12struct resource;
  13struct usb_hcd;
  14
  15struct isp1760_slotinfo {
  16        struct isp1760_qh *qh;
  17        struct isp1760_qtd *qtd;
  18        unsigned long timestamp;
  19};
  20
  21/* chip memory management */
  22#define ISP176x_BLOCK_MAX (32 + 20 + 4)
  23#define ISP176x_BLOCK_NUM 3
  24
  25struct isp1760_memory_layout {
  26        unsigned int blocks[ISP176x_BLOCK_NUM];
  27        unsigned int blocks_size[ISP176x_BLOCK_NUM];
  28
  29        unsigned int slot_num;
  30        unsigned int payload_blocks;
  31        unsigned int payload_area_size;
  32};
  33
  34struct isp1760_memory_chunk {
  35        unsigned int start;
  36        unsigned int size;
  37        unsigned int free;
  38};
  39
  40enum isp1760_queue_head_types {
  41        QH_CONTROL,
  42        QH_BULK,
  43        QH_INTERRUPT,
  44        QH_END
  45};
  46
  47struct isp1760_hcd {
  48        struct usb_hcd          *hcd;
  49
  50        void __iomem            *base;
  51
  52        struct regmap           *regs;
  53        struct regmap_field     *fields[HC_FIELD_MAX];
  54
  55        bool                    is_isp1763;
  56        const struct isp1760_memory_layout      *memory_layout;
  57
  58        spinlock_t              lock;
  59        struct isp1760_slotinfo *atl_slots;
  60        int                     atl_done_map;
  61        struct isp1760_slotinfo *int_slots;
  62        int                     int_done_map;
  63        struct isp1760_memory_chunk memory_pool[ISP176x_BLOCK_MAX];
  64        struct list_head        qh_list[QH_END];
  65
  66        /* periodic schedule support */
  67#define DEFAULT_I_TDPS          1024
  68        unsigned                periodic_size;
  69        unsigned                i_thresh;
  70        unsigned long           reset_done;
  71        unsigned long           next_statechange;
  72};
  73
  74#ifdef CONFIG_USB_ISP1760_HCD
  75int isp1760_hcd_register(struct isp1760_hcd *priv, struct resource *mem,
  76                         int irq, unsigned long irqflags, struct device *dev);
  77void isp1760_hcd_unregister(struct isp1760_hcd *priv);
  78
  79int isp1760_init_kmem_once(void);
  80void isp1760_deinit_kmem_cache(void);
  81#else
  82static inline int isp1760_hcd_register(struct isp1760_hcd *priv,
  83                                       struct resource *mem,
  84                                       int irq, unsigned long irqflags,
  85                                       struct device *dev)
  86{
  87        return 0;
  88}
  89
  90static inline void isp1760_hcd_unregister(struct isp1760_hcd *priv)
  91{
  92}
  93
  94static inline int isp1760_init_kmem_once(void)
  95{
  96        return 0;
  97}
  98
  99static inline void isp1760_deinit_kmem_cache(void)
 100{
 101}
 102#endif
 103
 104#endif /* _ISP1760_HCD_H_ */
 105