Commit 9c1da3cb46316e40bac766ce45556dc4fd8df3ca
Committed by
Greg Kroah-Hartman
1 parent
022f7b07bf
Exists in
master
and in
4 other branches
[PATCH] SPI: spi_butterfly, restore lost deltas
This resolves some minor version skew glitches that accumulated for the AVR Butterfly adapter driver, which caused among other things the existence of a duplicate Kconfig entry. Most of it boils down to comment updates, but in one case it removes some now-superfluous code that would be better if not copied into other controller-level drivers. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Showing 3 changed files with 34 additions and 35 deletions Side-by-side Diff
Documentation/spi/butterfly
... | ... | @@ -12,13 +12,20 @@ |
12 | 12 | directly to the Butterfly. Or (if you have the parts and skills) you |
13 | 13 | can come up with something fancier, providing ciruit protection to the |
14 | 14 | Butterfly and the printer port, or with a better power supply than two |
15 | -signal pins from the printer port. | |
15 | +signal pins from the printer port. Or for that matter, you can use | |
16 | +similar cables to talk to many AVR boards, even a breadboard. | |
16 | 17 | |
18 | +This is more powerful than "ISP programming" cables since it lets kernel | |
19 | +SPI protocol drivers interact with the AVR, and could even let the AVR | |
20 | +issue interrupts to them. Later, your protocol driver should work | |
21 | +easily with a "real SPI controller", instead of this bitbanger. | |
17 | 22 | |
23 | + | |
18 | 24 | The first cable connections will hook Linux up to one SPI bus, with the |
19 | 25 | AVR and a DataFlash chip; and to the AVR reset line. This is all you |
20 | 26 | need to reflash the firmware, and the pins are the standard Atmel "ISP" |
21 | -connector pins (used also on non-Butterfly AVR boards). | |
27 | +connector pins (used also on non-Butterfly AVR boards). On the parport | |
28 | +side this is like "sp12" programming cables. | |
22 | 29 | |
23 | 30 | Signal Butterfly Parport (DB-25) |
24 | 31 | ------ --------- --------------- |
... | ... | @@ -40,10 +47,14 @@ |
40 | 47 | SELECT = J400.PB0/nSS = pin 17/C3,nSELECT |
41 | 48 | GND = J400.GND = pin 24/GND |
42 | 49 | |
43 | -The "USI" controller, using J405, can be used for a second SPI bus. That | |
44 | -would let you talk to the AVR over SPI, running firmware that makes it act | |
45 | -as an SPI slave, while letting either Linux or the AVR use the DataFlash. | |
46 | -There are plenty of spare parport pins to wire this one up, such as: | |
50 | +Or you could flash firmware making the AVR into an SPI slave (keeping the | |
51 | +DataFlash in reset) and tweak the spi_butterfly driver to make it bind to | |
52 | +the driver for your custom SPI-based protocol. | |
53 | + | |
54 | +The "USI" controller, using J405, can also be used for a second SPI bus. | |
55 | +That would let you talk to the AVR using custom SPI-with-USI firmware, | |
56 | +while letting either Linux or the AVR use the DataFlash. There are plenty | |
57 | +of spare parport pins to wire this one up, such as: | |
47 | 58 | |
48 | 59 | Signal Butterfly Parport (DB-25) |
49 | 60 | ------ --------- --------------- |
drivers/spi/Kconfig
... | ... | @@ -75,16 +75,6 @@ |
75 | 75 | inexpensive battery powered microcontroller evaluation board. |
76 | 76 | This same cable can be used to flash new firmware. |
77 | 77 | |
78 | -config SPI_BUTTERFLY | |
79 | - tristate "Parallel port adapter for AVR Butterfly (DEVELOPMENT)" | |
80 | - depends on SPI_MASTER && PARPORT && EXPERIMENTAL | |
81 | - select SPI_BITBANG | |
82 | - help | |
83 | - This uses a custom parallel port cable to connect to an AVR | |
84 | - Butterfly <http://www.atmel.com/products/avr/butterfly>, an | |
85 | - inexpensive battery powered microcontroller evaluation board. | |
86 | - This same cable can be used to flash new firmware. | |
87 | - | |
88 | 78 | # |
89 | 79 | # Add new SPI master controllers in alphabetical order above this line |
90 | 80 | # |
drivers/spi/spi_butterfly.c
... | ... | @@ -163,21 +163,20 @@ |
163 | 163 | struct butterfly *pp = spidev_to_pp(spi); |
164 | 164 | |
165 | 165 | /* set default clock polarity */ |
166 | - if (value) | |
166 | + if (value != BITBANG_CS_INACTIVE) | |
167 | 167 | setsck(spi, spi->mode & SPI_CPOL); |
168 | 168 | |
169 | 169 | /* no chipselect on this USI link config */ |
170 | 170 | if (is_usidev(spi)) |
171 | 171 | return; |
172 | 172 | |
173 | - /* here, value == "activate or not" */ | |
174 | - | |
175 | - /* most PARPORT_CONTROL_* bits are negated */ | |
173 | + /* here, value == "activate or not"; | |
174 | + * most PARPORT_CONTROL_* bits are negated, so we must | |
175 | + * morph it to value == "bit value to write in control register" | |
176 | + */ | |
176 | 177 | if (spi_cs_bit == PARPORT_CONTROL_INIT) |
177 | 178 | value = !value; |
178 | 179 | |
179 | - /* here, value == "bit value to write in control register" */ | |
180 | - | |
181 | 180 | parport_frob_control(pp->port, spi_cs_bit, value ? spi_cs_bit : 0); |
182 | 181 | } |
183 | 182 | |
... | ... | @@ -202,7 +201,9 @@ |
202 | 201 | |
203 | 202 | /* override default partitioning with cmdlinepart */ |
204 | 203 | static struct mtd_partition partitions[] = { { |
205 | - /* JFFS2 wants partitions of 4*N blocks for this device ... */ | |
204 | + /* JFFS2 wants partitions of 4*N blocks for this device, | |
205 | + * so sectors 0 and 1 can't be partitions by themselves. | |
206 | + */ | |
206 | 207 | |
207 | 208 | /* sector 0 = 8 pages * 264 bytes/page (1 block) |
208 | 209 | * sector 1 = 248 pages * 264 bytes/page |
... | ... | @@ -316,8 +317,9 @@ |
316 | 317 | if (status < 0) |
317 | 318 | goto clean2; |
318 | 319 | |
319 | - /* Bus 1 lets us talk to at45db041b (firmware disables AVR) | |
320 | - * or AVR (firmware resets at45, acts as spi slave) | |
320 | + /* Bus 1 lets us talk to at45db041b (firmware disables AVR SPI), AVR | |
321 | + * (firmware resets at45, acts as spi slave) or neither (we ignore | |
322 | + * both, AVR uses AT45). Here we expect firmware for the first option. | |
321 | 323 | */ |
322 | 324 | pp->info[0].max_speed_hz = 15 * 1000 * 1000; |
323 | 325 | strcpy(pp->info[0].modalias, "mtd_dataflash"); |
... | ... | @@ -330,7 +332,9 @@ |
330 | 332 | pp->dataflash->dev.bus_id); |
331 | 333 | |
332 | 334 | #ifdef HAVE_USI |
333 | - /* even more custom AVR firmware */ | |
335 | + /* Bus 2 is only for talking to the AVR, and it can work no | |
336 | + * matter who masters bus 1; needs appropriate AVR firmware. | |
337 | + */ | |
334 | 338 | pp->info[1].max_speed_hz = 10 /* ?? */ * 1000 * 1000; |
335 | 339 | strcpy(pp->info[1].modalias, "butterfly"); |
336 | 340 | // pp->info[1].platform_data = ... TBD ... ; |
... | ... | @@ -378,13 +382,8 @@ |
378 | 382 | pp = butterfly; |
379 | 383 | butterfly = NULL; |
380 | 384 | |
381 | -#ifdef HAVE_USI | |
382 | - spi_unregister_device(pp->butterfly); | |
383 | - pp->butterfly = NULL; | |
384 | -#endif | |
385 | - spi_unregister_device(pp->dataflash); | |
386 | - pp->dataflash = NULL; | |
387 | - | |
385 | + /* stop() unregisters child devices too */ | |
386 | + pdev = to_platform_device(pp->bitbang.master->cdev.dev); | |
388 | 387 | status = spi_bitbang_stop(&pp->bitbang); |
389 | 388 | |
390 | 389 | /* turn off VCC */ |
... | ... | @@ -394,8 +393,6 @@ |
394 | 393 | parport_release(pp->pd); |
395 | 394 | parport_unregister_device(pp->pd); |
396 | 395 | |
397 | - pdev = to_platform_device(pp->bitbang.master->cdev.dev); | |
398 | - | |
399 | 396 | (void) spi_master_put(pp->bitbang.master); |
400 | 397 | |
401 | 398 | platform_device_unregister(pdev); |
... | ... | @@ -420,5 +417,6 @@ |
420 | 417 | } |
421 | 418 | module_exit(butterfly_exit); |
422 | 419 | |
420 | +MODULE_DESCRIPTION("Parport Adapter driver for AVR Butterfly"); | |
423 | 421 | MODULE_LICENSE("GPL"); |