2 * Support for the Extra GPIOs on the Sharp SL-C1000 (Akita)
3 * (uses a Maxim MAX7310 8 Port IO Expander)
5 * Copyright 2005 Openedhand Ltd.
7 * Author: Richard Purdie <richard@openedhand.com>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/platform_device.h>
18 #include <linux/module.h>
19 #include <linux/i2c.h>
20 #include <linux/slab.h>
21 #include <linux/workqueue.h>
22 #include <asm/arch/akita.h>
24 /* MAX7310 Regiser Map */
25 #define MAX7310_INPUT 0x00
26 #define MAX7310_OUTPUT 0x01
27 #define MAX7310_POLINV 0x02
28 #define MAX7310_IODIR 0x03 /* 1 = Input, 0 = Output */
29 #define MAX7310_TIMEOUT 0x04
31 /* Addresses to scan */
32 static unsigned short normal_i2c
[] = { 0x18, I2C_CLIENT_END
};
37 static int max7310_write(struct i2c_client
*client
, int address
, int data
);
38 static struct i2c_client max7310_template
;
39 static void akita_ioexp_work(struct work_struct
*private_
);
41 static struct device
*akita_ioexp_device
;
42 static unsigned char ioexp_output_value
= AKITA_IOEXP_IO_OUT
;
43 DECLARE_WORK(akita_ioexp
, akita_ioexp_work
);
49 static int max7310_config(struct device
*dev
, int iomode
, int polarity
)
52 struct i2c_client
*client
= to_i2c_client(dev
);
54 ret
= max7310_write(client
, MAX7310_POLINV
, polarity
);
57 ret
= max7310_write(client
, MAX7310_IODIR
, iomode
);
61 static int max7310_set_ouputs(struct device
*dev
, int outputs
)
63 struct i2c_client
*client
= to_i2c_client(dev
);
65 return max7310_write(client
, MAX7310_OUTPUT
, outputs
);
71 static int max7310_write(struct i2c_client
*client
, int address
, int value
)
75 data
[0] = address
& 0xff;
76 data
[1] = value
& 0xff;
78 if (i2c_master_send(client
, data
, 2) == 2)
83 static int max7310_detect(struct i2c_adapter
*adapter
, int address
, int kind
)
85 struct i2c_client
*new_client
;
88 if (!(new_client
= kmalloc(sizeof(struct i2c_client
), GFP_KERNEL
)))
91 max7310_template
.adapter
= adapter
;
92 max7310_template
.addr
= address
;
94 memcpy(new_client
, &max7310_template
, sizeof(struct i2c_client
));
96 if ((err
= i2c_attach_client(new_client
))) {
101 max7310_config(&new_client
->dev
, AKITA_IOEXP_IO_DIR
, 0);
102 akita_ioexp_device
= &new_client
->dev
;
103 schedule_work(&akita_ioexp
);
108 static int max7310_attach_adapter(struct i2c_adapter
*adapter
)
110 return i2c_probe(adapter
, &addr_data
, max7310_detect
);
113 static int max7310_detach_client(struct i2c_client
*client
)
117 akita_ioexp_device
= NULL
;
119 if ((err
= i2c_detach_client(client
)))
126 static struct i2c_driver max7310_i2c_driver
= {
128 .name
= "akita-max7310",
130 .id
= I2C_DRIVERID_AKITAIOEXP
,
131 .attach_adapter
= max7310_attach_adapter
,
132 .detach_client
= max7310_detach_client
,
135 static struct i2c_client max7310_template
= {
136 name
: "akita-max7310",
137 driver
: &max7310_i2c_driver
,
140 void akita_set_ioexp(struct device
*dev
, unsigned char bit
)
142 ioexp_output_value
|= bit
;
144 if (akita_ioexp_device
)
145 schedule_work(&akita_ioexp
);
149 void akita_reset_ioexp(struct device
*dev
, unsigned char bit
)
151 ioexp_output_value
&= ~bit
;
153 if (akita_ioexp_device
)
154 schedule_work(&akita_ioexp
);
158 EXPORT_SYMBOL(akita_set_ioexp
);
159 EXPORT_SYMBOL(akita_reset_ioexp
);
161 static void akita_ioexp_work(struct work_struct
*private_
)
163 if (akita_ioexp_device
)
164 max7310_set_ouputs(akita_ioexp_device
, ioexp_output_value
);
169 static int akita_ioexp_suspend(struct platform_device
*pdev
, pm_message_t state
)
171 flush_scheduled_work();
175 static int akita_ioexp_resume(struct platform_device
*pdev
)
177 schedule_work(&akita_ioexp
);
181 #define akita_ioexp_suspend NULL
182 #define akita_ioexp_resume NULL
185 static int __init
akita_ioexp_probe(struct platform_device
*pdev
)
187 return i2c_add_driver(&max7310_i2c_driver
);
190 static int akita_ioexp_remove(struct platform_device
*pdev
)
192 i2c_del_driver(&max7310_i2c_driver
);
196 static struct platform_driver akita_ioexp_driver
= {
197 .probe
= akita_ioexp_probe
,
198 .remove
= akita_ioexp_remove
,
199 .suspend
= akita_ioexp_suspend
,
200 .resume
= akita_ioexp_resume
,
202 .name
= "akita-ioexp",
206 static int __init
akita_ioexp_init(void)
208 return platform_driver_register(&akita_ioexp_driver
);
211 static void __exit
akita_ioexp_exit(void)
213 platform_driver_unregister(&akita_ioexp_driver
);
216 MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>");
217 MODULE_DESCRIPTION("Akita IO-Expander driver");
218 MODULE_LICENSE("GPL");
220 fs_initcall(akita_ioexp_init
);
221 module_exit(akita_ioexp_exit
);