blob: b32123758eaba90842c5b0dcb6b1396c6d75461f [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Paul Burtonda61fa52013-09-09 15:30:26 +01002/*
3 * Copyright 2008,2010 Freescale Semiconductor, Inc
Yangbo Lu39913ac2020-06-17 18:08:58 +08004 * Copyright 2020 NXP
Paul Burtonda61fa52013-09-09 15:30:26 +01005 * Andy Fleming
6 *
7 * Based (loosely) on the Linux code
Paul Burtonda61fa52013-09-09 15:30:26 +01008 */
9
10#ifndef _MMC_PRIVATE_H_
11#define _MMC_PRIVATE_H_
12
13#include <mmc.h>
14
Jean-Jacques Hiblot863d1002019-07-02 10:53:52 +020015int mmc_send_status(struct mmc *mmc, unsigned int *status);
16int mmc_poll_for_busy(struct mmc *mmc, int timeout);
17
18int mmc_set_blocklen(struct mmc *mmc, int len);
Paul Burtonda61fa52013-09-09 15:30:26 +010019
Simon Glassc4d660d2017-07-04 13:31:19 -060020#if CONFIG_IS_ENABLED(BLK)
Simon Glass7dba0b92016-06-12 23:30:15 -060021ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
22 void *dst);
23#else
24ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
25 void *dst);
26#endif
27
Jean-Jacques Hiblotd6400c32018-01-04 15:23:32 +010028#if CONFIG_IS_ENABLED(MMC_WRITE)
Paul Burtonda61fa52013-09-09 15:30:26 +010029
Simon Glassc4d660d2017-07-04 13:31:19 -060030#if CONFIG_IS_ENABLED(BLK)
Simon Glass33fb2112016-05-01 13:52:41 -060031ulong mmc_bwrite(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
32 const void *src);
Simon Glass561e6242016-10-01 14:43:17 -060033ulong mmc_berase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt);
Simon Glass33fb2112016-05-01 13:52:41 -060034#else
35ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
36 const void *src);
Simon Glass561e6242016-10-01 14:43:17 -060037ulong mmc_berase(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt);
Simon Glass33fb2112016-05-01 13:52:41 -060038#endif
Paul Burtonda61fa52013-09-09 15:30:26 +010039
Jean-Jacques Hiblotd6400c32018-01-04 15:23:32 +010040#else /* CONFIG_SPL_MMC_WRITE is not defined */
Paul Burtonda61fa52013-09-09 15:30:26 +010041
B, Ravid2d9bdf2016-09-28 14:46:18 +053042/* declare dummies to reduce code size. */
Paul Burtonda61fa52013-09-09 15:30:26 +010043
Simon Glassc4d660d2017-07-04 13:31:19 -060044#if CONFIG_IS_ENABLED(BLK)
Simon Glasse419a3e2016-05-14 14:03:09 -060045static inline unsigned long mmc_berase(struct udevice *dev,
46 lbaint_t start, lbaint_t blkcnt)
47{
48 return 0;
49}
50
51static inline ulong mmc_bwrite(struct udevice *dev, lbaint_t start,
52 lbaint_t blkcnt, const void *src)
53{
54 return 0;
55}
56#else
Simon Glass4101f682016-02-29 15:25:34 -070057static inline unsigned long mmc_berase(struct blk_desc *block_dev,
Stephen Warren7c4213f2015-12-07 11:38:48 -070058 lbaint_t start, lbaint_t blkcnt)
Paul Burtonda61fa52013-09-09 15:30:26 +010059{
60 return 0;
61}
62
Simon Glass4101f682016-02-29 15:25:34 -070063static inline ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start,
Stephen Warren7c4213f2015-12-07 11:38:48 -070064 lbaint_t blkcnt, const void *src)
Paul Burtonda61fa52013-09-09 15:30:26 +010065{
66 return 0;
67}
Simon Glasse419a3e2016-05-14 14:03:09 -060068#endif
Paul Burtonda61fa52013-09-09 15:30:26 +010069
70#endif /* CONFIG_SPL_BUILD */
71
Simon Glassc0c76eb2016-06-12 23:30:20 -060072#ifdef CONFIG_MMC_TRACE
73void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd);
74void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret);
75void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd);
76#else
77static inline void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
78{
79}
80
81static inline void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd,
82 int ret)
83{
84}
85
86static inline void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
87{
88}
89#endif
90
Simon Glassc40fdca2016-05-01 13:52:35 -060091/**
92 * mmc_get_next_devnum() - Get the next available MMC device number
93 *
Heinrich Schuchardt185f8122022-01-19 18:05:50 +010094 * Return: next available device number (0 = first), or -ve on error
Simon Glassc40fdca2016-05-01 13:52:35 -060095 */
96int mmc_get_next_devnum(void);
97
98/**
99 * mmc_do_preinit() - Get an MMC device ready for use
100 */
101void mmc_do_preinit(void);
102
103/**
104 * mmc_list_init() - Set up the list of MMC devices
105 */
106void mmc_list_init(void);
107
108/**
109 * mmc_list_add() - Add a new MMC device to the list of devices
110 *
111 * @mmc: Device to add
112 */
113void mmc_list_add(struct mmc *mmc);
114
Simon Glass7dba0b92016-06-12 23:30:15 -0600115/**
116 * mmc_switch_part() - Switch to a new MMC hardware partition
117 *
118 * @mmc: MMC device
119 * @part_num: Hardware partition number
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100120 * Return: 0 if OK, -ve on error
Simon Glass7dba0b92016-06-12 23:30:15 -0600121 */
122int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
123
Simon Glassc40704f2016-06-12 23:30:18 -0600124/**
125 * mmc_switch() - Issue and MMC switch mode command
126 *
127 * @mmc: MMC device
128 * @set: Unused
129 * @index: Cmdarg index
130 * @value: Cmdarg value
Heinrich Schuchardt185f8122022-01-19 18:05:50 +0100131 * Return: 0 if OK, -ve on error
Simon Glassc40704f2016-06-12 23:30:18 -0600132 */
133int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value);
134
Paul Burtonda61fa52013-09-09 15:30:26 +0100135#endif /* _MMC_PRIVATE_H_ */