1 /* SPDX-License-Identifier: GPL-2.0 */
5 * Copyright (C) 2017 Horms Solutions Ltd., Simon Horman
6 * Copyright (C) 2017-19 Renesas Electronics Corporation
10 #define RENESAS_SDHI_H
12 #include <linux/dmaengine.h>
13 #include <linux/platform_device.h>
14 #include <linux/workqueue.h>
17 struct renesas_sdhi_scc
{
18 unsigned long clk_rate
; /* clock rate for SDR104 */
19 u32 tap
; /* sampling clock position for SDR104/HS400 (8 TAP) */
20 u32 tap_hs400_4tap
; /* sampling clock position for HS400 (4 TAP) */
23 #define SDHI_FLAG_NEED_CLKH_FALLBACK BIT(0)
25 struct renesas_sdhi_of_data
{
26 unsigned long tmio_flags
;
28 unsigned long capabilities
;
29 unsigned long capabilities2
;
30 enum dma_slave_buswidth dma_buswidth
;
31 dma_addr_t dma_rx_offset
;
32 unsigned int bus_shift
;
34 struct renesas_sdhi_scc
*taps
;
36 unsigned int max_blk_count
;
37 unsigned short max_segs
;
38 unsigned long sdhi_flags
;
41 #define SDHI_CALIB_TABLE_MAX 32
43 #define sdhi_has_quirk(p, q) ((p)->quirks && (p)->quirks->q)
45 struct renesas_sdhi_quirks
{
50 bool manual_tap_correction
;
51 bool old_info1_layout
;
53 const u8 (*hs400_calib_table
)[SDHI_CALIB_TABLE_MAX
];
56 struct renesas_sdhi_of_data_with_quirks
{
57 const struct renesas_sdhi_of_data
*of_data
;
58 const struct renesas_sdhi_quirks
*quirks
;
61 /* We want both end_flags to be set before we mark DMA as finished */
62 #define SDHI_DMA_END_FLAG_DMA 0
63 #define SDHI_DMA_END_FLAG_ACCESS 1
65 struct renesas_sdhi_dma
{
66 unsigned long end_flags
;
67 enum dma_slave_buswidth dma_buswidth
;
69 void (*enable
)(struct tmio_mmc_host
*host
, bool enable
);
70 struct completion dma_dataend
;
71 struct work_struct dma_complete
;
78 struct tmio_mmc_data mmc_data
;
79 struct renesas_sdhi_dma dma_priv
;
80 const struct renesas_sdhi_quirks
*quirks
;
81 struct pinctrl
*pinctrl
;
82 struct pinctrl_state
*pins_default
, *pins_uhs
;
83 void __iomem
*scc_ctl
;
86 const u8
*adjust_hs400_calib_table
;
87 bool needs_adjust_hs400
;
89 /* Tuning values: 1 for success, 0 for failure */
90 DECLARE_BITMAP(taps
, BITS_PER_LONG
);
91 /* Sampling data comparison: 1 for match, 0 for mismatch */
92 DECLARE_BITMAP(smpcmp
, BITS_PER_LONG
);
96 struct reset_control
*rstc
;
97 struct tmio_mmc_host
*host
;
100 #define host_to_priv(host) \
101 container_of((host)->pdata, struct renesas_sdhi, mmc_data)
103 int renesas_sdhi_probe(struct platform_device
*pdev
,
104 const struct tmio_mmc_dma_ops
*dma_ops
,
105 const struct renesas_sdhi_of_data
*of_data
,
106 const struct renesas_sdhi_quirks
*quirks
);
107 void renesas_sdhi_remove(struct platform_device
*pdev
);