cregit-Linux how code gets into the kernel

Release 4.14 drivers/gpio/gpio-da9052.c

Directory: drivers/gpio
/*
 * GPIO Driver for Dialog DA9052 PMICs.
 *
 * Copyright(c) 2011 Dialog Semiconductor Ltd.
 *
 * Author: David Dajun Chen <dchen@diasemi.com>
 *
 *  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;  either version 2 of the  License, or (at your
 *  option) any later version.
 *
 */
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/syscalls.h>
#include <linux/seq_file.h>

#include <linux/mfd/da9052/da9052.h>
#include <linux/mfd/da9052/reg.h>
#include <linux/mfd/da9052/pdata.h>


#define DA9052_INPUT				1

#define DA9052_OUTPUT_OPENDRAIN		2

#define DA9052_OUTPUT_PUSHPULL			3


#define DA9052_SUPPLY_VDD_IO1			0


#define DA9052_DEBOUNCING_OFF			0

#define DA9052_DEBOUNCING_ON			1


#define DA9052_OUTPUT_LOWLEVEL			0


#define DA9052_ACTIVE_LOW			0

#define DA9052_ACTIVE_HIGH			1


#define DA9052_GPIO_MAX_PORTS_PER_REGISTER	8

#define DA9052_GPIO_SHIFT_COUNT(no)		(no%8)

#define DA9052_GPIO_MASK_UPPER_NIBBLE		0xF0

#define DA9052_GPIO_MASK_LOWER_NIBBLE		0x0F

#define DA9052_GPIO_NIBBLE_SHIFT		4

#define DA9052_IRQ_GPI0			16

#define DA9052_GPIO_ODD_SHIFT			7

#define DA9052_GPIO_EVEN_SHIFT			3


struct da9052_gpio {
	
struct da9052 *da9052;
	
struct gpio_chip gp;
};


static unsigned char da9052_gpio_port_odd(unsigned offset) { return offset % 2; }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam15100.00%1100.00%
Total15100.00%1100.00%


static int da9052_gpio_get(struct gpio_chip *gc, unsigned offset) { struct da9052_gpio *gpio = gpiochip_get_data(gc); int da9052_port_direction = 0; int ret; ret = da9052_reg_read(gpio->da9052, DA9052_GPIO_0_1_REG + (offset >> 1)); if (ret < 0) return ret; if (da9052_gpio_port_odd(offset)) { da9052_port_direction = ret & DA9052_GPIO_ODD_PORT_PIN; da9052_port_direction >>= 4; } else { da9052_port_direction = ret & DA9052_GPIO_EVEN_PORT_PIN; } switch (da9052_port_direction) { case DA9052_INPUT: if (offset < DA9052_GPIO_MAX_PORTS_PER_REGISTER) ret = da9052_reg_read(gpio->da9052, DA9052_STATUS_C_REG); else ret = da9052_reg_read(gpio->da9052, DA9052_STATUS_D_REG); if (ret < 0) return ret; return !!(ret & (1 << DA9052_GPIO_SHIFT_COUNT(offset))); case DA9052_OUTPUT_PUSHPULL: if (da9052_gpio_port_odd(offset)) return !!(ret & DA9052_GPIO_ODD_PORT_MODE); else return !!(ret & DA9052_GPIO_EVEN_PORT_MODE); default: return -EINVAL; } }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam16992.35%133.33%
Linus Walleij147.65%266.67%
Total183100.00%3100.00%


static void da9052_gpio_set(struct gpio_chip *gc, unsigned offset, int value) { struct da9052_gpio *gpio = gpiochip_get_data(gc); int ret; if (da9052_gpio_port_odd(offset)) { ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_ODD_PORT_MODE, value << DA9052_GPIO_ODD_SHIFT); if (ret != 0) dev_err(gpio->da9052->dev, "Failed to updated gpio odd reg,%d", ret); } else { ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_EVEN_PORT_MODE, value << DA9052_GPIO_EVEN_SHIFT); if (ret != 0) dev_err(gpio->da9052->dev, "Failed to updated gpio even reg,%d", ret); } }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam12599.21%266.67%
Linus Walleij10.79%133.33%
Total126100.00%3100.00%


static int da9052_gpio_direction_input(struct gpio_chip *gc, unsigned offset) { struct da9052_gpio *gpio = gpiochip_get_data(gc); unsigned char register_value; int ret; /* Format: function - 2 bits type - 1 bit mode - 1 bit */ register_value = DA9052_INPUT | DA9052_ACTIVE_LOW << 2 | DA9052_DEBOUNCING_ON << 3; if (da9052_gpio_port_odd(offset)) ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_UPPER_NIBBLE, (register_value << DA9052_GPIO_NIBBLE_SHIFT)); else ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_LOWER_NIBBLE, register_value); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam10099.01%150.00%
Linus Walleij10.99%150.00%
Total101100.00%2100.00%


static int da9052_gpio_direction_output(struct gpio_chip *gc, unsigned offset, int value) { struct da9052_gpio *gpio = gpiochip_get_data(gc); unsigned char register_value; int ret; /* Format: Function - 2 bits Type - 1 bit Mode - 1 bit */ register_value = DA9052_OUTPUT_PUSHPULL | DA9052_SUPPLY_VDD_IO1 << 2 | value << 3; if (da9052_gpio_port_odd(offset)) ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_UPPER_NIBBLE, (register_value << DA9052_GPIO_NIBBLE_SHIFT)); else ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_LOWER_NIBBLE, register_value); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam10399.04%150.00%
Linus Walleij10.96%150.00%
Total104100.00%2100.00%


static int da9052_gpio_to_irq(struct gpio_chip *gc, u32 offset) { struct da9052_gpio *gpio = gpiochip_get_data(gc); struct da9052 *da9052 = gpio->da9052; int irq; irq = regmap_irq_get_virq(da9052->irq_data, DA9052_IRQ_GPI0 + offset); return irq; }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam3873.08%133.33%
Fabio Estevam1325.00%133.33%
Linus Walleij11.92%133.33%
Total52100.00%3100.00%

static const struct gpio_chip reference_gp = { .label = "da9052-gpio", .owner = THIS_MODULE, .get = da9052_gpio_get, .set = da9052_gpio_set, .direction_input = da9052_gpio_direction_input, .direction_output = da9052_gpio_direction_output, .to_irq = da9052_gpio_to_irq, .can_sleep = true, .ngpio = 16, .base = -1, };
static int da9052_gpio_probe(struct platform_device *pdev) { struct da9052_gpio *gpio; struct da9052_pdata *pdata; int ret; gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL); if (!gpio) return -ENOMEM; gpio->da9052 = dev_get_drvdata(pdev->dev.parent); pdata = dev_get_platdata(gpio->da9052->dev); gpio->gp = reference_gp; if (pdata && pdata->gpio_base) gpio->gp.base = pdata->gpio_base; ret = devm_gpiochip_add_data(&pdev->dev, &gpio->gp, gpio); if (ret < 0) { dev_err(&pdev->dev, "Could not register gpiochip, %d\n", ret); return ret; } platform_set_drvdata(pdev, gpio); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam12885.91%116.67%
Axel Lin96.04%116.67%
Laxman Dewangan64.03%116.67%
Jingoo Han32.01%116.67%
Linus Walleij21.34%116.67%
Varka Bhadram10.67%116.67%
Total149100.00%6100.00%

static struct platform_driver da9052_gpio_driver = { .probe = da9052_gpio_probe, .driver = { .name = "da9052-gpio", }, }; module_platform_driver(da9052_gpio_driver); MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); MODULE_DESCRIPTION("DA9052 GPIO Device Driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:da9052-gpio");

Overall Contributors

PersonTokensPropCommitsCommitProp
Ashish Jangam89794.22%216.67%
Linus Walleij212.21%325.00%
Fabio Estevam131.37%18.33%
Axel Lin90.95%18.33%
Laxman Dewangan60.63%18.33%
Jingoo Han30.32%18.33%
Varka Bhadram10.11%18.33%
Mark Brown10.11%18.33%
Julia Lawall10.11%18.33%
Bill Pemberton0.00%00.00%
Total952100.00%12100.00%
Directory: drivers/gpio
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.