• Home
  • Raw
  • Download

Lines Matching +full:data +full:- +full:addr

2  * GPIO driver for Fintek Super-I/O F71869, F71869A, F71882, F71889 and F81866
4 * Copyright (C) 2010-2013 LaCie
21 #define DRVNAME "gpio-f7188x"
24 * Super-I/O registers
32 #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */
33 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */
55 int addr; member
62 struct f7188x_gpio_data *data; member
72 * Super-I/O functions.
104 return -EBUSY; in superio_enter()
160 /* Output mode register (0:open drain 1:push-pull). */
230 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_get_direction()
233 err = superio_enter(sio->addr); in f7188x_gpio_get_direction()
236 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_get_direction()
238 dir = superio_inb(sio->addr, gpio_dir(bank->regbase)); in f7188x_gpio_get_direction()
240 superio_exit(sio->addr); in f7188x_gpio_get_direction()
249 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_direction_in()
252 err = superio_enter(sio->addr); in f7188x_gpio_direction_in()
255 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_direction_in()
257 dir = superio_inb(sio->addr, gpio_dir(bank->regbase)); in f7188x_gpio_direction_in()
259 superio_outb(sio->addr, gpio_dir(bank->regbase), dir); in f7188x_gpio_direction_in()
261 superio_exit(sio->addr); in f7188x_gpio_direction_in()
270 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_get()
271 u8 dir, data; in f7188x_gpio_get() local
273 err = superio_enter(sio->addr); in f7188x_gpio_get()
276 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_get()
278 dir = superio_inb(sio->addr, gpio_dir(bank->regbase)); in f7188x_gpio_get()
281 data = superio_inb(sio->addr, gpio_data_out(bank->regbase)); in f7188x_gpio_get()
283 data = superio_inb(sio->addr, gpio_data_in(bank->regbase)); in f7188x_gpio_get()
285 superio_exit(sio->addr); in f7188x_gpio_get()
287 return !!(data & BIT(offset)); in f7188x_gpio_get()
295 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_direction_out()
298 err = superio_enter(sio->addr); in f7188x_gpio_direction_out()
301 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_direction_out()
303 data_out = superio_inb(sio->addr, gpio_data_out(bank->regbase)); in f7188x_gpio_direction_out()
308 superio_outb(sio->addr, gpio_data_out(bank->regbase), data_out); in f7188x_gpio_direction_out()
310 dir = superio_inb(sio->addr, gpio_dir(bank->regbase)); in f7188x_gpio_direction_out()
312 superio_outb(sio->addr, gpio_dir(bank->regbase), dir); in f7188x_gpio_direction_out()
314 superio_exit(sio->addr); in f7188x_gpio_direction_out()
323 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_set()
326 err = superio_enter(sio->addr); in f7188x_gpio_set()
329 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_set()
331 data_out = superio_inb(sio->addr, gpio_data_out(bank->regbase)); in f7188x_gpio_set()
336 superio_outb(sio->addr, gpio_data_out(bank->regbase), data_out); in f7188x_gpio_set()
338 superio_exit(sio->addr); in f7188x_gpio_set()
347 struct f7188x_sio *sio = bank->data->sio; in f7188x_gpio_set_config()
348 u8 data; in f7188x_gpio_set_config() local
352 return -ENOTSUPP; in f7188x_gpio_set_config()
354 err = superio_enter(sio->addr); in f7188x_gpio_set_config()
357 superio_select(sio->addr, SIO_LD_GPIO); in f7188x_gpio_set_config()
359 data = superio_inb(sio->addr, gpio_out_mode(bank->regbase)); in f7188x_gpio_set_config()
361 data &= ~BIT(offset); in f7188x_gpio_set_config()
363 data |= BIT(offset); in f7188x_gpio_set_config()
364 superio_outb(sio->addr, gpio_out_mode(bank->regbase), data); in f7188x_gpio_set_config()
366 superio_exit(sio->addr); in f7188x_gpio_set_config()
378 struct f7188x_sio *sio = dev_get_platdata(&pdev->dev); in f7188x_gpio_probe()
379 struct f7188x_gpio_data *data; in f7188x_gpio_probe() local
381 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in f7188x_gpio_probe()
382 if (!data) in f7188x_gpio_probe()
383 return -ENOMEM; in f7188x_gpio_probe()
385 switch (sio->type) { in f7188x_gpio_probe()
387 data->nr_bank = ARRAY_SIZE(f71869_gpio_bank); in f7188x_gpio_probe()
388 data->bank = f71869_gpio_bank; in f7188x_gpio_probe()
391 data->nr_bank = ARRAY_SIZE(f71869a_gpio_bank); in f7188x_gpio_probe()
392 data->bank = f71869a_gpio_bank; in f7188x_gpio_probe()
395 data->nr_bank = ARRAY_SIZE(f71882_gpio_bank); in f7188x_gpio_probe()
396 data->bank = f71882_gpio_bank; in f7188x_gpio_probe()
399 data->nr_bank = ARRAY_SIZE(f71889a_gpio_bank); in f7188x_gpio_probe()
400 data->bank = f71889a_gpio_bank; in f7188x_gpio_probe()
403 data->nr_bank = ARRAY_SIZE(f71889_gpio_bank); in f7188x_gpio_probe()
404 data->bank = f71889_gpio_bank; in f7188x_gpio_probe()
407 data->nr_bank = ARRAY_SIZE(f81866_gpio_bank); in f7188x_gpio_probe()
408 data->bank = f81866_gpio_bank; in f7188x_gpio_probe()
411 return -ENODEV; in f7188x_gpio_probe()
413 data->sio = sio; in f7188x_gpio_probe()
415 platform_set_drvdata(pdev, data); in f7188x_gpio_probe()
418 for (i = 0; i < data->nr_bank; i++) { in f7188x_gpio_probe()
419 struct f7188x_gpio_bank *bank = &data->bank[i]; in f7188x_gpio_probe()
421 bank->chip.parent = &pdev->dev; in f7188x_gpio_probe()
422 bank->data = data; in f7188x_gpio_probe()
424 err = devm_gpiochip_add_data(&pdev->dev, &bank->chip, bank); in f7188x_gpio_probe()
426 dev_err(&pdev->dev, in f7188x_gpio_probe()
436 static int __init f7188x_find(int addr, struct f7188x_sio *sio) in f7188x_find() argument
441 err = superio_enter(addr); in f7188x_find()
445 err = -ENODEV; in f7188x_find()
446 devid = superio_inw(addr, SIO_MANID); in f7188x_find()
448 pr_debug(DRVNAME ": Not a Fintek device at 0x%08x\n", addr); in f7188x_find()
452 devid = superio_inw(addr, SIO_DEVID); in f7188x_find()
455 sio->type = f71869; in f7188x_find()
458 sio->type = f71869a; in f7188x_find()
461 sio->type = f71882fg; in f7188x_find()
464 sio->type = f71889a; in f7188x_find()
467 sio->type = f71889f; in f7188x_find()
470 sio->type = f81866; in f7188x_find()
476 sio->addr = addr; in f7188x_find()
480 f7188x_names[sio->type], in f7188x_find()
481 (unsigned int) addr, in f7188x_find()
482 (int) superio_inb(addr, SIO_DEVREV)); in f7188x_find()
485 superio_exit(addr); in f7188x_find()
496 f7188x_gpio_pdev = platform_device_alloc(DRVNAME, -1); in f7188x_gpio_device_add()
498 return -ENOMEM; in f7188x_gpio_device_add()
503 pr_err(DRVNAME "Platform data allocation failed\n"); in f7188x_gpio_device_add()
522 * Try to match a supported Fintek device by reading the (hard-wired)
541 return -ENODEV; in f7188x_gpio_init()
561 MODULE_DESCRIPTION("GPIO driver for Super-I/O chips F71869, F71869A, F71882FG, F71889A, F71889F and…