gpio-pca953x.c revision 6dd599f8af0166805951f4421a78ba716d78321a
1/*
2 *  PCA953x 4/8/16 bit I/O ports
3 *
4 *  Copyright (C) 2005 Ben Gardner <bgardner@wabtec.com>
5 *  Copyright (C) 2007 Marvell International Ltd.
6 *
7 *  Derived from drivers/i2c/chips/pca9539.c
8 *
9 *  This program is free software; you can redistribute it and/or modify
10 *  it under the terms of the GNU General Public License as published by
11 *  the Free Software Foundation; version 2 of the License.
12 */
13
14#include <linux/module.h>
15#include <linux/init.h>
16#include <linux/gpio.h>
17#include <linux/interrupt.h>
18#include <linux/irq.h>
19#include <linux/i2c.h>
20#include <linux/i2c/pca953x.h>
21#include <linux/slab.h>
22#ifdef CONFIG_OF_GPIO
23#include <linux/of_platform.h>
24#include <linux/of_gpio.h>
25#endif
26
27#define PCA953X_INPUT		0
28#define PCA953X_OUTPUT		1
29#define PCA953X_INVERT		2
30#define PCA953X_DIRECTION	3
31
32#define PCA957X_IN		0
33#define PCA957X_INVRT		1
34#define PCA957X_BKEN		2
35#define PCA957X_PUPD		3
36#define PCA957X_CFG		4
37#define PCA957X_OUT		5
38#define PCA957X_MSK		6
39#define PCA957X_INTS		7
40
41#define PCA_GPIO_MASK		0x00FF
42#define PCA_INT			0x0100
43#define PCA953X_TYPE		0x1000
44#define PCA957X_TYPE		0x2000
45
46static const struct i2c_device_id pca953x_id[] = {
47	{ "pca9534", 8  | PCA953X_TYPE | PCA_INT, },
48	{ "pca9535", 16 | PCA953X_TYPE | PCA_INT, },
49	{ "pca9536", 4  | PCA953X_TYPE, },
50	{ "pca9537", 4  | PCA953X_TYPE | PCA_INT, },
51	{ "pca9538", 8  | PCA953X_TYPE | PCA_INT, },
52	{ "pca9539", 16 | PCA953X_TYPE | PCA_INT, },
53	{ "pca9554", 8  | PCA953X_TYPE | PCA_INT, },
54	{ "pca9555", 16 | PCA953X_TYPE | PCA_INT, },
55	{ "pca9556", 8  | PCA953X_TYPE, },
56	{ "pca9557", 8  | PCA953X_TYPE, },
57	{ "pca9574", 8  | PCA957X_TYPE | PCA_INT, },
58	{ "pca9575", 16 | PCA957X_TYPE | PCA_INT, },
59
60	{ "max7310", 8  | PCA953X_TYPE, },
61	{ "max7312", 16 | PCA953X_TYPE | PCA_INT, },
62	{ "max7313", 16 | PCA953X_TYPE | PCA_INT, },
63	{ "max7315", 8  | PCA953X_TYPE | PCA_INT, },
64	{ "pca6107", 8  | PCA953X_TYPE | PCA_INT, },
65	{ "tca6408", 8  | PCA953X_TYPE | PCA_INT, },
66	{ "tca6416", 16 | PCA953X_TYPE | PCA_INT, },
67	/* NYET:  { "tca6424", 24, }, */
68	{ }
69};
70MODULE_DEVICE_TABLE(i2c, pca953x_id);
71
72struct pca953x_chip {
73	unsigned gpio_start;
74	uint16_t reg_output;
75	uint16_t reg_direction;
76	struct mutex i2c_lock;
77
78#ifdef CONFIG_GPIO_PCA953X_IRQ
79	struct mutex irq_lock;
80	uint16_t irq_mask;
81	uint16_t irq_stat;
82	uint16_t irq_trig_raise;
83	uint16_t irq_trig_fall;
84	int	 irq_base;
85#endif
86
87	struct i2c_client *client;
88	struct pca953x_platform_data *dyn_pdata;
89	struct gpio_chip gpio_chip;
90	const char *const *names;
91	int	chip_type;
92};
93
94static int pca953x_write_reg(struct pca953x_chip *chip, int reg, uint16_t val)
95{
96	int ret = 0;
97
98	if (chip->gpio_chip.ngpio <= 8)
99		ret = i2c_smbus_write_byte_data(chip->client, reg, val);
100	else {
101		switch (chip->chip_type) {
102		case PCA953X_TYPE:
103			ret = i2c_smbus_write_word_data(chip->client,
104							reg << 1, val);
105			break;
106		case PCA957X_TYPE:
107			ret = i2c_smbus_write_byte_data(chip->client, reg << 1,
108							val & 0xff);
109			if (ret < 0)
110				break;
111			ret = i2c_smbus_write_byte_data(chip->client,
112							(reg << 1) + 1,
113							(val & 0xff00) >> 8);
114			break;
115		}
116	}
117
118	if (ret < 0) {
119		dev_err(&chip->client->dev, "failed writing register\n");
120		return ret;
121	}
122
123	return 0;
124}
125
126static int pca953x_read_reg(struct pca953x_chip *chip, int reg, uint16_t *val)
127{
128	int ret;
129
130	if (chip->gpio_chip.ngpio <= 8)
131		ret = i2c_smbus_read_byte_data(chip->client, reg);
132	else
133		ret = i2c_smbus_read_word_data(chip->client, reg << 1);
134
135	if (ret < 0) {
136		dev_err(&chip->client->dev, "failed reading register\n");
137		return ret;
138	}
139
140	*val = (uint16_t)ret;
141	return 0;
142}
143
144static int pca953x_gpio_direction_input(struct gpio_chip *gc, unsigned off)
145{
146	struct pca953x_chip *chip;
147	uint16_t reg_val;
148	int ret, offset = 0;
149
150	chip = container_of(gc, struct pca953x_chip, gpio_chip);
151
152	mutex_lock(&chip->i2c_lock);
153	reg_val = chip->reg_direction | (1u << off);
154
155	switch (chip->chip_type) {
156	case PCA953X_TYPE:
157		offset = PCA953X_DIRECTION;
158		break;
159	case PCA957X_TYPE:
160		offset = PCA957X_CFG;
161		break;
162	}
163	ret = pca953x_write_reg(chip, offset, reg_val);
164	if (ret)
165		goto exit;
166
167	chip->reg_direction = reg_val;
168	ret = 0;
169exit:
170	mutex_unlock(&chip->i2c_lock);
171	return ret;
172}
173
174static int pca953x_gpio_direction_output(struct gpio_chip *gc,
175		unsigned off, int val)
176{
177	struct pca953x_chip *chip;
178	uint16_t reg_val;
179	int ret, offset = 0;
180
181	chip = container_of(gc, struct pca953x_chip, gpio_chip);
182
183	mutex_lock(&chip->i2c_lock);
184	/* set output level */
185	if (val)
186		reg_val = chip->reg_output | (1u << off);
187	else
188		reg_val = chip->reg_output & ~(1u << off);
189
190	switch (chip->chip_type) {
191	case PCA953X_TYPE:
192		offset = PCA953X_OUTPUT;
193		break;
194	case PCA957X_TYPE:
195		offset = PCA957X_OUT;
196		break;
197	}
198	ret = pca953x_write_reg(chip, offset, reg_val);
199	if (ret)
200		goto exit;
201
202	chip->reg_output = reg_val;
203
204	/* then direction */
205	reg_val = chip->reg_direction & ~(1u << off);
206	switch (chip->chip_type) {
207	case PCA953X_TYPE:
208		offset = PCA953X_DIRECTION;
209		break;
210	case PCA957X_TYPE:
211		offset = PCA957X_CFG;
212		break;
213	}
214	ret = pca953x_write_reg(chip, offset, reg_val);
215	if (ret)
216		goto exit;
217
218	chip->reg_direction = reg_val;
219	ret = 0;
220exit:
221	mutex_unlock(&chip->i2c_lock);
222	return ret;
223}
224
225static int pca953x_gpio_get_value(struct gpio_chip *gc, unsigned off)
226{
227	struct pca953x_chip *chip;
228	uint16_t reg_val;
229	int ret, offset = 0;
230
231	chip = container_of(gc, struct pca953x_chip, gpio_chip);
232
233	mutex_lock(&chip->i2c_lock);
234	switch (chip->chip_type) {
235	case PCA953X_TYPE:
236		offset = PCA953X_INPUT;
237		break;
238	case PCA957X_TYPE:
239		offset = PCA957X_IN;
240		break;
241	}
242	ret = pca953x_read_reg(chip, offset, &reg_val);
243	mutex_unlock(&chip->i2c_lock);
244	if (ret < 0) {
245		/* NOTE:  diagnostic already emitted; that's all we should
246		 * do unless gpio_*_value_cansleep() calls become different
247		 * from their nonsleeping siblings (and report faults).
248		 */
249		return 0;
250	}
251
252	return (reg_val & (1u << off)) ? 1 : 0;
253}
254
255static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
256{
257	struct pca953x_chip *chip;
258	uint16_t reg_val;
259	int ret, offset = 0;
260
261	chip = container_of(gc, struct pca953x_chip, gpio_chip);
262
263	mutex_lock(&chip->i2c_lock);
264	if (val)
265		reg_val = chip->reg_output | (1u << off);
266	else
267		reg_val = chip->reg_output & ~(1u << off);
268
269	switch (chip->chip_type) {
270	case PCA953X_TYPE:
271		offset = PCA953X_OUTPUT;
272		break;
273	case PCA957X_TYPE:
274		offset = PCA957X_OUT;
275		break;
276	}
277	ret = pca953x_write_reg(chip, offset, reg_val);
278	if (ret)
279		goto exit;
280
281	chip->reg_output = reg_val;
282exit:
283	mutex_unlock(&chip->i2c_lock);
284}
285
286static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
287{
288	struct gpio_chip *gc;
289
290	gc = &chip->gpio_chip;
291
292	gc->direction_input  = pca953x_gpio_direction_input;
293	gc->direction_output = pca953x_gpio_direction_output;
294	gc->get = pca953x_gpio_get_value;
295	gc->set = pca953x_gpio_set_value;
296	gc->can_sleep = 1;
297
298	gc->base = chip->gpio_start;
299	gc->ngpio = gpios;
300	gc->label = chip->client->name;
301	gc->dev = &chip->client->dev;
302	gc->owner = THIS_MODULE;
303	gc->names = chip->names;
304}
305
306#ifdef CONFIG_GPIO_PCA953X_IRQ
307static int pca953x_gpio_to_irq(struct gpio_chip *gc, unsigned off)
308{
309	struct pca953x_chip *chip;
310
311	chip = container_of(gc, struct pca953x_chip, gpio_chip);
312	return chip->irq_base + off;
313}
314
315static void pca953x_irq_mask(struct irq_data *d)
316{
317	struct pca953x_chip *chip = irq_data_get_irq_chip_data(d);
318
319	chip->irq_mask &= ~(1 << (d->irq - chip->irq_base));
320}
321
322static void pca953x_irq_unmask(struct irq_data *d)
323{
324	struct pca953x_chip *chip = irq_data_get_irq_chip_data(d);
325
326	chip->irq_mask |= 1 << (d->irq - chip->irq_base);
327}
328
329static void pca953x_irq_bus_lock(struct irq_data *d)
330{
331	struct pca953x_chip *chip = irq_data_get_irq_chip_data(d);
332
333	mutex_lock(&chip->irq_lock);
334}
335
336static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
337{
338	struct pca953x_chip *chip = irq_data_get_irq_chip_data(d);
339	uint16_t new_irqs;
340	uint16_t level;
341
342	/* Look for any newly setup interrupt */
343	new_irqs = chip->irq_trig_fall | chip->irq_trig_raise;
344	new_irqs &= ~chip->reg_direction;
345
346	while (new_irqs) {
347		level = __ffs(new_irqs);
348		pca953x_gpio_direction_input(&chip->gpio_chip, level);
349		new_irqs &= ~(1 << level);
350	}
351
352	mutex_unlock(&chip->irq_lock);
353}
354
355static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)
356{
357	struct pca953x_chip *chip = irq_data_get_irq_chip_data(d);
358	uint16_t level = d->irq - chip->irq_base;
359	uint16_t mask = 1 << level;
360
361	if (!(type & IRQ_TYPE_EDGE_BOTH)) {
362		dev_err(&chip->client->dev, "irq %d: unsupported type %d\n",
363			d->irq, type);
364		return -EINVAL;
365	}
366
367	if (type & IRQ_TYPE_EDGE_FALLING)
368		chip->irq_trig_fall |= mask;
369	else
370		chip->irq_trig_fall &= ~mask;
371
372	if (type & IRQ_TYPE_EDGE_RISING)
373		chip->irq_trig_raise |= mask;
374	else
375		chip->irq_trig_raise &= ~mask;
376
377	return 0;
378}
379
380static struct irq_chip pca953x_irq_chip = {
381	.name			= "pca953x",
382	.irq_mask		= pca953x_irq_mask,
383	.irq_unmask		= pca953x_irq_unmask,
384	.irq_bus_lock		= pca953x_irq_bus_lock,
385	.irq_bus_sync_unlock	= pca953x_irq_bus_sync_unlock,
386	.irq_set_type		= pca953x_irq_set_type,
387};
388
389static uint16_t pca953x_irq_pending(struct pca953x_chip *chip)
390{
391	uint16_t cur_stat;
392	uint16_t old_stat;
393	uint16_t pending;
394	uint16_t trigger;
395	int ret, offset = 0;
396
397	switch (chip->chip_type) {
398	case PCA953X_TYPE:
399		offset = PCA953X_INPUT;
400		break;
401	case PCA957X_TYPE:
402		offset = PCA957X_IN;
403		break;
404	}
405	ret = pca953x_read_reg(chip, offset, &cur_stat);
406	if (ret)
407		return 0;
408
409	/* Remove output pins from the equation */
410	cur_stat &= chip->reg_direction;
411
412	old_stat = chip->irq_stat;
413	trigger = (cur_stat ^ old_stat) & chip->irq_mask;
414
415	if (!trigger)
416		return 0;
417
418	chip->irq_stat = cur_stat;
419
420	pending = (old_stat & chip->irq_trig_fall) |
421		  (cur_stat & chip->irq_trig_raise);
422	pending &= trigger;
423
424	return pending;
425}
426
427static irqreturn_t pca953x_irq_handler(int irq, void *devid)
428{
429	struct pca953x_chip *chip = devid;
430	uint16_t pending;
431	uint16_t level;
432
433	pending = pca953x_irq_pending(chip);
434
435	if (!pending)
436		return IRQ_HANDLED;
437
438	do {
439		level = __ffs(pending);
440		handle_nested_irq(level + chip->irq_base);
441
442		pending &= ~(1 << level);
443	} while (pending);
444
445	return IRQ_HANDLED;
446}
447
448static int pca953x_irq_setup(struct pca953x_chip *chip,
449			     const struct i2c_device_id *id)
450{
451	struct i2c_client *client = chip->client;
452	struct pca953x_platform_data *pdata = client->dev.platform_data;
453	int ret, offset = 0;
454
455	if (pdata->irq_base != -1
456			&& (id->driver_data & PCA_INT)) {
457		int lvl;
458
459		switch (chip->chip_type) {
460		case PCA953X_TYPE:
461			offset = PCA953X_INPUT;
462			break;
463		case PCA957X_TYPE:
464			offset = PCA957X_IN;
465			break;
466		}
467		ret = pca953x_read_reg(chip, offset, &chip->irq_stat);
468		if (ret)
469			goto out_failed;
470
471		/*
472		 * There is no way to know which GPIO line generated the
473		 * interrupt.  We have to rely on the previous read for
474		 * this purpose.
475		 */
476		chip->irq_stat &= chip->reg_direction;
477		mutex_init(&chip->irq_lock);
478
479		chip->irq_base = irq_alloc_descs(-1, pdata->irq_base, chip->gpio_chip.ngpio, -1);
480		if (chip->irq_base < 0)
481			goto out_failed;
482
483		for (lvl = 0; lvl < chip->gpio_chip.ngpio; lvl++) {
484			int irq = lvl + chip->irq_base;
485
486			irq_clear_status_flags(irq, IRQ_NOREQUEST);
487			irq_set_chip_data(irq, chip);
488			irq_set_chip(irq, &pca953x_irq_chip);
489			irq_set_nested_thread(irq, true);
490#ifdef CONFIG_ARM
491			set_irq_flags(irq, IRQF_VALID);
492#else
493			irq_set_noprobe(irq);
494#endif
495		}
496
497		ret = request_threaded_irq(client->irq,
498					   NULL,
499					   pca953x_irq_handler,
500					   IRQF_TRIGGER_LOW | IRQF_ONESHOT,
501					   dev_name(&client->dev), chip);
502		if (ret) {
503			dev_err(&client->dev, "failed to request irq %d\n",
504				client->irq);
505			goto out_failed;
506		}
507
508		chip->gpio_chip.to_irq = pca953x_gpio_to_irq;
509	}
510
511	return 0;
512
513out_failed:
514	chip->irq_base = -1;
515	return ret;
516}
517
518static void pca953x_irq_teardown(struct pca953x_chip *chip)
519{
520	if (chip->irq_base != -1)
521		free_irq(chip->client->irq, chip);
522}
523#else /* CONFIG_GPIO_PCA953X_IRQ */
524static int pca953x_irq_setup(struct pca953x_chip *chip,
525			     const struct i2c_device_id *id)
526{
527	struct i2c_client *client = chip->client;
528	struct pca953x_platform_data *pdata = client->dev.platform_data;
529
530	if (pdata->irq_base != -1 && (id->driver_data & PCA_INT))
531		dev_warn(&client->dev, "interrupt support not compiled in\n");
532
533	return 0;
534}
535
536static void pca953x_irq_teardown(struct pca953x_chip *chip)
537{
538}
539#endif
540
541/*
542 * Handlers for alternative sources of platform_data
543 */
544#ifdef CONFIG_OF_GPIO
545/*
546 * Translate OpenFirmware node properties into platform_data
547 */
548static struct pca953x_platform_data *
549pca953x_get_alt_pdata(struct i2c_client *client)
550{
551	struct pca953x_platform_data *pdata;
552	struct device_node *node;
553	const __be32 *val;
554	int size;
555
556	node = client->dev.of_node;
557	if (node == NULL)
558		return NULL;
559
560	pdata = kzalloc(sizeof(struct pca953x_platform_data), GFP_KERNEL);
561	if (pdata == NULL) {
562		dev_err(&client->dev, "Unable to allocate platform_data\n");
563		return NULL;
564	}
565
566	pdata->gpio_base = -1;
567	val = of_get_property(node, "linux,gpio-base", &size);
568	if (val) {
569		if (size != sizeof(*val))
570			dev_warn(&client->dev, "%s: wrong linux,gpio-base\n",
571				 node->full_name);
572		else
573			pdata->gpio_base = be32_to_cpup(val);
574	}
575
576	val = of_get_property(node, "polarity", NULL);
577	if (val)
578		pdata->invert = *val;
579
580	return pdata;
581}
582#else
583static struct pca953x_platform_data *
584pca953x_get_alt_pdata(struct i2c_client *client)
585{
586	return NULL;
587}
588#endif
589
590static int __devinit device_pca953x_init(struct pca953x_chip *chip, int invert)
591{
592	int ret;
593
594	ret = pca953x_read_reg(chip, PCA953X_OUTPUT, &chip->reg_output);
595	if (ret)
596		goto out;
597
598	ret = pca953x_read_reg(chip, PCA953X_DIRECTION,
599			       &chip->reg_direction);
600	if (ret)
601		goto out;
602
603	/* set platform specific polarity inversion */
604	ret = pca953x_write_reg(chip, PCA953X_INVERT, invert);
605	if (ret)
606		goto out;
607	return 0;
608out:
609	return ret;
610}
611
612static int __devinit device_pca957x_init(struct pca953x_chip *chip, int invert)
613{
614	int ret;
615	uint16_t val = 0;
616
617	/* Let every port in proper state, that could save power */
618	pca953x_write_reg(chip, PCA957X_PUPD, 0x0);
619	pca953x_write_reg(chip, PCA957X_CFG, 0xffff);
620	pca953x_write_reg(chip, PCA957X_OUT, 0x0);
621
622	ret = pca953x_read_reg(chip, PCA957X_IN, &val);
623	if (ret)
624		goto out;
625	ret = pca953x_read_reg(chip, PCA957X_OUT, &chip->reg_output);
626	if (ret)
627		goto out;
628	ret = pca953x_read_reg(chip, PCA957X_CFG, &chip->reg_direction);
629	if (ret)
630		goto out;
631
632	/* set platform specific polarity inversion */
633	pca953x_write_reg(chip, PCA957X_INVRT, invert);
634
635	/* To enable register 6, 7 to controll pull up and pull down */
636	pca953x_write_reg(chip, PCA957X_BKEN, 0x202);
637
638	return 0;
639out:
640	return ret;
641}
642
643static int __devinit pca953x_probe(struct i2c_client *client,
644				   const struct i2c_device_id *id)
645{
646	struct pca953x_platform_data *pdata;
647	struct pca953x_chip *chip;
648	int ret = 0;
649
650	chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL);
651	if (chip == NULL)
652		return -ENOMEM;
653
654	pdata = client->dev.platform_data;
655	if (pdata == NULL) {
656		pdata = pca953x_get_alt_pdata(client);
657		/*
658		 * Unlike normal platform_data, this is allocated
659		 * dynamically and must be freed in the driver
660		 */
661		chip->dyn_pdata = pdata;
662	}
663
664	if (pdata == NULL) {
665		dev_dbg(&client->dev, "no platform data\n");
666		ret = -EINVAL;
667		goto out_failed;
668	}
669
670	chip->client = client;
671
672	chip->gpio_start = pdata->gpio_base;
673
674	chip->names = pdata->names;
675	chip->chip_type = id->driver_data & (PCA953X_TYPE | PCA957X_TYPE);
676
677	mutex_init(&chip->i2c_lock);
678
679	/* initialize cached registers from their original values.
680	 * we can't share this chip with another i2c master.
681	 */
682	pca953x_setup_gpio(chip, id->driver_data & PCA_GPIO_MASK);
683
684	if (chip->chip_type == PCA953X_TYPE)
685		device_pca953x_init(chip, pdata->invert);
686	else if (chip->chip_type == PCA957X_TYPE)
687		device_pca957x_init(chip, pdata->invert);
688	else
689		goto out_failed;
690
691	ret = pca953x_irq_setup(chip, id);
692	if (ret)
693		goto out_failed;
694
695	ret = gpiochip_add(&chip->gpio_chip);
696	if (ret)
697		goto out_failed_irq;
698
699	if (pdata->setup) {
700		ret = pdata->setup(client, chip->gpio_chip.base,
701				chip->gpio_chip.ngpio, pdata->context);
702		if (ret < 0)
703			dev_warn(&client->dev, "setup failed, %d\n", ret);
704	}
705
706	i2c_set_clientdata(client, chip);
707	return 0;
708
709out_failed_irq:
710	pca953x_irq_teardown(chip);
711out_failed:
712	kfree(chip->dyn_pdata);
713	kfree(chip);
714	return ret;
715}
716
717static int pca953x_remove(struct i2c_client *client)
718{
719	struct pca953x_platform_data *pdata = client->dev.platform_data;
720	struct pca953x_chip *chip = i2c_get_clientdata(client);
721	int ret = 0;
722
723	if (pdata->teardown) {
724		ret = pdata->teardown(client, chip->gpio_chip.base,
725				chip->gpio_chip.ngpio, pdata->context);
726		if (ret < 0) {
727			dev_err(&client->dev, "%s failed, %d\n",
728					"teardown", ret);
729			return ret;
730		}
731	}
732
733	ret = gpiochip_remove(&chip->gpio_chip);
734	if (ret) {
735		dev_err(&client->dev, "%s failed, %d\n",
736				"gpiochip_remove()", ret);
737		return ret;
738	}
739
740	pca953x_irq_teardown(chip);
741	kfree(chip->dyn_pdata);
742	kfree(chip);
743	return 0;
744}
745
746static struct i2c_driver pca953x_driver = {
747	.driver = {
748		.name	= "pca953x",
749	},
750	.probe		= pca953x_probe,
751	.remove		= pca953x_remove,
752	.id_table	= pca953x_id,
753};
754
755static int __init pca953x_init(void)
756{
757	return i2c_add_driver(&pca953x_driver);
758}
759/* register after i2c postcore initcall and before
760 * subsys initcalls that may rely on these GPIOs
761 */
762subsys_initcall(pca953x_init);
763
764static void __exit pca953x_exit(void)
765{
766	i2c_del_driver(&pca953x_driver);
767}
768module_exit(pca953x_exit);
769
770MODULE_AUTHOR("eric miao <eric.miao@marvell.com>");
771MODULE_DESCRIPTION("GPIO expander driver for PCA953x");
772MODULE_LICENSE("GPL");
773