Commit 8d48427e authored by Richard Purdie's avatar Richard Purdie Committed by Russell King

[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: default avatarRichard Purdie <rpurdie@rpsys.net>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 2dc94310
...@@ -814,12 +814,15 @@ static inline struct locomo *locomo_chip_driver(struct locomo_dev *ldev) ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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 = { ...@@ -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[] = { ...@@ -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 = { ...@@ -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; ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 *); ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment