[ARM] 3847/2: Convert LOMOMO to use struct device for GPIOs
Convert LOMOMO to use struct device * for GPIOs instead of struct locomo_dev. This enables access to the GPIOs from code which is not a locomo device itself (such as audio). Access for gpio 31 is removed for error handling (no such hardware exists). Signed-off-by: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
committed by
Russell King
parent
2dc94310bd
commit
8d48427ecb
@@ -814,12 +814,15 @@ static inline struct locomo *locomo_chip_driver(struct locomo_dev *ldev)
|
|||||||
return (struct locomo *)dev_get_drvdata(ldev->dev.parent);
|
return (struct locomo *)dev_get_drvdata(ldev->dev.parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void locomo_gpio_set_dir(struct locomo_dev *ldev, unsigned int bits, unsigned int dir)
|
void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir)
|
||||||
{
|
{
|
||||||
struct locomo *lchip = locomo_chip_driver(ldev);
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int r;
|
unsigned int r;
|
||||||
|
|
||||||
|
if (!lchip)
|
||||||
|
return;
|
||||||
|
|
||||||
spin_lock_irqsave(&lchip->lock, flags);
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
|
|
||||||
r = locomo_readl(lchip->base + LOCOMO_GPD);
|
r = locomo_readl(lchip->base + LOCOMO_GPD);
|
||||||
@@ -836,12 +839,15 @@ void locomo_gpio_set_dir(struct locomo_dev *ldev, unsigned int bits, unsigned in
|
|||||||
spin_unlock_irqrestore(&lchip->lock, flags);
|
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int locomo_gpio_read_level(struct locomo_dev *ldev, unsigned int bits)
|
int locomo_gpio_read_level(struct device *dev, unsigned int bits)
|
||||||
{
|
{
|
||||||
struct locomo *lchip = locomo_chip_driver(ldev);
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
|
|
||||||
|
if (!lchip)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
spin_lock_irqsave(&lchip->lock, flags);
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
ret = locomo_readl(lchip->base + LOCOMO_GPL);
|
ret = locomo_readl(lchip->base + LOCOMO_GPL);
|
||||||
spin_unlock_irqrestore(&lchip->lock, flags);
|
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||||
@@ -850,12 +856,15 @@ unsigned int locomo_gpio_read_level(struct locomo_dev *ldev, unsigned int bits)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int locomo_gpio_read_output(struct locomo_dev *ldev, unsigned int bits)
|
int locomo_gpio_read_output(struct device *dev, unsigned int bits)
|
||||||
{
|
{
|
||||||
struct locomo *lchip = locomo_chip_driver(ldev);
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
|
|
||||||
|
if (!lchip)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
spin_lock_irqsave(&lchip->lock, flags);
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
ret = locomo_readl(lchip->base + LOCOMO_GPO);
|
ret = locomo_readl(lchip->base + LOCOMO_GPO);
|
||||||
spin_unlock_irqrestore(&lchip->lock, flags);
|
spin_unlock_irqrestore(&lchip->lock, flags);
|
||||||
@@ -864,12 +873,15 @@ unsigned int locomo_gpio_read_output(struct locomo_dev *ldev, unsigned int bits)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void locomo_gpio_write(struct locomo_dev *ldev, unsigned int bits, unsigned int set)
|
void locomo_gpio_write(struct device *dev, unsigned int bits, unsigned int set)
|
||||||
{
|
{
|
||||||
struct locomo *lchip = locomo_chip_driver(ldev);
|
struct locomo *lchip = dev_get_drvdata(dev);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int r;
|
unsigned int r;
|
||||||
|
|
||||||
|
if (!lchip)
|
||||||
|
return;
|
||||||
|
|
||||||
spin_lock_irqsave(&lchip->lock, flags);
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
|
|
||||||
r = locomo_readl(lchip->base + LOCOMO_GPO);
|
r = locomo_readl(lchip->base + LOCOMO_GPO);
|
||||||
@@ -1058,9 +1070,9 @@ void locomo_frontlight_set(struct locomo_dev *dev, int duty, int vr, int bpwf)
|
|||||||
struct locomo *lchip = locomo_chip_driver(dev);
|
struct locomo *lchip = locomo_chip_driver(dev);
|
||||||
|
|
||||||
if (vr)
|
if (vr)
|
||||||
locomo_gpio_write(dev, LOCOMO_GPIO_FL_VR, 1);
|
locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 1);
|
||||||
else
|
else
|
||||||
locomo_gpio_write(dev, LOCOMO_GPIO_FL_VR, 0);
|
locomo_gpio_write(dev->dev.parent, LOCOMO_GPIO_FL_VR, 0);
|
||||||
|
|
||||||
spin_lock_irqsave(&lchip->lock, flags);
|
spin_lock_irqsave(&lchip->lock, flags);
|
||||||
locomo_writel(bpwf, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);
|
locomo_writel(bpwf, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS);
|
||||||
|
@@ -91,30 +91,29 @@ static struct mcp_plat_data collie_mcp_data = {
|
|||||||
/*
|
/*
|
||||||
* low-level UART features.
|
* low-level UART features.
|
||||||
*/
|
*/
|
||||||
static struct locomo_dev *uart_dev = NULL;
|
struct platform_device collie_locomo_device;
|
||||||
|
|
||||||
static void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl)
|
static void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl)
|
||||||
{
|
{
|
||||||
if (!uart_dev) return;
|
|
||||||
|
|
||||||
if (mctrl & TIOCM_RTS)
|
if (mctrl & TIOCM_RTS)
|
||||||
locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 0);
|
locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 0);
|
||||||
else
|
else
|
||||||
locomo_gpio_write(uart_dev, LOCOMO_GPIO_RTS, 1);
|
locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 1);
|
||||||
|
|
||||||
if (mctrl & TIOCM_DTR)
|
if (mctrl & TIOCM_DTR)
|
||||||
locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 0);
|
locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 0);
|
||||||
else
|
else
|
||||||
locomo_gpio_write(uart_dev, LOCOMO_GPIO_DTR, 1);
|
locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u_int collie_uart_get_mctrl(struct uart_port *port)
|
static u_int collie_uart_get_mctrl(struct uart_port *port)
|
||||||
{
|
{
|
||||||
int ret = TIOCM_CD;
|
int ret = TIOCM_CD;
|
||||||
unsigned int r;
|
unsigned int r;
|
||||||
if (!uart_dev) return ret;
|
|
||||||
|
|
||||||
r = locomo_gpio_read_output(uart_dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR);
|
r = locomo_gpio_read_output(&collie_locomo_device.dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR);
|
||||||
|
if (r == -ENODEV)
|
||||||
|
return ret;
|
||||||
if (r & LOCOMO_GPIO_CTS)
|
if (r & LOCOMO_GPIO_CTS)
|
||||||
ret |= TIOCM_CTS;
|
ret |= TIOCM_CTS;
|
||||||
if (r & LOCOMO_GPIO_DSR)
|
if (r & LOCOMO_GPIO_DSR)
|
||||||
@@ -130,13 +129,11 @@ static struct sa1100_port_fns collie_port_fns __initdata = {
|
|||||||
|
|
||||||
static int collie_uart_probe(struct locomo_dev *dev)
|
static int collie_uart_probe(struct locomo_dev *dev)
|
||||||
{
|
{
|
||||||
uart_dev = dev;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int collie_uart_remove(struct locomo_dev *dev)
|
static int collie_uart_remove(struct locomo_dev *dev)
|
||||||
{
|
{
|
||||||
uart_dev = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +167,7 @@ static struct resource locomo_resources[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device locomo_device = {
|
struct platform_device collie_locomo_device = {
|
||||||
.name = "locomo",
|
.name = "locomo",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.num_resources = ARRAY_SIZE(locomo_resources),
|
.num_resources = ARRAY_SIZE(locomo_resources),
|
||||||
@@ -178,7 +175,7 @@ static struct platform_device locomo_device = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device *devices[] __initdata = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&locomo_device,
|
&collie_locomo_device,
|
||||||
&colliescoop_device,
|
&colliescoop_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -33,19 +33,19 @@ static unsigned long locomolcd_flags;
|
|||||||
|
|
||||||
static void locomolcd_on(int comadj)
|
static void locomolcd_on(int comadj)
|
||||||
{
|
{
|
||||||
locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0);
|
locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 0);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 1);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 1);
|
||||||
mdelay(2);
|
mdelay(2);
|
||||||
|
|
||||||
locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0);
|
locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 0);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 1);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 1);
|
||||||
mdelay(2);
|
mdelay(2);
|
||||||
|
|
||||||
locomo_m62332_senddata(locomolcd_dev, comadj, 0);
|
locomo_m62332_senddata(locomolcd_dev, comadj, 0);
|
||||||
mdelay(5);
|
mdelay(5);
|
||||||
|
|
||||||
locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0);
|
locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VEE_ON, 0);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 1);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VEE_ON, 1);
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
|
|
||||||
/* TFTCRST | CPSOUT=0 | CPSEN */
|
/* TFTCRST | CPSOUT=0 | CPSEN */
|
||||||
@@ -58,8 +58,8 @@ static void locomolcd_on(int comadj)
|
|||||||
locomo_writel((0x04 | 0x01), locomolcd_dev->mapbase + LOCOMO_TC);
|
locomo_writel((0x04 | 0x01), locomolcd_dev->mapbase + LOCOMO_TC);
|
||||||
mdelay(10);
|
mdelay(10);
|
||||||
|
|
||||||
locomo_gpio_set_dir(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0);
|
locomo_gpio_set_dir(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_MOD, 0);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 1);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_MOD, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void locomolcd_off(int comadj)
|
static void locomolcd_off(int comadj)
|
||||||
@@ -68,16 +68,16 @@ static void locomolcd_off(int comadj)
|
|||||||
locomo_writel(0x06, locomolcd_dev->mapbase + LOCOMO_TC);
|
locomo_writel(0x06, locomolcd_dev->mapbase + LOCOMO_TC);
|
||||||
mdelay(1);
|
mdelay(1);
|
||||||
|
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHA_ON, 0);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHA_ON, 0);
|
||||||
mdelay(110);
|
mdelay(110);
|
||||||
|
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VEE_ON, 0);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VEE_ON, 0);
|
||||||
mdelay(700);
|
mdelay(700);
|
||||||
|
|
||||||
/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
|
/* TFTCRST=0 | CPSOUT=0 | CPSEN = 0 */
|
||||||
locomo_writel(0, locomolcd_dev->mapbase + LOCOMO_TC);
|
locomo_writel(0, locomolcd_dev->mapbase + LOCOMO_TC);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_MOD, 0);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_MOD, 0);
|
||||||
locomo_gpio_write(locomolcd_dev, LOCOMO_GPIO_LCD_VSHD_ON, 0);
|
locomo_gpio_write(locomolcd_dev->dev.parent, LOCOMO_GPIO_LCD_VSHD_ON, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void locomolcd_power(int on)
|
void locomolcd_power(int on)
|
||||||
@@ -167,14 +167,14 @@ static int locomolcd_resume(struct locomo_dev *dev)
|
|||||||
#define locomolcd_resume NULL
|
#define locomolcd_resume NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int locomolcd_probe(struct locomo_dev *dev)
|
static int locomolcd_probe(struct locomo_dev *ldev)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
locomolcd_dev = dev;
|
locomolcd_dev = ldev;
|
||||||
|
|
||||||
locomo_gpio_set_dir(dev, LOCOMO_GPIO_FL_VR, 0);
|
locomo_gpio_set_dir(ldev->dev.parent, LOCOMO_GPIO_FL_VR, 0);
|
||||||
|
|
||||||
/* the poodle_lcd_power function is called for the first time
|
/* the poodle_lcd_power function is called for the first time
|
||||||
* from fs_initcall, which is before locomo is activated.
|
* from fs_initcall, which is before locomo is activated.
|
||||||
|
@@ -197,10 +197,11 @@ int locomo_driver_register(struct locomo_driver *);
|
|||||||
void locomo_driver_unregister(struct locomo_driver *);
|
void locomo_driver_unregister(struct locomo_driver *);
|
||||||
|
|
||||||
/* GPIO control functions */
|
/* GPIO control functions */
|
||||||
void locomo_gpio_set_dir(struct locomo_dev *ldev, unsigned int bits, unsigned int dir);
|
void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir);
|
||||||
unsigned int locomo_gpio_read_level(struct locomo_dev *ldev, unsigned int bits);
|
int locomo_gpio_read_level(struct device *dev, unsigned int bits);
|
||||||
unsigned int locomo_gpio_read_output(struct locomo_dev *ldev, unsigned int bits);
|
int locomo_gpio_read_output(struct device *dev, unsigned int bits);
|
||||||
void locomo_gpio_write(struct locomo_dev *ldev, unsigned int bits, unsigned int set);
|
void locomo_gpio_write(struct device *dev, unsigned int bits, unsigned int set);
|
||||||
|
|
||||||
|
|
||||||
/* M62332 control function */
|
/* M62332 control function */
|
||||||
void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int channel);
|
void locomo_m62332_senddata(struct locomo_dev *ldev, unsigned int dac_data, int channel);
|
||||||
|
Reference in New Issue
Block a user