xref: /OK3568_Linux_fs/kernel/drivers/mmc/host/sdhci-of-arasan.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Arasan Secure Digital Host Controller Interface.
4*4882a593Smuzhiyun  * Copyright (C) 2011 - 2012 Michal Simek <monstr@monstr.eu>
5*4882a593Smuzhiyun  * Copyright (c) 2012 Wind River Systems, Inc.
6*4882a593Smuzhiyun  * Copyright (C) 2013 Pengutronix e.K.
7*4882a593Smuzhiyun  * Copyright (C) 2013 Xilinx Inc.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * Based on sdhci-of-esdhc.c
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Copyright (c) 2007 Freescale Semiconductor, Inc.
12*4882a593Smuzhiyun  * Copyright (c) 2009 MontaVista Software, Inc.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * Authors: Xiaobo Xie <X.Xie@freescale.com>
15*4882a593Smuzhiyun  *	    Anton Vorontsov <avorontsov@ru.mvista.com>
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <linux/clk-provider.h>
19*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/of_device.h>
22*4882a593Smuzhiyun #include <linux/phy/phy.h>
23*4882a593Smuzhiyun #include <linux/regmap.h>
24*4882a593Smuzhiyun #include <linux/of.h>
25*4882a593Smuzhiyun #include <linux/firmware/xlnx-zynqmp.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #include "cqhci.h"
28*4882a593Smuzhiyun #include "sdhci-cqhci.h"
29*4882a593Smuzhiyun #include "sdhci-pltfm.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define SDHCI_ARASAN_VENDOR_REGISTER	0x78
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define SDHCI_ARASAN_ITAPDLY_REGISTER	0xF0F8
34*4882a593Smuzhiyun #define SDHCI_ARASAN_ITAPDLY_SEL_MASK	0xFF
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define SDHCI_ARASAN_OTAPDLY_REGISTER	0xF0FC
37*4882a593Smuzhiyun #define SDHCI_ARASAN_OTAPDLY_SEL_MASK	0x3F
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define SDHCI_ARASAN_CQE_BASE_ADDR	0x200
40*4882a593Smuzhiyun #define VENDOR_ENHANCED_STROBE		BIT(0)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define PHY_CLK_TOO_SLOW_HZ		400000
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define SDHCI_ITAPDLY_CHGWIN		0x200
45*4882a593Smuzhiyun #define SDHCI_ITAPDLY_ENABLE		0x100
46*4882a593Smuzhiyun #define SDHCI_OTAPDLY_ENABLE		0x40
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* Default settings for ZynqMP Clock Phases */
49*4882a593Smuzhiyun #define ZYNQMP_ICLK_PHASE {0, 63, 63, 0, 63,  0,   0, 183, 54,  0, 0}
50*4882a593Smuzhiyun #define ZYNQMP_OCLK_PHASE {0, 72, 60, 0, 60, 72, 135, 48, 72, 135, 0}
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define VERSAL_ICLK_PHASE {0, 132, 132, 0, 132, 0, 0, 162, 90, 0, 0}
53*4882a593Smuzhiyun #define VERSAL_OCLK_PHASE {0,  60, 48, 0, 48, 72, 90, 36, 60, 90, 0}
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /*
56*4882a593Smuzhiyun  * On some SoCs the syscon area has a feature where the upper 16-bits of
57*4882a593Smuzhiyun  * each 32-bit register act as a write mask for the lower 16-bits.  This allows
58*4882a593Smuzhiyun  * atomic updates of the register without locking.  This macro is used on SoCs
59*4882a593Smuzhiyun  * that have that feature.
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun #define HIWORD_UPDATE(val, mask, shift) \
62*4882a593Smuzhiyun 		((val) << (shift) | (mask) << ((shift) + 16))
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /**
65*4882a593Smuzhiyun  * struct sdhci_arasan_soc_ctl_field - Field used in sdhci_arasan_soc_ctl_map
66*4882a593Smuzhiyun  *
67*4882a593Smuzhiyun  * @reg:	Offset within the syscon of the register containing this field
68*4882a593Smuzhiyun  * @width:	Number of bits for this field
69*4882a593Smuzhiyun  * @shift:	Bit offset within @reg of this field (or -1 if not avail)
70*4882a593Smuzhiyun  */
71*4882a593Smuzhiyun struct sdhci_arasan_soc_ctl_field {
72*4882a593Smuzhiyun 	u32 reg;
73*4882a593Smuzhiyun 	u16 width;
74*4882a593Smuzhiyun 	s16 shift;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /**
78*4882a593Smuzhiyun  * struct sdhci_arasan_soc_ctl_map - Map in syscon to corecfg registers
79*4882a593Smuzhiyun  *
80*4882a593Smuzhiyun  * @baseclkfreq:	Where to find corecfg_baseclkfreq
81*4882a593Smuzhiyun  * @clockmultiplier:	Where to find corecfg_clockmultiplier
82*4882a593Smuzhiyun  * @support64b:		Where to find SUPPORT64B bit
83*4882a593Smuzhiyun  * @hiword_update:	If true, use HIWORD_UPDATE to access the syscon
84*4882a593Smuzhiyun  *
85*4882a593Smuzhiyun  * It's up to the licensee of the Arsan IP block to make these available
86*4882a593Smuzhiyun  * somewhere if needed.  Presumably these will be scattered somewhere that's
87*4882a593Smuzhiyun  * accessible via the syscon API.
88*4882a593Smuzhiyun  */
89*4882a593Smuzhiyun struct sdhci_arasan_soc_ctl_map {
90*4882a593Smuzhiyun 	struct sdhci_arasan_soc_ctl_field	baseclkfreq;
91*4882a593Smuzhiyun 	struct sdhci_arasan_soc_ctl_field	clockmultiplier;
92*4882a593Smuzhiyun 	struct sdhci_arasan_soc_ctl_field	support64b;
93*4882a593Smuzhiyun 	bool					hiword_update;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun  * struct sdhci_arasan_clk_ops - Clock Operations for Arasan SD controller
98*4882a593Smuzhiyun  *
99*4882a593Smuzhiyun  * @sdcardclk_ops:	The output clock related operations
100*4882a593Smuzhiyun  * @sampleclk_ops:	The sample clock related operations
101*4882a593Smuzhiyun  */
102*4882a593Smuzhiyun struct sdhci_arasan_clk_ops {
103*4882a593Smuzhiyun 	const struct clk_ops *sdcardclk_ops;
104*4882a593Smuzhiyun 	const struct clk_ops *sampleclk_ops;
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /**
108*4882a593Smuzhiyun  * struct sdhci_arasan_clk_data - Arasan Controller Clock Data.
109*4882a593Smuzhiyun  *
110*4882a593Smuzhiyun  * @sdcardclk_hw:	Struct for the clock we might provide to a PHY.
111*4882a593Smuzhiyun  * @sdcardclk:		Pointer to normal 'struct clock' for sdcardclk_hw.
112*4882a593Smuzhiyun  * @sampleclk_hw:	Struct for the clock we might provide to a PHY.
113*4882a593Smuzhiyun  * @sampleclk:		Pointer to normal 'struct clock' for sampleclk_hw.
114*4882a593Smuzhiyun  * @clk_phase_in:	Array of Input Clock Phase Delays for all speed modes
115*4882a593Smuzhiyun  * @clk_phase_out:	Array of Output Clock Phase Delays for all speed modes
116*4882a593Smuzhiyun  * @set_clk_delays:	Function pointer for setting Clock Delays
117*4882a593Smuzhiyun  * @clk_of_data:	Platform specific runtime clock data storage pointer
118*4882a593Smuzhiyun  */
119*4882a593Smuzhiyun struct sdhci_arasan_clk_data {
120*4882a593Smuzhiyun 	struct clk_hw	sdcardclk_hw;
121*4882a593Smuzhiyun 	struct clk      *sdcardclk;
122*4882a593Smuzhiyun 	struct clk_hw	sampleclk_hw;
123*4882a593Smuzhiyun 	struct clk      *sampleclk;
124*4882a593Smuzhiyun 	int		clk_phase_in[MMC_TIMING_MMC_HS400 + 1];
125*4882a593Smuzhiyun 	int		clk_phase_out[MMC_TIMING_MMC_HS400 + 1];
126*4882a593Smuzhiyun 	void		(*set_clk_delays)(struct sdhci_host *host);
127*4882a593Smuzhiyun 	void		*clk_of_data;
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /**
131*4882a593Smuzhiyun  * struct sdhci_arasan_data - Arasan Controller Data
132*4882a593Smuzhiyun  *
133*4882a593Smuzhiyun  * @host:		Pointer to the main SDHCI host structure.
134*4882a593Smuzhiyun  * @clk_ahb:		Pointer to the AHB clock
135*4882a593Smuzhiyun  * @phy:		Pointer to the generic phy
136*4882a593Smuzhiyun  * @is_phy_on:		True if the PHY is on; false if not.
137*4882a593Smuzhiyun  * @has_cqe:		True if controller has command queuing engine.
138*4882a593Smuzhiyun  * @clk_data:		Struct for the Arasan Controller Clock Data.
139*4882a593Smuzhiyun  * @clk_ops:		Struct for the Arasan Controller Clock Operations.
140*4882a593Smuzhiyun  * @soc_ctl_base:	Pointer to regmap for syscon for soc_ctl registers.
141*4882a593Smuzhiyun  * @soc_ctl_map:	Map to get offsets into soc_ctl registers.
142*4882a593Smuzhiyun  * @quirks:		Arasan deviations from spec.
143*4882a593Smuzhiyun  */
144*4882a593Smuzhiyun struct sdhci_arasan_data {
145*4882a593Smuzhiyun 	struct sdhci_host *host;
146*4882a593Smuzhiyun 	struct clk	*clk_ahb;
147*4882a593Smuzhiyun 	struct phy	*phy;
148*4882a593Smuzhiyun 	bool		is_phy_on;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	bool		has_cqe;
151*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data clk_data;
152*4882a593Smuzhiyun 	const struct sdhci_arasan_clk_ops *clk_ops;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	struct regmap	*soc_ctl_base;
155*4882a593Smuzhiyun 	const struct sdhci_arasan_soc_ctl_map *soc_ctl_map;
156*4882a593Smuzhiyun 	unsigned int	quirks;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* Controller does not have CD wired and will not function normally without */
159*4882a593Smuzhiyun #define SDHCI_ARASAN_QUIRK_FORCE_CDTEST	BIT(0)
160*4882a593Smuzhiyun /* Controller immediately reports SDHCI_CLOCK_INT_STABLE after enabling the
161*4882a593Smuzhiyun  * internal clock even when the clock isn't stable */
162*4882a593Smuzhiyun #define SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE BIT(1)
163*4882a593Smuzhiyun /*
164*4882a593Smuzhiyun  * Some of the Arasan variations might not have timing requirements
165*4882a593Smuzhiyun  * met at 25MHz for Default Speed mode, those controllers work at
166*4882a593Smuzhiyun  * 19MHz instead
167*4882a593Smuzhiyun  */
168*4882a593Smuzhiyun #define SDHCI_ARASAN_QUIRK_CLOCK_25_BROKEN BIT(2)
169*4882a593Smuzhiyun };
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun struct sdhci_arasan_of_data {
172*4882a593Smuzhiyun 	const struct sdhci_arasan_soc_ctl_map *soc_ctl_map;
173*4882a593Smuzhiyun 	const struct sdhci_pltfm_data *pdata;
174*4882a593Smuzhiyun 	const struct sdhci_arasan_clk_ops *clk_ops;
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun static const struct sdhci_arasan_soc_ctl_map rk3399_soc_ctl_map = {
178*4882a593Smuzhiyun 	.baseclkfreq = { .reg = 0xf000, .width = 8, .shift = 8 },
179*4882a593Smuzhiyun 	.clockmultiplier = { .reg = 0xf02c, .width = 8, .shift = 0},
180*4882a593Smuzhiyun 	.hiword_update = true,
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun static const struct sdhci_arasan_soc_ctl_map intel_lgm_emmc_soc_ctl_map = {
184*4882a593Smuzhiyun 	.baseclkfreq = { .reg = 0xa0, .width = 8, .shift = 2 },
185*4882a593Smuzhiyun 	.clockmultiplier = { .reg = 0, .width = -1, .shift = -1 },
186*4882a593Smuzhiyun 	.hiword_update = false,
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun static const struct sdhci_arasan_soc_ctl_map intel_lgm_sdxc_soc_ctl_map = {
190*4882a593Smuzhiyun 	.baseclkfreq = { .reg = 0x80, .width = 8, .shift = 2 },
191*4882a593Smuzhiyun 	.clockmultiplier = { .reg = 0, .width = -1, .shift = -1 },
192*4882a593Smuzhiyun 	.hiword_update = false,
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun static const struct sdhci_arasan_soc_ctl_map intel_keembay_soc_ctl_map = {
196*4882a593Smuzhiyun 	.baseclkfreq = { .reg = 0x0, .width = 8, .shift = 14 },
197*4882a593Smuzhiyun 	.clockmultiplier = { .reg = 0x4, .width = 8, .shift = 14 },
198*4882a593Smuzhiyun 	.support64b = { .reg = 0x4, .width = 1, .shift = 24 },
199*4882a593Smuzhiyun 	.hiword_update = false,
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /**
203*4882a593Smuzhiyun  * sdhci_arasan_syscon_write - Write to a field in soc_ctl registers
204*4882a593Smuzhiyun  *
205*4882a593Smuzhiyun  * @host:	The sdhci_host
206*4882a593Smuzhiyun  * @fld:	The field to write to
207*4882a593Smuzhiyun  * @val:	The value to write
208*4882a593Smuzhiyun  *
209*4882a593Smuzhiyun  * This function allows writing to fields in sdhci_arasan_soc_ctl_map.
210*4882a593Smuzhiyun  * Note that if a field is specified as not available (shift < 0) then
211*4882a593Smuzhiyun  * this function will silently return an error code.  It will be noisy
212*4882a593Smuzhiyun  * and print errors for any other (unexpected) errors.
213*4882a593Smuzhiyun  *
214*4882a593Smuzhiyun  * Return: 0 on success and error value on error
215*4882a593Smuzhiyun  */
sdhci_arasan_syscon_write(struct sdhci_host * host,const struct sdhci_arasan_soc_ctl_field * fld,u32 val)216*4882a593Smuzhiyun static int sdhci_arasan_syscon_write(struct sdhci_host *host,
217*4882a593Smuzhiyun 				   const struct sdhci_arasan_soc_ctl_field *fld,
218*4882a593Smuzhiyun 				   u32 val)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
221*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
222*4882a593Smuzhiyun 	struct regmap *soc_ctl_base = sdhci_arasan->soc_ctl_base;
223*4882a593Smuzhiyun 	u32 reg = fld->reg;
224*4882a593Smuzhiyun 	u16 width = fld->width;
225*4882a593Smuzhiyun 	s16 shift = fld->shift;
226*4882a593Smuzhiyun 	int ret;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	/*
229*4882a593Smuzhiyun 	 * Silently return errors for shift < 0 so caller doesn't have
230*4882a593Smuzhiyun 	 * to check for fields which are optional.  For fields that
231*4882a593Smuzhiyun 	 * are required then caller needs to do something special
232*4882a593Smuzhiyun 	 * anyway.
233*4882a593Smuzhiyun 	 */
234*4882a593Smuzhiyun 	if (shift < 0)
235*4882a593Smuzhiyun 		return -EINVAL;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	if (sdhci_arasan->soc_ctl_map->hiword_update)
238*4882a593Smuzhiyun 		ret = regmap_write(soc_ctl_base, reg,
239*4882a593Smuzhiyun 				   HIWORD_UPDATE(val, GENMASK(width, 0),
240*4882a593Smuzhiyun 						 shift));
241*4882a593Smuzhiyun 	else
242*4882a593Smuzhiyun 		ret = regmap_update_bits(soc_ctl_base, reg,
243*4882a593Smuzhiyun 					 GENMASK(shift + width, shift),
244*4882a593Smuzhiyun 					 val << shift);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	/* Yell about (unexpected) regmap errors */
247*4882a593Smuzhiyun 	if (ret)
248*4882a593Smuzhiyun 		pr_warn("%s: Regmap write fail: %d\n",
249*4882a593Smuzhiyun 			 mmc_hostname(host->mmc), ret);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	return ret;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
sdhci_arasan_set_clock(struct sdhci_host * host,unsigned int clock)254*4882a593Smuzhiyun static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
257*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
258*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data = &sdhci_arasan->clk_data;
259*4882a593Smuzhiyun 	bool ctrl_phy = false;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	if (!IS_ERR(sdhci_arasan->phy)) {
262*4882a593Smuzhiyun 		if (!sdhci_arasan->is_phy_on && clock <= PHY_CLK_TOO_SLOW_HZ) {
263*4882a593Smuzhiyun 			/*
264*4882a593Smuzhiyun 			 * If PHY off, set clock to max speed and power PHY on.
265*4882a593Smuzhiyun 			 *
266*4882a593Smuzhiyun 			 * Although PHY docs apparently suggest power cycling
267*4882a593Smuzhiyun 			 * when changing the clock the PHY doesn't like to be
268*4882a593Smuzhiyun 			 * powered on while at low speeds like those used in ID
269*4882a593Smuzhiyun 			 * mode.  Even worse is powering the PHY on while the
270*4882a593Smuzhiyun 			 * clock is off.
271*4882a593Smuzhiyun 			 *
272*4882a593Smuzhiyun 			 * To workaround the PHY limitations, the best we can
273*4882a593Smuzhiyun 			 * do is to power it on at a faster speed and then slam
274*4882a593Smuzhiyun 			 * through low speeds without power cycling.
275*4882a593Smuzhiyun 			 */
276*4882a593Smuzhiyun 			sdhci_set_clock(host, host->max_clk);
277*4882a593Smuzhiyun 			if (phy_power_on(sdhci_arasan->phy)) {
278*4882a593Smuzhiyun 				pr_err("%s: Cannot power on phy.\n",
279*4882a593Smuzhiyun 				       mmc_hostname(host->mmc));
280*4882a593Smuzhiyun 				return;
281*4882a593Smuzhiyun 			}
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 			sdhci_arasan->is_phy_on = true;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 			/*
286*4882a593Smuzhiyun 			 * We'll now fall through to the below case with
287*4882a593Smuzhiyun 			 * ctrl_phy = false (so we won't turn off/on).  The
288*4882a593Smuzhiyun 			 * sdhci_set_clock() will set the real clock.
289*4882a593Smuzhiyun 			 */
290*4882a593Smuzhiyun 		} else if (clock > PHY_CLK_TOO_SLOW_HZ) {
291*4882a593Smuzhiyun 			/*
292*4882a593Smuzhiyun 			 * At higher clock speeds the PHY is fine being power
293*4882a593Smuzhiyun 			 * cycled and docs say you _should_ power cycle when
294*4882a593Smuzhiyun 			 * changing clock speeds.
295*4882a593Smuzhiyun 			 */
296*4882a593Smuzhiyun 			ctrl_phy = true;
297*4882a593Smuzhiyun 		}
298*4882a593Smuzhiyun 	}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	if (ctrl_phy && sdhci_arasan->is_phy_on) {
301*4882a593Smuzhiyun 		phy_power_off(sdhci_arasan->phy);
302*4882a593Smuzhiyun 		sdhci_arasan->is_phy_on = false;
303*4882a593Smuzhiyun 	}
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_CLOCK_25_BROKEN) {
306*4882a593Smuzhiyun 		/*
307*4882a593Smuzhiyun 		 * Some of the Arasan variations might not have timing
308*4882a593Smuzhiyun 		 * requirements met at 25MHz for Default Speed mode,
309*4882a593Smuzhiyun 		 * those controllers work at 19MHz instead.
310*4882a593Smuzhiyun 		 */
311*4882a593Smuzhiyun 		if (clock == DEFAULT_SPEED_MAX_DTR)
312*4882a593Smuzhiyun 			clock = (DEFAULT_SPEED_MAX_DTR * 19) / 25;
313*4882a593Smuzhiyun 	}
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	/* Set the Input and Output Clock Phase Delays */
316*4882a593Smuzhiyun 	if (clk_data->set_clk_delays)
317*4882a593Smuzhiyun 		clk_data->set_clk_delays(host);
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	sdhci_set_clock(host, clock);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE)
322*4882a593Smuzhiyun 		/*
323*4882a593Smuzhiyun 		 * Some controllers immediately report SDHCI_CLOCK_INT_STABLE
324*4882a593Smuzhiyun 		 * after enabling the clock even though the clock is not
325*4882a593Smuzhiyun 		 * stable. Trying to use a clock without waiting here results
326*4882a593Smuzhiyun 		 * in EILSEQ while detecting some older/slower cards. The
327*4882a593Smuzhiyun 		 * chosen delay is the maximum delay from sdhci_set_clock.
328*4882a593Smuzhiyun 		 */
329*4882a593Smuzhiyun 		msleep(20);
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	if (ctrl_phy) {
332*4882a593Smuzhiyun 		if (phy_power_on(sdhci_arasan->phy)) {
333*4882a593Smuzhiyun 			pr_err("%s: Cannot power on phy.\n",
334*4882a593Smuzhiyun 			       mmc_hostname(host->mmc));
335*4882a593Smuzhiyun 			return;
336*4882a593Smuzhiyun 		}
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 		sdhci_arasan->is_phy_on = true;
339*4882a593Smuzhiyun 	}
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
sdhci_arasan_hs400_enhanced_strobe(struct mmc_host * mmc,struct mmc_ios * ios)342*4882a593Smuzhiyun static void sdhci_arasan_hs400_enhanced_strobe(struct mmc_host *mmc,
343*4882a593Smuzhiyun 					struct mmc_ios *ios)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun 	u32 vendor;
346*4882a593Smuzhiyun 	struct sdhci_host *host = mmc_priv(mmc);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	vendor = sdhci_readl(host, SDHCI_ARASAN_VENDOR_REGISTER);
349*4882a593Smuzhiyun 	if (ios->enhanced_strobe)
350*4882a593Smuzhiyun 		vendor |= VENDOR_ENHANCED_STROBE;
351*4882a593Smuzhiyun 	else
352*4882a593Smuzhiyun 		vendor &= ~VENDOR_ENHANCED_STROBE;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	sdhci_writel(host, vendor, SDHCI_ARASAN_VENDOR_REGISTER);
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun 
sdhci_arasan_reset(struct sdhci_host * host,u8 mask)357*4882a593Smuzhiyun static void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun 	u8 ctrl;
360*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
361*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	sdhci_and_cqhci_reset(host, mask);
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_FORCE_CDTEST) {
366*4882a593Smuzhiyun 		ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
367*4882a593Smuzhiyun 		ctrl |= SDHCI_CTRL_CDTEST_INS | SDHCI_CTRL_CDTEST_EN;
368*4882a593Smuzhiyun 		sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
369*4882a593Smuzhiyun 	}
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun 
sdhci_arasan_voltage_switch(struct mmc_host * mmc,struct mmc_ios * ios)372*4882a593Smuzhiyun static int sdhci_arasan_voltage_switch(struct mmc_host *mmc,
373*4882a593Smuzhiyun 				       struct mmc_ios *ios)
374*4882a593Smuzhiyun {
375*4882a593Smuzhiyun 	switch (ios->signal_voltage) {
376*4882a593Smuzhiyun 	case MMC_SIGNAL_VOLTAGE_180:
377*4882a593Smuzhiyun 		/*
378*4882a593Smuzhiyun 		 * Plese don't switch to 1V8 as arasan,5.1 doesn't
379*4882a593Smuzhiyun 		 * actually refer to this setting to indicate the
380*4882a593Smuzhiyun 		 * signal voltage and the state machine will be broken
381*4882a593Smuzhiyun 		 * actually if we force to enable 1V8. That's something
382*4882a593Smuzhiyun 		 * like broken quirk but we could work around here.
383*4882a593Smuzhiyun 		 */
384*4882a593Smuzhiyun 		return 0;
385*4882a593Smuzhiyun 	case MMC_SIGNAL_VOLTAGE_330:
386*4882a593Smuzhiyun 	case MMC_SIGNAL_VOLTAGE_120:
387*4882a593Smuzhiyun 		/* We don't support 3V3 and 1V2 */
388*4882a593Smuzhiyun 		break;
389*4882a593Smuzhiyun 	}
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	return -EINVAL;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun static const struct sdhci_ops sdhci_arasan_ops = {
395*4882a593Smuzhiyun 	.set_clock = sdhci_arasan_set_clock,
396*4882a593Smuzhiyun 	.get_max_clock = sdhci_pltfm_clk_get_max_clock,
397*4882a593Smuzhiyun 	.get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
398*4882a593Smuzhiyun 	.set_bus_width = sdhci_set_bus_width,
399*4882a593Smuzhiyun 	.reset = sdhci_arasan_reset,
400*4882a593Smuzhiyun 	.set_uhs_signaling = sdhci_set_uhs_signaling,
401*4882a593Smuzhiyun 	.set_power = sdhci_set_power_and_bus_voltage,
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
sdhci_arasan_cqhci_irq(struct sdhci_host * host,u32 intmask)404*4882a593Smuzhiyun static u32 sdhci_arasan_cqhci_irq(struct sdhci_host *host, u32 intmask)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	int cmd_error = 0;
407*4882a593Smuzhiyun 	int data_error = 0;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	if (!sdhci_cqe_irq(host, intmask, &cmd_error, &data_error))
410*4882a593Smuzhiyun 		return intmask;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	cqhci_irq(host->mmc, intmask, cmd_error, data_error);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	return 0;
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun 
sdhci_arasan_dumpregs(struct mmc_host * mmc)417*4882a593Smuzhiyun static void sdhci_arasan_dumpregs(struct mmc_host *mmc)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun 	sdhci_dumpregs(mmc_priv(mmc));
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun 
sdhci_arasan_cqe_enable(struct mmc_host * mmc)422*4882a593Smuzhiyun static void sdhci_arasan_cqe_enable(struct mmc_host *mmc)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun 	struct sdhci_host *host = mmc_priv(mmc);
425*4882a593Smuzhiyun 	u32 reg;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	reg = sdhci_readl(host, SDHCI_PRESENT_STATE);
428*4882a593Smuzhiyun 	while (reg & SDHCI_DATA_AVAILABLE) {
429*4882a593Smuzhiyun 		sdhci_readl(host, SDHCI_BUFFER);
430*4882a593Smuzhiyun 		reg = sdhci_readl(host, SDHCI_PRESENT_STATE);
431*4882a593Smuzhiyun 	}
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	sdhci_cqe_enable(mmc);
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun static const struct cqhci_host_ops sdhci_arasan_cqhci_ops = {
437*4882a593Smuzhiyun 	.enable         = sdhci_arasan_cqe_enable,
438*4882a593Smuzhiyun 	.disable        = sdhci_cqe_disable,
439*4882a593Smuzhiyun 	.dumpregs       = sdhci_arasan_dumpregs,
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun static const struct sdhci_ops sdhci_arasan_cqe_ops = {
443*4882a593Smuzhiyun 	.set_clock = sdhci_arasan_set_clock,
444*4882a593Smuzhiyun 	.get_max_clock = sdhci_pltfm_clk_get_max_clock,
445*4882a593Smuzhiyun 	.get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
446*4882a593Smuzhiyun 	.set_bus_width = sdhci_set_bus_width,
447*4882a593Smuzhiyun 	.reset = sdhci_arasan_reset,
448*4882a593Smuzhiyun 	.set_uhs_signaling = sdhci_set_uhs_signaling,
449*4882a593Smuzhiyun 	.set_power = sdhci_set_power_and_bus_voltage,
450*4882a593Smuzhiyun 	.irq = sdhci_arasan_cqhci_irq,
451*4882a593Smuzhiyun };
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_arasan_cqe_pdata = {
454*4882a593Smuzhiyun 	.ops = &sdhci_arasan_cqe_ops,
455*4882a593Smuzhiyun 	.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
456*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
457*4882a593Smuzhiyun 			SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
458*4882a593Smuzhiyun };
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
461*4882a593Smuzhiyun /**
462*4882a593Smuzhiyun  * sdhci_arasan_suspend - Suspend method for the driver
463*4882a593Smuzhiyun  * @dev:	Address of the device structure
464*4882a593Smuzhiyun  *
465*4882a593Smuzhiyun  * Put the device in a low power state.
466*4882a593Smuzhiyun  *
467*4882a593Smuzhiyun  * Return: 0 on success and error value on error
468*4882a593Smuzhiyun  */
sdhci_arasan_suspend(struct device * dev)469*4882a593Smuzhiyun static int sdhci_arasan_suspend(struct device *dev)
470*4882a593Smuzhiyun {
471*4882a593Smuzhiyun 	struct sdhci_host *host = dev_get_drvdata(dev);
472*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
473*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
474*4882a593Smuzhiyun 	int ret;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	if (host->tuning_mode != SDHCI_TUNING_MODE_3)
477*4882a593Smuzhiyun 		mmc_retune_needed(host->mmc);
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	if (sdhci_arasan->has_cqe) {
480*4882a593Smuzhiyun 		ret = cqhci_suspend(host->mmc);
481*4882a593Smuzhiyun 		if (ret)
482*4882a593Smuzhiyun 			return ret;
483*4882a593Smuzhiyun 	}
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	ret = sdhci_suspend_host(host);
486*4882a593Smuzhiyun 	if (ret)
487*4882a593Smuzhiyun 		return ret;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 	if (!IS_ERR(sdhci_arasan->phy) && sdhci_arasan->is_phy_on) {
490*4882a593Smuzhiyun 		ret = phy_power_off(sdhci_arasan->phy);
491*4882a593Smuzhiyun 		if (ret) {
492*4882a593Smuzhiyun 			dev_err(dev, "Cannot power off phy.\n");
493*4882a593Smuzhiyun 			if (sdhci_resume_host(host))
494*4882a593Smuzhiyun 				dev_err(dev, "Cannot resume host.\n");
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 			return ret;
497*4882a593Smuzhiyun 		}
498*4882a593Smuzhiyun 		sdhci_arasan->is_phy_on = false;
499*4882a593Smuzhiyun 	}
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun 	clk_disable(pltfm_host->clk);
502*4882a593Smuzhiyun 	clk_disable(sdhci_arasan->clk_ahb);
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun 	return 0;
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /**
508*4882a593Smuzhiyun  * sdhci_arasan_resume - Resume method for the driver
509*4882a593Smuzhiyun  * @dev:	Address of the device structure
510*4882a593Smuzhiyun  *
511*4882a593Smuzhiyun  * Resume operation after suspend
512*4882a593Smuzhiyun  *
513*4882a593Smuzhiyun  * Return: 0 on success and error value on error
514*4882a593Smuzhiyun  */
sdhci_arasan_resume(struct device * dev)515*4882a593Smuzhiyun static int sdhci_arasan_resume(struct device *dev)
516*4882a593Smuzhiyun {
517*4882a593Smuzhiyun 	struct sdhci_host *host = dev_get_drvdata(dev);
518*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
519*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
520*4882a593Smuzhiyun 	int ret;
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	ret = clk_enable(sdhci_arasan->clk_ahb);
523*4882a593Smuzhiyun 	if (ret) {
524*4882a593Smuzhiyun 		dev_err(dev, "Cannot enable AHB clock.\n");
525*4882a593Smuzhiyun 		return ret;
526*4882a593Smuzhiyun 	}
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun 	ret = clk_enable(pltfm_host->clk);
529*4882a593Smuzhiyun 	if (ret) {
530*4882a593Smuzhiyun 		dev_err(dev, "Cannot enable SD clock.\n");
531*4882a593Smuzhiyun 		return ret;
532*4882a593Smuzhiyun 	}
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	if (!IS_ERR(sdhci_arasan->phy) && host->mmc->actual_clock) {
535*4882a593Smuzhiyun 		ret = phy_power_on(sdhci_arasan->phy);
536*4882a593Smuzhiyun 		if (ret) {
537*4882a593Smuzhiyun 			dev_err(dev, "Cannot power on phy.\n");
538*4882a593Smuzhiyun 			return ret;
539*4882a593Smuzhiyun 		}
540*4882a593Smuzhiyun 		sdhci_arasan->is_phy_on = true;
541*4882a593Smuzhiyun 	}
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	ret = sdhci_resume_host(host);
544*4882a593Smuzhiyun 	if (ret) {
545*4882a593Smuzhiyun 		dev_err(dev, "Cannot resume host.\n");
546*4882a593Smuzhiyun 		return ret;
547*4882a593Smuzhiyun 	}
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	if (sdhci_arasan->has_cqe)
550*4882a593Smuzhiyun 		return cqhci_resume(host->mmc);
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun 	return 0;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun #endif /* ! CONFIG_PM_SLEEP */
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(sdhci_arasan_dev_pm_ops, sdhci_arasan_suspend,
557*4882a593Smuzhiyun 			 sdhci_arasan_resume);
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun /**
560*4882a593Smuzhiyun  * sdhci_arasan_sdcardclk_recalc_rate - Return the card clock rate
561*4882a593Smuzhiyun  *
562*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
563*4882a593Smuzhiyun  * @parent_rate:		The parent rate (should be rate of clk_xin).
564*4882a593Smuzhiyun  *
565*4882a593Smuzhiyun  * Return the current actual rate of the SD card clock.  This can be used
566*4882a593Smuzhiyun  * to communicate with out PHY.
567*4882a593Smuzhiyun  *
568*4882a593Smuzhiyun  * Return: The card clock rate.
569*4882a593Smuzhiyun  */
sdhci_arasan_sdcardclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)570*4882a593Smuzhiyun static unsigned long sdhci_arasan_sdcardclk_recalc_rate(struct clk_hw *hw,
571*4882a593Smuzhiyun 						      unsigned long parent_rate)
572*4882a593Smuzhiyun {
573*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
574*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sdcardclk_hw);
575*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
576*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
577*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	return host->mmc->actual_clock;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun static const struct clk_ops arasan_sdcardclk_ops = {
583*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sdcardclk_recalc_rate,
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun /**
587*4882a593Smuzhiyun  * sdhci_arasan_sampleclk_recalc_rate - Return the sampling clock rate
588*4882a593Smuzhiyun  *
589*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
590*4882a593Smuzhiyun  * @parent_rate:		The parent rate (should be rate of clk_xin).
591*4882a593Smuzhiyun  *
592*4882a593Smuzhiyun  * Return the current actual rate of the sampling clock.  This can be used
593*4882a593Smuzhiyun  * to communicate with out PHY.
594*4882a593Smuzhiyun  *
595*4882a593Smuzhiyun  * Return: The sample clock rate.
596*4882a593Smuzhiyun  */
sdhci_arasan_sampleclk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)597*4882a593Smuzhiyun static unsigned long sdhci_arasan_sampleclk_recalc_rate(struct clk_hw *hw,
598*4882a593Smuzhiyun 						      unsigned long parent_rate)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
601*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sampleclk_hw);
602*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
603*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
604*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun 	return host->mmc->actual_clock;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun static const struct clk_ops arasan_sampleclk_ops = {
610*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sampleclk_recalc_rate,
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun /**
614*4882a593Smuzhiyun  * sdhci_zynqmp_sdcardclk_set_phase - Set the SD Output Clock Tap Delays
615*4882a593Smuzhiyun  *
616*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
617*4882a593Smuzhiyun  * @degrees:		The clock phase shift between 0 - 359.
618*4882a593Smuzhiyun  *
619*4882a593Smuzhiyun  * Set the SD Output Clock Tap Delays for Output path
620*4882a593Smuzhiyun  *
621*4882a593Smuzhiyun  * Return: 0 on success and error value on error
622*4882a593Smuzhiyun  */
sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw * hw,int degrees)623*4882a593Smuzhiyun static int sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
624*4882a593Smuzhiyun {
625*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
626*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sdcardclk_hw);
627*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
628*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
629*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
630*4882a593Smuzhiyun 	const char *clk_name = clk_hw_get_name(hw);
631*4882a593Smuzhiyun 	u32 node_id = !strcmp(clk_name, "clk_out_sd0") ? NODE_SD_0 : NODE_SD_1;
632*4882a593Smuzhiyun 	u8 tap_delay, tap_max = 0;
633*4882a593Smuzhiyun 	int ret;
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun 	/* This is applicable for SDHCI_SPEC_300 and above */
636*4882a593Smuzhiyun 	if (host->version < SDHCI_SPEC_300)
637*4882a593Smuzhiyun 		return 0;
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	switch (host->timing) {
640*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS:
641*4882a593Smuzhiyun 	case MMC_TIMING_SD_HS:
642*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR25:
643*4882a593Smuzhiyun 	case MMC_TIMING_UHS_DDR50:
644*4882a593Smuzhiyun 	case MMC_TIMING_MMC_DDR52:
645*4882a593Smuzhiyun 		/* For 50MHz clock, 30 Taps are available */
646*4882a593Smuzhiyun 		tap_max = 30;
647*4882a593Smuzhiyun 		break;
648*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR50:
649*4882a593Smuzhiyun 		/* For 100MHz clock, 15 Taps are available */
650*4882a593Smuzhiyun 		tap_max = 15;
651*4882a593Smuzhiyun 		break;
652*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR104:
653*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS200:
654*4882a593Smuzhiyun 		/* For 200MHz clock, 8 Taps are available */
655*4882a593Smuzhiyun 		tap_max = 8;
656*4882a593Smuzhiyun 	default:
657*4882a593Smuzhiyun 		break;
658*4882a593Smuzhiyun 	}
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	tap_delay = (degrees * tap_max) / 360;
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 	/* Set the Clock Phase */
663*4882a593Smuzhiyun 	ret = zynqmp_pm_set_sd_tapdelay(node_id, PM_TAPDELAY_OUTPUT, tap_delay);
664*4882a593Smuzhiyun 	if (ret)
665*4882a593Smuzhiyun 		pr_err("Error setting Output Tap Delay\n");
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun 	/* Release DLL Reset */
668*4882a593Smuzhiyun 	zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_RELEASE);
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	return ret;
671*4882a593Smuzhiyun }
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun static const struct clk_ops zynqmp_sdcardclk_ops = {
674*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sdcardclk_recalc_rate,
675*4882a593Smuzhiyun 	.set_phase = sdhci_zynqmp_sdcardclk_set_phase,
676*4882a593Smuzhiyun };
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun /**
679*4882a593Smuzhiyun  * sdhci_zynqmp_sampleclk_set_phase - Set the SD Input Clock Tap Delays
680*4882a593Smuzhiyun  *
681*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
682*4882a593Smuzhiyun  * @degrees:		The clock phase shift between 0 - 359.
683*4882a593Smuzhiyun  *
684*4882a593Smuzhiyun  * Set the SD Input Clock Tap Delays for Input path
685*4882a593Smuzhiyun  *
686*4882a593Smuzhiyun  * Return: 0 on success and error value on error
687*4882a593Smuzhiyun  */
sdhci_zynqmp_sampleclk_set_phase(struct clk_hw * hw,int degrees)688*4882a593Smuzhiyun static int sdhci_zynqmp_sampleclk_set_phase(struct clk_hw *hw, int degrees)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
691*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sampleclk_hw);
692*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
693*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
694*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
695*4882a593Smuzhiyun 	const char *clk_name = clk_hw_get_name(hw);
696*4882a593Smuzhiyun 	u32 node_id = !strcmp(clk_name, "clk_in_sd0") ? NODE_SD_0 : NODE_SD_1;
697*4882a593Smuzhiyun 	u8 tap_delay, tap_max = 0;
698*4882a593Smuzhiyun 	int ret;
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	/* This is applicable for SDHCI_SPEC_300 and above */
701*4882a593Smuzhiyun 	if (host->version < SDHCI_SPEC_300)
702*4882a593Smuzhiyun 		return 0;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	/* Assert DLL Reset */
705*4882a593Smuzhiyun 	zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_ASSERT);
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	switch (host->timing) {
708*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS:
709*4882a593Smuzhiyun 	case MMC_TIMING_SD_HS:
710*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR25:
711*4882a593Smuzhiyun 	case MMC_TIMING_UHS_DDR50:
712*4882a593Smuzhiyun 	case MMC_TIMING_MMC_DDR52:
713*4882a593Smuzhiyun 		/* For 50MHz clock, 120 Taps are available */
714*4882a593Smuzhiyun 		tap_max = 120;
715*4882a593Smuzhiyun 		break;
716*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR50:
717*4882a593Smuzhiyun 		/* For 100MHz clock, 60 Taps are available */
718*4882a593Smuzhiyun 		tap_max = 60;
719*4882a593Smuzhiyun 		break;
720*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR104:
721*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS200:
722*4882a593Smuzhiyun 		/* For 200MHz clock, 30 Taps are available */
723*4882a593Smuzhiyun 		tap_max = 30;
724*4882a593Smuzhiyun 	default:
725*4882a593Smuzhiyun 		break;
726*4882a593Smuzhiyun 	}
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	tap_delay = (degrees * tap_max) / 360;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun 	/* Set the Clock Phase */
731*4882a593Smuzhiyun 	ret = zynqmp_pm_set_sd_tapdelay(node_id, PM_TAPDELAY_INPUT, tap_delay);
732*4882a593Smuzhiyun 	if (ret)
733*4882a593Smuzhiyun 		pr_err("Error setting Input Tap Delay\n");
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	return ret;
736*4882a593Smuzhiyun }
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun static const struct clk_ops zynqmp_sampleclk_ops = {
739*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sampleclk_recalc_rate,
740*4882a593Smuzhiyun 	.set_phase = sdhci_zynqmp_sampleclk_set_phase,
741*4882a593Smuzhiyun };
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun /**
744*4882a593Smuzhiyun  * sdhci_versal_sdcardclk_set_phase - Set the SD Output Clock Tap Delays
745*4882a593Smuzhiyun  *
746*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
747*4882a593Smuzhiyun  * @degrees:		The clock phase shift between 0 - 359.
748*4882a593Smuzhiyun  *
749*4882a593Smuzhiyun  * Set the SD Output Clock Tap Delays for Output path
750*4882a593Smuzhiyun  *
751*4882a593Smuzhiyun  * Return: 0 on success and error value on error
752*4882a593Smuzhiyun  */
sdhci_versal_sdcardclk_set_phase(struct clk_hw * hw,int degrees)753*4882a593Smuzhiyun static int sdhci_versal_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
756*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sdcardclk_hw);
757*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
758*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
759*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
760*4882a593Smuzhiyun 	u8 tap_delay, tap_max = 0;
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun 	/* This is applicable for SDHCI_SPEC_300 and above */
763*4882a593Smuzhiyun 	if (host->version < SDHCI_SPEC_300)
764*4882a593Smuzhiyun 		return 0;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 	switch (host->timing) {
767*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS:
768*4882a593Smuzhiyun 	case MMC_TIMING_SD_HS:
769*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR25:
770*4882a593Smuzhiyun 	case MMC_TIMING_UHS_DDR50:
771*4882a593Smuzhiyun 	case MMC_TIMING_MMC_DDR52:
772*4882a593Smuzhiyun 		/* For 50MHz clock, 30 Taps are available */
773*4882a593Smuzhiyun 		tap_max = 30;
774*4882a593Smuzhiyun 		break;
775*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR50:
776*4882a593Smuzhiyun 		/* For 100MHz clock, 15 Taps are available */
777*4882a593Smuzhiyun 		tap_max = 15;
778*4882a593Smuzhiyun 		break;
779*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR104:
780*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS200:
781*4882a593Smuzhiyun 		/* For 200MHz clock, 8 Taps are available */
782*4882a593Smuzhiyun 		tap_max = 8;
783*4882a593Smuzhiyun 	default:
784*4882a593Smuzhiyun 		break;
785*4882a593Smuzhiyun 	}
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	tap_delay = (degrees * tap_max) / 360;
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun 	/* Set the Clock Phase */
790*4882a593Smuzhiyun 	if (tap_delay) {
791*4882a593Smuzhiyun 		u32 regval;
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 		regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
794*4882a593Smuzhiyun 		regval |= SDHCI_OTAPDLY_ENABLE;
795*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
796*4882a593Smuzhiyun 		regval &= ~SDHCI_ARASAN_OTAPDLY_SEL_MASK;
797*4882a593Smuzhiyun 		regval |= tap_delay;
798*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
799*4882a593Smuzhiyun 	}
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun 	return 0;
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun static const struct clk_ops versal_sdcardclk_ops = {
805*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sdcardclk_recalc_rate,
806*4882a593Smuzhiyun 	.set_phase = sdhci_versal_sdcardclk_set_phase,
807*4882a593Smuzhiyun };
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun /**
810*4882a593Smuzhiyun  * sdhci_versal_sampleclk_set_phase - Set the SD Input Clock Tap Delays
811*4882a593Smuzhiyun  *
812*4882a593Smuzhiyun  * @hw:			Pointer to the hardware clock structure.
813*4882a593Smuzhiyun  * @degrees:		The clock phase shift between 0 - 359.
814*4882a593Smuzhiyun  *
815*4882a593Smuzhiyun  * Set the SD Input Clock Tap Delays for Input path
816*4882a593Smuzhiyun  *
817*4882a593Smuzhiyun  * Return: 0 on success and error value on error
818*4882a593Smuzhiyun  */
sdhci_versal_sampleclk_set_phase(struct clk_hw * hw,int degrees)819*4882a593Smuzhiyun static int sdhci_versal_sampleclk_set_phase(struct clk_hw *hw, int degrees)
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data =
822*4882a593Smuzhiyun 		container_of(hw, struct sdhci_arasan_clk_data, sampleclk_hw);
823*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan =
824*4882a593Smuzhiyun 		container_of(clk_data, struct sdhci_arasan_data, clk_data);
825*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
826*4882a593Smuzhiyun 	u8 tap_delay, tap_max = 0;
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun 	/* This is applicable for SDHCI_SPEC_300 and above */
829*4882a593Smuzhiyun 	if (host->version < SDHCI_SPEC_300)
830*4882a593Smuzhiyun 		return 0;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	switch (host->timing) {
833*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS:
834*4882a593Smuzhiyun 	case MMC_TIMING_SD_HS:
835*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR25:
836*4882a593Smuzhiyun 	case MMC_TIMING_UHS_DDR50:
837*4882a593Smuzhiyun 	case MMC_TIMING_MMC_DDR52:
838*4882a593Smuzhiyun 		/* For 50MHz clock, 120 Taps are available */
839*4882a593Smuzhiyun 		tap_max = 120;
840*4882a593Smuzhiyun 		break;
841*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR50:
842*4882a593Smuzhiyun 		/* For 100MHz clock, 60 Taps are available */
843*4882a593Smuzhiyun 		tap_max = 60;
844*4882a593Smuzhiyun 		break;
845*4882a593Smuzhiyun 	case MMC_TIMING_UHS_SDR104:
846*4882a593Smuzhiyun 	case MMC_TIMING_MMC_HS200:
847*4882a593Smuzhiyun 		/* For 200MHz clock, 30 Taps are available */
848*4882a593Smuzhiyun 		tap_max = 30;
849*4882a593Smuzhiyun 	default:
850*4882a593Smuzhiyun 		break;
851*4882a593Smuzhiyun 	}
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun 	tap_delay = (degrees * tap_max) / 360;
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun 	/* Set the Clock Phase */
856*4882a593Smuzhiyun 	if (tap_delay) {
857*4882a593Smuzhiyun 		u32 regval;
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 		regval = sdhci_readl(host, SDHCI_ARASAN_ITAPDLY_REGISTER);
860*4882a593Smuzhiyun 		regval |= SDHCI_ITAPDLY_CHGWIN;
861*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
862*4882a593Smuzhiyun 		regval |= SDHCI_ITAPDLY_ENABLE;
863*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
864*4882a593Smuzhiyun 		regval &= ~SDHCI_ARASAN_ITAPDLY_SEL_MASK;
865*4882a593Smuzhiyun 		regval |= tap_delay;
866*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
867*4882a593Smuzhiyun 		regval &= ~SDHCI_ITAPDLY_CHGWIN;
868*4882a593Smuzhiyun 		sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
869*4882a593Smuzhiyun 	}
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	return 0;
872*4882a593Smuzhiyun }
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun static const struct clk_ops versal_sampleclk_ops = {
875*4882a593Smuzhiyun 	.recalc_rate = sdhci_arasan_sampleclk_recalc_rate,
876*4882a593Smuzhiyun 	.set_phase = sdhci_versal_sampleclk_set_phase,
877*4882a593Smuzhiyun };
878*4882a593Smuzhiyun 
arasan_zynqmp_dll_reset(struct sdhci_host * host,u32 deviceid)879*4882a593Smuzhiyun static void arasan_zynqmp_dll_reset(struct sdhci_host *host, u32 deviceid)
880*4882a593Smuzhiyun {
881*4882a593Smuzhiyun 	u16 clk;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun 	clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
884*4882a593Smuzhiyun 	clk &= ~(SDHCI_CLOCK_CARD_EN | SDHCI_CLOCK_INT_EN);
885*4882a593Smuzhiyun 	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun 	/* Issue DLL Reset */
888*4882a593Smuzhiyun 	zynqmp_pm_sd_dll_reset(deviceid, PM_DLL_RESET_PULSE);
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	sdhci_enable_clk(host, clk);
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun 
arasan_zynqmp_execute_tuning(struct mmc_host * mmc,u32 opcode)895*4882a593Smuzhiyun static int arasan_zynqmp_execute_tuning(struct mmc_host *mmc, u32 opcode)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun 	struct sdhci_host *host = mmc_priv(mmc);
898*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
899*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
900*4882a593Smuzhiyun 	struct clk_hw *hw = &sdhci_arasan->clk_data.sdcardclk_hw;
901*4882a593Smuzhiyun 	const char *clk_name = clk_hw_get_name(hw);
902*4882a593Smuzhiyun 	u32 device_id = !strcmp(clk_name, "clk_out_sd0") ? NODE_SD_0 :
903*4882a593Smuzhiyun 							   NODE_SD_1;
904*4882a593Smuzhiyun 	int err;
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun 	arasan_zynqmp_dll_reset(host, device_id);
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	err = sdhci_execute_tuning(mmc, opcode);
909*4882a593Smuzhiyun 	if (err)
910*4882a593Smuzhiyun 		return err;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	arasan_zynqmp_dll_reset(host, device_id);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	return 0;
915*4882a593Smuzhiyun }
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun /**
918*4882a593Smuzhiyun  * sdhci_arasan_update_clockmultiplier - Set corecfg_clockmultiplier
919*4882a593Smuzhiyun  *
920*4882a593Smuzhiyun  * @host:		The sdhci_host
921*4882a593Smuzhiyun  * @value:		The value to write
922*4882a593Smuzhiyun  *
923*4882a593Smuzhiyun  * The corecfg_clockmultiplier is supposed to contain clock multiplier
924*4882a593Smuzhiyun  * value of programmable clock generator.
925*4882a593Smuzhiyun  *
926*4882a593Smuzhiyun  * NOTES:
927*4882a593Smuzhiyun  * - Many existing devices don't seem to do this and work fine.  To keep
928*4882a593Smuzhiyun  *   compatibility for old hardware where the device tree doesn't provide a
929*4882a593Smuzhiyun  *   register map, this function is a noop if a soc_ctl_map hasn't been provided
930*4882a593Smuzhiyun  *   for this platform.
931*4882a593Smuzhiyun  * - The value of corecfg_clockmultiplier should sync with that of corresponding
932*4882a593Smuzhiyun  *   value reading from sdhci_capability_register. So this function is called
933*4882a593Smuzhiyun  *   once at probe time and never called again.
934*4882a593Smuzhiyun  */
sdhci_arasan_update_clockmultiplier(struct sdhci_host * host,u32 value)935*4882a593Smuzhiyun static void sdhci_arasan_update_clockmultiplier(struct sdhci_host *host,
936*4882a593Smuzhiyun 						u32 value)
937*4882a593Smuzhiyun {
938*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
939*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
940*4882a593Smuzhiyun 	const struct sdhci_arasan_soc_ctl_map *soc_ctl_map =
941*4882a593Smuzhiyun 		sdhci_arasan->soc_ctl_map;
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun 	/* Having a map is optional */
944*4882a593Smuzhiyun 	if (!soc_ctl_map)
945*4882a593Smuzhiyun 		return;
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	/* If we have a map, we expect to have a syscon */
948*4882a593Smuzhiyun 	if (!sdhci_arasan->soc_ctl_base) {
949*4882a593Smuzhiyun 		pr_warn("%s: Have regmap, but no soc-ctl-syscon\n",
950*4882a593Smuzhiyun 			mmc_hostname(host->mmc));
951*4882a593Smuzhiyun 		return;
952*4882a593Smuzhiyun 	}
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	sdhci_arasan_syscon_write(host, &soc_ctl_map->clockmultiplier, value);
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun /**
958*4882a593Smuzhiyun  * sdhci_arasan_update_baseclkfreq - Set corecfg_baseclkfreq
959*4882a593Smuzhiyun  *
960*4882a593Smuzhiyun  * @host:		The sdhci_host
961*4882a593Smuzhiyun  *
962*4882a593Smuzhiyun  * The corecfg_baseclkfreq is supposed to contain the MHz of clk_xin.  This
963*4882a593Smuzhiyun  * function can be used to make that happen.
964*4882a593Smuzhiyun  *
965*4882a593Smuzhiyun  * NOTES:
966*4882a593Smuzhiyun  * - Many existing devices don't seem to do this and work fine.  To keep
967*4882a593Smuzhiyun  *   compatibility for old hardware where the device tree doesn't provide a
968*4882a593Smuzhiyun  *   register map, this function is a noop if a soc_ctl_map hasn't been provided
969*4882a593Smuzhiyun  *   for this platform.
970*4882a593Smuzhiyun  * - It's assumed that clk_xin is not dynamic and that we use the SDHCI divider
971*4882a593Smuzhiyun  *   to achieve lower clock rates.  That means that this function is called once
972*4882a593Smuzhiyun  *   at probe time and never called again.
973*4882a593Smuzhiyun  */
sdhci_arasan_update_baseclkfreq(struct sdhci_host * host)974*4882a593Smuzhiyun static void sdhci_arasan_update_baseclkfreq(struct sdhci_host *host)
975*4882a593Smuzhiyun {
976*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
977*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
978*4882a593Smuzhiyun 	const struct sdhci_arasan_soc_ctl_map *soc_ctl_map =
979*4882a593Smuzhiyun 		sdhci_arasan->soc_ctl_map;
980*4882a593Smuzhiyun 	u32 mhz = DIV_ROUND_CLOSEST(clk_get_rate(pltfm_host->clk), 1000000);
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	/* Having a map is optional */
983*4882a593Smuzhiyun 	if (!soc_ctl_map)
984*4882a593Smuzhiyun 		return;
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	/* If we have a map, we expect to have a syscon */
987*4882a593Smuzhiyun 	if (!sdhci_arasan->soc_ctl_base) {
988*4882a593Smuzhiyun 		pr_warn("%s: Have regmap, but no soc-ctl-syscon\n",
989*4882a593Smuzhiyun 			mmc_hostname(host->mmc));
990*4882a593Smuzhiyun 		return;
991*4882a593Smuzhiyun 	}
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun 	sdhci_arasan_syscon_write(host, &soc_ctl_map->baseclkfreq, mhz);
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun 
sdhci_arasan_set_clk_delays(struct sdhci_host * host)996*4882a593Smuzhiyun static void sdhci_arasan_set_clk_delays(struct sdhci_host *host)
997*4882a593Smuzhiyun {
998*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
999*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
1000*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data = &sdhci_arasan->clk_data;
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	clk_set_phase(clk_data->sampleclk,
1003*4882a593Smuzhiyun 		      clk_data->clk_phase_in[host->timing]);
1004*4882a593Smuzhiyun 	clk_set_phase(clk_data->sdcardclk,
1005*4882a593Smuzhiyun 		      clk_data->clk_phase_out[host->timing]);
1006*4882a593Smuzhiyun }
1007*4882a593Smuzhiyun 
arasan_dt_read_clk_phase(struct device * dev,struct sdhci_arasan_clk_data * clk_data,unsigned int timing,const char * prop)1008*4882a593Smuzhiyun static void arasan_dt_read_clk_phase(struct device *dev,
1009*4882a593Smuzhiyun 				     struct sdhci_arasan_clk_data *clk_data,
1010*4882a593Smuzhiyun 				     unsigned int timing, const char *prop)
1011*4882a593Smuzhiyun {
1012*4882a593Smuzhiyun 	struct device_node *np = dev->of_node;
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	int clk_phase[2] = {0};
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun 	/*
1017*4882a593Smuzhiyun 	 * Read Tap Delay values from DT, if the DT does not contain the
1018*4882a593Smuzhiyun 	 * Tap Values then use the pre-defined values.
1019*4882a593Smuzhiyun 	 */
1020*4882a593Smuzhiyun 	if (of_property_read_variable_u32_array(np, prop, &clk_phase[0],
1021*4882a593Smuzhiyun 						2, 0)) {
1022*4882a593Smuzhiyun 		dev_dbg(dev, "Using predefined clock phase for %s = %d %d\n",
1023*4882a593Smuzhiyun 			prop, clk_data->clk_phase_in[timing],
1024*4882a593Smuzhiyun 			clk_data->clk_phase_out[timing]);
1025*4882a593Smuzhiyun 		return;
1026*4882a593Smuzhiyun 	}
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun 	/* The values read are Input and Output Clock Delays in order */
1029*4882a593Smuzhiyun 	clk_data->clk_phase_in[timing] = clk_phase[0];
1030*4882a593Smuzhiyun 	clk_data->clk_phase_out[timing] = clk_phase[1];
1031*4882a593Smuzhiyun }
1032*4882a593Smuzhiyun 
1033*4882a593Smuzhiyun /**
1034*4882a593Smuzhiyun  * arasan_dt_parse_clk_phases - Read Clock Delay values from DT
1035*4882a593Smuzhiyun  *
1036*4882a593Smuzhiyun  * @dev:		Pointer to our struct device.
1037*4882a593Smuzhiyun  * @clk_data:		Pointer to the Clock Data structure
1038*4882a593Smuzhiyun  *
1039*4882a593Smuzhiyun  * Called at initialization to parse the values of Clock Delays.
1040*4882a593Smuzhiyun  */
arasan_dt_parse_clk_phases(struct device * dev,struct sdhci_arasan_clk_data * clk_data)1041*4882a593Smuzhiyun static void arasan_dt_parse_clk_phases(struct device *dev,
1042*4882a593Smuzhiyun 				       struct sdhci_arasan_clk_data *clk_data)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun 	u32 mio_bank = 0;
1045*4882a593Smuzhiyun 	int i;
1046*4882a593Smuzhiyun 
1047*4882a593Smuzhiyun 	/*
1048*4882a593Smuzhiyun 	 * This has been kept as a pointer and is assigned a function here.
1049*4882a593Smuzhiyun 	 * So that different controller variants can assign their own handling
1050*4882a593Smuzhiyun 	 * function.
1051*4882a593Smuzhiyun 	 */
1052*4882a593Smuzhiyun 	clk_data->set_clk_delays = sdhci_arasan_set_clk_delays;
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	if (of_device_is_compatible(dev->of_node, "xlnx,zynqmp-8.9a")) {
1055*4882a593Smuzhiyun 		u32 zynqmp_iclk_phase[MMC_TIMING_MMC_HS400 + 1] =
1056*4882a593Smuzhiyun 			ZYNQMP_ICLK_PHASE;
1057*4882a593Smuzhiyun 		u32 zynqmp_oclk_phase[MMC_TIMING_MMC_HS400 + 1] =
1058*4882a593Smuzhiyun 			ZYNQMP_OCLK_PHASE;
1059*4882a593Smuzhiyun 
1060*4882a593Smuzhiyun 		of_property_read_u32(dev->of_node, "xlnx,mio-bank", &mio_bank);
1061*4882a593Smuzhiyun 		if (mio_bank == 2) {
1062*4882a593Smuzhiyun 			zynqmp_oclk_phase[MMC_TIMING_UHS_SDR104] = 90;
1063*4882a593Smuzhiyun 			zynqmp_oclk_phase[MMC_TIMING_MMC_HS200] = 90;
1064*4882a593Smuzhiyun 		}
1065*4882a593Smuzhiyun 
1066*4882a593Smuzhiyun 		for (i = 0; i <= MMC_TIMING_MMC_HS400; i++) {
1067*4882a593Smuzhiyun 			clk_data->clk_phase_in[i] = zynqmp_iclk_phase[i];
1068*4882a593Smuzhiyun 			clk_data->clk_phase_out[i] = zynqmp_oclk_phase[i];
1069*4882a593Smuzhiyun 		}
1070*4882a593Smuzhiyun 	}
1071*4882a593Smuzhiyun 
1072*4882a593Smuzhiyun 	if (of_device_is_compatible(dev->of_node, "xlnx,versal-8.9a")) {
1073*4882a593Smuzhiyun 		u32 versal_iclk_phase[MMC_TIMING_MMC_HS400 + 1] =
1074*4882a593Smuzhiyun 			VERSAL_ICLK_PHASE;
1075*4882a593Smuzhiyun 		u32 versal_oclk_phase[MMC_TIMING_MMC_HS400 + 1] =
1076*4882a593Smuzhiyun 			VERSAL_OCLK_PHASE;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 		for (i = 0; i <= MMC_TIMING_MMC_HS400; i++) {
1079*4882a593Smuzhiyun 			clk_data->clk_phase_in[i] = versal_iclk_phase[i];
1080*4882a593Smuzhiyun 			clk_data->clk_phase_out[i] = versal_oclk_phase[i];
1081*4882a593Smuzhiyun 		}
1082*4882a593Smuzhiyun 	}
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_LEGACY,
1085*4882a593Smuzhiyun 				 "clk-phase-legacy");
1086*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_MMC_HS,
1087*4882a593Smuzhiyun 				 "clk-phase-mmc-hs");
1088*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_SD_HS,
1089*4882a593Smuzhiyun 				 "clk-phase-sd-hs");
1090*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_UHS_SDR12,
1091*4882a593Smuzhiyun 				 "clk-phase-uhs-sdr12");
1092*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_UHS_SDR25,
1093*4882a593Smuzhiyun 				 "clk-phase-uhs-sdr25");
1094*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_UHS_SDR50,
1095*4882a593Smuzhiyun 				 "clk-phase-uhs-sdr50");
1096*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_UHS_SDR104,
1097*4882a593Smuzhiyun 				 "clk-phase-uhs-sdr104");
1098*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_UHS_DDR50,
1099*4882a593Smuzhiyun 				 "clk-phase-uhs-ddr50");
1100*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_MMC_DDR52,
1101*4882a593Smuzhiyun 				 "clk-phase-mmc-ddr52");
1102*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_MMC_HS200,
1103*4882a593Smuzhiyun 				 "clk-phase-mmc-hs200");
1104*4882a593Smuzhiyun 	arasan_dt_read_clk_phase(dev, clk_data, MMC_TIMING_MMC_HS400,
1105*4882a593Smuzhiyun 				 "clk-phase-mmc-hs400");
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_arasan_pdata = {
1109*4882a593Smuzhiyun 	.ops = &sdhci_arasan_ops,
1110*4882a593Smuzhiyun 	.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
1111*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
1112*4882a593Smuzhiyun 			SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN |
1113*4882a593Smuzhiyun 			SDHCI_QUIRK2_STOP_WITH_TC,
1114*4882a593Smuzhiyun };
1115*4882a593Smuzhiyun 
1116*4882a593Smuzhiyun static const struct sdhci_arasan_clk_ops arasan_clk_ops = {
1117*4882a593Smuzhiyun 	.sdcardclk_ops = &arasan_sdcardclk_ops,
1118*4882a593Smuzhiyun 	.sampleclk_ops = &arasan_sampleclk_ops,
1119*4882a593Smuzhiyun };
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun static struct sdhci_arasan_of_data sdhci_arasan_generic_data = {
1122*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_pdata,
1123*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1124*4882a593Smuzhiyun };
1125*4882a593Smuzhiyun 
1126*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_keembay_emmc_pdata = {
1127*4882a593Smuzhiyun 	.ops = &sdhci_arasan_cqe_ops,
1128*4882a593Smuzhiyun 	.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
1129*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC |
1130*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_LED |
1131*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_ADDR |
1132*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_SIZE |
1133*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_ADMA_SIZE,
1134*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
1135*4882a593Smuzhiyun 		SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN |
1136*4882a593Smuzhiyun 		SDHCI_QUIRK2_CAPS_BIT63_FOR_HS400 |
1137*4882a593Smuzhiyun 		SDHCI_QUIRK2_STOP_WITH_TC |
1138*4882a593Smuzhiyun 		SDHCI_QUIRK2_BROKEN_64_BIT_DMA,
1139*4882a593Smuzhiyun };
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_keembay_sd_pdata = {
1142*4882a593Smuzhiyun 	.ops = &sdhci_arasan_ops,
1143*4882a593Smuzhiyun 	.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
1144*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC |
1145*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_LED |
1146*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_ADDR |
1147*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_SIZE |
1148*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_ADMA_SIZE,
1149*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
1150*4882a593Smuzhiyun 		SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN |
1151*4882a593Smuzhiyun 		SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON |
1152*4882a593Smuzhiyun 		SDHCI_QUIRK2_STOP_WITH_TC |
1153*4882a593Smuzhiyun 		SDHCI_QUIRK2_BROKEN_64_BIT_DMA,
1154*4882a593Smuzhiyun };
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_keembay_sdio_pdata = {
1157*4882a593Smuzhiyun 	.ops = &sdhci_arasan_ops,
1158*4882a593Smuzhiyun 	.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
1159*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC |
1160*4882a593Smuzhiyun 		SDHCI_QUIRK_NO_LED |
1161*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_ADDR |
1162*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_DMA_SIZE |
1163*4882a593Smuzhiyun 		SDHCI_QUIRK_32BIT_ADMA_SIZE,
1164*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
1165*4882a593Smuzhiyun 		SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN |
1166*4882a593Smuzhiyun 		SDHCI_QUIRK2_HOST_OFF_CARD_ON |
1167*4882a593Smuzhiyun 		SDHCI_QUIRK2_BROKEN_64_BIT_DMA,
1168*4882a593Smuzhiyun };
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun static struct sdhci_arasan_of_data sdhci_arasan_rk3399_data = {
1171*4882a593Smuzhiyun 	.soc_ctl_map = &rk3399_soc_ctl_map,
1172*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_cqe_pdata,
1173*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1174*4882a593Smuzhiyun };
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun static struct sdhci_arasan_of_data intel_lgm_emmc_data = {
1177*4882a593Smuzhiyun 	.soc_ctl_map = &intel_lgm_emmc_soc_ctl_map,
1178*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_cqe_pdata,
1179*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1180*4882a593Smuzhiyun };
1181*4882a593Smuzhiyun 
1182*4882a593Smuzhiyun static struct sdhci_arasan_of_data intel_lgm_sdxc_data = {
1183*4882a593Smuzhiyun 	.soc_ctl_map = &intel_lgm_sdxc_soc_ctl_map,
1184*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_cqe_pdata,
1185*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1186*4882a593Smuzhiyun };
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun static const struct sdhci_pltfm_data sdhci_arasan_zynqmp_pdata = {
1189*4882a593Smuzhiyun 	.ops = &sdhci_arasan_ops,
1190*4882a593Smuzhiyun 	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
1191*4882a593Smuzhiyun 			SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN |
1192*4882a593Smuzhiyun 			SDHCI_QUIRK2_STOP_WITH_TC,
1193*4882a593Smuzhiyun };
1194*4882a593Smuzhiyun 
1195*4882a593Smuzhiyun static const struct sdhci_arasan_clk_ops zynqmp_clk_ops = {
1196*4882a593Smuzhiyun 	.sdcardclk_ops = &zynqmp_sdcardclk_ops,
1197*4882a593Smuzhiyun 	.sampleclk_ops = &zynqmp_sampleclk_ops,
1198*4882a593Smuzhiyun };
1199*4882a593Smuzhiyun 
1200*4882a593Smuzhiyun static struct sdhci_arasan_of_data sdhci_arasan_zynqmp_data = {
1201*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_zynqmp_pdata,
1202*4882a593Smuzhiyun 	.clk_ops = &zynqmp_clk_ops,
1203*4882a593Smuzhiyun };
1204*4882a593Smuzhiyun 
1205*4882a593Smuzhiyun static const struct sdhci_arasan_clk_ops versal_clk_ops = {
1206*4882a593Smuzhiyun 	.sdcardclk_ops = &versal_sdcardclk_ops,
1207*4882a593Smuzhiyun 	.sampleclk_ops = &versal_sampleclk_ops,
1208*4882a593Smuzhiyun };
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun static struct sdhci_arasan_of_data sdhci_arasan_versal_data = {
1211*4882a593Smuzhiyun 	.pdata = &sdhci_arasan_zynqmp_pdata,
1212*4882a593Smuzhiyun 	.clk_ops = &versal_clk_ops,
1213*4882a593Smuzhiyun };
1214*4882a593Smuzhiyun 
1215*4882a593Smuzhiyun static struct sdhci_arasan_of_data intel_keembay_emmc_data = {
1216*4882a593Smuzhiyun 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
1217*4882a593Smuzhiyun 	.pdata = &sdhci_keembay_emmc_pdata,
1218*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1219*4882a593Smuzhiyun };
1220*4882a593Smuzhiyun 
1221*4882a593Smuzhiyun static struct sdhci_arasan_of_data intel_keembay_sd_data = {
1222*4882a593Smuzhiyun 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
1223*4882a593Smuzhiyun 	.pdata = &sdhci_keembay_sd_pdata,
1224*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1225*4882a593Smuzhiyun };
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun static struct sdhci_arasan_of_data intel_keembay_sdio_data = {
1228*4882a593Smuzhiyun 	.soc_ctl_map = &intel_keembay_soc_ctl_map,
1229*4882a593Smuzhiyun 	.pdata = &sdhci_keembay_sdio_pdata,
1230*4882a593Smuzhiyun 	.clk_ops = &arasan_clk_ops,
1231*4882a593Smuzhiyun };
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun static const struct of_device_id sdhci_arasan_of_match[] = {
1234*4882a593Smuzhiyun 	/* SoC-specific compatible strings w/ soc_ctl_map */
1235*4882a593Smuzhiyun 	{
1236*4882a593Smuzhiyun 		.compatible = "rockchip,rk3399-sdhci-5.1",
1237*4882a593Smuzhiyun 		.data = &sdhci_arasan_rk3399_data,
1238*4882a593Smuzhiyun 	},
1239*4882a593Smuzhiyun 	{
1240*4882a593Smuzhiyun 		.compatible = "intel,lgm-sdhci-5.1-emmc",
1241*4882a593Smuzhiyun 		.data = &intel_lgm_emmc_data,
1242*4882a593Smuzhiyun 	},
1243*4882a593Smuzhiyun 	{
1244*4882a593Smuzhiyun 		.compatible = "intel,lgm-sdhci-5.1-sdxc",
1245*4882a593Smuzhiyun 		.data = &intel_lgm_sdxc_data,
1246*4882a593Smuzhiyun 	},
1247*4882a593Smuzhiyun 	{
1248*4882a593Smuzhiyun 		.compatible = "intel,keembay-sdhci-5.1-emmc",
1249*4882a593Smuzhiyun 		.data = &intel_keembay_emmc_data,
1250*4882a593Smuzhiyun 	},
1251*4882a593Smuzhiyun 	{
1252*4882a593Smuzhiyun 		.compatible = "intel,keembay-sdhci-5.1-sd",
1253*4882a593Smuzhiyun 		.data = &intel_keembay_sd_data,
1254*4882a593Smuzhiyun 	},
1255*4882a593Smuzhiyun 	{
1256*4882a593Smuzhiyun 		.compatible = "intel,keembay-sdhci-5.1-sdio",
1257*4882a593Smuzhiyun 		.data = &intel_keembay_sdio_data,
1258*4882a593Smuzhiyun 	},
1259*4882a593Smuzhiyun 	/* Generic compatible below here */
1260*4882a593Smuzhiyun 	{
1261*4882a593Smuzhiyun 		.compatible = "arasan,sdhci-8.9a",
1262*4882a593Smuzhiyun 		.data = &sdhci_arasan_generic_data,
1263*4882a593Smuzhiyun 	},
1264*4882a593Smuzhiyun 	{
1265*4882a593Smuzhiyun 		.compatible = "arasan,sdhci-5.1",
1266*4882a593Smuzhiyun 		.data = &sdhci_arasan_generic_data,
1267*4882a593Smuzhiyun 	},
1268*4882a593Smuzhiyun 	{
1269*4882a593Smuzhiyun 		.compatible = "arasan,sdhci-4.9a",
1270*4882a593Smuzhiyun 		.data = &sdhci_arasan_generic_data,
1271*4882a593Smuzhiyun 	},
1272*4882a593Smuzhiyun 	{
1273*4882a593Smuzhiyun 		.compatible = "xlnx,zynqmp-8.9a",
1274*4882a593Smuzhiyun 		.data = &sdhci_arasan_zynqmp_data,
1275*4882a593Smuzhiyun 	},
1276*4882a593Smuzhiyun 	{
1277*4882a593Smuzhiyun 		.compatible = "xlnx,versal-8.9a",
1278*4882a593Smuzhiyun 		.data = &sdhci_arasan_versal_data,
1279*4882a593Smuzhiyun 	},
1280*4882a593Smuzhiyun 	{ /* sentinel */ }
1281*4882a593Smuzhiyun };
1282*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, sdhci_arasan_of_match);
1283*4882a593Smuzhiyun 
1284*4882a593Smuzhiyun /**
1285*4882a593Smuzhiyun  * sdhci_arasan_register_sdcardclk - Register the sdcardclk for a PHY to use
1286*4882a593Smuzhiyun  *
1287*4882a593Smuzhiyun  * @sdhci_arasan:	Our private data structure.
1288*4882a593Smuzhiyun  * @clk_xin:		Pointer to the functional clock
1289*4882a593Smuzhiyun  * @dev:		Pointer to our struct device.
1290*4882a593Smuzhiyun  *
1291*4882a593Smuzhiyun  * Some PHY devices need to know what the actual card clock is.  In order for
1292*4882a593Smuzhiyun  * them to find out, we'll provide a clock through the common clock framework
1293*4882a593Smuzhiyun  * for them to query.
1294*4882a593Smuzhiyun  *
1295*4882a593Smuzhiyun  * Return: 0 on success and error value on error
1296*4882a593Smuzhiyun  */
1297*4882a593Smuzhiyun static int
sdhci_arasan_register_sdcardclk(struct sdhci_arasan_data * sdhci_arasan,struct clk * clk_xin,struct device * dev)1298*4882a593Smuzhiyun sdhci_arasan_register_sdcardclk(struct sdhci_arasan_data *sdhci_arasan,
1299*4882a593Smuzhiyun 				struct clk *clk_xin,
1300*4882a593Smuzhiyun 				struct device *dev)
1301*4882a593Smuzhiyun {
1302*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data = &sdhci_arasan->clk_data;
1303*4882a593Smuzhiyun 	struct device_node *np = dev->of_node;
1304*4882a593Smuzhiyun 	struct clk_init_data sdcardclk_init;
1305*4882a593Smuzhiyun 	const char *parent_clk_name;
1306*4882a593Smuzhiyun 	int ret;
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun 	ret = of_property_read_string_index(np, "clock-output-names", 0,
1309*4882a593Smuzhiyun 					    &sdcardclk_init.name);
1310*4882a593Smuzhiyun 	if (ret) {
1311*4882a593Smuzhiyun 		dev_err(dev, "DT has #clock-cells but no clock-output-names\n");
1312*4882a593Smuzhiyun 		return ret;
1313*4882a593Smuzhiyun 	}
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun 	parent_clk_name = __clk_get_name(clk_xin);
1316*4882a593Smuzhiyun 	sdcardclk_init.parent_names = &parent_clk_name;
1317*4882a593Smuzhiyun 	sdcardclk_init.num_parents = 1;
1318*4882a593Smuzhiyun 	sdcardclk_init.flags = CLK_GET_RATE_NOCACHE;
1319*4882a593Smuzhiyun 	sdcardclk_init.ops = sdhci_arasan->clk_ops->sdcardclk_ops;
1320*4882a593Smuzhiyun 
1321*4882a593Smuzhiyun 	clk_data->sdcardclk_hw.init = &sdcardclk_init;
1322*4882a593Smuzhiyun 	clk_data->sdcardclk =
1323*4882a593Smuzhiyun 		devm_clk_register(dev, &clk_data->sdcardclk_hw);
1324*4882a593Smuzhiyun 	if (IS_ERR(clk_data->sdcardclk))
1325*4882a593Smuzhiyun 		return PTR_ERR(clk_data->sdcardclk);
1326*4882a593Smuzhiyun 	clk_data->sdcardclk_hw.init = NULL;
1327*4882a593Smuzhiyun 
1328*4882a593Smuzhiyun 	ret = of_clk_add_provider(np, of_clk_src_simple_get,
1329*4882a593Smuzhiyun 				  clk_data->sdcardclk);
1330*4882a593Smuzhiyun 	if (ret)
1331*4882a593Smuzhiyun 		dev_err(dev, "Failed to add sdcard clock provider\n");
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun 	return ret;
1334*4882a593Smuzhiyun }
1335*4882a593Smuzhiyun 
1336*4882a593Smuzhiyun /**
1337*4882a593Smuzhiyun  * sdhci_arasan_register_sampleclk - Register the sampleclk for a PHY to use
1338*4882a593Smuzhiyun  *
1339*4882a593Smuzhiyun  * @sdhci_arasan:	Our private data structure.
1340*4882a593Smuzhiyun  * @clk_xin:		Pointer to the functional clock
1341*4882a593Smuzhiyun  * @dev:		Pointer to our struct device.
1342*4882a593Smuzhiyun  *
1343*4882a593Smuzhiyun  * Some PHY devices need to know what the actual card clock is.  In order for
1344*4882a593Smuzhiyun  * them to find out, we'll provide a clock through the common clock framework
1345*4882a593Smuzhiyun  * for them to query.
1346*4882a593Smuzhiyun  *
1347*4882a593Smuzhiyun  * Return: 0 on success and error value on error
1348*4882a593Smuzhiyun  */
1349*4882a593Smuzhiyun static int
sdhci_arasan_register_sampleclk(struct sdhci_arasan_data * sdhci_arasan,struct clk * clk_xin,struct device * dev)1350*4882a593Smuzhiyun sdhci_arasan_register_sampleclk(struct sdhci_arasan_data *sdhci_arasan,
1351*4882a593Smuzhiyun 				struct clk *clk_xin,
1352*4882a593Smuzhiyun 				struct device *dev)
1353*4882a593Smuzhiyun {
1354*4882a593Smuzhiyun 	struct sdhci_arasan_clk_data *clk_data = &sdhci_arasan->clk_data;
1355*4882a593Smuzhiyun 	struct device_node *np = dev->of_node;
1356*4882a593Smuzhiyun 	struct clk_init_data sampleclk_init;
1357*4882a593Smuzhiyun 	const char *parent_clk_name;
1358*4882a593Smuzhiyun 	int ret;
1359*4882a593Smuzhiyun 
1360*4882a593Smuzhiyun 	ret = of_property_read_string_index(np, "clock-output-names", 1,
1361*4882a593Smuzhiyun 					    &sampleclk_init.name);
1362*4882a593Smuzhiyun 	if (ret) {
1363*4882a593Smuzhiyun 		dev_err(dev, "DT has #clock-cells but no clock-output-names\n");
1364*4882a593Smuzhiyun 		return ret;
1365*4882a593Smuzhiyun 	}
1366*4882a593Smuzhiyun 
1367*4882a593Smuzhiyun 	parent_clk_name = __clk_get_name(clk_xin);
1368*4882a593Smuzhiyun 	sampleclk_init.parent_names = &parent_clk_name;
1369*4882a593Smuzhiyun 	sampleclk_init.num_parents = 1;
1370*4882a593Smuzhiyun 	sampleclk_init.flags = CLK_GET_RATE_NOCACHE;
1371*4882a593Smuzhiyun 	sampleclk_init.ops = sdhci_arasan->clk_ops->sampleclk_ops;
1372*4882a593Smuzhiyun 
1373*4882a593Smuzhiyun 	clk_data->sampleclk_hw.init = &sampleclk_init;
1374*4882a593Smuzhiyun 	clk_data->sampleclk =
1375*4882a593Smuzhiyun 		devm_clk_register(dev, &clk_data->sampleclk_hw);
1376*4882a593Smuzhiyun 	if (IS_ERR(clk_data->sampleclk))
1377*4882a593Smuzhiyun 		return PTR_ERR(clk_data->sampleclk);
1378*4882a593Smuzhiyun 	clk_data->sampleclk_hw.init = NULL;
1379*4882a593Smuzhiyun 
1380*4882a593Smuzhiyun 	ret = of_clk_add_provider(np, of_clk_src_simple_get,
1381*4882a593Smuzhiyun 				  clk_data->sampleclk);
1382*4882a593Smuzhiyun 	if (ret)
1383*4882a593Smuzhiyun 		dev_err(dev, "Failed to add sample clock provider\n");
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun 	return ret;
1386*4882a593Smuzhiyun }
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun /**
1389*4882a593Smuzhiyun  * sdhci_arasan_unregister_sdclk - Undoes sdhci_arasan_register_sdclk()
1390*4882a593Smuzhiyun  *
1391*4882a593Smuzhiyun  * @dev:		Pointer to our struct device.
1392*4882a593Smuzhiyun  *
1393*4882a593Smuzhiyun  * Should be called any time we're exiting and sdhci_arasan_register_sdclk()
1394*4882a593Smuzhiyun  * returned success.
1395*4882a593Smuzhiyun  */
sdhci_arasan_unregister_sdclk(struct device * dev)1396*4882a593Smuzhiyun static void sdhci_arasan_unregister_sdclk(struct device *dev)
1397*4882a593Smuzhiyun {
1398*4882a593Smuzhiyun 	struct device_node *np = dev->of_node;
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun 	if (!of_find_property(np, "#clock-cells", NULL))
1401*4882a593Smuzhiyun 		return;
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 	of_clk_del_provider(dev->of_node);
1404*4882a593Smuzhiyun }
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun /**
1407*4882a593Smuzhiyun  * sdhci_arasan_update_support64b - Set SUPPORT_64B (64-bit System Bus Support)
1408*4882a593Smuzhiyun  *
1409*4882a593Smuzhiyun  * This should be set based on the System Address Bus.
1410*4882a593Smuzhiyun  * 0: the Core supports only 32-bit System Address Bus.
1411*4882a593Smuzhiyun  * 1: the Core supports 64-bit System Address Bus.
1412*4882a593Smuzhiyun  *
1413*4882a593Smuzhiyun  * NOTES:
1414*4882a593Smuzhiyun  * - For Keem Bay, it is required to clear this bit. Its default value is 1'b1.
1415*4882a593Smuzhiyun  *   Keem Bay does not support 64-bit access.
1416*4882a593Smuzhiyun  *
1417*4882a593Smuzhiyun  * @host:		The sdhci_host
1418*4882a593Smuzhiyun  * @value:		The value to write
1419*4882a593Smuzhiyun  */
sdhci_arasan_update_support64b(struct sdhci_host * host,u32 value)1420*4882a593Smuzhiyun static void sdhci_arasan_update_support64b(struct sdhci_host *host, u32 value)
1421*4882a593Smuzhiyun {
1422*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1423*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
1424*4882a593Smuzhiyun 	const struct sdhci_arasan_soc_ctl_map *soc_ctl_map =
1425*4882a593Smuzhiyun 		sdhci_arasan->soc_ctl_map;
1426*4882a593Smuzhiyun 
1427*4882a593Smuzhiyun 	/* Having a map is optional */
1428*4882a593Smuzhiyun 	if (!soc_ctl_map)
1429*4882a593Smuzhiyun 		return;
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun 	/* If we have a map, we expect to have a syscon */
1432*4882a593Smuzhiyun 	if (!sdhci_arasan->soc_ctl_base) {
1433*4882a593Smuzhiyun 		pr_warn("%s: Have regmap, but no soc-ctl-syscon\n",
1434*4882a593Smuzhiyun 			mmc_hostname(host->mmc));
1435*4882a593Smuzhiyun 		return;
1436*4882a593Smuzhiyun 	}
1437*4882a593Smuzhiyun 
1438*4882a593Smuzhiyun 	sdhci_arasan_syscon_write(host, &soc_ctl_map->support64b, value);
1439*4882a593Smuzhiyun }
1440*4882a593Smuzhiyun 
1441*4882a593Smuzhiyun /**
1442*4882a593Smuzhiyun  * sdhci_arasan_register_sdclk - Register the sdcardclk for a PHY to use
1443*4882a593Smuzhiyun  *
1444*4882a593Smuzhiyun  * @sdhci_arasan:	Our private data structure.
1445*4882a593Smuzhiyun  * @clk_xin:		Pointer to the functional clock
1446*4882a593Smuzhiyun  * @dev:		Pointer to our struct device.
1447*4882a593Smuzhiyun  *
1448*4882a593Smuzhiyun  * Some PHY devices need to know what the actual card clock is.  In order for
1449*4882a593Smuzhiyun  * them to find out, we'll provide a clock through the common clock framework
1450*4882a593Smuzhiyun  * for them to query.
1451*4882a593Smuzhiyun  *
1452*4882a593Smuzhiyun  * Note: without seriously re-architecting SDHCI's clock code and testing on
1453*4882a593Smuzhiyun  * all platforms, there's no way to create a totally beautiful clock here
1454*4882a593Smuzhiyun  * with all clock ops implemented.  Instead, we'll just create a clock that can
1455*4882a593Smuzhiyun  * be queried and set the CLK_GET_RATE_NOCACHE attribute to tell common clock
1456*4882a593Smuzhiyun  * framework that we're doing things behind its back.  This should be sufficient
1457*4882a593Smuzhiyun  * to create nice clean device tree bindings and later (if needed) we can try
1458*4882a593Smuzhiyun  * re-architecting SDHCI if we see some benefit to it.
1459*4882a593Smuzhiyun  *
1460*4882a593Smuzhiyun  * Return: 0 on success and error value on error
1461*4882a593Smuzhiyun  */
sdhci_arasan_register_sdclk(struct sdhci_arasan_data * sdhci_arasan,struct clk * clk_xin,struct device * dev)1462*4882a593Smuzhiyun static int sdhci_arasan_register_sdclk(struct sdhci_arasan_data *sdhci_arasan,
1463*4882a593Smuzhiyun 				       struct clk *clk_xin,
1464*4882a593Smuzhiyun 				       struct device *dev)
1465*4882a593Smuzhiyun {
1466*4882a593Smuzhiyun 	struct device_node *np = dev->of_node;
1467*4882a593Smuzhiyun 	u32 num_clks = 0;
1468*4882a593Smuzhiyun 	int ret;
1469*4882a593Smuzhiyun 
1470*4882a593Smuzhiyun 	/* Providing a clock to the PHY is optional; no error if missing */
1471*4882a593Smuzhiyun 	if (of_property_read_u32(np, "#clock-cells", &num_clks) < 0)
1472*4882a593Smuzhiyun 		return 0;
1473*4882a593Smuzhiyun 
1474*4882a593Smuzhiyun 	ret = sdhci_arasan_register_sdcardclk(sdhci_arasan, clk_xin, dev);
1475*4882a593Smuzhiyun 	if (ret)
1476*4882a593Smuzhiyun 		return ret;
1477*4882a593Smuzhiyun 
1478*4882a593Smuzhiyun 	if (num_clks) {
1479*4882a593Smuzhiyun 		ret = sdhci_arasan_register_sampleclk(sdhci_arasan, clk_xin,
1480*4882a593Smuzhiyun 						      dev);
1481*4882a593Smuzhiyun 		if (ret) {
1482*4882a593Smuzhiyun 			sdhci_arasan_unregister_sdclk(dev);
1483*4882a593Smuzhiyun 			return ret;
1484*4882a593Smuzhiyun 		}
1485*4882a593Smuzhiyun 	}
1486*4882a593Smuzhiyun 
1487*4882a593Smuzhiyun 	return 0;
1488*4882a593Smuzhiyun }
1489*4882a593Smuzhiyun 
sdhci_arasan_add_host(struct sdhci_arasan_data * sdhci_arasan)1490*4882a593Smuzhiyun static int sdhci_arasan_add_host(struct sdhci_arasan_data *sdhci_arasan)
1491*4882a593Smuzhiyun {
1492*4882a593Smuzhiyun 	struct sdhci_host *host = sdhci_arasan->host;
1493*4882a593Smuzhiyun 	struct cqhci_host *cq_host;
1494*4882a593Smuzhiyun 	bool dma64;
1495*4882a593Smuzhiyun 	int ret;
1496*4882a593Smuzhiyun 
1497*4882a593Smuzhiyun 	if (!sdhci_arasan->has_cqe)
1498*4882a593Smuzhiyun 		return sdhci_add_host(host);
1499*4882a593Smuzhiyun 
1500*4882a593Smuzhiyun 	ret = sdhci_setup_host(host);
1501*4882a593Smuzhiyun 	if (ret)
1502*4882a593Smuzhiyun 		return ret;
1503*4882a593Smuzhiyun 
1504*4882a593Smuzhiyun 	cq_host = devm_kzalloc(host->mmc->parent,
1505*4882a593Smuzhiyun 			       sizeof(*cq_host), GFP_KERNEL);
1506*4882a593Smuzhiyun 	if (!cq_host) {
1507*4882a593Smuzhiyun 		ret = -ENOMEM;
1508*4882a593Smuzhiyun 		goto cleanup;
1509*4882a593Smuzhiyun 	}
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun 	cq_host->mmio = host->ioaddr + SDHCI_ARASAN_CQE_BASE_ADDR;
1512*4882a593Smuzhiyun 	cq_host->ops = &sdhci_arasan_cqhci_ops;
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun 	dma64 = host->flags & SDHCI_USE_64_BIT_DMA;
1515*4882a593Smuzhiyun 	if (dma64)
1516*4882a593Smuzhiyun 		cq_host->caps |= CQHCI_TASK_DESC_SZ_128;
1517*4882a593Smuzhiyun 
1518*4882a593Smuzhiyun 	ret = cqhci_init(cq_host, host->mmc, dma64);
1519*4882a593Smuzhiyun 	if (ret)
1520*4882a593Smuzhiyun 		goto cleanup;
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun 	ret = __sdhci_add_host(host);
1523*4882a593Smuzhiyun 	if (ret)
1524*4882a593Smuzhiyun 		goto cleanup;
1525*4882a593Smuzhiyun 
1526*4882a593Smuzhiyun 	return 0;
1527*4882a593Smuzhiyun 
1528*4882a593Smuzhiyun cleanup:
1529*4882a593Smuzhiyun 	sdhci_cleanup_host(host);
1530*4882a593Smuzhiyun 	return ret;
1531*4882a593Smuzhiyun }
1532*4882a593Smuzhiyun 
sdhci_arasan_probe(struct platform_device * pdev)1533*4882a593Smuzhiyun static int sdhci_arasan_probe(struct platform_device *pdev)
1534*4882a593Smuzhiyun {
1535*4882a593Smuzhiyun 	int ret;
1536*4882a593Smuzhiyun 	const struct of_device_id *match;
1537*4882a593Smuzhiyun 	struct device_node *node;
1538*4882a593Smuzhiyun 	struct clk *clk_xin;
1539*4882a593Smuzhiyun 	struct sdhci_host *host;
1540*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host;
1541*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan;
1542*4882a593Smuzhiyun 	struct device_node *np = pdev->dev.of_node;
1543*4882a593Smuzhiyun 	const struct sdhci_arasan_of_data *data;
1544*4882a593Smuzhiyun 
1545*4882a593Smuzhiyun 	match = of_match_node(sdhci_arasan_of_match, pdev->dev.of_node);
1546*4882a593Smuzhiyun 	data = match->data;
1547*4882a593Smuzhiyun 	host = sdhci_pltfm_init(pdev, data->pdata, sizeof(*sdhci_arasan));
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun 	if (IS_ERR(host))
1550*4882a593Smuzhiyun 		return PTR_ERR(host);
1551*4882a593Smuzhiyun 
1552*4882a593Smuzhiyun 	pltfm_host = sdhci_priv(host);
1553*4882a593Smuzhiyun 	sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
1554*4882a593Smuzhiyun 	sdhci_arasan->host = host;
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun 	sdhci_arasan->soc_ctl_map = data->soc_ctl_map;
1557*4882a593Smuzhiyun 	sdhci_arasan->clk_ops = data->clk_ops;
1558*4882a593Smuzhiyun 
1559*4882a593Smuzhiyun 	node = of_parse_phandle(pdev->dev.of_node, "arasan,soc-ctl-syscon", 0);
1560*4882a593Smuzhiyun 	if (node) {
1561*4882a593Smuzhiyun 		sdhci_arasan->soc_ctl_base = syscon_node_to_regmap(node);
1562*4882a593Smuzhiyun 		of_node_put(node);
1563*4882a593Smuzhiyun 
1564*4882a593Smuzhiyun 		if (IS_ERR(sdhci_arasan->soc_ctl_base)) {
1565*4882a593Smuzhiyun 			ret = dev_err_probe(&pdev->dev,
1566*4882a593Smuzhiyun 					    PTR_ERR(sdhci_arasan->soc_ctl_base),
1567*4882a593Smuzhiyun 					    "Can't get syscon\n");
1568*4882a593Smuzhiyun 			goto err_pltfm_free;
1569*4882a593Smuzhiyun 		}
1570*4882a593Smuzhiyun 	}
1571*4882a593Smuzhiyun 
1572*4882a593Smuzhiyun 	sdhci_arasan->clk_ahb = devm_clk_get(&pdev->dev, "clk_ahb");
1573*4882a593Smuzhiyun 	if (IS_ERR(sdhci_arasan->clk_ahb)) {
1574*4882a593Smuzhiyun 		dev_err(&pdev->dev, "clk_ahb clock not found.\n");
1575*4882a593Smuzhiyun 		ret = PTR_ERR(sdhci_arasan->clk_ahb);
1576*4882a593Smuzhiyun 		goto err_pltfm_free;
1577*4882a593Smuzhiyun 	}
1578*4882a593Smuzhiyun 
1579*4882a593Smuzhiyun 	clk_xin = devm_clk_get(&pdev->dev, "clk_xin");
1580*4882a593Smuzhiyun 	if (IS_ERR(clk_xin)) {
1581*4882a593Smuzhiyun 		dev_err(&pdev->dev, "clk_xin clock not found.\n");
1582*4882a593Smuzhiyun 		ret = PTR_ERR(clk_xin);
1583*4882a593Smuzhiyun 		goto err_pltfm_free;
1584*4882a593Smuzhiyun 	}
1585*4882a593Smuzhiyun 
1586*4882a593Smuzhiyun 	ret = clk_prepare_enable(sdhci_arasan->clk_ahb);
1587*4882a593Smuzhiyun 	if (ret) {
1588*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Unable to enable AHB clock.\n");
1589*4882a593Smuzhiyun 		goto err_pltfm_free;
1590*4882a593Smuzhiyun 	}
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun 	ret = clk_prepare_enable(clk_xin);
1593*4882a593Smuzhiyun 	if (ret) {
1594*4882a593Smuzhiyun 		dev_err(&pdev->dev, "Unable to enable SD clock.\n");
1595*4882a593Smuzhiyun 		goto clk_dis_ahb;
1596*4882a593Smuzhiyun 	}
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun 	sdhci_get_of_property(pdev);
1599*4882a593Smuzhiyun 
1600*4882a593Smuzhiyun 	if (of_property_read_bool(np, "xlnx,fails-without-test-cd"))
1601*4882a593Smuzhiyun 		sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_FORCE_CDTEST;
1602*4882a593Smuzhiyun 
1603*4882a593Smuzhiyun 	if (of_property_read_bool(np, "xlnx,int-clock-stable-broken"))
1604*4882a593Smuzhiyun 		sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_CLOCK_UNSTABLE;
1605*4882a593Smuzhiyun 
1606*4882a593Smuzhiyun 	pltfm_host->clk = clk_xin;
1607*4882a593Smuzhiyun 
1608*4882a593Smuzhiyun 	if (of_device_is_compatible(pdev->dev.of_node,
1609*4882a593Smuzhiyun 				    "rockchip,rk3399-sdhci-5.1"))
1610*4882a593Smuzhiyun 		sdhci_arasan_update_clockmultiplier(host, 0x0);
1611*4882a593Smuzhiyun 
1612*4882a593Smuzhiyun 	if (of_device_is_compatible(np, "intel,keembay-sdhci-5.1-emmc") ||
1613*4882a593Smuzhiyun 	    of_device_is_compatible(np, "intel,keembay-sdhci-5.1-sd") ||
1614*4882a593Smuzhiyun 	    of_device_is_compatible(np, "intel,keembay-sdhci-5.1-sdio")) {
1615*4882a593Smuzhiyun 		sdhci_arasan_update_clockmultiplier(host, 0x0);
1616*4882a593Smuzhiyun 		sdhci_arasan_update_support64b(host, 0x0);
1617*4882a593Smuzhiyun 
1618*4882a593Smuzhiyun 		host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY;
1619*4882a593Smuzhiyun 	}
1620*4882a593Smuzhiyun 
1621*4882a593Smuzhiyun 	sdhci_arasan_update_baseclkfreq(host);
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun 	ret = sdhci_arasan_register_sdclk(sdhci_arasan, clk_xin, &pdev->dev);
1624*4882a593Smuzhiyun 	if (ret)
1625*4882a593Smuzhiyun 		goto clk_disable_all;
1626*4882a593Smuzhiyun 
1627*4882a593Smuzhiyun 	if (of_device_is_compatible(np, "xlnx,zynqmp-8.9a")) {
1628*4882a593Smuzhiyun 		host->mmc_host_ops.execute_tuning =
1629*4882a593Smuzhiyun 			arasan_zynqmp_execute_tuning;
1630*4882a593Smuzhiyun 
1631*4882a593Smuzhiyun 		sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_CLOCK_25_BROKEN;
1632*4882a593Smuzhiyun 	}
1633*4882a593Smuzhiyun 
1634*4882a593Smuzhiyun 	arasan_dt_parse_clk_phases(&pdev->dev, &sdhci_arasan->clk_data);
1635*4882a593Smuzhiyun 
1636*4882a593Smuzhiyun 	ret = mmc_of_parse(host->mmc);
1637*4882a593Smuzhiyun 	if (ret) {
1638*4882a593Smuzhiyun 		if (ret != -EPROBE_DEFER)
1639*4882a593Smuzhiyun 			dev_err(&pdev->dev, "parsing dt failed (%d)\n", ret);
1640*4882a593Smuzhiyun 		goto unreg_clk;
1641*4882a593Smuzhiyun 	}
1642*4882a593Smuzhiyun 
1643*4882a593Smuzhiyun 	sdhci_arasan->phy = ERR_PTR(-ENODEV);
1644*4882a593Smuzhiyun 	if (of_device_is_compatible(pdev->dev.of_node,
1645*4882a593Smuzhiyun 				    "arasan,sdhci-5.1")) {
1646*4882a593Smuzhiyun 		sdhci_arasan->phy = devm_phy_get(&pdev->dev,
1647*4882a593Smuzhiyun 						 "phy_arasan");
1648*4882a593Smuzhiyun 		if (IS_ERR(sdhci_arasan->phy)) {
1649*4882a593Smuzhiyun 			ret = PTR_ERR(sdhci_arasan->phy);
1650*4882a593Smuzhiyun 			dev_err(&pdev->dev, "No phy for arasan,sdhci-5.1.\n");
1651*4882a593Smuzhiyun 			goto unreg_clk;
1652*4882a593Smuzhiyun 		}
1653*4882a593Smuzhiyun 
1654*4882a593Smuzhiyun 		ret = phy_init(sdhci_arasan->phy);
1655*4882a593Smuzhiyun 		if (ret < 0) {
1656*4882a593Smuzhiyun 			dev_err(&pdev->dev, "phy_init err.\n");
1657*4882a593Smuzhiyun 			goto unreg_clk;
1658*4882a593Smuzhiyun 		}
1659*4882a593Smuzhiyun 
1660*4882a593Smuzhiyun 		host->mmc_host_ops.hs400_enhanced_strobe =
1661*4882a593Smuzhiyun 					sdhci_arasan_hs400_enhanced_strobe;
1662*4882a593Smuzhiyun 		host->mmc_host_ops.start_signal_voltage_switch =
1663*4882a593Smuzhiyun 					sdhci_arasan_voltage_switch;
1664*4882a593Smuzhiyun 
1665*4882a593Smuzhiyun 		if (!of_property_read_bool(np, "disable-cqe")) {
1666*4882a593Smuzhiyun 			sdhci_arasan->has_cqe = true;
1667*4882a593Smuzhiyun 			host->mmc->caps2 |= MMC_CAP2_CQE;
1668*4882a593Smuzhiyun 		}
1669*4882a593Smuzhiyun 
1670*4882a593Smuzhiyun 		if (!of_property_read_bool(np, "disable-cqe-dcmd"))
1671*4882a593Smuzhiyun 			host->mmc->caps2 |= MMC_CAP2_CQE_DCMD;
1672*4882a593Smuzhiyun 	}
1673*4882a593Smuzhiyun 
1674*4882a593Smuzhiyun 	ret = sdhci_arasan_add_host(sdhci_arasan);
1675*4882a593Smuzhiyun 	if (ret)
1676*4882a593Smuzhiyun 		goto err_add_host;
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun 	device_init_wakeup(&pdev->dev, 1);
1679*4882a593Smuzhiyun 
1680*4882a593Smuzhiyun 	return 0;
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun err_add_host:
1683*4882a593Smuzhiyun 	if (!IS_ERR(sdhci_arasan->phy))
1684*4882a593Smuzhiyun 		phy_exit(sdhci_arasan->phy);
1685*4882a593Smuzhiyun unreg_clk:
1686*4882a593Smuzhiyun 	sdhci_arasan_unregister_sdclk(&pdev->dev);
1687*4882a593Smuzhiyun clk_disable_all:
1688*4882a593Smuzhiyun 	clk_disable_unprepare(clk_xin);
1689*4882a593Smuzhiyun clk_dis_ahb:
1690*4882a593Smuzhiyun 	clk_disable_unprepare(sdhci_arasan->clk_ahb);
1691*4882a593Smuzhiyun err_pltfm_free:
1692*4882a593Smuzhiyun 	sdhci_pltfm_free(pdev);
1693*4882a593Smuzhiyun 	return ret;
1694*4882a593Smuzhiyun }
1695*4882a593Smuzhiyun 
sdhci_arasan_remove(struct platform_device * pdev)1696*4882a593Smuzhiyun static int sdhci_arasan_remove(struct platform_device *pdev)
1697*4882a593Smuzhiyun {
1698*4882a593Smuzhiyun 	int ret;
1699*4882a593Smuzhiyun 	struct sdhci_host *host = platform_get_drvdata(pdev);
1700*4882a593Smuzhiyun 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
1701*4882a593Smuzhiyun 	struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
1702*4882a593Smuzhiyun 	struct clk *clk_ahb = sdhci_arasan->clk_ahb;
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun 	if (!IS_ERR(sdhci_arasan->phy)) {
1705*4882a593Smuzhiyun 		if (sdhci_arasan->is_phy_on)
1706*4882a593Smuzhiyun 			phy_power_off(sdhci_arasan->phy);
1707*4882a593Smuzhiyun 		phy_exit(sdhci_arasan->phy);
1708*4882a593Smuzhiyun 	}
1709*4882a593Smuzhiyun 
1710*4882a593Smuzhiyun 	sdhci_arasan_unregister_sdclk(&pdev->dev);
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun 	ret = sdhci_pltfm_unregister(pdev);
1713*4882a593Smuzhiyun 
1714*4882a593Smuzhiyun 	clk_disable_unprepare(clk_ahb);
1715*4882a593Smuzhiyun 
1716*4882a593Smuzhiyun 	return ret;
1717*4882a593Smuzhiyun }
1718*4882a593Smuzhiyun 
1719*4882a593Smuzhiyun static struct platform_driver sdhci_arasan_driver = {
1720*4882a593Smuzhiyun 	.driver = {
1721*4882a593Smuzhiyun 		.name = "sdhci-arasan",
1722*4882a593Smuzhiyun 		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
1723*4882a593Smuzhiyun 		.of_match_table = sdhci_arasan_of_match,
1724*4882a593Smuzhiyun 		.pm = &sdhci_arasan_dev_pm_ops,
1725*4882a593Smuzhiyun 	},
1726*4882a593Smuzhiyun 	.probe = sdhci_arasan_probe,
1727*4882a593Smuzhiyun 	.remove = sdhci_arasan_remove,
1728*4882a593Smuzhiyun };
1729*4882a593Smuzhiyun 
1730*4882a593Smuzhiyun module_platform_driver(sdhci_arasan_driver);
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for the Arasan SDHCI Controller");
1733*4882a593Smuzhiyun MODULE_AUTHOR("Soeren Brinkmann <soren.brinkmann@xilinx.com>");
1734*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1735