mirror of
				https://source.denx.de/u-boot/u-boot.git
				synced 2025-10-31 16:31:25 +01:00 
			
		
		
		
	Add a new 'demo light' command which uses GPIOs to control imaginary lights. Each light is assigned a bit number in the overall value. This provides an example driver for using the new GPIO API. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2013 Google, Inc
 | |
|  *
 | |
|  * (C) Copyright 2012
 | |
|  * Pavel Herrmann <morpheus.ibis@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #include <common.h>
 | |
| #include <dm.h>
 | |
| #include <dm-demo.h>
 | |
| #include <errno.h>
 | |
| #include <fdtdec.h>
 | |
| #include <malloc.h>
 | |
| #include <asm/io.h>
 | |
| #include <linux/list.h>
 | |
| 
 | |
| DECLARE_GLOBAL_DATA_PTR;
 | |
| 
 | |
| UCLASS_DRIVER(demo) = {
 | |
| 	.name		= "demo",
 | |
| 	.id		= UCLASS_DEMO,
 | |
| };
 | |
| 
 | |
| int demo_hello(struct udevice *dev, int ch)
 | |
| {
 | |
| 	const struct demo_ops *ops = device_get_ops(dev);
 | |
| 
 | |
| 	if (!ops->hello)
 | |
| 		return -ENOSYS;
 | |
| 
 | |
| 	return ops->hello(dev, ch);
 | |
| }
 | |
| 
 | |
| int demo_status(struct udevice *dev, int *status)
 | |
| {
 | |
| 	const struct demo_ops *ops = device_get_ops(dev);
 | |
| 
 | |
| 	if (!ops->status)
 | |
| 		return -ENOSYS;
 | |
| 
 | |
| 	return ops->status(dev, status);
 | |
| }
 | |
| 
 | |
| int demo_get_light(struct udevice *dev)
 | |
| {
 | |
| 	const struct demo_ops *ops = device_get_ops(dev);
 | |
| 
 | |
| 	if (!ops->get_light)
 | |
| 		return -ENOSYS;
 | |
| 
 | |
| 	return ops->get_light(dev);
 | |
| }
 | |
| 
 | |
| int demo_set_light(struct udevice *dev, int light)
 | |
| {
 | |
| 	const struct demo_ops *ops = device_get_ops(dev);
 | |
| 
 | |
| 	if (!ops->set_light)
 | |
| 		return -ENOSYS;
 | |
| 
 | |
| 	return ops->set_light(dev, light);
 | |
| }
 | |
| 
 | |
| int demo_parse_dt(struct udevice *dev)
 | |
| {
 | |
| 	struct dm_demo_pdata *pdata = dev_get_platdata(dev);
 | |
| 	int dn = dev->of_offset;
 | |
| 
 | |
| 	pdata->sides = fdtdec_get_int(gd->fdt_blob, dn, "sides", 0);
 | |
| 	pdata->colour = fdt_getprop(gd->fdt_blob, dn, "colour", NULL);
 | |
| 	if (!pdata->sides || !pdata->colour) {
 | |
| 		debug("%s: Invalid device tree data\n", __func__);
 | |
| 		return -EINVAL;
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 |