Commit 8c1bc04e authored by David Brownell's avatar David Brownell Committed by Linus Torvalds

[PATCH] fix more workqueue build breakage (tps65010)

More fixes to build breakage from the work_struct changes ...  this updates
the tps65010 driver.  Plus, fix some dependencies related to the way it's
used on the OMAP OSK: force static linking there, since the resulting
kernel can't link.

NOTE that until the i2c core gets fixed to work without SMBUS_QUICK,
kernels needing this driver must still use "tps65010.force=0,0x48" on the
command line.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 05b3e0c2
...@@ -43,6 +43,7 @@ config MACH_OMAP_H3 ...@@ -43,6 +43,7 @@ config MACH_OMAP_H3
config MACH_OMAP_OSK config MACH_OMAP_OSK
bool "TI OSK Support" bool "TI OSK Support"
depends on ARCH_OMAP1 && ARCH_OMAP16XX depends on ARCH_OMAP1 && ARCH_OMAP16XX
select TPS65010
help help
TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here
if you have such a board. if you have such a board.
......
...@@ -82,7 +82,7 @@ struct tps65010 { ...@@ -82,7 +82,7 @@ struct tps65010 {
struct i2c_client client; struct i2c_client client;
struct mutex lock; struct mutex lock;
int irq; int irq;
struct work_struct work; struct delayed_work work;
struct dentry *file; struct dentry *file;
unsigned charging:1; unsigned charging:1;
unsigned por:1; unsigned por:1;
...@@ -328,7 +328,7 @@ static void tps65010_interrupt(struct tps65010 *tps) ...@@ -328,7 +328,7 @@ static void tps65010_interrupt(struct tps65010 *tps)
{ {
u8 tmp = 0, mask, poll; u8 tmp = 0, mask, poll;
/* IRQs won't trigger irqs for certain events, but we can get /* IRQs won't trigger for certain events, but we can get
* others by polling (normally, with external power applied). * others by polling (normally, with external power applied).
*/ */
poll = 0; poll = 0;
...@@ -411,10 +411,11 @@ static void tps65010_interrupt(struct tps65010 *tps) ...@@ -411,10 +411,11 @@ static void tps65010_interrupt(struct tps65010 *tps)
} }
/* handle IRQs and polling using keventd for now */ /* handle IRQs and polling using keventd for now */
static void tps65010_work(void *_tps) static void tps65010_work(struct work_struct *work)
{ {
struct tps65010 *tps = _tps; struct tps65010 *tps;
tps = container_of(work, struct tps65010, work.work);
mutex_lock(&tps->lock); mutex_lock(&tps->lock);
tps65010_interrupt(tps); tps65010_interrupt(tps);
...@@ -452,7 +453,7 @@ static irqreturn_t tps65010_irq(int irq, void *_tps) ...@@ -452,7 +453,7 @@ static irqreturn_t tps65010_irq(int irq, void *_tps)
disable_irq_nosync(irq); disable_irq_nosync(irq);
set_bit(FLAG_IRQ_ENABLE, &tps->flags); set_bit(FLAG_IRQ_ENABLE, &tps->flags);
(void) schedule_work(&tps->work); (void) schedule_work(&tps->work.work);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -465,13 +466,15 @@ static int __exit tps65010_detach_client(struct i2c_client *client) ...@@ -465,13 +466,15 @@ static int __exit tps65010_detach_client(struct i2c_client *client)
struct tps65010 *tps; struct tps65010 *tps;
tps = container_of(client, struct tps65010, client); tps = container_of(client, struct tps65010, client);
free_irq(tps->irq, tps);
#ifdef CONFIG_ARM #ifdef CONFIG_ARM
if (machine_is_omap_h2()) if (machine_is_omap_h2())
omap_free_gpio(58); omap_free_gpio(58);
if (machine_is_omap_osk()) if (machine_is_omap_osk())
omap_free_gpio(OMAP_MPUIO(1)); omap_free_gpio(OMAP_MPUIO(1));
#endif #endif
free_irq(tps->irq, tps); cancel_delayed_work(&tps->work);
flush_scheduled_work();
debugfs_remove(tps->file); debugfs_remove(tps->file);
if (i2c_detach_client(client) == 0) if (i2c_detach_client(client) == 0)
kfree(tps); kfree(tps);
...@@ -505,7 +508,7 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind) ...@@ -505,7 +508,7 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind)
return 0; return 0;
mutex_init(&tps->lock); mutex_init(&tps->lock);
INIT_WORK(&tps->work, tps65010_work, tps); INIT_DELAYED_WORK(&tps->work, tps65010_work);
tps->irq = -1; tps->irq = -1;
tps->client.addr = address; tps->client.addr = address;
tps->client.adapter = bus; tps->client.adapter = bus;
...@@ -620,7 +623,7 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind) ...@@ -620,7 +623,7 @@ tps65010_probe(struct i2c_adapter *bus, int address, int kind)
(void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK3, 0x0f (void) i2c_smbus_write_byte_data(&tps->client, TPS_MASK3, 0x0f
| i2c_smbus_read_byte_data(&tps->client, TPS_MASK3)); | i2c_smbus_read_byte_data(&tps->client, TPS_MASK3));
tps65010_work(tps); tps65010_work(&tps->work.work);
tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL, tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL,
tps, DEBUG_FOPS); tps, DEBUG_FOPS);
...@@ -672,7 +675,7 @@ int tps65010_set_vbus_draw(unsigned mA) ...@@ -672,7 +675,7 @@ int tps65010_set_vbus_draw(unsigned mA)
&& test_and_set_bit( && test_and_set_bit(
FLAG_VBUS_CHANGED, &the_tps->flags)) { FLAG_VBUS_CHANGED, &the_tps->flags)) {
/* gadget drivers call this in_irq() */ /* gadget drivers call this in_irq() */
(void) schedule_work(&the_tps->work); (void) schedule_work(&the_tps->work.work);
} }
local_irq_restore(flags); local_irq_restore(flags);
......
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