1#-
2# Copyright (c) 2015 Michal Meloun
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24# SUCH DAMAGE.
25#
26# $FreeBSD$
27#
28
29#include <machine/bus.h>
30
31INTERFACE syscon;
32
33HEADER {
34	struct syscon;
35	int syscon_get_handle_default(device_t dev, struct syscon **syscon);
36}
37
38CODE {
39	#include <sys/systm.h>
40	#include <sys/bus.h>
41
42	int
43	syscon_get_handle_default(device_t dev, struct syscon **syscon)
44	{
45		device_t parent;
46
47		parent = device_get_parent(dev);
48		if (parent == NULL)
49			return (ENODEV);
50		return (SYSCON_GET_HANDLE(parent, syscon));
51	}
52
53	static void
54	syscon_device_lock_default(device_t dev)
55	{
56
57		panic("syscon_device_lock is not implemented");
58	};
59
60	static void
61	syscon_device_unlock_default(device_t dev)
62	{
63
64		panic("syscon_device_unlock is not implemented");
65	};
66}
67
68METHOD int init {
69	struct syscon	*syscon;
70};
71
72METHOD int uninit {
73	struct syscon	*syscon;
74};
75
76/**
77 * Accessor functions for syscon register space
78 */
79METHOD uint32_t read_4 {
80	struct syscon	*syscon;
81	bus_size_t	offset;
82};
83
84METHOD int write_4 {
85	struct syscon	*syscon;
86	bus_size_t	offset;
87	uint32_t	val;
88};
89
90METHOD int modify_4 {
91	struct syscon	*syscon;
92	bus_size_t	offset;
93	uint32_t	clear_bits;
94	uint32_t	set_bits;
95};
96
97/**
98 * Unlocked verion of access function
99 */
100METHOD uint32_t unlocked_read_4 {
101	struct syscon	*syscon;
102	bus_size_t	offset;
103};
104
105METHOD int unlocked_write_4 {
106	struct syscon	*syscon;
107	bus_size_t	offset;
108	uint32_t	val;
109};
110
111METHOD int unlocked_modify_4 {
112	struct syscon	*syscon;
113	bus_size_t	offset;
114	uint32_t	clear_bits;
115	uint32_t	set_bits;
116};
117
118/**
119* Locking for exclusive access to underlying device
120*/
121METHOD void device_lock {
122	device_t	dev;
123} DEFAULT syscon_device_lock_default;
124
125METHOD void device_unlock {
126	device_t	dev;
127} DEFAULT syscon_device_unlock_default;
128
129/**
130 * Get syscon handle from parent driver
131 */
132METHOD int get_handle {
133	device_t	dev;
134	struct syscon	**syscon;
135} DEFAULT syscon_get_handle_default;
136