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
	{ "pca9555", 16, },
39
	{ "pca9556", 8, },
40
	{ "pca9557", 8, },
41

42
	{ "max7310", 8, },
A
Alek Du 已提交
43
	{ "max7315", 8, },
44 45 46 47
	{ "pca6107", 8, },
	{ "tca6408", 8, },
	{ "tca6416", 16, },
	/* NYET:  { "tca6424", 24, }, */
48
	{ }
49
};
50
MODULE_DEVICE_TABLE(i2c, pca953x_id);
51

52
struct pca953x_chip {
53 54 55 56 57
	unsigned gpio_start;
	uint16_t reg_output;
	uint16_t reg_direction;

	struct i2c_client *client;
58
	struct pca953x_platform_data *dyn_pdata;
59
	struct gpio_chip gpio_chip;
60
	char **names;
61 62
};

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

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

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

	return 0;
78 79
}

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

84 85 86 87 88
	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);

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

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

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

104
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
105 106

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

	chip->reg_direction = reg_val;
	return 0;
}

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

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

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

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

	chip->reg_output = reg_val;

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

	chip->reg_direction = reg_val;
	return 0;
}

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

152
	chip = container_of(gc, struct pca953x_chip, gpio_chip);
153

154
	ret = pca953x_read_reg(chip, PCA953X_INPUT, &reg_val);
155 156 157 158 159 160 161 162 163 164 165
	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;
}

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

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

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

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

	chip->reg_output = reg_val;
}

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

	gc = &chip->gpio_chip;

192 193 194 195
	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;
196
	gc->can_sleep = 1;
197 198

	gc->base = chip->gpio_start;
199 200
	gc->ngpio = gpios;
	gc->label = chip->client->name;
D
David Brownell 已提交
201
	gc->dev = &chip->client->dev;
202
	gc->owner = THIS_MODULE;
203
	gc->names = chip->names;
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 252 253
/*
 * 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

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

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

265
	pdata = client->dev.platform_data;
266
	if (pdata == NULL) {
267 268 269 270 271 272
		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;
273
	}
274

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

	chip->client = client;

	chip->gpio_start = pdata->gpio_base;

285 286
	chip->names = pdata->names;

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

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

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

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

305 306

	ret = gpiochip_add(&chip->gpio_chip);
307 308 309 310 311 312 313 314 315 316 317 318 319 320
	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:
321
	kfree(chip->dyn_pdata);
322 323 324 325
	kfree(chip);
	return ret;
}

326
static int pca953x_remove(struct i2c_client *client)
327
{
328 329
	struct pca953x_platform_data *pdata = client->dev.platform_data;
	struct pca953x_chip *chip = i2c_get_clientdata(client);
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
	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;
	}

349
	kfree(chip->dyn_pdata);
350 351 352 353
	kfree(chip);
	return 0;
}

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

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

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

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