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