Example #1
0
void __init stx7105_configure_lirc(struct stx7105_lirc_config *config)
{
	static int configured;
	struct stx7105_lirc_config default_config = {};
	struct stm_plat_lirc_data *plat_data =
			stx7105_lirc_device.dev.platform_data;
	struct stm_pad_config *pad_config;

	BUG_ON(configured);
	configured = 1;

	if (!config)
		config = &default_config;

	pad_config = stm_pad_config_alloc(3, 0);
	BUG_ON(!pad_config);

	plat_data->txenabled = config->tx_enabled || config->tx_od_enabled;
	plat_data->pads = pad_config;

	switch (config->rx_mode) {
	case stx7105_lirc_rx_disabled:
		/* Nothing to do */
		break;
	case stx7105_lirc_rx_mode_ir:
		plat_data->rxuhfmode = 0;
		stm_pad_config_add_pio_in(pad_config, 3, 0, -1);
		break;
	case stx7105_lirc_rx_mode_uhf:
		plat_data->rxuhfmode = 1;
		stm_pad_config_add_pio_in(pad_config, 3, 1, -1);
		break;
	default:
		BUG();
		break;
	}

	if (config->tx_enabled)
		stm_pad_config_add_pio_out(pad_config, 3, 2, 3);

	if (config->tx_od_enabled)
		stm_pad_config_add_pio_out(pad_config, 3, 3, 3);

	platform_device_register(&stx7105_lirc_device);
}
Example #2
0
int __init stx7105_configure_ssc_spi(int ssc, struct stx7105_ssc_config *config)
{
	static int spi_busnum;
	struct stx7105_ssc_config default_config = {};
	struct stm_plat_ssc_data *plat_data;
	struct stm_pad_config *pad_config;

	BUG_ON(ssc < 0 || ssc >= ARRAY_SIZE(stx7105_ssc_devices));

	BUG_ON(stx7105_ssc_configured[ssc]);
	stx7105_ssc_configured[ssc] = 1;

	if (!config)
		config = &default_config;

	stx7105_ssc_devices[ssc].name = "spi-stm";
	stx7105_ssc_devices[ssc].id = spi_busnum;

	plat_data = stx7105_ssc_devices[ssc].dev.platform_data;

	switch (ssc) {
	case 0:
	case 1:
		pad_config = &stx7105_ssc_spi_pad_configs[ssc];
		break;
	case 2:
		pad_config = stm_pad_config_alloc(3, 2);

		/* SCK */
		switch (config->routing.ssc2.sclk) {
		case stx7105_ssc2_sclk_pio2_4: /* 7106 only! */
			BUG_ON(cpu_data->type != CPU_STX7106);
			stm_pad_config_add_pio_out(pad_config, 2, 4, 2);
			/* ssc2_sclk_in: 00 = PIO2.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 0);
			break;
		case stx7105_ssc2_sclk_pio3_4:
			stm_pad_config_add_pio_out(pad_config, 3, 4, 2);
			/* ssc2_sclk_in: 01 = PIO3.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 1);
			break;
		case stx7105_ssc2_sclk_pio12_0:
			stm_pad_config_add_pio_out(pad_config, 12, 0, 3);
			/* ssc2_sclk_in: 10 = PIO12.0 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 2);
			break;
		case stx7105_ssc2_sclk_pio13_4:
			stm_pad_config_add_pio_out(pad_config, 13, 4, 2);
			/* ssc2_sclk_in: 11 = PIO13.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 3);
			break;
		}

		/* MOSI */
		switch (config->routing.ssc2.mtsr) {
		case stx7105_ssc2_mtsr_pio2_0:
			stm_pad_config_add_pio_out(pad_config, 2, 0, 3);
			break;
		case stx7105_ssc2_mtsr_pio3_5:
			stm_pad_config_add_pio_out(pad_config, 3, 5, 2);
			break;
		case stx7105_ssc2_mtsr_pio12_1:
			stm_pad_config_add_pio_out(pad_config, 12, 1, 3);
			break;
		case stx7105_ssc2_mtsr_pio13_5:
			stm_pad_config_add_pio_out(pad_config, 13, 5, 2);
			break;
		}

		/* MISO */
		switch (config->routing.ssc2.mrst) {
		case stx7105_ssc2_mrst_pio2_0:
			stm_pad_config_add_pio_in(pad_config, 2, 0, -1);
			/* ssc2_mrst_in: 00 = PIO2.0 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 7, 8, 0);
			break;
		case stx7105_ssc2_mrst_pio3_5:
			stm_pad_config_add_pio_in(pad_config, 3, 5, -1);
			/* ssc2_mrst_in: 01 = PIO3.5 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 7, 8, 1);
			break;
		case stx7105_ssc2_mrst_pio12_1:
			stm_pad_config_add_pio_in(pad_config, 12, 1, -1);
			/* ssc2_mrst_in: 10 = PIO12.1 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 7, 8, 2);
			break;
		case stx7105_ssc2_mrst_pio13_5:
			stm_pad_config_add_pio_in(pad_config, 13, 5, -1);
			/* ssc2_mrst_in: 11 = PIO13.5 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 7, 8, 3);
			break;
		}

		break;
	case 3:
		pad_config = stm_pad_config_alloc(3, 2);

		/* SCK */
		switch (config->routing.ssc3.sclk) {
		case stx7105_ssc3_sclk_pio2_7: /* 7106 only! */
			BUG_ON(cpu_data->type != CPU_STX7106);
			stm_pad_config_add_pio_out(pad_config, 2, 7, 2);
			/* ssc3_sclk_in: 00 = PIO2.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 0);
			break;
		case stx7105_ssc3_sclk_pio3_6:
			stm_pad_config_add_pio_out(pad_config, 3, 6, 2);
			/* ssc3_sclk_in: 00 = PIO3.6 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 0);
			break;
		case stx7105_ssc3_sclk_pio13_2:
			stm_pad_config_add_pio_out(pad_config, 13, 2, 4);
			/* ssc3_sclk_in: 01 = PIO13.2 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 1);
			break;
		case stx7105_ssc3_sclk_pio13_6:
			stm_pad_config_add_pio_out(pad_config, 13, 6, 2);
			/* ssc3_sclk_in: 1x = PIO13.6 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 2);
			break;
		}

		/* MOSI */
		switch (config->routing.ssc3.mtsr) {
		case stx7105_ssc3_mtsr_pio2_1:
			stm_pad_config_add_pio_out(pad_config, 2, 1, 3);
			break;
		case stx7105_ssc3_mtsr_pio3_7:
			stm_pad_config_add_pio_out(pad_config, 3, 7, 3);
			break;
		case stx7105_ssc3_mtsr_pio13_3:
			stm_pad_config_add_pio_out(pad_config, 13, 3, 4);
			break;
		case stx7105_ssc3_mtsr_pio13_7:
			stm_pad_config_add_pio_out(pad_config, 13, 7, 2);
			break;
		}

		/* MISO */
		switch (config->routing.ssc3.mrst) {
		case stx7105_ssc3_mrst_pio2_1:
			stm_pad_config_add_pio_in(pad_config, 2, 1, -1);
			/* ssc3_mrst_in: 00 = PIO2.1 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 14, 15, 0);
			break;
		case stx7105_ssc3_mrst_pio3_7:
			stm_pad_config_add_pio_in(pad_config, 3, 7, -1);
			/* ssc3_mrst_in: 01 = PIO3.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 14, 15, 1);
			break;
		case stx7105_ssc3_mrst_pio13_3:
			stm_pad_config_add_pio_in(pad_config, 13, 3, -1);
			/* ssc3_mrst_in: 10 = PIO13.3 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 14, 15, 2);
			break;
		case stx7105_ssc3_mrst_pio13_7:
			stm_pad_config_add_pio_in(pad_config, 13, 7, -1);
			/* ssc3_mrst_in: 11 = PIO13.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 14, 15, 3);
			break;
		}

		break;
	default:
		BUG();
		pad_config = NULL; /* Keep the compiler happy ;-) */
		break;
	}

	plat_data->spi_chipselect = config->spi_chipselect;
	plat_data->pad_config = pad_config;

	platform_device_register(&stx7105_ssc_devices[ssc]);

	return spi_busnum++;
}
Example #3
0
int __init stx7105_configure_ssc_i2c(int ssc, struct stx7105_ssc_config *config)
{
	static int i2c_busnum;
	struct stx7105_ssc_config default_config = {};
	struct stm_plat_ssc_data *plat_data;
	struct stm_pad_config *pad_config;

	BUG_ON(ssc < 0 || ssc >= ARRAY_SIZE(stx7105_ssc_devices));

	BUG_ON(stx7105_ssc_configured[ssc]);
	stx7105_ssc_configured[ssc] = 1;

	if (!config)
		config = &default_config;

	stx7105_ssc_devices[ssc].name = "i2c-stm";
	stx7105_ssc_devices[ssc].id = i2c_busnum;

	plat_data = stx7105_ssc_devices[ssc].dev.platform_data;

	switch (ssc) {
	case 0:
	case 1:
		pad_config = &stx7105_ssc_i2c_pad_configs[ssc];
		break;
	case 2:
		pad_config = stm_pad_config_alloc(2, 2);

		/* SCL */
		switch (config->routing.ssc2.sclk) {
		case stx7105_ssc2_sclk_pio2_4: /* 7106 only! */
			BUG_ON(cpu_data->type != CPU_STX7106);
			stm_pad_config_add_pio_bidir_named(pad_config,
					2, 4, 2, "SCL");
			/* ssc2_sclk_in: 00 = PIO2.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 0);

			break;
		case stx7105_ssc2_sclk_pio3_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					3, 4, 2, "SCL");
			/* ssc2_sclk_in: 01 = PIO3.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 1);
			break;
		case stx7105_ssc2_sclk_pio12_0:
			stm_pad_config_add_pio_bidir_named(pad_config,
					12, 0, 3, "SCL");
			/* ssc2_sclk_in: 10 = PIO12.0 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 2);
			break;
		case stx7105_ssc2_sclk_pio13_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 4, 2, "SCL");
			/* ssc2_sclk_in: 11 = PIO13.4 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 11, 12, 3);
			break;
		}

		/* SDA */
		switch (config->routing.ssc2.mtsr) {
		case stx7105_ssc2_mtsr_pio2_0:
			stm_pad_config_add_pio_bidir_named(pad_config,
					2, 0, 3, "SDA");
			/* ssc2_mtsr_in: 00 = PIO2.0 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 9, 10, 0);
			break;
		case stx7105_ssc2_mtsr_pio3_5:
			stm_pad_config_add_pio_bidir_named(pad_config,
					3, 5, 2, "SDA");
			/* ssc2_mtsr_in: 01 = PIO3.5 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 9, 10, 1);
			break;
		case stx7105_ssc2_mtsr_pio12_1:
			stm_pad_config_add_pio_bidir_named(pad_config,
					12, 1, 3, "SDA");
			/* ssc2_mtsr_in: 10 = PIO12.1 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 9, 10, 2);
			break;
		case stx7105_ssc2_mtsr_pio13_5:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 5, 2, "SDA");
			/* ssc2_mtsr_in: 11 = PIO13.5 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 9, 10, 3);
			break;
		}

		break;
	case 3:
		pad_config = stm_pad_config_alloc(2, 2);

		/* SCL */
		switch (config->routing.ssc3.sclk) {
		case stx7105_ssc3_sclk_pio2_7: /* 7106 only! */
			BUG_ON(cpu_data->type != CPU_STX7106);
			stm_pad_config_add_pio_bidir_named(pad_config,
					2, 7, 2, "SCL");
			/* ssc3_sclk_in: 00 = PIO2.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 0);
			break;
		case stx7105_ssc3_sclk_pio3_6:
			stm_pad_config_add_pio_bidir_named(pad_config,
					3, 6, 2, "SCL");
			/* ssc3_sclk_in: 01 = PIO3.6 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 1);
			break;
		case stx7105_ssc3_sclk_pio13_2:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 2, 4, "SCL");
			/* ssc3_sclk_in: 10 = PIO13.2 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 2);
			break;
		case stx7105_ssc3_sclk_pio13_6:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 6, 2, "SCL");
			/* ssc3_sclk_in: 11 = PIO13.6 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 18, 19, 3);
			break;
		}

		/* SDA */
		switch (config->routing.ssc3.mtsr) {
		case stx7105_ssc3_mtsr_pio2_1:
			stm_pad_config_add_pio_bidir_named(pad_config,
					2, 1, 3, "SDA");
			/* ssc3_mtsr_in: 00 = PIO2.1 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 16, 17, 0);
			break;
		case stx7105_ssc3_mtsr_pio3_7:
			stm_pad_config_add_pio_bidir_named(pad_config,
					3, 7, 2, "SDA");
			/* ssc3_mtsr_in: 01 = PIO3.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 16, 17, 1);
			break;
		case stx7105_ssc3_mtsr_pio13_3:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 3, 4, "SDA");
			/* ssc3_mtsr_in: 10 = PIO13.3 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 16, 17, 2);
			break;
		case stx7105_ssc3_mtsr_pio13_7:
			stm_pad_config_add_pio_bidir_named(pad_config,
					13, 7, 2, "SDA");
			/* ssc3_mtsr_in: 11 = PIO13.7 */
			stm_pad_config_add_sys_cfg(pad_config, 16, 16, 17, 3);
			break;
		}

		break;
	default:
		BUG();
		pad_config = NULL; /* Keep the compiler happy ;-) */
		break;
	}

	plat_data->pad_config = pad_config;

	/* I2C bus number reservation (to prevent any hot-plug device
	 * from using it) */
	i2c_register_board_info(i2c_busnum, NULL, 0);

	platform_device_register(&stx7105_ssc_devices[ssc]);

	return i2c_busnum++;
}
Example #4
0
int __init stx7108_configure_ssc_spi(int ssc, struct stx7108_ssc_config *config)
{
	static int spi_busnum;
	struct stx7108_ssc_config default_config = {};
	struct stm_plat_ssc_data *plat_data;
	struct stm_pad_config *pad_config;

	BUG_ON(ssc < 0 || ssc >= ARRAY_SIZE(stx7108_ssc_devices));

	BUG_ON(stx7108_ssc_configured[ssc]);
	stx7108_ssc_configured[ssc] = 1;

	if (!config)
		config = &default_config;

	stx7108_ssc_devices[ssc].name = "spi-stm";
	stx7108_ssc_devices[ssc].id = spi_busnum;

	plat_data = stx7108_ssc_devices[ssc].dev.platform_data;

	if (ssc == 2) {
		pad_config = stm_pad_config_alloc(3, 0);

		/* SCK */
		switch (config->routing.ssc2.sclk) {
		case stx7108_ssc2_sclk_pio1_3:
			stm_pad_config_add_pio_bidir_named(pad_config,
					1, 3, 2, "SCL");
			break;
		case stx7108_ssc2_sclk_pio14_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					14, 4, 2, "SCL");
			break;
		default:
			BUG();
			break;
		}

		/* MOSI */
		switch (config->routing.ssc2.mtsr) {
		case stx7108_ssc2_mtsr_pio1_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					1, 4, 2, "SDA");
			break;
		case stx7108_ssc2_mtsr_pio14_5:
			stm_pad_config_add_pio_bidir_named(pad_config,
					14, 5, 2, "SDA");
			break;
		default:
			BUG();
			break;
		}

		/* MISO */
		switch (config->routing.ssc2.mrst) {
		case stx7108_ssc2_mrst_pio1_5:
			stm_pad_config_add_pio_bidir_named(pad_config,
					1, 5, 2, "SDA");
			break;
		case stx7108_ssc2_mrst_pio14_6:
			stm_pad_config_add_pio_bidir_named(pad_config,
					14, 6, 2, "SDA");
			break;
		default:
			BUG();
			break;
		}
	} else {
		pad_config = &stx7108_ssc_spi_pad_configs[ssc];
	}

	plat_data->spi_chipselect = config->spi_chipselect;
	plat_data->pad_config = pad_config;

	platform_device_register(&stx7108_ssc_devices[ssc]);

	return spi_busnum++;
}
Example #5
0
int __init stx7108_configure_ssc_i2c(int ssc, struct stx7108_ssc_config *config)
{
	static int i2c_busnum;
	struct stx7108_ssc_config default_config = {};
	struct stm_plat_ssc_data *plat_data;
	struct stm_pad_config *pad_config;

	BUG_ON(ssc < 0 || ssc >= ARRAY_SIZE(stx7108_ssc_devices));

	BUG_ON(stx7108_ssc_configured[ssc]);
	stx7108_ssc_configured[ssc] = 1;

	if (!config)
		config = &default_config;

	stx7108_ssc_devices[ssc].name = "i2c-stm";
	stx7108_ssc_devices[ssc].id = i2c_busnum;

	plat_data = stx7108_ssc_devices[ssc].dev.platform_data;

	if (ssc == 2) {
		pad_config = stm_pad_config_alloc(2, 0);

		/* SCL */
		switch (config->routing.ssc2.sclk) {
		case stx7108_ssc2_sclk_pio1_3:
			stm_pad_config_add_pio_bidir_named(pad_config,
					1, 3, 2, "SCL");
			break;
		case stx7108_ssc2_sclk_pio14_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					14, 4, 2, "SCL");
			break;
		default:
			BUG();
			break;
		}

		/* SDA */
		switch (config->routing.ssc2.mtsr) {
		case stx7108_ssc2_mtsr_pio1_4:
			stm_pad_config_add_pio_bidir_named(pad_config,
					1, 4, 2, "SDA");
			break;
		case stx7108_ssc2_mtsr_pio14_5:
			stm_pad_config_add_pio_bidir_named(pad_config,
					14, 5, 2, "SDA");
			break;
		default:
			BUG();
			break;
		}
	} else {
		pad_config = &stx7108_ssc_i2c_pad_configs[ssc];
	}

	plat_data->pad_config = pad_config;
	plat_data->i2c_fastmode = config->i2c_fastmode;

	/* I2C bus number reservation (to prevent any hot-plug device
	 * from using it) */
	i2c_register_board_info(i2c_busnum, NULL, 0);

	platform_device_register(&stx7108_ssc_devices[ssc]);

	return i2c_busnum++;
}
Example #6
0
void __init stx7108_configure_asc(int asc, struct stx7108_asc_config *config)
{
	static int configured[ARRAY_SIZE(stx7108_asc_devices)];
	static int tty_id;
	struct stx7108_asc_config default_config = {};
	struct platform_device *pdev;
	struct stm_plat_asc_data *plat_data;
	struct stm_pad_config *pad_config;

	BUG_ON(asc < 0 || asc >= ARRAY_SIZE(stx7108_asc_devices));

	BUG_ON(configured[asc]);
	configured[asc] = 1;

	if (!config)
		config = &default_config;

	pdev = &stx7108_asc_devices[asc];
	plat_data = pdev->dev.platform_data;

	pdev->id = tty_id++;
	plat_data->hw_flow_control = config->hw_flow_control;
	plat_data->txfifo_bug = 1;

	if (asc == 3) {
		pad_config = stm_pad_config_alloc(4, 0);
		plat_data->pad_config = pad_config;

		switch (config->routing.asc3.txd) {
		case stx7108_asc3_txd_pio21_0:
			stm_pad_config_add_pio_out(pad_config, 21, 0, 2);
			break;
		case stx7108_asc3_txd_pio24_4:
			stm_pad_config_add_pio_out(pad_config, 24, 4, 1);
			break;
		default:
			BUG();
			break;
		}

		switch (config->routing.asc3.rxd) {
		case stx7108_asc3_rxd_pio21_1:
			stm_pad_config_add_pio_in(pad_config, 21, 1, 2);
			break;
		case stx7108_asc3_rxd_pio24_5:
			stm_pad_config_add_pio_in(pad_config, 24, 5, 1);
			break;
		default:
			BUG();
			break;
		}

		if (config->hw_flow_control) {
			switch (config->routing.asc3.cts) {
			case stx7108_asc3_cts_pio21_4:
				stm_pad_config_add_pio_in(pad_config, 21, 4, 2);
				break;
			case stx7108_asc3_cts_pio25_0:
				stm_pad_config_add_pio_in(pad_config, 25, 0, 1);
				break;
			default:
				BUG();
				break;
			}

			switch (config->routing.asc3.rts) {
			case stx7108_asc3_rts_pio21_3:
				stm_pad_config_add_pio_out(pad_config,
						21, 3, 2);
				break;
			case stx7108_asc3_rts_pio24_7:
				stm_pad_config_add_pio_out(pad_config,
						24, 7, 1);
				break;
			default:
				BUG();
				break;
			}
		}
	} else {
		pad_config = &stx7108_asc_pad_configs[asc];

		if (!config->hw_flow_control) {
			/* Don't claim RTS/CTS pads */
			stm_pad_set_pio_ignored(pad_config, "RTS");
			stm_pad_set_pio_ignored(pad_config, "CTS");
		}
	}

	if (config->is_console)
		stm_asc_console_device = pdev->id;

	stm_asc_configured_devices[stm_asc_configured_devices_num++] = pdev;
}