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++; }
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++; }
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++; }