pca953x.c 8.2 KB
Newer Older
1
/*
2
 *  pca953x.c - 4/8/16 bit I/O ports
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 *  Copyright (C) 2005 Ben Gardner <bgardner@wabtec.com>
 *  Copyright (C) 2007 Marvell International Ltd.
 *
 *  Derived from drivers/i2c/chips/pca9539.c
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License.
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/i2c.h>
17
#include <linux/i2c/pca953x.h>
18 19 20 21
#ifdef CONFIG_OF_GPIO
#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#endif
22 23 24

#include <asm/gpio.h>

25 26 27 28
#define PCA953X_INPUT          0
#define PCA953X_OUTPUT         1
#define PCA953X_INVERT         2
#define PCA953X_DIRECTION      3
29

30
static const struct i2c_device_id pca953x_id[] = {
31 32 33 34 35 36
	{ "pca9534", 8, },
	{ "pca9535", 16, },
	{ "pca9536", 4, },
	{ "pca9537", 4, },
	{ "pca9538", 8, },
	{ "pca9539", 16, },
37
	{ "pca9554", 8, },
38 39
	{ "pca9555", 16, },
	{ "pca9557", 8, },
40

41
	{ "max7310", 8, },
42 43 44 45
	{ "pca6107", 8, },
	{ "tca6408", 8, },
	{ "tca6416", 16, },
	/* NYET:  { "tca6424", 24, }, */
46
	{ }
47
};
48
MODULE_DEVICE_TABLE(i2c, pca953x_id);
49

50
struct pca953x_chip {
51 52 53 54 55
	unsigned gpio_start;
	uint16_t reg_output;
	uint16_t reg_direction;

	struct i2c_client *client;
56
	struct pca953x_platform_data *dyn_pdata;
57
	struct gpio_chip gpio_chip;
58
	char **names;
59 60
};

61
static int pca953x_write_reg(struct pca953x_chip *chip, int reg, uint16_t val)
62
{
63 64 65 66
	int ret;

	if (chip->gpio_chip.ngpio <= 8)
		ret = i2c_smbus_write_byte_data(chip->client, reg, val);
67
	else
68 69 70 71
		ret = i2c_smbus_write_word_data(chip->client, reg << 1, val);

	if (ret < 0) {
		dev_err(&chip->client->dev, "failed writing register\n");
72
		return ret;
73 74 75
	}

	return 0;
76 77
}

78
static int pca953x_read_reg(struct pca953x_chip *chip, int reg, uint16_t *val)
79 80 81
{
	int ret;

82 83 84 85 86
	if (chip->gpio_chip.ngpio <= 8)
		ret = i2c_smbus_read_byte_data(chip->client, reg);
	else
		ret = i2c_smbus_read_word_data(chip->client, reg << 1);

87 88
	if (ret < 0) {
		dev_err(&chip->client->dev, "failed reading register\n");
89
		return ret;
90 91 92 93 94 95
	}

	*val = (uint16_t)ret;
	return 0;
}

96
static int pca953x_gpio_direction_input(struct gpio_chip *gc, unsigned off)
97
{
98
	struct pca953x_chip *chip;
99 100 101
	uint16_t reg_val;
	int ret;

102
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
103 104

	reg_val = chip->reg_direction | (1u << off);
105
	ret = pca953x_write_reg(chip, PCA953X_DIRECTION, reg_val);
106 107 108 109 110 111 112
	if (ret)
		return ret;

	chip->reg_direction = reg_val;
	return 0;
}

113
static int pca953x_gpio_direction_output(struct gpio_chip *gc,
114 115
		unsigned off, int val)
{
116
	struct pca953x_chip *chip;
117 118 119
	uint16_t reg_val;
	int ret;

120
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
121 122 123 124 125 126 127

	/* set output level */
	if (val)
		reg_val = chip->reg_output | (1u << off);
	else
		reg_val = chip->reg_output & ~(1u << off);

128
	ret = pca953x_write_reg(chip, PCA953X_OUTPUT, reg_val);
129 130 131 132 133 134 135
	if (ret)
		return ret;

	chip->reg_output = reg_val;

	/* then direction */
	reg_val = chip->reg_direction & ~(1u << off);
136
	ret = pca953x_write_reg(chip, PCA953X_DIRECTION, reg_val);
137 138 139 140 141 142 143
	if (ret)
		return ret;

	chip->reg_direction = reg_val;
	return 0;
}

144
static int pca953x_gpio_get_value(struct gpio_chip *gc, unsigned off)
145
{
146
	struct pca953x_chip *chip;
147 148 149
	uint16_t reg_val;
	int ret;

150
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
151

152
	ret = pca953x_read_reg(chip, PCA953X_INPUT, &reg_val);
153 154 155 156 157 158 159 160 161 162 163
	if (ret < 0) {
		/* NOTE:  diagnostic already emitted; that's all we should
		 * do unless gpio_*_value_cansleep() calls become different
		 * from their nonsleeping siblings (and report faults).
		 */
		return 0;
	}

	return (reg_val & (1u << off)) ? 1 : 0;
}

164
static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
165
{
166
	struct pca953x_chip *chip;
167 168 169
	uint16_t reg_val;
	int ret;

170
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
171 172 173 174 175 176

	if (val)
		reg_val = chip->reg_output | (1u << off);
	else
		reg_val = chip->reg_output & ~(1u << off);

177
	ret = pca953x_write_reg(chip, PCA953X_OUTPUT, reg_val);
178 179 180 181 182 183
	if (ret)
		return;

	chip->reg_output = reg_val;
}

184
static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
185 186 187 188 189
{
	struct gpio_chip *gc;

	gc = &chip->gpio_chip;

190 191 192 193
	gc->direction_input  = pca953x_gpio_direction_input;
	gc->direction_output = pca953x_gpio_direction_output;
	gc->get = pca953x_gpio_get_value;
	gc->set = pca953x_gpio_set_value;
194
	gc->can_sleep = 1;
195 196

	gc->base = chip->gpio_start;
197 198
	gc->ngpio = gpios;
	gc->label = chip->client->name;
D
David Brownell 已提交
199
	gc->dev = &chip->client->dev;
200
	gc->owner = THIS_MODULE;
201
	gc->names = chip->names;
202 203
}

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
/*
 * Handlers for alternative sources of platform_data
 */
#ifdef CONFIG_OF_GPIO
/*
 * Translate OpenFirmware node properties into platform_data
 */
static struct pca953x_platform_data *
pca953x_get_alt_pdata(struct i2c_client *client)
{
	struct pca953x_platform_data *pdata;
	struct device_node *node;
	const uint16_t *val;

	node = dev_archdata_get_node(&client->dev.archdata);
	if (node == NULL)
		return NULL;

	pdata = kzalloc(sizeof(struct pca953x_platform_data), GFP_KERNEL);
	if (pdata == NULL) {
		dev_err(&client->dev, "Unable to allocate platform_data\n");
		return NULL;
	}

	pdata->gpio_base = -1;
	val = of_get_property(node, "linux,gpio-base", NULL);
	if (val) {
		if (*val < 0)
			dev_warn(&client->dev,
				 "invalid gpio-base in device tree\n");
		else
			pdata->gpio_base = *val;
	}

	val = of_get_property(node, "polarity", NULL);
	if (val)
		pdata->invert = *val;

	return pdata;
}
#else
static struct pca953x_platform_data *
pca953x_get_alt_pdata(struct i2c_client *client)
{
	return NULL;
}
#endif

252
static int __devinit pca953x_probe(struct i2c_client *client,
253
				   const struct i2c_device_id *id)
254
{
255 256
	struct pca953x_platform_data *pdata;
	struct pca953x_chip *chip;
257
	int ret;
258

259 260 261 262
	chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL);
	if (chip == NULL)
		return -ENOMEM;

263
	pdata = client->dev.platform_data;
264
	if (pdata == NULL) {
265 266 267 268 269 270
		pdata = pca953x_get_alt_pdata(client);
		/*
		 * Unlike normal platform_data, this is allocated
		 * dynamically and must be freed in the driver
		 */
		chip->dyn_pdata = pdata;
271
	}
272

273 274 275 276 277
	if (pdata == NULL) {
		dev_dbg(&client->dev, "no platform data\n");
		ret = -EINVAL;
		goto out_failed;
	}
278 279 280 281 282

	chip->client = client;

	chip->gpio_start = pdata->gpio_base;

283 284
	chip->names = pdata->names;

285 286 287
	/* initialize cached registers from their original values.
	 * we can't share this chip with another i2c master.
	 */
288 289
	pca953x_setup_gpio(chip, id->driver_data);

290
	ret = pca953x_read_reg(chip, PCA953X_OUTPUT, &chip->reg_output);
291 292 293
	if (ret)
		goto out_failed;

294
	ret = pca953x_read_reg(chip, PCA953X_DIRECTION, &chip->reg_direction);
295 296 297 298
	if (ret)
		goto out_failed;

	/* set platform specific polarity inversion */
299
	ret = pca953x_write_reg(chip, PCA953X_INVERT, pdata->invert);
300 301 302
	if (ret)
		goto out_failed;

303 304

	ret = gpiochip_add(&chip->gpio_chip);
305 306 307 308 309 310 311 312 313 314 315 316 317 318
	if (ret)
		goto out_failed;

	if (pdata->setup) {
		ret = pdata->setup(client, chip->gpio_chip.base,
				chip->gpio_chip.ngpio, pdata->context);
		if (ret < 0)
			dev_warn(&client->dev, "setup failed, %d\n", ret);
	}

	i2c_set_clientdata(client, chip);
	return 0;

out_failed:
319
	kfree(chip->dyn_pdata);
320 321 322 323
	kfree(chip);
	return ret;
}

324
static int pca953x_remove(struct i2c_client *client)
325
{
326 327
	struct pca953x_platform_data *pdata = client->dev.platform_data;
	struct pca953x_chip *chip = i2c_get_clientdata(client);
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
	int ret = 0;

	if (pdata->teardown) {
		ret = pdata->teardown(client, chip->gpio_chip.base,
				chip->gpio_chip.ngpio, pdata->context);
		if (ret < 0) {
			dev_err(&client->dev, "%s failed, %d\n",
					"teardown", ret);
			return ret;
		}
	}

	ret = gpiochip_remove(&chip->gpio_chip);
	if (ret) {
		dev_err(&client->dev, "%s failed, %d\n",
				"gpiochip_remove()", ret);
		return ret;
	}

347
	kfree(chip->dyn_pdata);
348 349 350 351
	kfree(chip);
	return 0;
}

352
static struct i2c_driver pca953x_driver = {
353
	.driver = {
354
		.name	= "pca953x",
355
	},
356 357
	.probe		= pca953x_probe,
	.remove		= pca953x_remove,
358
	.id_table	= pca953x_id,
359 360
};

361
static int __init pca953x_init(void)
362
{
363
	return i2c_add_driver(&pca953x_driver);
364
}
365 366 367 368
/* register after i2c postcore initcall and before
 * subsys initcalls that may rely on these GPIOs
 */
subsys_initcall(pca953x_init);
369

370
static void __exit pca953x_exit(void)
371
{
372
	i2c_del_driver(&pca953x_driver);
373
}
374
module_exit(pca953x_exit);
375 376

MODULE_AUTHOR("eric miao <eric.miao@marvell.com>");
377
MODULE_DESCRIPTION("GPIO expander driver for PCA953x");
378
MODULE_LICENSE("GPL");