cregit-Linux how code gets into the kernel

Release 4.11 arch/arm/mach-sa1100/jornada720_ssp.c

/**
 *  arch/arm/mac-sa1100/jornada720_ssp.c
 *
 *  Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
 *   Copyright (C) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 *  SSP driver for the HP Jornada 710/720/728
 */

#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/sched.h>
#include <linux/io.h>

#include <mach/hardware.h>
#include <mach/jornada720.h>
#include <asm/hardware/ssp.h>

static DEFINE_SPINLOCK(jornada_ssp_lock);

static unsigned long jornada_ssp_flags;

/**
 * jornada_ssp_reverse - reverses input byte
 *
 * we need to reverse all data we receive from the mcu due to its physical location
 * returns : 01110111 -> 11101110
 */

u8 inline jornada_ssp_reverse(u8 byte) { return ((0x80 & byte) >> 7) | ((0x40 & byte) >> 5) | ((0x20 & byte) >> 3) | ((0x10 & byte) >> 1) | ((0x08 & byte) << 1) | ((0x04 & byte) << 3) | ((0x02 & byte) << 5) | ((0x01 & byte) << 7); }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson90100.00%1100.00%
Total90100.00%1100.00%

; EXPORT_SYMBOL(jornada_ssp_reverse); /** * jornada_ssp_byte - waits for ready ssp bus and sends byte * * waits for fifo buffer to clear and then transmits, if it doesn't then we will * timeout after <timeout> rounds. Needs mcu running before its called. * * returns : %mcu output on success * : %-ETIMEDOUT on timeout */
int jornada_ssp_byte(u8 byte) { int timeout = 400000; u16 ret; while ((GPLR & GPIO_GPIO10)) { if (!--timeout) { printk(KERN_WARNING "SSP: timeout while waiting for transmit\n"); return -ETIMEDOUT; } cpu_relax(); } ret = jornada_ssp_reverse(byte) << 8; ssp_write_word(ret); ssp_read_word(&ret); return jornada_ssp_reverse(ret); }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson73100.00%1100.00%
Total73100.00%1100.00%

; EXPORT_SYMBOL(jornada_ssp_byte); /** * jornada_ssp_inout - decide if input is command or trading byte * * returns : (jornada_ssp_byte(byte)) on success * : %-ETIMEDOUT on timeout failure */
int jornada_ssp_inout(u8 byte) { int ret, i; /* true means command byte */ if (byte != TXDUMMY) { ret = jornada_ssp_byte(byte); /* Proper return to commands is TxDummy */ if (ret != TXDUMMY) { for (i = 0; i < 256; i++)/* flushing bus */ if (jornada_ssp_byte(TXDUMMY) == -1) break; return -ETIMEDOUT; } } else /* Exchange TxDummy for data */ ret = jornada_ssp_byte(TXDUMMY); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson79100.00%1100.00%
Total79100.00%1100.00%

; EXPORT_SYMBOL(jornada_ssp_inout); /** * jornada_ssp_start - enable mcu * */
void jornada_ssp_start(void) { spin_lock_irqsave(&jornada_ssp_lock, jornada_ssp_flags); GPCR = GPIO_GPIO25; udelay(50); return; }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson25100.00%2100.00%
Total25100.00%2100.00%

; EXPORT_SYMBOL(jornada_ssp_start); /** * jornada_ssp_end - disable mcu and turn off lock * */
void jornada_ssp_end(void) { GPSR = GPIO_GPIO25; spin_unlock_irqrestore(&jornada_ssp_lock, jornada_ssp_flags); return; }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson20100.00%2100.00%
Total20100.00%2100.00%

; EXPORT_SYMBOL(jornada_ssp_end);
static int jornada_ssp_probe(struct platform_device *dev) { int ret; GPSR = GPIO_GPIO25; ret = ssp_init(); /* worked fine, lets not bother with anything else */ if (!ret) { printk(KERN_INFO "SSP: device initialized with irq\n"); return ret; } printk(KERN_WARNING "SSP: initialization failed, trying non-irq solution \n"); /* init of Serial 4 port */ Ser4MCCR0 = 0; Ser4SSCR0 = 0x0387; Ser4SSCR1 = 0x18; /* clear out any left over data */ ssp_flush(); /* enable MCU */ jornada_ssp_start(); /* see if return value makes sense */ ret = jornada_ssp_inout(GETBRIGHTNESS); /* seems like it worked, just feed it with TxDummy to get rid of data */ if (ret == TXDUMMY) jornada_ssp_inout(TXDUMMY); jornada_ssp_end(); /* failed, lets just kill everything */ if (ret == -ETIMEDOUT) { printk(KERN_WARNING "SSP: attempts failed, bailing\n"); ssp_exit(); return -ENODEV; } /* all fine */ printk(KERN_INFO "SSP: device initialized\n"); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson123100.00%2100.00%
Total123100.00%2100.00%

;
static int jornada_ssp_remove(struct platform_device *dev) { /* Note that this doesn't actually remove the driver, since theres nothing to remove * It just makes sure everything is turned off */ GPSR = GPIO_GPIO25; ssp_exit(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson2195.45%150.00%
Lucas De Marchi14.55%150.00%
Total22100.00%2100.00%

; struct platform_driver jornadassp_driver = { .probe = jornada_ssp_probe, .remove = jornada_ssp_remove, .driver = { .name = "jornada_ssp", }, };
static int __init jornada_ssp_init(void) { return platform_driver_register(&jornadassp_driver); }

Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson16100.00%1100.00%
Total16100.00%1100.00%

module_init(jornada_ssp_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
Kristoffer Ericson54897.68%337.50%
Linus Walleij50.89%112.50%
Russell King40.71%225.00%
Jean Delvare20.36%112.50%
Lucas De Marchi20.36%112.50%
Total561100.00%8100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.