xref: /OK3568_Linux_fs/kernel/arch/arm/mach-omap1/board-h2-mmc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/arch/arm/mach-omap1/board-h2-mmc.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
6*4882a593Smuzhiyun  * Author: Felipe Balbi <felipe.lima@indt.org.br>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * This code is based on linux/arch/arm/mach-omap2/board-n800-mmc.c, which is:
9*4882a593Smuzhiyun  * Copyright (C) 2006 Nokia Corporation
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun #include <linux/gpio.h>
12*4882a593Smuzhiyun #include <linux/platform_device.h>
13*4882a593Smuzhiyun #include <linux/platform_data/gpio-omap.h>
14*4882a593Smuzhiyun #include <linux/mfd/tps65010.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include "board-h2.h"
17*4882a593Smuzhiyun #include "mmc.h"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_MMC_OMAP)
20*4882a593Smuzhiyun 
mmc_set_power(struct device * dev,int slot,int power_on,int vdd)21*4882a593Smuzhiyun static int mmc_set_power(struct device *dev, int slot, int power_on,
22*4882a593Smuzhiyun 				int vdd)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun 	gpio_set_value(H2_TPS_GPIO_MMC_PWR_EN, power_on);
25*4882a593Smuzhiyun 	return 0;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
mmc_late_init(struct device * dev)28*4882a593Smuzhiyun static int mmc_late_init(struct device *dev)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	int ret = gpio_request(H2_TPS_GPIO_MMC_PWR_EN, "MMC power");
31*4882a593Smuzhiyun 	if (ret < 0)
32*4882a593Smuzhiyun 		return ret;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	return ret;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun 
mmc_cleanup(struct device * dev)39*4882a593Smuzhiyun static void mmc_cleanup(struct device *dev)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	gpio_free(H2_TPS_GPIO_MMC_PWR_EN);
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun  * H2 could use the following functions tested:
46*4882a593Smuzhiyun  * - mmc_get_cover_state that uses OMAP_MPUIO(1)
47*4882a593Smuzhiyun  * - mmc_get_wp that uses OMAP_MPUIO(3)
48*4882a593Smuzhiyun  */
49*4882a593Smuzhiyun static struct omap_mmc_platform_data mmc1_data = {
50*4882a593Smuzhiyun 	.nr_slots                       = 1,
51*4882a593Smuzhiyun 	.init				= mmc_late_init,
52*4882a593Smuzhiyun 	.cleanup			= mmc_cleanup,
53*4882a593Smuzhiyun 	.slots[0]       = {
54*4882a593Smuzhiyun 		.set_power              = mmc_set_power,
55*4882a593Smuzhiyun 		.ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
56*4882a593Smuzhiyun 		.name                   = "mmcblk",
57*4882a593Smuzhiyun 	},
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun static struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];
61*4882a593Smuzhiyun 
h2_mmc_init(void)62*4882a593Smuzhiyun void __init h2_mmc_init(void)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	mmc_data[0] = &mmc1_data;
65*4882a593Smuzhiyun 	omap1_init_mmc(mmc_data, OMAP16XX_NR_MMC);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #else
69*4882a593Smuzhiyun 
h2_mmc_init(void)70*4882a593Smuzhiyun void __init h2_mmc_init(void)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #endif
75