1afa17a500a3667f66df450100538d06769529bbaWolfram Sang/*
2afa17a500a3667f66df450100538d06769529bbaWolfram Sang * CAN bus driver for the Freescale MPC5xxx embedded CPU.
3afa17a500a3667f66df450100538d06769529bbaWolfram Sang *
4afa17a500a3667f66df450100538d06769529bbaWolfram Sang * Copyright (C) 2004-2005 Andrey Volkov <avolkov@varma-el.com>,
5afa17a500a3667f66df450100538d06769529bbaWolfram Sang *                         Varma Electronics Oy
6afa17a500a3667f66df450100538d06769529bbaWolfram Sang * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com>
7afa17a500a3667f66df450100538d06769529bbaWolfram Sang * Copyright (C) 2009 Wolfram Sang, Pengutronix <w.sang@pengutronix.de>
8afa17a500a3667f66df450100538d06769529bbaWolfram Sang *
9afa17a500a3667f66df450100538d06769529bbaWolfram Sang * This program is free software; you can redistribute it and/or modify
10afa17a500a3667f66df450100538d06769529bbaWolfram Sang * it under the terms of the version 2 of the GNU General Public License
11afa17a500a3667f66df450100538d06769529bbaWolfram Sang * as published by the Free Software Foundation
12afa17a500a3667f66df450100538d06769529bbaWolfram Sang *
13afa17a500a3667f66df450100538d06769529bbaWolfram Sang * This program is distributed in the hope that it will be useful, but
14afa17a500a3667f66df450100538d06769529bbaWolfram Sang * WITHOUT ANY WARRANTY; without even the implied warranty of
15afa17a500a3667f66df450100538d06769529bbaWolfram Sang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16afa17a500a3667f66df450100538d06769529bbaWolfram Sang * GNU General Public License for more details.
17afa17a500a3667f66df450100538d06769529bbaWolfram Sang *
18afa17a500a3667f66df450100538d06769529bbaWolfram Sang * You should have received a copy of the GNU General Public License
19afa17a500a3667f66df450100538d06769529bbaWolfram Sang * along with this program; if not, write to the Free Software
20afa17a500a3667f66df450100538d06769529bbaWolfram Sang * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21afa17a500a3667f66df450100538d06769529bbaWolfram Sang */
22afa17a500a3667f66df450100538d06769529bbaWolfram Sang
23afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/kernel.h>
24afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/module.h>
25afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/interrupt.h>
26afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/platform_device.h>
27afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/netdevice.h>
28afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/can/dev.h>
29afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/of_platform.h>
30afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <sysdev/fsl_soc.h>
31bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger#include <linux/clk.h>
32afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <linux/io.h>
33afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include <asm/mpc52xx.h>
34afa17a500a3667f66df450100538d06769529bbaWolfram Sang
35afa17a500a3667f66df450100538d06769529bbaWolfram Sang#include "mscan.h"
36afa17a500a3667f66df450100538d06769529bbaWolfram Sang
37afa17a500a3667f66df450100538d06769529bbaWolfram Sang#define DRV_NAME "mpc5xxx_can"
38afa17a500a3667f66df450100538d06769529bbaWolfram Sang
39bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstruct mpc5xxx_can_data {
40bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	unsigned int type;
412dc11581376829303b98eadb2de253bee065a56aGrant Likely	u32 (*get_clock)(struct platform_device *ofdev, const char *clock_name,
42bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			 int *mscan_clksrc);
43bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger};
44bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
45c5bab5e94d148aee2c852450374143c89aa56511Wolfgang Grandegger#ifdef CONFIG_PPC_MPC52xx
46bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstatic struct of_device_id __devinitdata mpc52xx_cdm_ids[] = {
47afa17a500a3667f66df450100538d06769529bbaWolfram Sang	{ .compatible = "fsl,mpc5200-cdm", },
48afa17a500a3667f66df450100538d06769529bbaWolfram Sang	{}
49afa17a500a3667f66df450100538d06769529bbaWolfram Sang};
50afa17a500a3667f66df450100538d06769529bbaWolfram Sang
512dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic u32 __devinit mpc52xx_can_get_clock(struct platform_device *ofdev,
52bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   const char *clock_name,
53bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   int *mscan_clksrc)
54afa17a500a3667f66df450100538d06769529bbaWolfram Sang{
553f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang	unsigned int pvr;
56afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mpc52xx_cdm  __iomem *cdm;
57afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct device_node *np_cdm;
58afa17a500a3667f66df450100538d06769529bbaWolfram Sang	unsigned int freq;
59afa17a500a3667f66df450100538d06769529bbaWolfram Sang	u32 val;
60afa17a500a3667f66df450100538d06769529bbaWolfram Sang
613f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang	pvr = mfspr(SPRN_PVR);
623f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang
63bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/*
64bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * Either the oscillator clock (SYS_XTAL_IN) or the IP bus clock
65bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * (IP_CLK) can be selected as MSCAN clock source. According to
66bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * the MPC5200 user's manual, the oscillator clock is the better
67bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * choice as it has less jitter. For this reason, it is selected
68bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * by default. Unfortunately, it can not be selected for the old
69bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * MPC5200 Rev. A chips due to a hardware bug (check errata).
70bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 */
71bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (clock_name && strcmp(clock_name, "ip") == 0)
72bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		*mscan_clksrc = MSCAN_CLKSRC_BUS;
73bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	else
74bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		*mscan_clksrc = MSCAN_CLKSRC_XTAL;
75bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
766bd17eb96ffc9c3b52927913d59da9ced5109c6aAnatolij Gustschin	freq = mpc5xxx_get_bus_frequency(ofdev->dev.of_node);
77afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (!freq)
78afa17a500a3667f66df450100538d06769529bbaWolfram Sang		return 0;
79afa17a500a3667f66df450100538d06769529bbaWolfram Sang
80bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (*mscan_clksrc == MSCAN_CLKSRC_BUS || pvr == 0x80822011)
813f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang		return freq;
823f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang
833f158c253214bb783e7072f6848b61c1999631e7Wolfram Sang	/* Determine SYS_XTAL_IN frequency from the clock domain settings */
84afa17a500a3667f66df450100538d06769529bbaWolfram Sang	np_cdm = of_find_matching_node(NULL, mpc52xx_cdm_ids);
85afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (!np_cdm) {
86c5bab5e94d148aee2c852450374143c89aa56511Wolfgang Grandegger		dev_err(&ofdev->dev, "can't get clock node!\n");
87afa17a500a3667f66df450100538d06769529bbaWolfram Sang		return 0;
88afa17a500a3667f66df450100538d06769529bbaWolfram Sang	}
89afa17a500a3667f66df450100538d06769529bbaWolfram Sang	cdm = of_iomap(np_cdm, 0);
90afa17a500a3667f66df450100538d06769529bbaWolfram Sang
91afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (in_8(&cdm->ipb_clk_sel) & 0x1)
92afa17a500a3667f66df450100538d06769529bbaWolfram Sang		freq *= 2;
930285e7ceaaec9ef2d2e74dd37e2b557c0e017b5cWolfram Sang	val = in_be32(&cdm->rstcfg);
940285e7ceaaec9ef2d2e74dd37e2b557c0e017b5cWolfram Sang
950285e7ceaaec9ef2d2e74dd37e2b557c0e017b5cWolfram Sang	freq *= (val & (1 << 5)) ? 8 : 4;
960285e7ceaaec9ef2d2e74dd37e2b557c0e017b5cWolfram Sang	freq /= (val & (1 << 6)) ? 12 : 16;
97afa17a500a3667f66df450100538d06769529bbaWolfram Sang
98bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	of_node_put(np_cdm);
99afa17a500a3667f66df450100538d06769529bbaWolfram Sang	iounmap(cdm);
100afa17a500a3667f66df450100538d06769529bbaWolfram Sang
101afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return freq;
102afa17a500a3667f66df450100538d06769529bbaWolfram Sang}
103c5bab5e94d148aee2c852450374143c89aa56511Wolfgang Grandegger#else /* !CONFIG_PPC_MPC52xx */
1042dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic u32 __devinit mpc52xx_can_get_clock(struct platform_device *ofdev,
105bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   const char *clock_name,
106bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   int *mscan_clksrc)
107bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger{
108bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	return 0;
109bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger}
110c5bab5e94d148aee2c852450374143c89aa56511Wolfgang Grandegger#endif /* CONFIG_PPC_MPC52xx */
111bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
112bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger#ifdef CONFIG_PPC_MPC512x
113bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstruct mpc512x_clockctl {
114bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 spmr;		/* System PLL Mode Reg */
115bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 sccr[2];		/* System Clk Ctrl Reg 1 & 2 */
116bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 scfr1;		/* System Clk Freq Reg 1 */
117bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 scfr2;		/* System Clk Freq Reg 2 */
118bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 reserved;
119bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 bcr;		/* Bread Crumb Reg */
120bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 pccr[12];		/* PSC Clk Ctrl Reg 0-11 */
121bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 spccr;		/* SPDIF Clk Ctrl Reg */
122bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 cccr;		/* CFM Clk Ctrl Reg */
123bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 dccr;		/* DIU Clk Cnfg Reg */
124bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 mccr[4];		/* MSCAN Clk Ctrl Reg 1-3 */
125bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger};
126bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
127bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstatic struct of_device_id __devinitdata mpc512x_clock_ids[] = {
128bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	{ .compatible = "fsl,mpc5121-clock", },
129bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	{}
130bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger};
131bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
1322dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev,
133bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   const char *clock_name,
134bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   int *mscan_clksrc)
135bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger{
136bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	struct mpc512x_clockctl __iomem *clockctl;
137bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	struct device_node *np_clock;
138bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	struct clk *sys_clk, *ref_clk;
139bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	int plen, clockidx, clocksrc = -1;
140bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	u32 sys_freq, val, clockdiv = 1, freq = 0;
141bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	const u32 *pval;
142bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
143bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	np_clock = of_find_matching_node(NULL, mpc512x_clock_ids);
144bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (!np_clock) {
145bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		dev_err(&ofdev->dev, "couldn't find clock node\n");
146aed5029ead26fe47527d9e9f2052cf56b72543f0Julia Lawall		return 0;
147bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	}
148bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	clockctl = of_iomap(np_clock, 0);
149bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (!clockctl) {
150bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		dev_err(&ofdev->dev, "couldn't map clock registers\n");
151aed5029ead26fe47527d9e9f2052cf56b72543f0Julia Lawall		goto exit_put;
152bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	}
153bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
154bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/* Determine the MSCAN device index from the physical address */
1556bd17eb96ffc9c3b52927913d59da9ced5109c6aAnatolij Gustschin	pval = of_get_property(ofdev->dev.of_node, "reg", &plen);
156bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	BUG_ON(!pval || plen < sizeof(*pval));
157bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	clockidx = (*pval & 0x80) ? 1 : 0;
158bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (*pval & 0x2000)
159bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		clockidx += 2;
160bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
161bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/*
162bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * Clock source and divider selection: 3 different clock sources
163bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * can be selected: "ip", "ref" or "sys". For the latter two, a
164bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * clock divider can be defined as well. If the clock source is
165bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * not specified by the device tree, we first try to find an
166bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * optimal CAN source clock based on the system clock. If that
167bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 * is not posslible, the reference clock will be used.
168bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	 */
169bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (clock_name && !strcmp(clock_name, "ip")) {
170bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		*mscan_clksrc = MSCAN_CLKSRC_IPS;
1716bd17eb96ffc9c3b52927913d59da9ced5109c6aAnatolij Gustschin		freq = mpc5xxx_get_bus_frequency(ofdev->dev.of_node);
172bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	} else {
173bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		*mscan_clksrc = MSCAN_CLKSRC_BUS;
174bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
1756bd17eb96ffc9c3b52927913d59da9ced5109c6aAnatolij Gustschin		pval = of_get_property(ofdev->dev.of_node,
176bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				       "fsl,mscan-clock-divider", &plen);
177bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		if (pval && plen == sizeof(*pval))
178bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			clockdiv = *pval;
179bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		if (!clockdiv)
180bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			clockdiv = 1;
181bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
182bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		if (!clock_name || !strcmp(clock_name, "sys")) {
183bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			sys_clk = clk_get(&ofdev->dev, "sys_clk");
184bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			if (!sys_clk) {
185bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				dev_err(&ofdev->dev, "couldn't get sys_clk\n");
186bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				goto exit_unmap;
187bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			}
188bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			/* Get and round up/down sys clock rate */
189bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			sys_freq = 1000000 *
190bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				((clk_get_rate(sys_clk) + 499999) / 1000000);
191bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
192bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			if (!clock_name) {
193bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				/* A multiple of 16 MHz would be optimal */
194bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				if ((sys_freq % 16000000) == 0) {
195bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					clocksrc = 0;
196bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					clockdiv = sys_freq / 16000000;
197bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					freq = sys_freq / clockdiv;
198bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				}
199bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			} else {
200bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				clocksrc = 0;
201bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				freq = sys_freq / clockdiv;
202bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			}
203bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		}
204bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
205bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		if (clocksrc < 0) {
206bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			ref_clk = clk_get(&ofdev->dev, "ref_clk");
207bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			if (!ref_clk) {
208bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				dev_err(&ofdev->dev, "couldn't get ref_clk\n");
209bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger				goto exit_unmap;
210bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			}
211bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			clocksrc = 1;
212bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger			freq = clk_get_rate(ref_clk) / clockdiv;
213bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		}
214bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	}
215bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
216bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/* Disable clock */
217bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	out_be32(&clockctl->mccr[clockidx], 0x0);
218bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (clocksrc >= 0) {
219bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		/* Set source and divider */
220bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		val = (clocksrc << 14) | ((clockdiv - 1) << 17);
221bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		out_be32(&clockctl->mccr[clockidx], val);
222bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		/* Enable clock */
223bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		out_be32(&clockctl->mccr[clockidx], val | 0x10000);
224bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	}
225bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
226bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/* Enable MSCAN clock domain */
227bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	val = in_be32(&clockctl->sccr[1]);
228bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (!(val & (1 << 25)))
229bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		out_be32(&clockctl->sccr[1], val | (1 << 25));
230bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
231bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	dev_dbg(&ofdev->dev, "using '%s' with frequency divider %d\n",
232bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		*mscan_clksrc == MSCAN_CLKSRC_IPS ? "ips_clk" :
233bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		clocksrc == 1 ? "ref_clk" : "sys_clk", clockdiv);
234bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
235bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerexit_unmap:
236bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	iounmap(clockctl);
237aed5029ead26fe47527d9e9f2052cf56b72543f0Julia Lawallexit_put:
238aed5029ead26fe47527d9e9f2052cf56b72543f0Julia Lawall	of_node_put(np_clock);
239bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	return freq;
240bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger}
241bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger#else /* !CONFIG_PPC_MPC512x */
2422dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev,
243bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   const char *clock_name,
244bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					   int *mscan_clksrc)
245bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger{
246bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	return 0;
247bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger}
248bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger#endif /* CONFIG_PPC_MPC512x */
249afa17a500a3667f66df450100538d06769529bbaWolfram Sang
250b1608d69cb804e414d0887140ba08a9398e4e638Grant Likelystatic struct of_device_id mpc5xxx_can_table[];
25174888760d40b3ac9054f9c5fa07b566c0676ba2dGrant Likelystatic int __devinit mpc5xxx_can_probe(struct platform_device *ofdev)
252afa17a500a3667f66df450100538d06769529bbaWolfram Sang{
253b1608d69cb804e414d0887140ba08a9398e4e638Grant Likely	const struct of_device_id *match;
25474888760d40b3ac9054f9c5fa07b566c0676ba2dGrant Likely	struct mpc5xxx_can_data *data;
2556bd17eb96ffc9c3b52927913d59da9ced5109c6aAnatolij Gustschin	struct device_node *np = ofdev->dev.of_node;
256afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct net_device *dev;
257afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_priv *priv;
258afa17a500a3667f66df450100538d06769529bbaWolfram Sang	void __iomem *base;
259bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	const char *clock_name = NULL;
260bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	int irq, mscan_clksrc = 0;
261bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	int err = -ENOMEM;
262afa17a500a3667f66df450100538d06769529bbaWolfram Sang
263b1608d69cb804e414d0887140ba08a9398e4e638Grant Likely	match = of_match_device(mpc5xxx_can_table, &ofdev->dev);
264b1608d69cb804e414d0887140ba08a9398e4e638Grant Likely	if (!match)
26574888760d40b3ac9054f9c5fa07b566c0676ba2dGrant Likely		return -EINVAL;
266b1608d69cb804e414d0887140ba08a9398e4e638Grant Likely	data = match->data;
26774888760d40b3ac9054f9c5fa07b566c0676ba2dGrant Likely
268bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	base = of_iomap(np, 0);
269afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (!base) {
270afa17a500a3667f66df450100538d06769529bbaWolfram Sang		dev_err(&ofdev->dev, "couldn't ioremap\n");
271bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		return err;
272afa17a500a3667f66df450100538d06769529bbaWolfram Sang	}
273afa17a500a3667f66df450100538d06769529bbaWolfram Sang
274afa17a500a3667f66df450100538d06769529bbaWolfram Sang	irq = irq_of_parse_and_map(np, 0);
275afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (!irq) {
276afa17a500a3667f66df450100538d06769529bbaWolfram Sang		dev_err(&ofdev->dev, "no irq found\n");
277afa17a500a3667f66df450100538d06769529bbaWolfram Sang		err = -ENODEV;
278afa17a500a3667f66df450100538d06769529bbaWolfram Sang		goto exit_unmap_mem;
279afa17a500a3667f66df450100538d06769529bbaWolfram Sang	}
280afa17a500a3667f66df450100538d06769529bbaWolfram Sang
281afa17a500a3667f66df450100538d06769529bbaWolfram Sang	dev = alloc_mscandev();
282bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	if (!dev)
283afa17a500a3667f66df450100538d06769529bbaWolfram Sang		goto exit_dispose_irq;
284afa17a500a3667f66df450100538d06769529bbaWolfram Sang
285afa17a500a3667f66df450100538d06769529bbaWolfram Sang	priv = netdev_priv(dev);
286afa17a500a3667f66df450100538d06769529bbaWolfram Sang	priv->reg_base = base;
287afa17a500a3667f66df450100538d06769529bbaWolfram Sang	dev->irq = irq;
288afa17a500a3667f66df450100538d06769529bbaWolfram Sang
289bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	clock_name = of_get_property(np, "fsl,mscan-clock-source", NULL);
290bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
291bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	BUG_ON(!data);
292bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	priv->type = data->type;
293bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	priv->can.clock.freq = data->get_clock(ofdev, clock_name,
294bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger					       &mscan_clksrc);
295afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (!priv->can.clock.freq) {
296bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger		dev_err(&ofdev->dev, "couldn't get MSCAN clock properties\n");
297afa17a500a3667f66df450100538d06769529bbaWolfram Sang		goto exit_free_mscan;
298afa17a500a3667f66df450100538d06769529bbaWolfram Sang	}
299afa17a500a3667f66df450100538d06769529bbaWolfram Sang
300afa17a500a3667f66df450100538d06769529bbaWolfram Sang	SET_NETDEV_DEV(dev, &ofdev->dev);
301afa17a500a3667f66df450100538d06769529bbaWolfram Sang
302bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	err = register_mscandev(dev, mscan_clksrc);
303afa17a500a3667f66df450100538d06769529bbaWolfram Sang	if (err) {
304afa17a500a3667f66df450100538d06769529bbaWolfram Sang		dev_err(&ofdev->dev, "registering %s failed (err=%d)\n",
305afa17a500a3667f66df450100538d06769529bbaWolfram Sang			DRV_NAME, err);
306afa17a500a3667f66df450100538d06769529bbaWolfram Sang		goto exit_free_mscan;
307afa17a500a3667f66df450100538d06769529bbaWolfram Sang	}
308afa17a500a3667f66df450100538d06769529bbaWolfram Sang
309afa17a500a3667f66df450100538d06769529bbaWolfram Sang	dev_set_drvdata(&ofdev->dev, dev);
310afa17a500a3667f66df450100538d06769529bbaWolfram Sang
311afa17a500a3667f66df450100538d06769529bbaWolfram Sang	dev_info(&ofdev->dev, "MSCAN at 0x%p, irq %d, clock %d Hz\n",
312afa17a500a3667f66df450100538d06769529bbaWolfram Sang		 priv->reg_base, dev->irq, priv->can.clock.freq);
313afa17a500a3667f66df450100538d06769529bbaWolfram Sang
314afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return 0;
315afa17a500a3667f66df450100538d06769529bbaWolfram Sang
316afa17a500a3667f66df450100538d06769529bbaWolfram Sangexit_free_mscan:
317afa17a500a3667f66df450100538d06769529bbaWolfram Sang	free_candev(dev);
318afa17a500a3667f66df450100538d06769529bbaWolfram Sangexit_dispose_irq:
319afa17a500a3667f66df450100538d06769529bbaWolfram Sang	irq_dispose_mapping(irq);
320afa17a500a3667f66df450100538d06769529bbaWolfram Sangexit_unmap_mem:
321afa17a500a3667f66df450100538d06769529bbaWolfram Sang	iounmap(base);
322bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
323afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return err;
324afa17a500a3667f66df450100538d06769529bbaWolfram Sang}
325afa17a500a3667f66df450100538d06769529bbaWolfram Sang
3262dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic int __devexit mpc5xxx_can_remove(struct platform_device *ofdev)
327afa17a500a3667f66df450100538d06769529bbaWolfram Sang{
328afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct net_device *dev = dev_get_drvdata(&ofdev->dev);
329afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_priv *priv = netdev_priv(dev);
330afa17a500a3667f66df450100538d06769529bbaWolfram Sang
331afa17a500a3667f66df450100538d06769529bbaWolfram Sang	dev_set_drvdata(&ofdev->dev, NULL);
332afa17a500a3667f66df450100538d06769529bbaWolfram Sang
333afa17a500a3667f66df450100538d06769529bbaWolfram Sang	unregister_mscandev(dev);
334afa17a500a3667f66df450100538d06769529bbaWolfram Sang	iounmap(priv->reg_base);
335afa17a500a3667f66df450100538d06769529bbaWolfram Sang	irq_dispose_mapping(dev->irq);
336afa17a500a3667f66df450100538d06769529bbaWolfram Sang	free_candev(dev);
337afa17a500a3667f66df450100538d06769529bbaWolfram Sang
338afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return 0;
339afa17a500a3667f66df450100538d06769529bbaWolfram Sang}
340afa17a500a3667f66df450100538d06769529bbaWolfram Sang
341afa17a500a3667f66df450100538d06769529bbaWolfram Sang#ifdef CONFIG_PM
342afa17a500a3667f66df450100538d06769529bbaWolfram Sangstatic struct mscan_regs saved_regs;
3432dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic int mpc5xxx_can_suspend(struct platform_device *ofdev, pm_message_t state)
344afa17a500a3667f66df450100538d06769529bbaWolfram Sang{
345afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct net_device *dev = dev_get_drvdata(&ofdev->dev);
346afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_priv *priv = netdev_priv(dev);
347afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base;
348afa17a500a3667f66df450100538d06769529bbaWolfram Sang
349afa17a500a3667f66df450100538d06769529bbaWolfram Sang	_memcpy_fromio(&saved_regs, regs, sizeof(*regs));
350afa17a500a3667f66df450100538d06769529bbaWolfram Sang
351afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return 0;
352afa17a500a3667f66df450100538d06769529bbaWolfram Sang}
353afa17a500a3667f66df450100538d06769529bbaWolfram Sang
3542dc11581376829303b98eadb2de253bee065a56aGrant Likelystatic int mpc5xxx_can_resume(struct platform_device *ofdev)
355afa17a500a3667f66df450100538d06769529bbaWolfram Sang{
356afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct net_device *dev = dev_get_drvdata(&ofdev->dev);
357afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_priv *priv = netdev_priv(dev);
358afa17a500a3667f66df450100538d06769529bbaWolfram Sang	struct mscan_regs *regs = (struct mscan_regs *)priv->reg_base;
359afa17a500a3667f66df450100538d06769529bbaWolfram Sang
360afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canctl0 |= MSCAN_INITRQ;
3610285e7ceaaec9ef2d2e74dd37e2b557c0e017b5cWolfram Sang	while (!(regs->canctl1 & MSCAN_INITAK))
362afa17a500a3667f66df450100538d06769529bbaWolfram Sang		udelay(10);
363afa17a500a3667f66df450100538d06769529bbaWolfram Sang
364afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canctl1 = saved_regs.canctl1;
365afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canbtr0 = saved_regs.canbtr0;
366afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canbtr1 = saved_regs.canbtr1;
367afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canidac = saved_regs.canidac;
368afa17a500a3667f66df450100538d06769529bbaWolfram Sang
369afa17a500a3667f66df450100538d06769529bbaWolfram Sang	/* restore masks, buffers etc. */
370afa17a500a3667f66df450100538d06769529bbaWolfram Sang	_memcpy_toio(&regs->canidar1_0, (void *)&saved_regs.canidar1_0,
371afa17a500a3667f66df450100538d06769529bbaWolfram Sang		     sizeof(*regs) - offsetof(struct mscan_regs, canidar1_0));
372afa17a500a3667f66df450100538d06769529bbaWolfram Sang
373afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canctl0 &= ~MSCAN_INITRQ;
374afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->cantbsel = saved_regs.cantbsel;
375afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canrier = saved_regs.canrier;
376afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->cantier = saved_regs.cantier;
377afa17a500a3667f66df450100538d06769529bbaWolfram Sang	regs->canctl0 = saved_regs.canctl0;
378afa17a500a3667f66df450100538d06769529bbaWolfram Sang
379afa17a500a3667f66df450100538d06769529bbaWolfram Sang	return 0;
380afa17a500a3667f66df450100538d06769529bbaWolfram Sang}
381afa17a500a3667f66df450100538d06769529bbaWolfram Sang#endif
382afa17a500a3667f66df450100538d06769529bbaWolfram Sang
383bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstatic struct mpc5xxx_can_data __devinitdata mpc5200_can_data = {
384bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	.type = MSCAN_TYPE_MPC5200,
385bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	.get_clock = mpc52xx_can_get_clock,
386bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger};
387bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
388bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandeggerstatic struct mpc5xxx_can_data __devinitdata mpc5121_can_data = {
389bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	.type = MSCAN_TYPE_MPC5121,
390bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	.get_clock = mpc512x_can_get_clock,
391bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger};
392bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger
393afa17a500a3667f66df450100538d06769529bbaWolfram Sangstatic struct of_device_id __devinitdata mpc5xxx_can_table[] = {
394bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	{ .compatible = "fsl,mpc5200-mscan", .data = &mpc5200_can_data, },
395bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	/* Note that only MPC5121 Rev. 2 (and later) is supported */
396bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang Grandegger	{ .compatible = "fsl,mpc5121-mscan", .data = &mpc5121_can_data, },
397afa17a500a3667f66df450100538d06769529bbaWolfram Sang	{},
398afa17a500a3667f66df450100538d06769529bbaWolfram Sang};
399afa17a500a3667f66df450100538d06769529bbaWolfram Sang
40074888760d40b3ac9054f9c5fa07b566c0676ba2dGrant Likelystatic struct platform_driver mpc5xxx_can_driver = {
4014018294b53d1dae026880e45f174c1cc63b5d435Grant Likely	.driver = {
4024018294b53d1dae026880e45f174c1cc63b5d435Grant Likely		.name = "mpc5xxx_can",
4034018294b53d1dae026880e45f174c1cc63b5d435Grant Likely		.owner = THIS_MODULE,
4044018294b53d1dae026880e45f174c1cc63b5d435Grant Likely		.of_match_table = mpc5xxx_can_table,
4054018294b53d1dae026880e45f174c1cc63b5d435Grant Likely	},
406afa17a500a3667f66df450100538d06769529bbaWolfram Sang	.probe = mpc5xxx_can_probe,
407afa17a500a3667f66df450100538d06769529bbaWolfram Sang	.remove = __devexit_p(mpc5xxx_can_remove),
408afa17a500a3667f66df450100538d06769529bbaWolfram Sang#ifdef CONFIG_PM
409afa17a500a3667f66df450100538d06769529bbaWolfram Sang	.suspend = mpc5xxx_can_suspend,
410afa17a500a3667f66df450100538d06769529bbaWolfram Sang	.resume = mpc5xxx_can_resume,
411afa17a500a3667f66df450100538d06769529bbaWolfram Sang#endif
412afa17a500a3667f66df450100538d06769529bbaWolfram Sang};
413afa17a500a3667f66df450100538d06769529bbaWolfram Sang
414871d33725545ca2e402b4526f38f89d041ba930fAxel Linmodule_platform_driver(mpc5xxx_can_driver);
415afa17a500a3667f66df450100538d06769529bbaWolfram Sang
416afa17a500a3667f66df450100538d06769529bbaWolfram SangMODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
417bf3af54732bea5894ccc2cbde3ab566f0af7da56Wolfgang GrandeggerMODULE_DESCRIPTION("Freescale MPC5xxx CAN driver");
418afa17a500a3667f66df450100538d06769529bbaWolfram SangMODULE_LICENSE("GPL v2");
419