[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: David 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: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
05b3e0c2c7
commit
8c1bc04e79
@@ -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 {
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
(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)
|
|||||||
&& 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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user