Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0597007f authored by Pierre Ossman's avatar Pierre Ossman
Browse files

sdio: basic parsing of FBR



Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent 35c66c19
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -23,8 +23,34 @@
#include "sd_ops.h"
#include "sdio_ops.h"

static int sdio_read_fbr(struct sdio_func *func)
{
	int ret;
	unsigned char data;

	ret = mmc_io_rw_direct(func->card, 0, 0,
		func->num * 0x100 + SDIO_FBR_STD_IF, 0, &data);
	if (ret)
		goto out;

	data &= 0x0f;

	if (data == 0x0f) {
		ret = mmc_io_rw_direct(func->card, 0, 0,
			func->num * 0x100 + SDIO_FBR_STD_IF_EXT, 0, &data);
		if (ret)
			goto out;
	}

	func->class = data;

out:
	return ret;
}

static int sdio_init_func(struct mmc_card *card, unsigned int fn)
{
	int ret;
	struct sdio_func *func;

	BUG_ON(fn > SDIO_MAX_FUNCS);
@@ -35,9 +61,21 @@ static int sdio_init_func(struct mmc_card *card, unsigned int fn)

	func->num = fn;

	ret = sdio_read_fbr(func);
	if (ret)
		goto fail;

	card->sdio_func[fn - 1] = func;

	return 0;

fail:
	/*
	 * It is okay to remove the function here even though we hold
	 * the host lock as we haven't registered the device yet.
	 */
	sdio_remove_func(func);
	return ret;
}

static int sdio_read_cccr(struct mmc_card *card)
+5 −0
Original line number Diff line number Diff line
@@ -21,6 +21,11 @@ struct sdio_func {
	struct mmc_card		*card;		/* the card this device belongs to */
	struct device		dev;		/* the device */
	unsigned int		num;		/* function number */

	unsigned char		class;		/* standard interface class */
	unsigned short		vendor;		/* vendor id */
	unsigned short		device;		/* device id */

	unsigned int		state;		/* function state */
#define SDIO_STATE_PRESENT	(1<<0)		/* present in sysfs */
};