162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * linux/arch/arm/mach-omap1/board-sx1-mmc.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
662306a36Sopenharmony_ci * Author: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * This code is based on linux/arch/arm/mach-omap1/board-h2-mmc.c, which is:
962306a36Sopenharmony_ci * Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "hardware.h"
1562306a36Sopenharmony_ci#include "board-sx1.h"
1662306a36Sopenharmony_ci#include "mmc.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_MMC_OMAP)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic int mmc_set_power(struct device *dev, int slot, int power_on,
2162306a36Sopenharmony_ci				int vdd)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	int err;
2462306a36Sopenharmony_ci	u8 dat = 0;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
2762306a36Sopenharmony_ci	if (err < 0)
2862306a36Sopenharmony_ci		return err;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	if (power_on)
3162306a36Sopenharmony_ci		dat |= SOFIA_MMC_POWER;
3262306a36Sopenharmony_ci	else
3362306a36Sopenharmony_ci		dat &= ~SOFIA_MMC_POWER;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci/* Cover switch is at OMAP_MPUIO(3) */
3962306a36Sopenharmony_cistatic struct omap_mmc_platform_data mmc1_data = {
4062306a36Sopenharmony_ci	.nr_slots                       = 1,
4162306a36Sopenharmony_ci	.slots[0]       = {
4262306a36Sopenharmony_ci		.set_power              = mmc_set_power,
4362306a36Sopenharmony_ci		.ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
4462306a36Sopenharmony_ci		.name                   = "mmcblk",
4562306a36Sopenharmony_ci	},
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic struct omap_mmc_platform_data *mmc_data[OMAP15XX_NR_MMC];
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_civoid __init sx1_mmc_init(void)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	mmc_data[0] = &mmc1_data;
5362306a36Sopenharmony_ci	omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#else
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_civoid __init sx1_mmc_init(void)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#endif
63