linux SPI駆動-spidevのdeive(五)


1.  board  

1: struct spi_board_info {
 2: /* the device name and module name are coupled, like platform_bus;
 3: * "modalias"is normally the driver name.
 4: *
 5: * platform_data goes to spi_device.dev.platform_data,
 6: * controller_data goes to spi_device.controller_data,
 7: * irq is copied too
 8: */
 9: char modalias[SPI_NAME_SIZE];
 10: const void *platform_data;
 11:void *controller_data;
 12: int irq;
 13:  
 14: /* slower signaling on noisy or low voltage boards */
 15: u32 max_speed_hz;
 16:  
 17:  
 18: /* bus_num is board specific and matches the bus_num of some
 19: * spi_master that will probably be registered later.
 20: *
 21: * chip_select reflects how this chip is wired to that master;
 22: * it's less than num_chipselect.
 23: */
 24: u16 bus_num;
 25: u16 chip_select;
 26:  
 27: /* mode becomes spi_device.mode, and is essential for chips
 28: * where the default of SPI_CS_HIGH = 0 is wrong.
 29: */
 30: u8 mode;
 31:  
 32: /* ... may need additional spi_device chip config data here.
 33: * avoid stuff protocol drivers can set; but include stuff
 34: * needed to behave without being bound to a driver:
 35: * - quirks like clock rate mattering when not selected
36: */
1: /* add by xuyonghong for test */
 2: struct spi_board_info jz_spi0_board_info[] = {
 3: {
 4:.modalias = "spidev",
 5: .mode = SPI_MODE_3,
 6: .max_speed_hz = 1000000,
 7: .controller_data = (void *)GPIO_PB(2),
 8: .bus_num = 0,
 9: .chip_select = 0,
 10: },
 11: };
 12: intjz_spi0_devs_size = ARRAY_SIZE(jz_spi0_board_info);
 
 

1: int __init
 2: spi_register_board_info(struct spi_board_info const *info, unsigned n)
 3: {
4: struct boardinfo *bi;
 5: int i;
 6:  
 7: bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);
 8: if(!bi)
 9: return -ENOMEM;
 10:  
 11: for (i = 0; i < n; i++, bi++, info++) {
 12: structspi_master *master;
 13:  
 14: memcpy(&bi->board_info, info, sizeof(*info));
 15:mutex_lock(&board_lock);
 16: list_add_tail(&bi->list, &board_list);
 17: /* 
18:masterが先に登録した場合spi_match_master_to_boardinfoマッチング、
19:そうでなければマスター登録時にデバイスにマッチ
20: */
 21:list_for_each_entry(master, &spi_master_list, list)
 22: spi_match_master_to_boardinfo(master, &bi->board_info);
 23: mutex_unlock(&board_lock);
 24: }
 25:  
 26: return 0;
 27: }
1: spi_register_board_info(jz_spi0_board_info, jz_spi0_devs_size);
 
まとめ:
1. list_add_tail(&bi->list, &board_list); boardをboardに追加するlist
2.masterが登録されている場合はspi_match_master_to_boardinfoとspi_new_デバイスspiデバイスを作成します.