cregit-Linux how code gets into the kernel

Release 4.14 arch/powerpc/sysdev/simple_gpio.c

/*
 * Simple Memory-Mapped GPIOs
 *
 * Copyright (c) MontaVista Software, Inc. 2008.
 *
 * Author: Anton Vorontsov <avorontsov@ru.mvista.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/init.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/gpio/driver.h>
#include <linux/slab.h>
#include <asm/prom.h>
#include "simple_gpio.h"


struct u8_gpio_chip {
	
struct of_mm_gpio_chip mm_gc;
	
spinlock_t lock;

	/* shadowed data register to clear/set bits safely */
	
u8 data;
};


static u8 u8_pin2mask(unsigned int pin) { return 1 << (8 - 1 - pin); }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov21100.00%1100.00%
Total21100.00%1100.00%


static int u8_gpio_get(struct gpio_chip *gc, unsigned int gpio) { struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); return !!(in_8(mm_gc->regs) & u8_pin2mask(gpio)); }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov3890.48%150.00%
Linus Walleij49.52%150.00%
Total42100.00%2100.00%


static void u8_gpio_set(struct gpio_chip *gc, unsigned int gpio, int val) { struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); struct u8_gpio_chip *u8_gc = gpiochip_get_data(gc); unsigned long flags; spin_lock_irqsave(&u8_gc->lock, flags); if (val) u8_gc->data |= u8_pin2mask(gpio); else u8_gc->data &= ~u8_pin2mask(gpio); out_8(mm_gc->regs, u8_gc->data); spin_unlock_irqrestore(&u8_gc->lock, flags); }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov9597.94%150.00%
Linus Walleij22.06%150.00%
Total97100.00%2100.00%


static int u8_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio) { return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov18100.00%1100.00%
Total18100.00%1100.00%


static int u8_gpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val) { u8_gpio_set(gc, gpio, val); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov30100.00%1100.00%
Total30100.00%1100.00%


static void u8_gpio_save_regs(struct of_mm_gpio_chip *mm_gc) { struct u8_gpio_chip *u8_gc = container_of(mm_gc, struct u8_gpio_chip, mm_gc); u8_gc->data = in_8(mm_gc->regs); }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov3183.78%150.00%
Christophe Leroy616.22%150.00%
Total37100.00%2100.00%


static int __init u8_simple_gpiochip_add(struct device_node *np) { int ret; struct u8_gpio_chip *u8_gc; struct of_mm_gpio_chip *mm_gc; struct gpio_chip *gc; u8_gc = kzalloc(sizeof(*u8_gc), GFP_KERNEL); if (!u8_gc) return -ENOMEM; spin_lock_init(&u8_gc->lock); mm_gc = &u8_gc->mm_gc; gc = &mm_gc->gc; mm_gc->save_regs = u8_gpio_save_regs; gc->ngpio = 8; gc->direction_input = u8_gpio_dir_in; gc->direction_output = u8_gpio_dir_out; gc->get = u8_gpio_get; gc->set = u8_gpio_set; ret = of_mm_gpiochip_add_data(np, mm_gc, u8_gc); if (ret) goto err; return 0; err: kfree(u8_gc); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov13897.87%266.67%
Linus Walleij32.13%133.33%
Total141100.00%3100.00%


void __init simple_gpiochip_init(const char *compatible) { struct device_node *np; for_each_compatible_node(np, NULL, compatible) { int ret; struct resource r; ret = of_address_to_resource(np, 0, &r); if (ret) goto err; switch (resource_size(&r)) { case 1: ret = u8_simple_gpiochip_add(np); if (ret) goto err; break; default: /* * Whenever you need support for GPIO bank width > 1, * please just turn u8_ code into huge macros, and * construct needed uX_ code with it. */ ret = -ENOSYS; goto err; } continue; err: pr_err("%pOF: registration failed, status %d\n", np, ret); } }

Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov10199.02%150.00%
Rob Herring10.98%150.00%
Total102100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Anton Vorontsov52196.30%228.57%
Linus Walleij101.85%228.57%
Christophe Leroy61.11%114.29%
Tejun Heo30.55%114.29%
Rob Herring10.18%114.29%
Total541100.00%7100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.