summaryrefslogtreecommitdiff
path: root/drivers/pcmcia/sa1100_h3600.c
blob: 2e9265e59ae4cdc85931b75e2397c627c6b43743 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// SPDX-License-Identifier: GPL-2.0
/*
 * drivers/pcmcia/sa1100_h3600.c
 *
 * PCMCIA implementation routines for H3600
 *
 */
#include <linux/kernel.h>
#include <linux/device.h>

#include <asm/mach-types.h>

#include "l1110.h"
#include "sa1100_generic.h"

struct ipaq_option_id {
	u16 vendor;
	u16 device;
};

static int l1110_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
{
	struct device *dev = skt->socket.dev.parent;
	struct l1110 *l;
	int err;

	skt->stat[SOC_STAT_CD].name = skt->nr ? "pcmcia1-detect" : "pcmcia0-detect";
	skt->stat[SOC_STAT_RDY].name = skt->nr ? "pcmcia1-ready" : "pcmcia0-ready";

	err = soc_pcmcia_request_gpiods(skt);
	if (err)
		return err;

	err = l1110_init(dev, &l, skt->nr ? 0x19000000 : 0x1a000000,
			 skt->nr);
	if (err)
		return err;

	skt->socket.driver_data = l;

	return 0;
}

static void l1110_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
	struct pcmcia_state *state)
{
	struct l1110 *l = skt->socket.driver_data;

	l1110_socket_state(l, state);
}

static int l1110_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
	const socket_state_t *state)
{
	struct l1110 *l = skt->socket.driver_data;

	return l1110_configure_socket(l, state);
}

static struct pcmcia_low_level l1110_pcmcia_ops = {
	.owner			= THIS_MODULE,
	.hw_init		= l1110_pcmcia_hw_init,
	.socket_state		= l1110_pcmcia_socket_state,
	.configure_socket	= l1110_pcmcia_configure_socket,
};

int pcmcia_h3600_init(struct device *dev)
{
	struct ipaq_option_id *id = dev->platform_data;

	if ((!machine_is_h3600() && !machine_is_h3100()) || !id)
		return -ENODEV;

	if (id->vendor != 0x1125 || id->device != 0x0001)
		return -ENODEV;

	return sa11xx_drv_pcmcia_probe(dev, &l1110_pcmcia_ops, 0, 2);
}