139f7611fSSimon Glass /* 239f7611fSSimon Glass * Copyright (c) 2013 Google, Inc 339f7611fSSimon Glass * 439f7611fSSimon Glass * (C) Copyright 2012 539f7611fSSimon Glass * Pavel Herrmann <morpheus.ibis@gmail.com> 639f7611fSSimon Glass * 739f7611fSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 839f7611fSSimon Glass */ 939f7611fSSimon Glass 1039f7611fSSimon Glass #include <common.h> 1139f7611fSSimon Glass #include <dm.h> 1239f7611fSSimon Glass #include <dm-demo.h> 1339f7611fSSimon Glass #include <errno.h> 1439f7611fSSimon Glass #include <fdtdec.h> 1539f7611fSSimon Glass #include <malloc.h> 1639f7611fSSimon Glass #include <asm/io.h> 1739f7611fSSimon Glass #include <linux/list.h> 1839f7611fSSimon Glass 1939f7611fSSimon Glass DECLARE_GLOBAL_DATA_PTR; 2039f7611fSSimon Glass 2139f7611fSSimon Glass UCLASS_DRIVER(demo) = { 2274f96dadSSimon Glass .name = "demo", 2339f7611fSSimon Glass .id = UCLASS_DEMO, 2439f7611fSSimon Glass }; 2539f7611fSSimon Glass 2654c5d08aSHeiko Schocher int demo_hello(struct udevice *dev, int ch) 2739f7611fSSimon Glass { 2839f7611fSSimon Glass const struct demo_ops *ops = device_get_ops(dev); 2939f7611fSSimon Glass 3039f7611fSSimon Glass if (!ops->hello) 3139f7611fSSimon Glass return -ENOSYS; 3239f7611fSSimon Glass 3339f7611fSSimon Glass return ops->hello(dev, ch); 3439f7611fSSimon Glass } 3539f7611fSSimon Glass 3654c5d08aSHeiko Schocher int demo_status(struct udevice *dev, int *status) 3739f7611fSSimon Glass { 3839f7611fSSimon Glass const struct demo_ops *ops = device_get_ops(dev); 3939f7611fSSimon Glass 4039f7611fSSimon Glass if (!ops->status) 4139f7611fSSimon Glass return -ENOSYS; 4239f7611fSSimon Glass 4339f7611fSSimon Glass return ops->status(dev, status); 4439f7611fSSimon Glass } 4539f7611fSSimon Glass 46*a02af4aeSSimon Glass int demo_get_light(struct udevice *dev) 47*a02af4aeSSimon Glass { 48*a02af4aeSSimon Glass const struct demo_ops *ops = device_get_ops(dev); 49*a02af4aeSSimon Glass 50*a02af4aeSSimon Glass if (!ops->get_light) 51*a02af4aeSSimon Glass return -ENOSYS; 52*a02af4aeSSimon Glass 53*a02af4aeSSimon Glass return ops->get_light(dev); 54*a02af4aeSSimon Glass } 55*a02af4aeSSimon Glass 56*a02af4aeSSimon Glass int demo_set_light(struct udevice *dev, int light) 57*a02af4aeSSimon Glass { 58*a02af4aeSSimon Glass const struct demo_ops *ops = device_get_ops(dev); 59*a02af4aeSSimon Glass 60*a02af4aeSSimon Glass if (!ops->set_light) 61*a02af4aeSSimon Glass return -ENOSYS; 62*a02af4aeSSimon Glass 63*a02af4aeSSimon Glass return ops->set_light(dev, light); 64*a02af4aeSSimon Glass } 65*a02af4aeSSimon Glass 6654c5d08aSHeiko Schocher int demo_parse_dt(struct udevice *dev) 6739f7611fSSimon Glass { 6839f7611fSSimon Glass struct dm_demo_pdata *pdata = dev_get_platdata(dev); 6939f7611fSSimon Glass int dn = dev->of_offset; 7039f7611fSSimon Glass 7139f7611fSSimon Glass pdata->sides = fdtdec_get_int(gd->fdt_blob, dn, "sides", 0); 7239f7611fSSimon Glass pdata->colour = fdt_getprop(gd->fdt_blob, dn, "colour", NULL); 7339f7611fSSimon Glass if (!pdata->sides || !pdata->colour) { 7439f7611fSSimon Glass debug("%s: Invalid device tree data\n", __func__); 7539f7611fSSimon Glass return -EINVAL; 7639f7611fSSimon Glass } 7739f7611fSSimon Glass 7839f7611fSSimon Glass return 0; 7939f7611fSSimon Glass } 80