mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 10:13:57 +08:00
19206b1742
On some Samsung SoCs not all SDHCI controllers have card detect (CD) line. For some embedded designs it is not even needed, because ususally the device (like SDIO flash memory or wifi controller) is permanently wired to the controller. There are also systems which have a card detect line connected to some of the external interrupt lines or the presence of the card depends on some other actions (like enabling a power regulator). This patch adds all required changes to platform support code, so another patch, which extends the driver with support for the new card detection methods can be applied. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> [kgene.kim@samsung.com: minor title and coding-style fixes] [kgene.kim@samsung.com: fix build errors] Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
/* linux/arch/arm/plat-s3c64xx/setup-sdhci-gpio.c
|
|
*
|
|
* Copyright 2008 Simtec Electronics
|
|
* Ben Dooks <ben@simtec.co.uk>
|
|
* http://armlinux.simtec.co.uk/
|
|
*
|
|
* S3C64XX - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/io.h>
|
|
|
|
#include <mach/gpio.h>
|
|
#include <plat/gpio-cfg.h>
|
|
#include <plat/sdhci.h>
|
|
|
|
void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
|
|
{
|
|
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
|
|
unsigned int gpio;
|
|
unsigned int end;
|
|
|
|
end = S3C64XX_GPG(2 + width);
|
|
|
|
/* Set all the necessary GPG pins to special-function 0 */
|
|
for (gpio = S3C64XX_GPG(0); gpio < end; gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
|
|
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
|
|
s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP);
|
|
s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(2));
|
|
}
|
|
}
|
|
|
|
void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
|
|
{
|
|
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
|
|
unsigned int gpio;
|
|
unsigned int end;
|
|
|
|
end = S3C64XX_GPH(2 + width);
|
|
|
|
/* Set all the necessary GPG pins to special-function 0 */
|
|
for (gpio = S3C64XX_GPH(0); gpio < end; gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
|
|
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
|
|
s3c_gpio_setpull(S3C64XX_GPG(6), S3C_GPIO_PULL_UP);
|
|
s3c_gpio_cfgpin(S3C64XX_GPG(6), S3C_GPIO_SFN(3));
|
|
}
|
|
}
|
|
|
|
void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
|
|
{
|
|
unsigned int gpio;
|
|
unsigned int end;
|
|
|
|
end = S3C64XX_GPH(6 + width);
|
|
|
|
/* Set all the necessary GPH pins to special-function 1 */
|
|
for (gpio = S3C64XX_GPH(6); gpio < end; gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
|
|
/* Set all the necessary GPC pins to special-function 1 */
|
|
for (gpio = S3C64XX_GPC(4); gpio < S3C64XX_GPC(6); gpio++) {
|
|
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
|
|
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
|
|
}
|
|
}
|