Project

General

Profile

RE: KSZ8995MA Ethernet Switch Support ยป baseboard-hawkersiddeleydev.c

Charles Kinney, 06/11/2012 10:35 AM

 
1
/*
2
 * Critical Link MityOMAP-L138 SoM Baseboard initializtaion file
3
 * Modified for Hawker Siddeley Switchgear Demo Board
4
 *
5
 */
6
#include <linux/kernel.h>
7
#include <linux/init.h>
8
#include <linux/gpio.h>
9
#include <linux/platform_device.h>
10
#include <linux/spi/spi.h>
11
#include <linux/delay.h>
12
#include <linux/mtd/mtd.h>
13
#include <linux/usb/musb.h>
14

    
15
#include <asm/mach-types.h>
16
#include <asm/mach/arch.h>
17
#include <asm/setup.h>
18
#include <mach/mux.h>
19
#include <mach/da8xx.h>
20
#include <linux/can/platform/mcp251x.h>
21

    
22
//#define BASEBOARD_NAME "IndustrialIO"
23
#define BASEBOARD_NAME "Hawker Siddeley Switchgear Demo Board"
24
#define MSTPRI2_LCD_MASK  0x70000000
25
#define MSTPRI2_LCD_SHIFT 28
26
#define LCD_PRIORITY	  0 /* make video output highest priority */
27

    
28
#define MMCSD_CD_PIN		GPIO_TO_PIN(4, 0)
29
#define MMCSD_WP_PIN		GPIO_TO_PIN(4, 1)
30
#define SYSTEM_RESET		GPIO_TO_PIN(5, 14)
31
#define CAN_CS_N		GPIO_TO_PIN(2, 15)
32
#define CAN_INT_PIN		GPIO_TO_PIN(2, 12)
33
#define DSD1791_CS_N		GPIO_TO_PIN(0, 8)
34
#define KS8995_CS		GPIO_TO_PIN(0, 15)
35

    
36
static int baseboard_mmc_get_ro(int index)
37
{
38
	return gpio_get_value(MMCSD_WP_PIN);
39
}
40

    
41
static int baseboard_mmc_get_cd(int index)
42
{
43
	return !gpio_get_value(MMCSD_CD_PIN);
44
}
45

    
46
static struct davinci_mmc_config da850_mmc_config = {
47
	.get_ro		= baseboard_mmc_get_ro,
48
	.get_cd		= baseboard_mmc_get_cd,
49
	.wires		= 4,
50
	.max_freq	= 50000000,
51
	.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
52
	.version	= MMC_CTLR_VERSION_2,
53
};
54

    
55
static const short da850_mmcsd0_pins[] __initconst = {
56
	DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
57
	DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
58
	DA850_GPIO4_0, DA850_GPIO4_1,
59
	-1
60
};
61

    
62
static __init void baseboard_setup_mmc(void)
63
{
64
	int ret;
65

    
66
	ret = davinci_cfg_reg_list(da850_mmcsd0_pins);
67
	if (ret)
68
		pr_warning("%s: mmcsd0 mux setup failed: %d\n", __func__, ret);
69

    
70
	ret = gpio_request(MMCSD_CD_PIN, "MMC CD\n");
71
	if (ret)
72
		pr_warning("%s: can not open GPIO %d\n", __func__,
73
				MMCSD_CD_PIN);
74
	gpio_direction_input(MMCSD_CD_PIN);
75

    
76
	ret = gpio_request(MMCSD_WP_PIN, "MMC WP\n");
77
	if (ret)
78
		pr_warning("%s: can not open GPIO %d\n", __func__,
79
				MMCSD_WP_PIN);
80
	gpio_direction_input(MMCSD_WP_PIN);
81

    
82
	ret = da8xx_register_mmcsd0(&da850_mmc_config);
83
	if (ret)
84
		pr_warning("%s: mmcsd0 registration failed: %d\n", __func__,
85
				ret);
86
}
87

    
88
/*
89
 * GPIO pins, this is an exhaustive list which may be overridden by
90
 * other devices
91
 */
92
static short baseboard_gpio_pins[] __initdata = {
93
	DA850_GPIO0_0, DA850_GPIO0_1, DA850_GPIO0_2, DA850_GPIO0_3,
94
	DA850_GPIO0_4, DA850_GPIO0_5, DA850_GPIO0_6, DA850_GPIO0_7,
95
	DA850_GPIO0_8, DA850_GPIO0_9, DA850_GPIO0_10, DA850_GPIO0_11,
96
	DA850_GPIO0_12, DA850_GPIO0_13, DA850_GPIO0_14,DA850_GPIO0_15, //used for CS on KSZ8995MA
97
	DA850_GPIO2_12, DA850_GPIO2_15, -1,
98
};
99

    
100
/* davinci da850 evm audio machine driver */
101
static u8 da850_iis_serializer_direction[] = {
102
	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
103
	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
104
	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
105
	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
106
};
107

    
108
static struct snd_platform_data baseboard_snd_data = {
109
	.tx_dma_offset	= 0x2000,
110
	.rx_dma_offset	= 0x2000,
111
	.op_mode	= DAVINCI_MCASP_IIS_MODE,
112
	.num_serializer	= ARRAY_SIZE(da850_iis_serializer_direction),
113
	.tdm_slots	= 0,
114
	.serial_dir	= da850_iis_serializer_direction,
115
	.asp_chan_q	= EVENTQ_1,
116
	.version	= MCASP_VERSION_2,
117
	.txnumevt	= 0,
118
	.rxnumevt	= 0,
119
};
120

    
121
static short baseboard_mcasp_pins[25] __initdata = {
122
	DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
123
	DA850_AHCLKR, DA850_ACLKR, DA850_AFSR,
124
	DA850_AMUTE, DA850_GPIO5_14,
125
	-1, -1, -1, -1,
126
	-1, -1, -1, -1,
127
	-1, -1, -1, -1,
128
	-1, -1, -1, -1,
129
	-1
130
};
131

    
132
static __init int baseboard_setup_mcasp(void)
133
{
134
	int ret;
135

    
136
	baseboard_mcasp_pins[8+0] = DA850_AXR_15;
137
	da850_iis_serializer_direction[15] = TX_MODE;
138

    
139
	ret = davinci_cfg_reg_list(baseboard_mcasp_pins);
140
	if (ret)
141
		pr_warning("%s: mcasp mux setup failed: %d\n", __func__, ret);
142

    
143
	ret = gpio_request(SYSTEM_RESET, "SYSTEM RESET\n");
144
	if (ret)
145
		pr_warning("%s: can't open GPIO %d\n", __func__, SYSTEM_RESET);
146
	msleep(20);
147
	gpio_direction_output(SYSTEM_RESET, 0);
148
	msleep(20);
149
	gpio_set_value(SYSTEM_RESET, 1);
150

    
151
	baseboard_snd_data.tdm_slots = 2;
152
	baseboard_snd_data.txnumevt = 1;
153

    
154
	da8xx_register_mcasp(0, &baseboard_snd_data);
155

    
156
	return ret;
157
}
158

    
159
static const struct display_panel disp_panel = {
160
	QVGA,
161
	16,
162
	16,
163
	COLOR_ACTIVE,
164
};
165

    
166
static struct lcd_ctrl_config lcd_cfg = {
167
	&disp_panel,
168
	.ac_bias		= 255,
169
	.ac_bias_intrpt		= 0,
170
	.dma_burst_sz		= 16,
171
	.bpp			= 16,
172
	.fdd			= 255,
173
	.tft_alt_mode		= 0,
174
	.stn_565_mode		= 0,
175
	.mono_8bit_mode		= 0,
176
	.invert_line_clock	= 0,
177
	.invert_frm_clock	= 0,
178
	.sync_edge		= 0,
179
	.sync_ctrl		= 1,
180
	.raster_order		= 0,
181
};
182

    
183
static struct da8xx_lcdc_platform_data sharp_lq035q7dh06_pdata = {
184
	.manu_name		= "sharp",
185
	.controller_data	= &lcd_cfg,
186
	.type			= "Sharp_LQ035Q7DH06",
187
};
188

    
189
static struct da8xx_lcdc_platform_data chimei_p0430wqlb_pdata = {
190
	.manu_name		= "ChiMei",
191
	.controller_data	= &lcd_cfg,
192
	.type			= "ChiMei_P0430WQLB",
193
};
194

    
195
static struct da8xx_lcdc_platform_data vga_640x480_pdata = {
196
	.manu_name		= "VGA",
197
	.controller_data	= &lcd_cfg,
198
	.type			= "vga_640x480",
199
};
200

    
201
static struct da8xx_lcdc_platform_data wvga_800x480_pdata = {
202
	.manu_name		= "WVGA",
203
	.controller_data	= &lcd_cfg,
204
	.type			= "wvga_800x480",
205
};
206

    
207
static struct da8xx_lcdc_platform_data svga_800x600_pdata = {
208
	.manu_name		= "SVGA",
209
	.controller_data	= &lcd_cfg,
210
	.type			= "svga_800x600",
211
};
212

    
213
static struct da8xx_lcdc_platform_data nec_nl4827hc19_pdata = {
214
	.manu_name		= "NEC",
215
	.controller_data	= &lcd_cfg,
216
	.type			= "NEC_NL4827HC19-05B",
217
};
218

    
219
static __init void baseboard_setup_lcd(const char *panel)
220
{
221
	int ret;
222
	struct da8xx_lcdc_platform_data *pdata;
223

    
224
	u32 prio;
225

    
226
	/* set peripheral master priority up to 1 */
227
	prio = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_MSTPRI2_REG));
228
	prio &= ~MSTPRI2_LCD_MASK;
229
	prio |= LCD_PRIORITY<<MSTPRI2_LCD_SHIFT;
230
	__raw_writel(prio, DA8XX_SYSCFG0_VIRT(DA8XX_MSTPRI2_REG));
231

    
232
	if (!strcmp("Sharp_LQ035Q7DH06", panel))
233
		pdata = &sharp_lq035q7dh06_pdata;
234
	else if (!strcmp("ChiMei_P0430WQLB", panel))
235
		pdata = &chimei_p0430wqlb_pdata;
236
	else if (!strcmp("vga_640x480", panel))
237
		pdata = &vga_640x480_pdata;
238
	else if (!strcmp("wvga_800x480", panel))
239
		pdata = &wvga_800x480_pdata;
240
	else if (!strcmp("svga_800x600", panel))
241
		pdata = &svga_800x600_pdata;
242
	else if (!strcmp("NEC_NL4827HC19-05B", panel)) {
243
		pdata = &nec_nl4827hc19_pdata;
244
		lcd_cfg.invert_line_clock	= 1;
245
		lcd_cfg.invert_frm_clock	= 1;
246
	} else {
247
		pr_warning("%s: unknown LCD type : %s\n", __func__,
248
				panel);
249
		return;
250
	}
251

    
252
	ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
253
	if (ret) {
254
		pr_warning("%s: lcd pinmux failed : %d\n", __func__,
255
				ret);
256
		return;
257
	}
258

    
259
	ret = da8xx_register_lcdc(pdata);
260
}
261

    
262
#ifdef CONFIG_MTD
263
#define OFFSET_LCDCONFIG 0260
264
#define LCDCONFIG_LEN 33
265
static void baseboard_mtd_notify(struct mtd_info *mtd)
266
{
267
	int retlen;
268
	char buf[LCDCONFIG_LEN]; /* enable, manufacturer name */
269
	if (!strcmp(mtd->name, "periph-config")) {
270
		mtd->_read(mtd, OFFSET_LCDCONFIG, LCDCONFIG_LEN, &retlen,
271
			  buf);
272
		if (retlen == LCDCONFIG_LEN) {
273
			if (buf[0]) {
274
				buf[LCDCONFIG_LEN-1] = 0;
275
				pr_info("Using LCD panel: %s\n", &buf[1]);
276
				baseboard_setup_lcd(&buf[1]);
277
			} else
278
				pr_info("No LCD configured\n");
279
		}
280
	}
281
}
282

    
283
static struct mtd_notifier baseboard_spi_notifier = {
284
	.add	= baseboard_mtd_notify,
285
};
286

    
287
static void baseboard_mtd_notify_add(void)
288
{
289
	register_mtd_user(&baseboard_spi_notifier);
290
}
291
#else
292
static void baseboard_mtd_notify_add(void) { }
293
#endif
294

    
295
static struct mcp251x_platform_data mcp2515_pdata = {
296
	.oscillator_frequency	= 20000000,
297
};
298

    
299
static struct davinci_spi_config spi_mcp2515_config = {
300
	.io_type	= SPI_IO_TYPE_DMA,
301
	.c2tdelay	= 0,
302
	.t2cdelay	= 0,
303
};
304

    
305
static struct davinci_spi_config spi_dsd1791_config = {
306
	.io_type	= SPI_IO_TYPE_DMA,
307
	.c2tdelay	= 0,
308
	.t2cdelay	= 0,
309
};
310
static struct davinci_spi_config spi_ks8995_config = {
311
	.io_type	= SPI_IO_TYPE_DMA,
312
	.c2tdelay	= 0,
313
	.t2cdelay	= 0,
314
};
315

    
316
static struct spi_board_info baseboard_spi1_info[] = {
317
	[0] = {
318
		.modalias		= "mcp2515",
319
		.platform_data		= &mcp2515_pdata,
320
		.controller_data	= &spi_mcp2515_config,
321
		.max_speed_hz		= 10000000,
322
		.bus_num		= 1,
323
		.chip_select		= 1,
324
	},
325
	[1] = {
326
		.modalias		= "dsd1791",
327
		.controller_data	= &spi_dsd1791_config,
328
		.max_speed_hz		= 1000000,
329
		.bus_num		= 1,
330
		.chip_select		= 2,
331
	},
332
	[2] = {
333
		.modalias		= "spi-ks8995",
334
		.controller_data	= &spi_ks8995_config,
335
		.max_speed_hz		= 1000000,	//5000000,
336
		.bus_num		= 1,
337
		.chip_select		= 3,
338
	},
339
};
340

    
341
static u8 spi1_cs[] = {
342
	SPI_INTERN_CS,
343
	CAN_CS_N,
344
	DSD1791_CS_N,
345
	KS8995_CS,
346
};
347

    
348
static void __init baseboard_setup_spi(void)
349
{
350
	int ret;
351

    
352
	pr_info("%s: Entered\n", __func__);
353

    
354
	ret = gpio_request(CAN_CS_N, "CAN CS\n");
355
	if (ret)
356
		pr_warning("%s: can not open CAN CS %d\n", __func__, CAN_CS_N);
357

    
358
	ret = gpio_request(DSD1791_CS_N, "DSD1791 CS\n");
359
	if (ret)
360
		pr_warning("%s: can not open DSD1791 CS %d\n", __func__, DSD1791_CS_N);
361

    
362
	ret = gpio_request(KS8995_CS, "KS8995 CS\n");
363
	if (ret)
364
		pr_warning("%s: can not open KS8995 CS %d\n", __func__, KS8995_CS);
365
//	gpio_direction_output(KS8995_CS,0);
366
//	gpio_set_value(KS8995_CS,1);
367

    
368
	baseboard_spi1_info[0].irq = gpio_to_irq(CAN_INT_PIN);
369

    
370
	ret = spi_register_board_info(baseboard_spi1_info, ARRAY_SIZE(baseboard_spi1_info));
371
	if (ret)
372
		pr_warning("%s: Unable to register SPI1 Info: %d\n", __func__,
373
				ret);
374
	pr_info("%s: Exit\n", __func__);
375
}
376

    
377
static int __init baseboard_pre_init(void)
378
{
379
	pr_info("%s: Entered\n", __func__);
380
	da8xx_spi_pdata[1].chip_sel = spi1_cs;
381
	da8xx_spi_pdata[1].num_chipselect = ARRAY_SIZE(spi1_cs);
382
	davinci_soc_info.emac_pdata->phy_id = "";
383
	return 0;
384
}
385
postcore_initcall_sync(baseboard_pre_init);
386

    
387
static int __init baseboard_init(void)
388
{
389
	pr_info("%s [%s]...\n", __func__, BASEBOARD_NAME);
390

    
391
	davinci_cfg_reg_list(baseboard_gpio_pins);
392

    
393
	baseboard_setup_mmc();
394

    
395
	baseboard_setup_spi();
396

    
397
	baseboard_setup_mcasp();
398

    
399
	baseboard_mtd_notify_add();
400

    
401
	mityomapl138_usb_init(MUSB_OTG);
402

    
403
	return 0;
404
}
405
arch_initcall_sync(baseboard_init);
406

    
    (1-1/1)
    Go to top
    Add picture from clipboard (Maximum size: 1 GB)