xref: /freebsd/sys/dev/sdhci/sdhci_if.m (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
1d6b3aaf8SOleksandr Tymoshenko#-
2f86e6000SWarner Losh# Copyright (c) 2006 M. Warner Losh <imp@FreeBSD.org>
3d6b3aaf8SOleksandr Tymoshenko#
4d6b3aaf8SOleksandr Tymoshenko# Redistribution and use in source and binary forms, with or without
5d6b3aaf8SOleksandr Tymoshenko# modification, are permitted provided that the following conditions
6d6b3aaf8SOleksandr Tymoshenko# are met:
7d6b3aaf8SOleksandr Tymoshenko# 1. Redistributions of source code must retain the above copyright
8d6b3aaf8SOleksandr Tymoshenko#    notice, this list of conditions and the following disclaimer.
9d6b3aaf8SOleksandr Tymoshenko# 2. Redistributions in binary form must reproduce the above copyright
10d6b3aaf8SOleksandr Tymoshenko#    notice, this list of conditions and the following disclaimer in the
11d6b3aaf8SOleksandr Tymoshenko#    documentation and/or other materials provided with the distribution.
12d6b3aaf8SOleksandr Tymoshenko#
13d6b3aaf8SOleksandr Tymoshenko# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14d6b3aaf8SOleksandr Tymoshenko# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15d6b3aaf8SOleksandr Tymoshenko# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16d6b3aaf8SOleksandr Tymoshenko# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17d6b3aaf8SOleksandr Tymoshenko# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18d6b3aaf8SOleksandr Tymoshenko# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19d6b3aaf8SOleksandr Tymoshenko# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20d6b3aaf8SOleksandr Tymoshenko# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21d6b3aaf8SOleksandr Tymoshenko# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22d6b3aaf8SOleksandr Tymoshenko# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23d6b3aaf8SOleksandr Tymoshenko# SUCH DAMAGE.
24d6b3aaf8SOleksandr Tymoshenko#
25d6b3aaf8SOleksandr Tymoshenko# Portions of this software may have been developed with reference to
26d6b3aaf8SOleksandr Tymoshenko# the SD Simplified Specification.  The following disclaimer may apply:
27d6b3aaf8SOleksandr Tymoshenko#
28d6b3aaf8SOleksandr Tymoshenko# The following conditions apply to the release of the simplified
29d6b3aaf8SOleksandr Tymoshenko# specification ("Simplified Specification") by the SD Card Association and
30d6b3aaf8SOleksandr Tymoshenko# the SD Group. The Simplified Specification is a subset of the complete SD
31d6b3aaf8SOleksandr Tymoshenko# Specification which is owned by the SD Card Association and the SD
32d6b3aaf8SOleksandr Tymoshenko# Group. This Simplified Specification is provided on a non-confidential
33d6b3aaf8SOleksandr Tymoshenko# basis subject to the disclaimers below. Any implementation of the
34d6b3aaf8SOleksandr Tymoshenko# Simplified Specification may require a license from the SD Card
35d6b3aaf8SOleksandr Tymoshenko# Association, SD Group, SD-3C LLC or other third parties.
36d6b3aaf8SOleksandr Tymoshenko#
37d6b3aaf8SOleksandr Tymoshenko# Disclaimers:
38d6b3aaf8SOleksandr Tymoshenko#
39d6b3aaf8SOleksandr Tymoshenko# The information contained in the Simplified Specification is presented only
40d6b3aaf8SOleksandr Tymoshenko# as a standard specification for SD Cards and SD Host/Ancillary products and
41d6b3aaf8SOleksandr Tymoshenko# is provided "AS-IS" without any representations or warranties of any
42d6b3aaf8SOleksandr Tymoshenko# kind. No responsibility is assumed by the SD Group, SD-3C LLC or the SD
43d6b3aaf8SOleksandr Tymoshenko# Card Association for any damages, any infringements of patents or other
44d6b3aaf8SOleksandr Tymoshenko# right of the SD Group, SD-3C LLC, the SD Card Association or any third
45d6b3aaf8SOleksandr Tymoshenko# parties, which may result from its use. No license is granted by
46d6b3aaf8SOleksandr Tymoshenko# implication, estoppel or otherwise under any patent or other rights of the
47d6b3aaf8SOleksandr Tymoshenko# SD Group, SD-3C LLC, the SD Card Association or any third party. Nothing
48d6b3aaf8SOleksandr Tymoshenko# herein shall be construed as an obligation by the SD Group, the SD-3C LLC
49d6b3aaf8SOleksandr Tymoshenko# or the SD Card Association to disclose or distribute any technical
50d6b3aaf8SOleksandr Tymoshenko# information, know-how or other confidential information to any third party.
51d6b3aaf8SOleksandr Tymoshenko#
52d6b3aaf8SOleksandr Tymoshenko#
53d6b3aaf8SOleksandr Tymoshenko
54d6b3aaf8SOleksandr Tymoshenko#
55d6b3aaf8SOleksandr Tymoshenko# This is the set of callbacks that mmc bridges call into the bus, or
56d6b3aaf8SOleksandr Tymoshenko# that mmc/sd card drivers call to make requests.
57d6b3aaf8SOleksandr Tymoshenko#
58d6b3aaf8SOleksandr Tymoshenko
59aca38eabSMarius Strobl#include <sys/lock.h>
60aca38eabSMarius Strobl#include <sys/mutex.h>
6157677a3aSOleksandr Tymoshenko#include <sys/types.h>
62f0d2731dSMarius Strobl#include <sys/sysctl.h>
6357677a3aSOleksandr Tymoshenko#include <sys/taskqueue.h>
6457677a3aSOleksandr Tymoshenko
65aca38eabSMarius Strobl#include <machine/bus.h>
66aca38eabSMarius Strobl
6757677a3aSOleksandr Tymoshenko#include <dev/mmc/bridge.h>
6857677a3aSOleksandr Tymoshenko#include <dev/sdhci/sdhci.h>
6957677a3aSOleksandr Tymoshenko
700f34084fSMarius StroblCODE {
71*e00774a9SSøren Schmidt	static int
72*e00774a9SSøren Schmidt	null_set_clock(device_t brdev __unused,
73*e00774a9SSøren Schmidt	    struct sdhci_slot *slot __unused,
74*e00774a9SSøren Schmidt	    int clock)
75*e00774a9SSøren Schmidt	{
76*e00774a9SSøren Schmidt		return (clock);
77*e00774a9SSøren Schmidt	}
78*e00774a9SSøren Schmidt
790f34084fSMarius Strobl	static void
800f34084fSMarius Strobl	null_set_uhs_timing(device_t brdev __unused,
810f34084fSMarius Strobl	    struct sdhci_slot *slot __unused)
820f34084fSMarius Strobl	{
830f34084fSMarius Strobl
840f34084fSMarius Strobl	}
850f34084fSMarius Strobl}
860f34084fSMarius Strobl
87d6b3aaf8SOleksandr TymoshenkoINTERFACE sdhci;
88d6b3aaf8SOleksandr Tymoshenko
89d6b3aaf8SOleksandr TymoshenkoMETHOD uint8_t read_1 {
90d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
91d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
92d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
93d6b3aaf8SOleksandr Tymoshenko}
94d6b3aaf8SOleksandr Tymoshenko
95d6b3aaf8SOleksandr TymoshenkoMETHOD uint16_t read_2 {
96d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
97d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
98d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
99d6b3aaf8SOleksandr Tymoshenko}
100d6b3aaf8SOleksandr Tymoshenko
101d6b3aaf8SOleksandr TymoshenkoMETHOD uint32_t read_4 {
102d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
103d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
104d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
105d6b3aaf8SOleksandr Tymoshenko}
106d6b3aaf8SOleksandr Tymoshenko
107d6b3aaf8SOleksandr TymoshenkoMETHOD void read_multi_4 {
108d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
109d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
110d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
111d6b3aaf8SOleksandr Tymoshenko	uint32_t		*data;
112d6b3aaf8SOleksandr Tymoshenko	bus_size_t		count;
113d6b3aaf8SOleksandr Tymoshenko}
114d6b3aaf8SOleksandr Tymoshenko
115d6b3aaf8SOleksandr TymoshenkoMETHOD void write_1 {
116d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
117d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
118d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
119d6b3aaf8SOleksandr Tymoshenko	uint8_t			val;
120d6b3aaf8SOleksandr Tymoshenko}
121d6b3aaf8SOleksandr Tymoshenko
122d6b3aaf8SOleksandr TymoshenkoMETHOD void write_2 {
123d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
124d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
125d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
126d6b3aaf8SOleksandr Tymoshenko	uint16_t		val;
127d6b3aaf8SOleksandr Tymoshenko}
128d6b3aaf8SOleksandr Tymoshenko
129d6b3aaf8SOleksandr TymoshenkoMETHOD void write_4 {
130d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
131d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
132d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
133d6b3aaf8SOleksandr Tymoshenko	uint32_t		val;
134d6b3aaf8SOleksandr Tymoshenko}
135d6b3aaf8SOleksandr Tymoshenko
136d6b3aaf8SOleksandr TymoshenkoMETHOD void write_multi_4 {
137d6b3aaf8SOleksandr Tymoshenko	device_t		brdev;
138d6b3aaf8SOleksandr Tymoshenko	struct sdhci_slot	*slot;
139d6b3aaf8SOleksandr Tymoshenko	bus_size_t		off;
140d6b3aaf8SOleksandr Tymoshenko	uint32_t		*data;
141d6b3aaf8SOleksandr Tymoshenko	bus_size_t		count;
142d6b3aaf8SOleksandr Tymoshenko}
14357677a3aSOleksandr Tymoshenko
144c3a0f75aSOleksandr TymoshenkoMETHOD int platform_will_handle {
145c3a0f75aSOleksandr Tymoshenko	device_t		brdev;
146c3a0f75aSOleksandr Tymoshenko	struct sdhci_slot	*slot;
147c3a0f75aSOleksandr Tymoshenko}
148c3a0f75aSOleksandr Tymoshenko
149c3a0f75aSOleksandr TymoshenkoMETHOD void platform_start_transfer {
150c3a0f75aSOleksandr Tymoshenko	device_t		brdev;
151c3a0f75aSOleksandr Tymoshenko	struct sdhci_slot	*slot;
152c3a0f75aSOleksandr Tymoshenko	uint32_t		*intmask;
153c3a0f75aSOleksandr Tymoshenko}
154c3a0f75aSOleksandr Tymoshenko
155c3a0f75aSOleksandr TymoshenkoMETHOD void platform_finish_transfer {
156c3a0f75aSOleksandr Tymoshenko	device_t		brdev;
157c3a0f75aSOleksandr Tymoshenko	struct sdhci_slot	*slot;
158c3a0f75aSOleksandr Tymoshenko}
159c3a0f75aSOleksandr Tymoshenko
16057677a3aSOleksandr TymoshenkoMETHOD uint32_t min_freq {
16157677a3aSOleksandr Tymoshenko	device_t		brdev;
16257677a3aSOleksandr Tymoshenko	struct sdhci_slot	*slot;
16357677a3aSOleksandr Tymoshenko} DEFAULT sdhci_generic_min_freq;
1646e37fb2bSIan Lepore
1656e37fb2bSIan LeporeMETHOD bool get_card_present {
1666e37fb2bSIan Lepore	device_t		brdev;
1676e37fb2bSIan Lepore	struct sdhci_slot	*slot;
1686e37fb2bSIan Lepore} DEFAULT sdhci_generic_get_card_present;
1696e37fb2bSIan Lepore
1700f34084fSMarius StroblMETHOD void set_uhs_timing {
1710f34084fSMarius Strobl	device_t		brdev;
1720f34084fSMarius Strobl	struct sdhci_slot	*slot;
1730f34084fSMarius Strobl} DEFAULT null_set_uhs_timing;
174b8f94506SArtur Rojek
175*e00774a9SSøren SchmidtMETHOD int set_clock {
176*e00774a9SSøren Schmidt	device_t		brdev;
177*e00774a9SSøren Schmidt	struct sdhci_slot	*slot;
178*e00774a9SSøren Schmidt	int			clock;
179*e00774a9SSøren Schmidt} DEFAULT null_set_clock;
180*e00774a9SSøren Schmidt
181b8f94506SArtur RojekMETHOD void reset {
182b8f94506SArtur Rojek	device_t		brdev;
183b8f94506SArtur Rojek	struct sdhci_slot	*slot;
184b8f94506SArtur Rojek	uint8_t			mask;
185b8f94506SArtur Rojek} DEFAULT sdhci_generic_reset;
186