Commit 9c1da3cb46316e40bac766ce45556dc4fd8df3ca

Authored by David Brownell
Committed by Greg Kroah-Hartman
1 parent 022f7b07bf

[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 ------ --------- ---------------
... ... @@ -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");