Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88660351 authored by Richard Purdie's avatar Richard Purdie Committed by Russell King
Browse files

[ARM] 3561/1: Poodle: Correct the MMC/SD power control



Patch from Richard Purdie

Correct the Poodle power control for the MMC/SD port. Also
add write protection switch support.

Signed-off-by: default avatarRichard Purdie <rpurdie@rpsys.net>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 74617fb6
Loading
Loading
Loading
Loading
+18 −4
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/fb.h>
#include <linux/pm.h>
#include <linux/pm.h>
#include <linux/delay.h>


#include <asm/hardware.h>
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach-types.h>
@@ -143,7 +144,9 @@ static int poodle_mci_init(struct device *dev, irqreturn_t (*poodle_detect_int)(
	pxa_gpio_mode(GPIO6_MMCCLK_MD);
	pxa_gpio_mode(GPIO6_MMCCLK_MD);
	pxa_gpio_mode(GPIO8_MMCCS0_MD);
	pxa_gpio_mode(GPIO8_MMCCS0_MD);
	pxa_gpio_mode(POODLE_GPIO_nSD_DETECT | GPIO_IN);
	pxa_gpio_mode(POODLE_GPIO_nSD_DETECT | GPIO_IN);
	pxa_gpio_mode(POODLE_GPIO_nSD_WP | GPIO_IN);
	pxa_gpio_mode(POODLE_GPIO_SD_PWR | GPIO_OUT);
	pxa_gpio_mode(POODLE_GPIO_SD_PWR | GPIO_OUT);
	pxa_gpio_mode(POODLE_GPIO_SD_PWR1 | GPIO_OUT);


	poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250);
	poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250);


@@ -162,12 +165,22 @@ static void poodle_mci_setpower(struct device *dev, unsigned int vdd)
{
{
	struct pxamci_platform_data* p_d = dev->platform_data;
	struct pxamci_platform_data* p_d = dev->platform_data;


	if (( 1 << vdd) & p_d->ocr_mask)
	if (( 1 << vdd) & p_d->ocr_mask) {
		GPSR1 = GPIO_bit(POODLE_GPIO_SD_PWR);
		GPSR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR);
	else
		mdelay(2);
		GPCR1 = GPIO_bit(POODLE_GPIO_SD_PWR);
		GPSR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1);
	} else {
		GPCR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1);
		GPCR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR);
	}
}

static int poodle_mci_get_ro(struct device *dev)
{
	return GPLR(POODLE_GPIO_nSD_WP) & GPIO_bit(POODLE_GPIO_nSD_WP);
}
}



static void poodle_mci_exit(struct device *dev, void *data)
static void poodle_mci_exit(struct device *dev, void *data)
{
{
	free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data);
	free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data);
@@ -176,6 +189,7 @@ static void poodle_mci_exit(struct device *dev, void *data)
static struct pxamci_platform_data poodle_mci_platform_data = {
static struct pxamci_platform_data poodle_mci_platform_data = {
	.ocr_mask	= MMC_VDD_32_33|MMC_VDD_33_34,
	.ocr_mask	= MMC_VDD_32_33|MMC_VDD_33_34,
	.init 		= poodle_mci_init,
	.init 		= poodle_mci_init,
	.get_ro		= poodle_mci_get_ro,
	.setpower 	= poodle_mci_setpower,
	.setpower 	= poodle_mci_setpower,
	.exit		= poodle_mci_exit,
	.exit		= poodle_mci_exit,
};
};
+2 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
#define POODLE_GPIO_CF_CD		(14)
#define POODLE_GPIO_CF_CD		(14)
#define POODLE_GPIO_CF_STSCHG		(14)
#define POODLE_GPIO_CF_STSCHG		(14)
#define POODLE_GPIO_SD_PWR		(33)
#define POODLE_GPIO_SD_PWR		(33)
#define POODLE_GPIO_SD_PWR1		(3)
#define POODLE_GPIO_nSD_CLK		(6)
#define POODLE_GPIO_nSD_CLK		(6)
#define POODLE_GPIO_nSD_WP		(7)
#define POODLE_GPIO_nSD_WP		(7)
#define POODLE_GPIO_nSD_INT		(8)
#define POODLE_GPIO_nSD_INT		(8)
@@ -42,6 +43,7 @@
#define POODLE_GPIO_BYPASS_ON		(36)
#define POODLE_GPIO_BYPASS_ON		(36)
#define POODLE_GPIO_CHRG_ON		(38)
#define POODLE_GPIO_CHRG_ON		(38)
#define POODLE_GPIO_CHRG_FULL		(16)
#define POODLE_GPIO_CHRG_FULL		(16)
#define POODLE_GPIO_DISCHARGE_ON        (42) /* Enable battery discharge */


/* PXA GPIOs */
/* PXA GPIOs */
#define POODLE_IRQ_GPIO_ON_KEY		IRQ_GPIO(0)
#define POODLE_IRQ_GPIO_ON_KEY		IRQ_GPIO(0)