1/*
2 * Secure Digital Host Controller Interface ACPI driver.
3 *
4 * Copyright (c) 2012, Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 */
20
21#include <linux/init.h>
22#include <linux/export.h>
23#include <linux/module.h>
24#include <linux/device.h>
25#include <linux/platform_device.h>
26#include <linux/ioport.h>
27#include <linux/io.h>
28#include <linux/dma-mapping.h>
29#include <linux/compiler.h>
30#include <linux/stddef.h>
31#include <linux/bitops.h>
32#include <linux/types.h>
33#include <linux/err.h>
34#include <linux/interrupt.h>
35#include <linux/acpi.h>
36#include <linux/pm.h>
37#include <linux/pm_runtime.h>
38#include <linux/delay.h>
39
40#include <linux/mmc/host.h>
41#include <linux/mmc/pm.h>
42#include <linux/mmc/slot-gpio.h>
43
44#include "sdhci.h"
45
46enum {
47	SDHCI_ACPI_SD_CD		= BIT(0),
48	SDHCI_ACPI_RUNTIME_PM		= BIT(1),
49	SDHCI_ACPI_SD_CD_OVERRIDE_LEVEL	= BIT(2),
50};
51
52struct sdhci_acpi_chip {
53	const struct	sdhci_ops *ops;
54	unsigned int	quirks;
55	unsigned int	quirks2;
56	unsigned long	caps;
57	unsigned int	caps2;
58	mmc_pm_flag_t	pm_caps;
59};
60
61struct sdhci_acpi_slot {
62	const struct	sdhci_acpi_chip *chip;
63	unsigned int	quirks;
64	unsigned int	quirks2;
65	unsigned long	caps;
66	unsigned int	caps2;
67	mmc_pm_flag_t	pm_caps;
68	unsigned int	flags;
69	int (*probe_slot)(struct platform_device *, const char *, const char *);
70	int (*remove_slot)(struct platform_device *);
71};
72
73struct sdhci_acpi_host {
74	struct sdhci_host		*host;
75	const struct sdhci_acpi_slot	*slot;
76	struct platform_device		*pdev;
77	bool				use_runtime_pm;
78	bool				dma_setup;
79};
80
81static inline bool sdhci_acpi_flag(struct sdhci_acpi_host *c, unsigned int flag)
82{
83	return c->slot && (c->slot->flags & flag);
84}
85
86static int sdhci_acpi_enable_dma(struct sdhci_host *host)
87{
88	struct sdhci_acpi_host *c = sdhci_priv(host);
89	struct device *dev = &c->pdev->dev;
90	int err = -1;
91
92	if (c->dma_setup)
93		return 0;
94
95	if (host->flags & SDHCI_USE_64_BIT_DMA) {
96		if (host->quirks2 & SDHCI_QUIRK2_BROKEN_64_BIT_DMA) {
97			host->flags &= ~SDHCI_USE_64_BIT_DMA;
98		} else {
99			err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
100			if (err)
101				dev_warn(dev, "Failed to set 64-bit DMA mask\n");
102		}
103	}
104
105	if (err)
106		err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
107
108	c->dma_setup = !err;
109
110	return err;
111}
112
113static void sdhci_acpi_int_hw_reset(struct sdhci_host *host)
114{
115	u8 reg;
116
117	reg = sdhci_readb(host, SDHCI_POWER_CONTROL);
118	reg |= 0x10;
119	sdhci_writeb(host, reg, SDHCI_POWER_CONTROL);
120	/* For eMMC, minimum is 1us but give it 9us for good measure */
121	udelay(9);
122	reg &= ~0x10;
123	sdhci_writeb(host, reg, SDHCI_POWER_CONTROL);
124	/* For eMMC, minimum is 200us but give it 300us for good measure */
125	usleep_range(300, 1000);
126}
127
128static const struct sdhci_ops sdhci_acpi_ops_dflt = {
129	.set_clock = sdhci_set_clock,
130	.enable_dma = sdhci_acpi_enable_dma,
131	.set_bus_width = sdhci_set_bus_width,
132	.reset = sdhci_reset,
133	.set_uhs_signaling = sdhci_set_uhs_signaling,
134};
135
136static const struct sdhci_ops sdhci_acpi_ops_int = {
137	.set_clock = sdhci_set_clock,
138	.enable_dma = sdhci_acpi_enable_dma,
139	.set_bus_width = sdhci_set_bus_width,
140	.reset = sdhci_reset,
141	.set_uhs_signaling = sdhci_set_uhs_signaling,
142	.hw_reset   = sdhci_acpi_int_hw_reset,
143};
144
145static const struct sdhci_acpi_chip sdhci_acpi_chip_int = {
146	.ops = &sdhci_acpi_ops_int,
147};
148
149static int sdhci_acpi_emmc_probe_slot(struct platform_device *pdev,
150				      const char *hid, const char *uid)
151{
152	struct sdhci_acpi_host *c = platform_get_drvdata(pdev);
153	struct sdhci_host *host;
154
155	if (!c || !c->host)
156		return 0;
157
158	host = c->host;
159
160	/* Platform specific code during emmc probe slot goes here */
161
162	if (hid && uid && !strcmp(hid, "80860F14") && !strcmp(uid, "1") &&
163	    sdhci_readl(host, SDHCI_CAPABILITIES) == 0x446cc8b2 &&
164	    sdhci_readl(host, SDHCI_CAPABILITIES_1) == 0x00000807)
165		host->timeout_clk = 1000; /* 1000 kHz i.e. 1 MHz */
166
167	return 0;
168}
169
170static int sdhci_acpi_sdio_probe_slot(struct platform_device *pdev,
171				      const char *hid, const char *uid)
172{
173	struct sdhci_acpi_host *c = platform_get_drvdata(pdev);
174	struct sdhci_host *host;
175
176	if (!c || !c->host)
177		return 0;
178
179	host = c->host;
180
181	/* Platform specific code during sdio probe slot goes here */
182
183	return 0;
184}
185
186static int sdhci_acpi_sd_probe_slot(struct platform_device *pdev,
187				    const char *hid, const char *uid)
188{
189	struct sdhci_acpi_host *c = platform_get_drvdata(pdev);
190	struct sdhci_host *host;
191
192	if (!c || !c->host || !c->slot)
193		return 0;
194
195	host = c->host;
196
197	/* Platform specific code during sd probe slot goes here */
198
199	return 0;
200}
201
202static const struct sdhci_acpi_slot sdhci_acpi_slot_int_emmc = {
203	.chip    = &sdhci_acpi_chip_int,
204	.caps    = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE |
205		   MMC_CAP_HW_RESET | MMC_CAP_1_8V_DDR |
206		   MMC_CAP_WAIT_WHILE_BUSY,
207	.caps2   = MMC_CAP2_HC_ERASE_SZ,
208	.flags   = SDHCI_ACPI_RUNTIME_PM,
209	.quirks  = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
210	.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN | SDHCI_QUIRK2_STOP_WITH_TC,
211	.probe_slot	= sdhci_acpi_emmc_probe_slot,
212};
213
214static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {
215	.quirks  = SDHCI_QUIRK_BROKEN_CARD_DETECTION |
216		   SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
217	.quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON,
218	.caps    = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD |
219		   MMC_CAP_WAIT_WHILE_BUSY,
220	.flags   = SDHCI_ACPI_RUNTIME_PM,
221	.pm_caps = MMC_PM_KEEP_POWER,
222	.probe_slot	= sdhci_acpi_sdio_probe_slot,
223};
224
225static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sd = {
226	.flags   = SDHCI_ACPI_SD_CD | SDHCI_ACPI_SD_CD_OVERRIDE_LEVEL |
227		   SDHCI_ACPI_RUNTIME_PM,
228	.quirks  = SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC,
229	.quirks2 = SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON |
230		   SDHCI_QUIRK2_STOP_WITH_TC,
231	.caps    = MMC_CAP_WAIT_WHILE_BUSY,
232	.probe_slot	= sdhci_acpi_sd_probe_slot,
233};
234
235struct sdhci_acpi_uid_slot {
236	const char *hid;
237	const char *uid;
238	const struct sdhci_acpi_slot *slot;
239};
240
241static const struct sdhci_acpi_uid_slot sdhci_acpi_uids[] = {
242	{ "80860F14" , "1" , &sdhci_acpi_slot_int_emmc },
243	{ "80860F14" , "3" , &sdhci_acpi_slot_int_sd   },
244	{ "80860F16" , NULL, &sdhci_acpi_slot_int_sd   },
245	{ "INT33BB"  , "2" , &sdhci_acpi_slot_int_sdio },
246	{ "INT33BB"  , "3" , &sdhci_acpi_slot_int_sd },
247	{ "INT33C6"  , NULL, &sdhci_acpi_slot_int_sdio },
248	{ "INT3436"  , NULL, &sdhci_acpi_slot_int_sdio },
249	{ "INT344D"  , NULL, &sdhci_acpi_slot_int_sdio },
250	{ "PNP0D40"  },
251	{ },
252};
253
254static const struct acpi_device_id sdhci_acpi_ids[] = {
255	{ "80860F14" },
256	{ "80860F16" },
257	{ "INT33BB"  },
258	{ "INT33C6"  },
259	{ "INT3436"  },
260	{ "INT344D"  },
261	{ "PNP0D40"  },
262	{ },
263};
264MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids);
265
266static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid,
267							 const char *uid)
268{
269	const struct sdhci_acpi_uid_slot *u;
270
271	for (u = sdhci_acpi_uids; u->hid; u++) {
272		if (strcmp(u->hid, hid))
273			continue;
274		if (!u->uid)
275			return u->slot;
276		if (uid && !strcmp(u->uid, uid))
277			return u->slot;
278	}
279	return NULL;
280}
281
282static int sdhci_acpi_probe(struct platform_device *pdev)
283{
284	struct device *dev = &pdev->dev;
285	acpi_handle handle = ACPI_HANDLE(dev);
286	struct acpi_device *device;
287	struct sdhci_acpi_host *c;
288	struct sdhci_host *host;
289	struct resource *iomem;
290	resource_size_t len;
291	const char *hid;
292	const char *uid;
293	int err;
294
295	if (acpi_bus_get_device(handle, &device))
296		return -ENODEV;
297
298	if (acpi_bus_get_status(device) || !device->status.present)
299		return -ENODEV;
300
301	hid = acpi_device_hid(device);
302	uid = device->pnp.unique_id;
303
304	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
305	if (!iomem)
306		return -ENOMEM;
307
308	len = resource_size(iomem);
309	if (len < 0x100)
310		dev_err(dev, "Invalid iomem size!\n");
311
312	if (!devm_request_mem_region(dev, iomem->start, len, dev_name(dev)))
313		return -ENOMEM;
314
315	host = sdhci_alloc_host(dev, sizeof(struct sdhci_acpi_host));
316	if (IS_ERR(host))
317		return PTR_ERR(host);
318
319	c = sdhci_priv(host);
320	c->host = host;
321	c->slot = sdhci_acpi_get_slot(hid, uid);
322	c->pdev = pdev;
323	c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM);
324
325	platform_set_drvdata(pdev, c);
326
327	host->hw_name	= "ACPI";
328	host->ops	= &sdhci_acpi_ops_dflt;
329	host->irq	= platform_get_irq(pdev, 0);
330
331	host->ioaddr = devm_ioremap_nocache(dev, iomem->start,
332					    resource_size(iomem));
333	if (host->ioaddr == NULL) {
334		err = -ENOMEM;
335		goto err_free;
336	}
337
338	if (c->slot) {
339		if (c->slot->probe_slot) {
340			err = c->slot->probe_slot(pdev, hid, uid);
341			if (err)
342				goto err_free;
343		}
344		if (c->slot->chip) {
345			host->ops            = c->slot->chip->ops;
346			host->quirks        |= c->slot->chip->quirks;
347			host->quirks2       |= c->slot->chip->quirks2;
348			host->mmc->caps     |= c->slot->chip->caps;
349			host->mmc->caps2    |= c->slot->chip->caps2;
350			host->mmc->pm_caps  |= c->slot->chip->pm_caps;
351		}
352		host->quirks        |= c->slot->quirks;
353		host->quirks2       |= c->slot->quirks2;
354		host->mmc->caps     |= c->slot->caps;
355		host->mmc->caps2    |= c->slot->caps2;
356		host->mmc->pm_caps  |= c->slot->pm_caps;
357	}
358
359	host->mmc->caps2 |= MMC_CAP2_NO_PRESCAN_POWERUP;
360
361	if (sdhci_acpi_flag(c, SDHCI_ACPI_SD_CD)) {
362		bool v = sdhci_acpi_flag(c, SDHCI_ACPI_SD_CD_OVERRIDE_LEVEL);
363
364		if (mmc_gpiod_request_cd(host->mmc, NULL, 0, v, 0, NULL)) {
365			dev_warn(dev, "failed to setup card detect gpio\n");
366			c->use_runtime_pm = false;
367		}
368	}
369
370	err = sdhci_add_host(host);
371	if (err)
372		goto err_free;
373
374	if (c->use_runtime_pm) {
375		pm_runtime_set_active(dev);
376		pm_suspend_ignore_children(dev, 1);
377		pm_runtime_set_autosuspend_delay(dev, 50);
378		pm_runtime_use_autosuspend(dev);
379		pm_runtime_enable(dev);
380	}
381
382	return 0;
383
384err_free:
385	sdhci_free_host(c->host);
386	return err;
387}
388
389static int sdhci_acpi_remove(struct platform_device *pdev)
390{
391	struct sdhci_acpi_host *c = platform_get_drvdata(pdev);
392	struct device *dev = &pdev->dev;
393	int dead;
394
395	if (c->use_runtime_pm) {
396		pm_runtime_get_sync(dev);
397		pm_runtime_disable(dev);
398		pm_runtime_put_noidle(dev);
399	}
400
401	if (c->slot && c->slot->remove_slot)
402		c->slot->remove_slot(pdev);
403
404	dead = (sdhci_readl(c->host, SDHCI_INT_STATUS) == ~0);
405	sdhci_remove_host(c->host, dead);
406	sdhci_free_host(c->host);
407
408	return 0;
409}
410
411#ifdef CONFIG_PM_SLEEP
412
413static int sdhci_acpi_suspend(struct device *dev)
414{
415	struct sdhci_acpi_host *c = dev_get_drvdata(dev);
416
417	return sdhci_suspend_host(c->host);
418}
419
420static int sdhci_acpi_resume(struct device *dev)
421{
422	struct sdhci_acpi_host *c = dev_get_drvdata(dev);
423
424	return sdhci_resume_host(c->host);
425}
426
427#else
428
429#define sdhci_acpi_suspend	NULL
430#define sdhci_acpi_resume	NULL
431
432#endif
433
434#ifdef CONFIG_PM
435
436static int sdhci_acpi_runtime_suspend(struct device *dev)
437{
438	struct sdhci_acpi_host *c = dev_get_drvdata(dev);
439
440	return sdhci_runtime_suspend_host(c->host);
441}
442
443static int sdhci_acpi_runtime_resume(struct device *dev)
444{
445	struct sdhci_acpi_host *c = dev_get_drvdata(dev);
446
447	return sdhci_runtime_resume_host(c->host);
448}
449
450#endif
451
452static const struct dev_pm_ops sdhci_acpi_pm_ops = {
453	.suspend		= sdhci_acpi_suspend,
454	.resume			= sdhci_acpi_resume,
455	SET_RUNTIME_PM_OPS(sdhci_acpi_runtime_suspend,
456			sdhci_acpi_runtime_resume, NULL)
457};
458
459static struct platform_driver sdhci_acpi_driver = {
460	.driver = {
461		.name			= "sdhci-acpi",
462		.acpi_match_table	= sdhci_acpi_ids,
463		.pm			= &sdhci_acpi_pm_ops,
464	},
465	.probe	= sdhci_acpi_probe,
466	.remove	= sdhci_acpi_remove,
467};
468
469module_platform_driver(sdhci_acpi_driver);
470
471MODULE_DESCRIPTION("Secure Digital Host Controller Interface ACPI driver");
472MODULE_AUTHOR("Adrian Hunter");
473MODULE_LICENSE("GPL v2");
474