diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/clockchips.h | 2 | ||||
-rw-r--r-- | include/linux/cpufreq.h | 12 | ||||
-rw-r--r-- | include/linux/i2c-omap.h | 2 | ||||
-rw-r--r-- | include/linux/i2c/twl.h | 5 | ||||
-rw-r--r-- | include/linux/i2c/twl6030-madc.h | 86 | ||||
-rw-r--r-- | include/linux/mfd/twl6040-codec.h | 243 | ||||
-rw-r--r-- | include/linux/mod_devicetable.h | 10 | ||||
-rw-r--r-- | include/linux/omap_v4l2_gfx.h | 177 | ||||
-rw-r--r-- | include/linux/opp.h | 8 | ||||
-rw-r--r-- | include/linux/plist.h | 55 | ||||
-rw-r--r-- | include/linux/remoteproc.h | 238 | ||||
-rw-r--r-- | include/linux/rpmsg.h | 191 | ||||
-rw-r--r-- | include/linux/rpmsg_omx.h | 132 | ||||
-rw-r--r-- | include/linux/rpmsg_resmgr.h | 118 | ||||
-rw-r--r-- | include/linux/rtmutex.h | 4 | ||||
-rw-r--r-- | include/linux/virtio_ids.h | 1 | ||||
-rw-r--r-- | include/linux/virtio_ring.h | 2 |
17 files changed, 1231 insertions, 55 deletions
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index d6733e2..267ba73 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -144,6 +144,8 @@ extern int clockevents_program_event(struct clock_event_device *dev, extern void clockevents_handle_noop(struct clock_event_device *dev); +extern int clockevents_reconfigure(struct clock_event_device *ce, u32 freq, u32 minsec); + static inline void clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 minsec) { diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 11be48e..215d393 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -358,6 +358,9 @@ extern struct cpufreq_governor cpufreq_gov_ondemand; #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE) extern struct cpufreq_governor cpufreq_gov_conservative; #define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_conservative) +#elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_HOTPLUG) +extern struct cpufreq_governor cpufreq_gov_hotplug; +#define CPUFREQ_DEFAULT_GOVERNOR (&cpufreq_gov_hotplug) #endif @@ -399,5 +402,14 @@ void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table, void cpufreq_frequency_table_put_attr(unsigned int cpu); +/* the following are for use in governors, or anywhere else */ +extern int cpufreq_frequency_table_next_lowest(struct cpufreq_policy *policy, + struct cpufreq_frequency_table *table, + int *index); + +extern int cpufreq_frequency_table_next_highest(struct cpufreq_policy *policy, + struct cpufreq_frequency_table *table, + int *index); + #endif /* _LINUX_CPUFREQ_H */ diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h index 7472449..3beb390 100644 --- a/include/linux/i2c-omap.h +++ b/include/linux/i2c-omap.h @@ -5,7 +5,7 @@ struct omap_i2c_bus_platform_data { u32 clkrate; - void (*set_mpu_wkup_lat)(struct device *dev, long set); + bool needs_wakeup_latency; int (*device_enable) (struct platform_device *pdev); int (*device_shutdown) (struct platform_device *pdev); int (*device_idle) (struct platform_device *pdev); diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index ba4f886..3b7bb86 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -664,6 +664,10 @@ struct twl4030_codec_audio_data { unsigned int check_defaults:1; unsigned int reset_registers:1; unsigned int hs_extmute:1; + u16 hs_left_step; + u16 hs_right_step; + u16 hf_left_step; + u16 hf_right_step; void (*set_hs_extmute)(int mute); }; @@ -679,6 +683,7 @@ struct twl4030_codec_data { /* twl6040 */ int audpwron_gpio; /* audio power-on gpio */ int naudint_irq; /* audio interrupt */ + unsigned int irq_base; }; struct twl4030_platform_data { diff --git a/include/linux/i2c/twl6030-madc.h b/include/linux/i2c/twl6030-madc.h new file mode 100644 index 0000000..81b9464 --- /dev/null +++ b/include/linux/i2c/twl6030-madc.h @@ -0,0 +1,86 @@ +/* + * twl6030_madc.h - Header for TWL6030 MADC + * + * Copyright (C) 2011 Samsung Telecommunications of America + * + * Based on twl4030-madc.h + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * J Keerthy <j-keerthy@ti.com> + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _TWL6030_MADC_H +#define _TWL6030_MADC_H + +#define TWL6030_MADC_MAX_CHANNELS 17 +/* + * twl6030 madc occupies the same offset in the twl6030 map that + * twl4030 madc does in the twl4030 map. + * likewise the charger + */ +#define TWL6030_MODULE_MADC TWL4030_MODULE_MADC +#define TWL6030_MODULE_MAIN_CHARGE TWL4030_MODULE_MAIN_CHARGE + +#define TWL6030_MADC_CTRL 0x00 +#define TWL6030_MADC_TEMP1_EN (1 << 0) +#define TWL6030_MADC_TEMP2_EN (1 << 1) +#define TWL6030_MADC_SCALER_EN_CH2 (1 << 2) +#define TWL6030_MADC_VBAT_SCALER_DIV (1 << 3) +#define TWL6030_MADC_SCALER_EN_CH11 (1 << 4) +#define TWL6030_MADC_TMP1_EN_MONITOR (1 << 5) +#define TWL6030_MADC_TMP2_EN_MONITOR (1 << 6) +#define TWL6030_MADC_ISOURCE_EN (1 << 7) + +#define TWL6030_MADC_RTSELECT_LSB 0x02 +#define TWL6030_MADC_ADCIN0 (1 << 0) +#define TWL6030_MADC_ADCIN1 (1 << 1) +#define TWL6030_MADC_ADCIN2 (1 << 2) +#define TWL6030_MADC_ADCIN3 (1 << 3) +#define TWL6030_MADC_ADCIN4 (1 << 4) +#define TWL6030_MADC_ADCIN5 (1 << 5) +#define TWL6030_MADC_ADCIN6 (1 << 6) +#define TWL6030_MADC_ADCIN7 (1 << 7) + +#define TWL6030_MADC_RTSELECT_ISB 0x03 +#define TWL6030_MADC_ADCIN8 (1 << 0) +#define TWL6030_MADC_ADCIN9 (1 << 1) +#define TWL6030_MADC_ADCIN10 (1 << 2) +#define TWL6030_MADC_ADCIN11 (1 << 3) +#define TWL6030_MADC_ADCIN12 (1 << 4) +#define TWL6030_MADC_ADCIN13 (1 << 5) +#define TWL6030_MADC_ADCIN14 (1 << 6) +#define TWL6030_MADC_ADCIN15 (1 << 7) + +#define TWL6030_MADC_RTSELECT_MSB 0x04 +#define TWL6030_MADC_ADCIN16 (1 << 0) + +#define TWL6030_MADC_CTRL_P1 0x05 +#define TWL6030_MADC_BUSY (1 << 0) +#define TWL6030_MADC_EOCP1 (1 << 1) +#define TWL6030_MADC_EOCRT (1 << 2) +#define TWL6030_MADC_SP1 (1 << 3) + +#define TWL6030_MADC_CTRL_P2 0x06 +#define TWL6030_MADC_BUSYB (1 << 0) +#define TWL6030_MADC_EOCP2 (1 << 1) +#define TWL6030_MADC_SP2 (1 << 2) + +#define TWL6030_MADC_RTCH0_LSB 0x07 +#define TWL6030_MADC_GPCH0_LSB 0x29 + +int twl6030_get_madc_conversion(int channel_no); +#endif diff --git a/include/linux/mfd/twl6040-codec.h b/include/linux/mfd/twl6040-codec.h new file mode 100644 index 0000000..5d0fb10 --- /dev/null +++ b/include/linux/mfd/twl6040-codec.h @@ -0,0 +1,243 @@ +/* + * MFD driver for twl6040 codec submodule + * + * Authors: Jorge Eduardo Candelaria <jorge.candelaria@ti.com> + * Misael Lopez Cruz <misael.lopez@ti.com> + * + * Copyright: (C) 2011 Texas Instruments, Inc. + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef __TWL6040_CODEC_H__ +#define __TWL6040_CODEC_H__ + +#include <linux/interrupt.h> +#include <linux/mfd/core.h> + +#define TWL6040_REG_ASICID 0x01 +#define TWL6040_REG_ASICREV 0x02 +#define TWL6040_REG_INTID 0x03 +#define TWL6040_REG_INTMR 0x04 +#define TWL6040_REG_NCPCTL 0x05 +#define TWL6040_REG_LDOCTL 0x06 +#define TWL6040_REG_HPPLLCTL 0x07 +#define TWL6040_REG_LPPLLCTL 0x08 +#define TWL6040_REG_LPPLLDIV 0x09 +#define TWL6040_REG_AMICBCTL 0x0A +#define TWL6040_REG_DMICBCTL 0x0B +#define TWL6040_REG_MICLCTL 0x0C +#define TWL6040_REG_MICRCTL 0x0D +#define TWL6040_REG_MICGAIN 0x0E +#define TWL6040_REG_LINEGAIN 0x0F +#define TWL6040_REG_HSLCTL 0x10 +#define TWL6040_REG_HSRCTL 0x11 +#define TWL6040_REG_HSGAIN 0x12 +#define TWL6040_REG_EARCTL 0x13 +#define TWL6040_REG_HFLCTL 0x14 +#define TWL6040_REG_HFLGAIN 0x15 +#define TWL6040_REG_HFRCTL 0x16 +#define TWL6040_REG_HFRGAIN 0x17 +#define TWL6040_REG_VIBCTLL 0x18 +#define TWL6040_REG_VIBDATL 0x19 +#define TWL6040_REG_VIBCTLR 0x1A +#define TWL6040_REG_VIBDATR 0x1B +#define TWL6040_REG_HKCTL1 0x1C +#define TWL6040_REG_HKCTL2 0x1D +#define TWL6040_REG_GPOCTL 0x1E +#define TWL6040_REG_ALB 0x1F +#define TWL6040_REG_DLB 0x20 +#define TWL6040_REG_TRIM1 0x28 +#define TWL6040_REG_TRIM2 0x29 +#define TWL6040_REG_TRIM3 0x2A +#define TWL6040_REG_HSOTRIM 0x2B +#define TWL6040_REG_HFOTRIM 0x2C +#define TWL6040_REG_ACCCTL 0x2D +#define TWL6040_REG_STATUS 0x2E + +#define TWL6040_CACHEREGNUM (TWL6040_REG_STATUS + 1) + +#define TWL6040_VIOREGNUM 18 +#define TWL6040_VDDREGNUM 21 + +/* INTID (0x03) fields */ + +#define TWL6040_THINT 0x01 +#define TWL6040_PLUGINT 0x02 +#define TWL6040_UNPLUGINT 0x04 +#define TWL6040_HOOKINT 0x08 +#define TWL6040_HFINT 0x10 +#define TWL6040_VIBINT 0x20 +#define TWL6040_READYINT 0x40 + +/* INTMR (0x04) fields */ + +#define TWL6040_THMSK 0x01 +#define TWL6040_PLUGMSK 0x02 +#define TWL6040_HOOKMSK 0x08 +#define TWL6040_HFMSK 0x10 +#define TWL6040_VIBMSK 0x20 +#define TWL6040_READYMSK 0x40 +#define TWL6040_ALLINT_MSK 0x7B + +/* NCPCTL (0x05) fields */ + +#define TWL6040_NCPENA 0x01 +#define TWL6040_NCPOPEN 0x40 + +/* LDOCTL (0x06) fields */ + +#define TWL6040_LSLDOENA 0x01 +#define TWL6040_HSLDOENA 0x04 +#define TWL6040_REFENA 0x40 +#define TWL6040_OSCENA 0x80 + +/* HPPLLCTL (0x07) fields */ + +#define TWL6040_HPLLENA 0x01 +#define TWL6040_HPLLRST 0x02 +#define TWL6040_HPLLBP 0x04 +#define TWL6040_HPLLSQRENA 0x08 +#define TWL6040_HPLLSQRBP 0x10 +#define TWL6040_MCLK_12000KHZ (0 << 5) +#define TWL6040_MCLK_19200KHZ (1 << 5) +#define TWL6040_MCLK_26000KHZ (2 << 5) +#define TWL6040_MCLK_38400KHZ (3 << 5) +#define TWL6040_MCLK_MSK 0x60 + +/* LPPLLCTL (0x08) fields */ + +#define TWL6040_LPLLENA 0x01 +#define TWL6040_LPLLRST 0x02 +#define TWL6040_LPLLSEL 0x04 +#define TWL6040_LPLLFIN 0x08 +#define TWL6040_HPLLSEL 0x10 + +/* HSLCTL (0x10) fields */ + +#define TWL6040_HSDACMODEL 0x02 +#define TWL6040_HSDRVMODEL 0x08 + +/* HSRCTL (0x11) fields */ + +#define TWL6040_HSDACMODER 0x02 +#define TWL6040_HSDRVMODER 0x08 + +/* VIBCTLL (0x18) fields */ + +#define TWL6040_VIBCTRLLN 0x10 +#define TWL6040_VIBCTRLLP 0x04 +#define TWL6040_VIBENAL 0x01 + +/* VIBCTLL (0x19) fields */ + +#define TWL6040_VIBCTRLRN 0x10 +#define TWL6040_VIBCTRLRP 0x04 +#define TWL6040_VIBENAR 0x01 + +/* GPOCTL (0x1E) fields */ + +#define TWL6040_GPO1 0x01 +#define TWL6040_GPO2 0x02 +#define TWL6040_GPO3 0x03 + +/* ACCCTL (0x2D) fields */ + +#define TWL6040_I2CSEL 0x01 +#define TWL6040_RESETSPLIT 0x04 +#define TWL6040_INTCLRMODE 0x08 + +#define TWL6040_SYSCLK_SEL_LPPLL 1 +#define TWL6040_SYSCLK_SEL_HPPLL 2 + +/* STATUS (0x2E) fields */ + +#define TWL6040_PLUGCOMP 0x02 + +#define TWL6040_CELLS 2 + +#define TWL6040_IRQ_TH 0 +#define TWL6040_IRQ_PLUG 1 +#define TWL6040_IRQ_HOOK 2 +#define TWL6040_IRQ_HF 3 +#define TWL6040_IRQ_VIB 4 +#define TWL6040_IRQ_READY 5 + +enum twl6040_pll_id { + TWL6040_NOPLL_ID, + TWL6040_LPPLL_ID, + TWL6040_HPPLL_ID, +}; + +struct twl6040 { + struct device *dev; + struct mutex mutex; + struct mutex io_mutex; + struct mutex irq_mutex; + struct mfd_cell cells[TWL6040_CELLS]; + struct completion ready; + + int audpwron; + int powered; + int power_count; + + enum twl6040_pll_id pll; + unsigned int sysclk; + + unsigned int irq; + unsigned int irq_base; + u8 irq_masks_cur; + u8 irq_masks_cache; +}; + +static inline int twl6040_request_irq(struct twl6040 *twl6040, int irq, + irq_handler_t handler, const char *name, + void *data) +{ + if (!twl6040->irq_base) + return -EINVAL; + + return request_threaded_irq(twl6040->irq_base + irq, NULL, handler, + 0, name, data); +} + +static inline void twl6040_free_irq(struct twl6040 *twl6040, int irq, + void *data) +{ + if (!twl6040->irq_base) + return; + + free_irq(twl6040->irq_base + irq, data); +} + +int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg); +int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, + u8 val); +int twl6040_set_bits(struct twl6040 *twl6040, unsigned int reg, + u8 mask); +int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, + u8 mask); +int twl6040_enable(struct twl6040 *twl6040); +int twl6040_disable(struct twl6040 *twl6040); +int twl6040_is_enabled(struct twl6040 *twl6040); +int twl6040_set_pll(struct twl6040 *twl6040, enum twl6040_pll_id id, + unsigned int freq_in, unsigned int freq_out); +enum twl6040_pll_id twl6040_get_pll(struct twl6040 *twl6040); +unsigned int twl6040_get_sysclk(struct twl6040 *twl6040); +int twl6040_irq_init(struct twl6040 *twl6040); +void twl6040_irq_exit(struct twl6040 *twl6040); + +#endif /* End of __TWL6040_CODEC_H__ */ diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index ae28e93..561567e 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -533,4 +533,14 @@ struct isapnp_device_id { kernel_ulong_t driver_data; /* data private to the driver */ }; +/* rpmsg */ + +#define RPMSG_NAME_SIZE 32 +#define RPMSG_DEVICE_MODALIAS_FMT "rpmsg:%s" + +struct rpmsg_device_id { + char name[RPMSG_NAME_SIZE]; + kernel_ulong_t driver_data /* Data private to the driver */ + __attribute__((aligned(sizeof(kernel_ulong_t)))); +}; #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/include/linux/omap_v4l2_gfx.h b/include/linux/omap_v4l2_gfx.h new file mode 100644 index 0000000..cb175e5 --- /dev/null +++ b/include/linux/omap_v4l2_gfx.h @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/ + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + * + * This file specifies the custom ioctl API between a client "consumer" + * process and the V4L2-GFX driver. The consumer process should only use + * these APIs and will typically/ultimately be a GL application. + * + * There will also be a "producer" process which queues multimedia + * content to the driver, however, this will only use standard V4L2 APIs. + */ + +#ifndef _OMAP_V4L2_GFX_H_ +#define _OMAP_V4L2_GFX_H_ + +#include <linux/videodev.h> + +/* + * @see V4L2_GFX_IOC_CONSUMER, struct v4l2_gfx_consumer_params + */ +enum v4l2_gfx_consumer_type { + /* + * Wait for the producer process to activate a video stream + */ + V4L2_GFX_CONSUMER_WAITSTREAM, + }; + +/* + * @see V4L2_GFX_IOC_CONSUMER + */ +struct v4l2_gfx_consumer_params { + /* + * @see v4l2_gfx_consumer_type + */ + int type; /* w */ + /* + * If the consumer process is waiting the ioctl will block until the + * timeout expires or the expected event occurs, see the type field + */ + unsigned int timeout_ms; /* w */ + /* + * If acquire_timeout_ms > 0 and no streaming activity has been detected + * for acquire_timeout_ms milliseconds the V4L2_GFX_IOC_ACQ ioctl will + * return with ETIMEOUT + */ + unsigned int acquire_timeout_ms; /* w */ +}; + +/* + * @see V4L2_GFX_IOC_INFO + */ +struct v4l2_gfx_info_params { + + /* + * Return how many times the device has been opened, this number will + * decrement when the device is closed. + * + * One use for this might be to detect if a consumer or producer is + * active and in the process of setting up a stream. However this could + * be unreliable if the processes are in the process of closing / crashing. + * + * Obviously this value will always be at least one i.e. the process + * issuing the ioctl opens the device. + */ + unsigned int opencnt; /* r */ + +}; + +/* + * @see V4L2_GFX_IOC_PRODUCER + */ +struct v4l2_gfx_producer_params { + /* + * If set mark the producer side as open, if not set mark as closed. + * For Android we need this because the mediaserver won't close the + * driver. + */ + #define V4L2_GFX_PRODUCER_MASK_OPEN 0x1 + unsigned int flags; /* w */ +}; + +struct v4l2_gfx_buf_params { + /* + * Buffer index. + * + * On acquire, when the ioctl returns the bufid field will be filled in + * with the next buffer with data available. + * + * On release, the consumer process just specifies the buffer to release + * which usually is the last acquired buffer index. + */ + int bufid; /* r/w */ + + /* + * Cropping information + * For the acquire ioctl only + */ + int crop_top; /* r */ + int crop_left; /* r */ + int crop_width; /* r */ + int crop_height; /* r */ +}; + +/* + * This ioctl should be issued once by the consumer process before starting + * any rendering loop. It allows the process to wait for the producer process + * to become ready. + * + * @see struct v4l2_gfx_consumer_params + * + * Return value: + * Returns 0 if successful, or -1 on error, in which case errno indicates + * the error. + */ +#define V4L2_GFX_IOC_CONSUMER _IOWR ('v', BASE_VIDIOCPRIVATE+0, \ + struct v4l2_gfx_consumer_params) + +/* + * Acquire the buffer to be rendered and its properties. + * + * @see struct v4l2_gfx_buf_params + * + * Return value: + * Returns 0 if successful, or -1 on error, in which case errno indicates + * the error. + * + * ETIMEDOUT If acquire_timeout_ms is set via V4L2_GFX_IOC_CONSUMER + * this error code can be returned. + * ENODEV If the producer side of the stream stops this error will + * be returned. + */ +#define V4L2_GFX_IOC_ACQ _IOR ('v', BASE_VIDIOCPRIVATE+1, \ + struct v4l2_gfx_buf_params) + +/* + * Release the buffer that was rendered + * + * @see struct v4l2_gfx_buf_params + * + * Return value: + * Returns 0 if successful, or -1 on error, in which case errno indicates + * the error. + * + * ETIMEDOUT It took longer than 16ms for the app to render the frame + * (This will probably go away to avoid render loop stalls) + * EINVAL Attempted to release an invalid buffer index. + */ +#define V4L2_GFX_IOC_REL _IOW ('v', BASE_VIDIOCPRIVATE+2, \ + struct v4l2_gfx_buf_params) + +/* + * Ioctl used to get information about the device + * + * @see struct v4l2_gfx_info_params + * + * Return value: + * Returns 0 if successful, or -1 on error, in which case errno indicates + * the error. + */ +#define V4L2_GFX_IOC_INFO _IOWR ('v', BASE_VIDIOCPRIVATE+3, \ + struct v4l2_gfx_info_params) + +/* + * Ioctl used to set producer params + * + * @see struct v4l2_gfx_producer_params + * + * Return value: + * Returns 0 if successful, or -1 on error, in which case errno indicates + * the error. + */ +#define V4L2_GFX_IOC_PRODUCER _IOWR ('v', BASE_VIDIOCPRIVATE+4, \ + struct v4l2_gfx_producer_params) +#endif // _OMAP_V4L2_GFX_H_ diff --git a/include/linux/opp.h b/include/linux/opp.h index 5449945..7020e97 100644 --- a/include/linux/opp.h +++ b/include/linux/opp.h @@ -94,12 +94,20 @@ static inline int opp_disable(struct device *dev, unsigned long freq) #if defined(CONFIG_CPU_FREQ) && defined(CONFIG_PM_OPP) int opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table); +void opp_free_cpufreq_table(struct device *dev, + struct cpufreq_frequency_table **table); #else static inline int opp_init_cpufreq_table(struct device *dev, struct cpufreq_frequency_table **table) { return -EINVAL; } + +static inline +void opp_free_cpufreq_table(struct device *dev, + struct cpufreq_frequency_table **table) +{ +} #endif /* CONFIG_CPU_FREQ */ #endif /* __LINUX_OPP_H__ */ diff --git a/include/linux/plist.h b/include/linux/plist.h index c9b9f32..aa0fb39 100644 --- a/include/linux/plist.h +++ b/include/linux/plist.h @@ -77,14 +77,9 @@ #include <linux/kernel.h> #include <linux/list.h> -#include <linux/spinlock_types.h> struct plist_head { struct list_head node_list; -#ifdef CONFIG_DEBUG_PI_LIST - raw_spinlock_t *rawlock; - spinlock_t *spinlock; -#endif }; struct plist_node { @@ -93,37 +88,13 @@ struct plist_node { struct list_head node_list; }; -#ifdef CONFIG_DEBUG_PI_LIST -# define PLIST_HEAD_LOCK_INIT(_lock) .spinlock = _lock -# define PLIST_HEAD_LOCK_INIT_RAW(_lock) .rawlock = _lock -#else -# define PLIST_HEAD_LOCK_INIT(_lock) -# define PLIST_HEAD_LOCK_INIT_RAW(_lock) -#endif - -#define _PLIST_HEAD_INIT(head) \ - .node_list = LIST_HEAD_INIT((head).node_list) - /** * PLIST_HEAD_INIT - static struct plist_head initializer * @head: struct plist_head variable name - * @_lock: lock to initialize for this list - */ -#define PLIST_HEAD_INIT(head, _lock) \ -{ \ - _PLIST_HEAD_INIT(head), \ - PLIST_HEAD_LOCK_INIT(&(_lock)) \ -} - -/** - * PLIST_HEAD_INIT_RAW - static struct plist_head initializer - * @head: struct plist_head variable name - * @_lock: lock to initialize for this list */ -#define PLIST_HEAD_INIT_RAW(head, _lock) \ +#define PLIST_HEAD_INIT(head) \ { \ - _PLIST_HEAD_INIT(head), \ - PLIST_HEAD_LOCK_INIT_RAW(&(_lock)) \ + .node_list = LIST_HEAD_INIT((head).node_list) \ } /** @@ -141,31 +112,11 @@ struct plist_node { /** * plist_head_init - dynamic struct plist_head initializer * @head: &struct plist_head pointer - * @lock: spinlock protecting the list (debugging) */ static inline void -plist_head_init(struct plist_head *head, spinlock_t *lock) +plist_head_init(struct plist_head *head) { INIT_LIST_HEAD(&head->node_list); -#ifdef CONFIG_DEBUG_PI_LIST - head->spinlock = lock; - head->rawlock = NULL; -#endif -} - -/** - * plist_head_init_raw - dynamic struct plist_head initializer - * @head: &struct plist_head pointer - * @lock: raw_spinlock protecting the list (debugging) - */ -static inline void -plist_head_init_raw(struct plist_head *head, raw_spinlock_t *lock) -{ - INIT_LIST_HEAD(&head->node_list); -#ifdef CONFIG_DEBUG_PI_LIST - head->rawlock = lock; - head->spinlock = NULL; -#endif } /** diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h new file mode 100644 index 0000000..2dc9ec1 --- /dev/null +++ b/include/linux/remoteproc.h @@ -0,0 +1,238 @@ +/* + * Remote Processor Framework + * + * Copyright(c) 2011 Texas Instruments. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Texas Instruments nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef REMOTEPROC_H +#define REMOTEPROC_H + +#include <linux/mutex.h> +#include <linux/completion.h> +#include <linux/workqueue.h> +#include <linux/notifier.h> + +/** + * The following enums and structures define the binary format of the images + * we load and run the remote processors with. + * + * The binary format is as follows: + * + * struct { + * char magic[4] = { 'R', 'P', 'R', 'C' }; + * u32 version; + * u32 header_len; + * char header[...] = { header_len bytes of unformatted, textual header }; + * struct section { + * u32 type; + * u64 da; + * u32 len; + * u8 content[...] = { len bytes of binary data }; + * } [ no limit on number of sections ]; + * } __packed; + */ +struct fw_header { + char magic[4]; + u32 version; + u32 header_len; + char header[0]; +} __packed; + +struct fw_section { + u32 type; + u64 da; + u32 len; + char content[0]; +} __packed; + +enum fw_section_type { + FW_RESOURCE = 0, + FW_TEXT = 1, + FW_DATA = 2, +}; + +struct fw_resource { + u32 type; + u64 da; + u32 len; + u32 reserved; + u8 name[48]; +} __packed; + +enum fw_resource_type { + RSC_MEMORY = 0, + RSC_DEVICE = 1, + RSC_IRQ = 2, + RSC_SERVICE = 3, + RSC_TRACE = 4, + RSC_BOOTADDR = 5, + RSC_END = 6, +}; + +/** + * struct rproc_mem_entry - descriptor of a remote memory region + * + * @da: virtual address as seen by the device (aka device address) + * @pa: physical address + * @size: size of this memory region + */ +struct rproc_mem_entry { + u64 da; + phys_addr_t pa; + u32 size; +}; + +struct rproc; + +struct rproc_ops { + int (*start)(struct rproc *rproc, u64 bootaddr); + int (*stop)(struct rproc *rproc); + int (*suspend)(struct rproc *rproc, bool force); + int (*resume)(struct rproc *rproc); + int (*iommu_init)(struct rproc *, int (*)(struct rproc *, u64, u32)); + int (*iommu_exit)(struct rproc *); +}; + +/* + * enum rproc_state - remote processor states + * + * @RPROC_OFFLINE: needs firmware load and init to exit this state. + * + * @RPROC_SUSPENDED: needs to be woken up to receive a message. + * + * @RPROC_RUNNING: up and running. + * + * @RPROC_LOADING: asynchronous firmware loading has started + * + * @RPROC_CRASHED: needs to be logged, connections torn down, resources + * released, and returned to OFFLINE. + */ +enum rproc_state { + RPROC_OFFLINE, + RPROC_SUSPENDED, + RPROC_RUNNING, + RPROC_LOADING, + RPROC_CRASHED, +}; + +/* + * enum rproc_event - remote processor events + * + * @RPROC_ERROR: Fatal error has happened on the remote processor. + * + * @RPROC_PRE_SUSPEND: users can register for that event in order to cancel + * autosuspend, they just need to return an error in the + * callback function. + * + * @RPROC_POS_SUSPEND: users can register for that event in order to release + * resources not needed when the remote processor is + * sleeping or if they need to save some context. + * + * @RPROC_RESUME: users should use this event to revert what was done in the + * POS_SUSPEND event. + */ +enum rproc_event { + RPROC_ERROR, + RPROC_PRE_SUSPEND, + RPROC_POS_SUSPEND, + RPROC_RESUME, +}; + +#define RPROC_MAX_NAME 100 + +/* + * struct rproc - a physical remote processor device + * + * @next: next rproc entry in the list + * @name: human readable name of the rproc, cannot exceed RPROC_MAN_NAME bytes + * @memory_maps: table of da-to-pa memory maps (relevant if device is behind + * an iommu) + * @firmware: name of firmware file to be loaded + * @owner: reference to the platform-specific rproc module + * @priv: private data which belongs to the platform-specific rproc module + * @ops: platform-specific start/stop rproc handlers + * @dev: reference to the platform-specific rproc dev + * @count: usage refcount + * @state: rproc_state enum value representing the state of the device + * @lock: lock which protects concurrent manipulations of the rproc + * @dbg_dir: debugfs directory of this rproc device + * @trace_buf0: main trace buffer of the remote processor + * @trace_buf1: second, optional, trace buffer of the remote processor + * @trace_len0: length of main trace buffer of the remote processor + * @trace_len1: length of the second (and optional) trace buffer + * @firmware_loading_complete: flags e/o asynchronous firmware loading + * @mmufault_work: work in charge of notifing mmufault + * @nb_error: notify block for fatal errors + */ +struct rproc { + struct list_head next; + const char *name; + const struct rproc_mem_entry *memory_maps; + const char *firmware; + struct module *owner; + void *priv; + const struct rproc_ops *ops; + struct device *dev; + int count; + int state; + struct mutex lock; + struct dentry *dbg_dir; + char *trace_buf0, *trace_buf1; + int trace_len0, trace_len1; + struct completion firmware_loading_complete; + struct work_struct mmufault_work; + struct blocking_notifier_head nb_error; +#ifdef CONFIG_REMOTE_PROC_AUTOSUSPEND + unsigned sus_timeout; + bool force_suspend; + bool need_resume; + struct blocking_notifier_head nb_presus; + struct blocking_notifier_head nb_possus; + struct blocking_notifier_head nb_resume; + struct mutex pm_lock; +#endif +}; + +struct rproc *rproc_get(const char *); +void rproc_put(struct rproc *); +int rproc_event_register(struct rproc *, struct notifier_block *, int); +int rproc_event_unregister(struct rproc *, struct notifier_block *, int); +int rproc_register(struct device *, const char *, const struct rproc_ops *, + const char *, const struct rproc_mem_entry *, struct module *, + unsigned int timeout); +int rproc_unregister(const char *); +void rproc_last_busy(struct rproc *); +#ifdef CONFIG_REMOTE_PROC_AUTOSUSPEND +extern const struct dev_pm_ops rproc_gen_pm_ops; +#define GENERIC_RPROC_PM_OPS (&rproc_gen_pm_ops) +#else +#define GENERIC_RPROC_PM_OPS NULL +#endif + +#endif /* REMOTEPROC_H */ diff --git a/include/linux/rpmsg.h b/include/linux/rpmsg.h new file mode 100644 index 0000000..1f7ba09 --- /dev/null +++ b/include/linux/rpmsg.h @@ -0,0 +1,191 @@ +/* + * Remote processor messaging + * + * Copyright(c) 2011 Texas Instruments. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Texas Instruments nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LINUX_RPMSG_H +#define _LINUX_RPMSG_H + +#include <linux/types.h> +#include <linux/device.h> +#include <linux/mod_devicetable.h> + +/* The feature bitmap for virtio rpmsg */ +#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ + +/** + * struct rpmsg_hdr - + * + * ... keep documenting ... + */ +struct rpmsg_hdr { + u16 len; + u16 flags; + u32 src; + u32 dst; + u32 unused; + u8 data[0]; +} __packed; + +enum rpmsg_ns_flags { + RPMSG_NS_CREATE = 0, + RPMSG_NS_DESTROY = 1, +}; + +struct rpmsg_ns_msg { + char name[RPMSG_NAME_SIZE]; + u32 addr; + u32 flags; +} __packed; + +/* driver requests */ +enum { + VPROC_BUF_ADDR, + VPROC_BUF_NUM, + VPROC_BUF_SZ, + VPROC_SIM_BASE, + VPROC_STATIC_CHANNELS, +}; + +#define RPMSG_ADDR_ANY 0xFFFFFFFF + +struct virtproc_info; + +/** + * rpmsg_channel - rpmsg channels are the devices of the rpmsg bus + * + * @vrp: the remote processor this channel connects to + * @dev: underlying device + * @id: the device type identification (used to match an rpmsg driver) + * @src: local address of this channel + * @dst: destination address of the remote service + * @priv: private pointer for the driver's use. + * @ept: local rpmsg endpoint of this channel + * @announce: need to tell remoteproc about channel creation/removal + */ +struct rpmsg_channel { + struct virtproc_info *vrp; + struct device dev; + struct rpmsg_device_id id; + u32 src; + u32 dst; + void *priv; + struct rpmsg_endpoint *ept; + bool announce; +}; + +struct rpmsg_channel_info { + char name[RPMSG_NAME_SIZE]; + u32 src; + u32 dst; +}; + +/** + * struct rpmsg_endpoint + * + * @rpdev: + * @cb: + * @src: local rpmsg address + * @priv: + */ +struct rpmsg_endpoint { + struct rpmsg_channel *rpdev; + void (*cb)(struct rpmsg_channel *, void *, int, void *, u32); + u32 addr; + void *priv; +}; + +/** + * rpmsg_driver - operations for a rpmsg I/O driver + * @driver: underlying device driver (populate name and owner). + * @id_table: the ids serviced by this driver. + * @probe: the function to call when a device is found. Returns 0 or -errno. + * @remove: the function when a device is removed. + * @callback: invoked when a message is received on the channel + */ +struct rpmsg_driver { + struct device_driver drv; + const struct rpmsg_device_id *id_table; + int (*probe)(struct rpmsg_channel *dev); + void (*remove)(struct rpmsg_channel *dev); + void (*callback)(struct rpmsg_channel *, void *, int, void *, u32); +}; + +int register_rpmsg_device(struct rpmsg_channel *dev); +void unregister_rpmsg_device(struct rpmsg_channel *dev); +int register_rpmsg_driver(struct rpmsg_driver *drv); +void unregister_rpmsg_driver(struct rpmsg_driver *drv); +void rpmsg_destroy_ept(struct rpmsg_endpoint *); +struct rpmsg_endpoint *rpmsg_create_ept(struct rpmsg_channel *, + void (*cb)(struct rpmsg_channel *, void *, int, void *, u32), + void *priv, u32 addr); + +int +rpmsg_send_offchannel_raw(struct rpmsg_channel *, u32, u32, void *, int, bool); + +static inline +int rpmsg_send_offchannel(struct rpmsg_channel *rpdev, u32 src, u32 dst, + void *data, int len) +{ + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, true); +} + +static inline int rpmsg_send(struct rpmsg_channel *rpdev, void *data, int len) +{ + return rpmsg_send_offchannel(rpdev, rpdev->src, rpdev->dst, data, len); +} + +static inline +int rpmsg_sendto(struct rpmsg_channel *rpdev, void *data, int len, u32 dst) +{ + return rpmsg_send_offchannel(rpdev, rpdev->src, dst, data, len); +} + +static inline +int rpmsg_trysend_offchannel(struct rpmsg_channel *rpdev, u32 src, u32 dst, + void *data, int len) +{ + return rpmsg_send_offchannel_raw(rpdev, src, dst, data, len, false); +} + +static inline +int rpmsg_trysend(struct rpmsg_channel *rpdev, void *data, int len) +{ + return rpmsg_trysend_offchannel(rpdev, rpdev->src, rpdev->dst, + data, len); +} + +static inline +int rpmsg_trysendto(struct rpmsg_channel *rpdev, void *data, int len, u32 dst) +{ + return rpmsg_trysend_offchannel(rpdev, rpdev->src, dst, data, len); +} + +#endif /* _LINUX_RPMSG_H */ diff --git a/include/linux/rpmsg_omx.h b/include/linux/rpmsg_omx.h new file mode 100644 index 0000000..d5c1585 --- /dev/null +++ b/include/linux/rpmsg_omx.h @@ -0,0 +1,132 @@ +/* + * OMX offloading remote processor driver + * + * Copyright(c) 2011 Texas Instruments. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Texas Instruments nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef RPMSG_OMX_H +#define RPMSG_OMX_H + +#include <linux/ioctl.h> + +#define OMX_IOC_MAGIC 'X' + +#define OMX_IOCCONNECT _IOW(OMX_IOC_MAGIC, 1, char *) +#define OMX_IOCIONREGISTER _IOWR(OMX_IOC_MAGIC, 2, struct ion_fd_data) +#define OMX_IOCIONUNREGISTER _IOWR(OMX_IOC_MAGIC, 3, struct ion_fd_data) + +#define OMX_IOC_MAXNR (1) + +#ifdef __KERNEL__ + +/** + * enum omx_msg_types - various message types currently supported + * + * @OMX_CONN_REQ: a connection request message type. the message should carry + * the name of the OMX service which we try to connect to. An instance of + * that service will be created remotely, and its address will be sent as + * a reply. + * + * @OMX_CONN_RSP: a response to a connection request. the message will carry + * an error code (success/failure), and if connection established successfully, + * the addr field will carry the address of the newly created OMX instance. + * + * @OMX_DISCONNECT: disconnect remote OMX instance. this message tells + * remote processor to release the resources coupled with this connection + * + * @OMX_RAW_MSG: a message that should be propagated as-is to the user. + * this would immediately enable user space development to start. + * as we progress, most likely this message won't be needed anymore. + */ +enum omx_msg_types { + OMX_CONN_REQ = 0, + OMX_CONN_RSP = 1, + OMX_DISCONNECT = 4, + OMX_RAW_MSG = 5, + /* todo: do we need a disconnect response ? ION refcounts should allow + * asynchronous release of relevant buffers */ +}; + +/** + * enum omx_error_codes - various error codes that will be used + * + * @OMX_SUCCESS: success + * + * @OMX_NOTSUPP: not supported + * + * @OMX_NOMEM: remote processor is out of memory + */ +enum omx_error_codes { + OMX_SUCCESS = 0, + OMX_NOTSUPP = 1, + OMX_NOMEM = 2, +}; + +/* keep documenting... */ +enum omx_state { + OMX_UNCONNECTED, + OMX_CONNECTED, + OMX_FAIL, +}; + +/** + * struct omx_msg_hdr - common header for all OMX messages + * @type: type of message, see enum omx_msg_types + * @flags: currently unused, should be zero + * @len: length of msg payload (in bytes) + * @data: the msg payload (depends on the message type) + * + * All OMX messages will start with this common header (which will begin + * right after the standard rpmsg header ends). + */ +struct omx_msg_hdr { + u32 type; + u32 flags; + u32 len; + char data[0]; +} __packed; + +struct omx_conn_rsp { + u32 status; + u32 addr; +} __packed; + +struct omx_disc_req { + u32 addr; +} __packed; + + +#endif /* __KERNEL__ */ + +/* temporarily exposed to user space too */ +struct omx_conn_req { + char name[48]; +} __packed; + +#endif /* RPMSG_OMX_H */ diff --git a/include/linux/rpmsg_resmgr.h b/include/linux/rpmsg_resmgr.h new file mode 100644 index 0000000..620043e --- /dev/null +++ b/include/linux/rpmsg_resmgr.h @@ -0,0 +1,118 @@ +/* + * Remote processor messaging + * + * Copyright(c) 2011 Texas Instruments. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Texas Instruments nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LINUX_RPMSG_RESMGR_H +#define _LINUX_RPMSG_RESMGR_H + +#define MAX_NUM_SDMA_CHANNELS 16 + +enum { + RPRM_GPTIMER = 0, + RPRM_IVAHD = 1, + RPRM_IVASEQ0 = 2, + RPRM_IVASEQ1 = 3, + RPRM_L3BUS = 4, + RPRM_ISS = 5, + RPRM_FDIF = 6, + RPRM_SL2IF = 7, + RPRM_AUXCLK = 8, + RPRM_REGULATOR = 9, + RPRM_GPIO = 10, + RPRM_SDMA = 11, + RPRM_MAX +}; + +enum { + RPRM_CONNECT = 0, + RPRM_REQ_ALLOC = 1, + RPRM_REQ_FREE = 2, + RPRM_DISCONNECT = 3, + RPRM_REQ_CONSTRAINTS = 4, + RPRM_REL_CONSTRAINTS = 5, +}; + +enum { + RPRM_SCALE = 0x1, + RPRM_LAT = 0x2, + RPRM_BW = 0x4, +}; + +struct rprm_request { + u32 res_type; + u32 acquire; + u32 res_id; + char data[]; +} __packed; + +struct rprm_ack { + u32 ret; + u32 res_type; + u32 res_id; + u32 base; + char data[]; +} __packed; + +struct rprm_gpt { + u32 id; + u32 src_clk; +}; + +struct rprm_auxclk { + u32 id; + u32 clk_rate; + u32 parent_src_clk; + u32 parent_src_clk_rate; +}; + +struct rprm_regulator { + u32 id; + u32 min_uv; + u32 max_uv; +}; + +struct rprm_gpio { + u32 id; +}; + +struct rprm_sdma { + u32 num_chs; + s32 channels[MAX_NUM_SDMA_CHANNELS]; +}; + +struct rprm_constraints_data { + u32 mask; + long frequency; + long bandwidth; + long latency; +}; + +#endif /* _LINUX_RPMSG_RESMGR_H */ diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h index 8d522ff..de17134 100644 --- a/include/linux/rtmutex.h +++ b/include/linux/rtmutex.h @@ -66,7 +66,7 @@ struct hrtimer_sleeper; #define __RT_MUTEX_INITIALIZER(mutexname) \ { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ - , .wait_list = PLIST_HEAD_INIT_RAW(mutexname.wait_list, mutexname.wait_lock) \ + , .wait_list = PLIST_HEAD_INIT(mutexname.wait_list) \ , .owner = NULL \ __DEBUG_RT_MUTEX_INITIALIZER(mutexname)} @@ -100,7 +100,7 @@ extern void rt_mutex_unlock(struct rt_mutex *lock); #ifdef CONFIG_RT_MUTEXES # define INIT_RT_MUTEXES(tsk) \ - .pi_waiters = PLIST_HEAD_INIT(tsk.pi_waiters, tsk.pi_lock), \ + .pi_waiters = PLIST_HEAD_INIT(tsk.pi_waiters), \ INIT_RT_MUTEX_DEBUG(tsk) #else # define INIT_RT_MUTEXES(tsk) diff --git a/include/linux/virtio_ids.h b/include/linux/virtio_ids.h index 85bb0bb..1520c06 100644 --- a/include/linux/virtio_ids.h +++ b/include/linux/virtio_ids.h @@ -35,5 +35,6 @@ #define VIRTIO_ID_RNG 4 /* virtio ring */ #define VIRTIO_ID_BALLOON 5 /* virtio balloon */ #define VIRTIO_ID_9P 9 /* 9p virtio console */ +#define VIRTIO_ID_RPMSG 10 /* virtio remote processor messaging */ #endif /* _LINUX_VIRTIO_IDS_H */ diff --git a/include/linux/virtio_ring.h b/include/linux/virtio_ring.h index 4a32cb6..7894a16 100644 --- a/include/linux/virtio_ring.h +++ b/include/linux/virtio_ring.h @@ -177,5 +177,7 @@ void vring_del_virtqueue(struct virtqueue *vq); void vring_transport_features(struct virtio_device *vdev); irqreturn_t vring_interrupt(int irq, void *_vq); +struct vring_virtqueue; +bool virtqueue_more_used(struct virtqueue *vq); #endif /* __KERNEL__ */ #endif /* _LINUX_VIRTIO_RING_H */ |