linux/drivers/mmc/host/renesas_sdhi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Renesas Mobile SDHI
   4 *
   5 * Copyright (C) 2017 Horms Solutions Ltd., Simon Horman
   6 * Copyright (C) 2017-19 Renesas Electronics Corporation
   7 */
   8
   9#ifndef RENESAS_SDHI_H
  10#define RENESAS_SDHI_H
  11
  12#include <linux/platform_device.h>
  13#include "tmio_mmc.h"
  14
  15struct renesas_sdhi_scc {
  16        unsigned long clk_rate; /* clock rate for SDR104 */
  17        u32 tap;                /* sampling clock position for SDR104/HS400 (8 TAP) */
  18        u32 tap_hs400_4tap;     /* sampling clock position for HS400 (4 TAP) */
  19};
  20
  21struct renesas_sdhi_of_data {
  22        unsigned long tmio_flags;
  23        u32           tmio_ocr_mask;
  24        unsigned long capabilities;
  25        unsigned long capabilities2;
  26        enum dma_slave_buswidth dma_buswidth;
  27        dma_addr_t dma_rx_offset;
  28        unsigned int bus_shift;
  29        int scc_offset;
  30        struct renesas_sdhi_scc *taps;
  31        int taps_num;
  32        unsigned int max_blk_count;
  33        unsigned short max_segs;
  34};
  35
  36#define SDHI_CALIB_TABLE_MAX 32
  37
  38struct renesas_sdhi_quirks {
  39        bool hs400_disabled;
  40        bool hs400_4taps;
  41        u32 hs400_bad_taps;
  42        const u8 (*hs400_calib_table)[SDHI_CALIB_TABLE_MAX];
  43};
  44
  45struct renesas_sdhi_of_data_with_quirks {
  46        const struct renesas_sdhi_of_data *of_data;
  47        const struct renesas_sdhi_quirks *quirks;
  48};
  49
  50struct tmio_mmc_dma {
  51        enum dma_slave_buswidth dma_buswidth;
  52        bool (*filter)(struct dma_chan *chan, void *arg);
  53        void (*enable)(struct tmio_mmc_host *host, bool enable);
  54        struct completion       dma_dataend;
  55        struct tasklet_struct   dma_complete;
  56};
  57
  58struct renesas_sdhi {
  59        struct clk *clk;
  60        struct clk *clk_cd;
  61        struct tmio_mmc_data mmc_data;
  62        struct tmio_mmc_dma dma_priv;
  63        const struct renesas_sdhi_quirks *quirks;
  64        struct pinctrl *pinctrl;
  65        struct pinctrl_state *pins_default, *pins_uhs;
  66        void __iomem *scc_ctl;
  67        u32 scc_tappos;
  68        u32 scc_tappos_hs400;
  69        const u8 *adjust_hs400_calib_table;
  70        bool needs_adjust_hs400;
  71
  72        /* Tuning values: 1 for success, 0 for failure */
  73        DECLARE_BITMAP(taps, BITS_PER_LONG);
  74        /* Sampling data comparison: 1 for match, 0 for mismatch */
  75        DECLARE_BITMAP(smpcmp, BITS_PER_LONG);
  76        unsigned int tap_num;
  77        unsigned int tap_set;
  78
  79        struct reset_control *rstc;
  80};
  81
  82#define host_to_priv(host) \
  83        container_of((host)->pdata, struct renesas_sdhi, mmc_data)
  84
  85int renesas_sdhi_probe(struct platform_device *pdev,
  86                       const struct tmio_mmc_dma_ops *dma_ops,
  87                       const struct renesas_sdhi_of_data *of_data,
  88                       const struct renesas_sdhi_quirks *quirks);
  89int renesas_sdhi_remove(struct platform_device *pdev);
  90#endif
  91