summaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorEnric Balletbo i Serra <eballetbo@iseebcn.com>2014-07-22 07:08:38 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-07-23 20:02:49 -0400
commit4dcc2ab3f869c5ecdcf4edfe5308767121f8a136 (patch)
tree5f4bcbb8895bf3157fb78fdf667e88b4a70ac4ae /drivers/misc
parentf222447ea1b70a651ec280bfb4a2fde4cbeae983 (diff)
drivers/misc/ti-st: Load firmware from ti-connectivity directory.
Looks like the default location for TI firmware is inside the ti-connectivity directory, to be coherent with other firmware request used by TI drivers, load the TIInit firmware from this directory instead of /lib/firmware directly. Signed-off-by: Enric Balletbo i Serra <eballetbo@iseebcn.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/ti-st/st_kim.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c
index 45007be7cfb7..21c2337bad68 100644
--- a/drivers/misc/ti-st/st_kim.c
+++ b/drivers/misc/ti-st/st_kim.c
@@ -244,7 +244,8 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
244 if (version & 0x8000) 244 if (version & 0x8000)
245 maj_ver |= 0x0008; 245 maj_ver |= 0x0008;
246 246
247 sprintf(bts_scr_name, "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver); 247 sprintf(bts_scr_name, "ti-connectivity/TIInit_%d.%d.%d.bts",
248 chip, maj_ver, min_ver);
248 249
249 /* to be accessed later via sysfs entry */ 250 /* to be accessed later via sysfs entry */
250 kim_gdata->version.full = version; 251 kim_gdata->version.full = version;
@@ -287,7 +288,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)
287 long len = 0; 288 long len = 0;
288 unsigned char *ptr = NULL; 289 unsigned char *ptr = NULL;
289 unsigned char *action_ptr = NULL; 290 unsigned char *action_ptr = NULL;
290 unsigned char bts_scr_name[30] = { 0 }; /* 30 char long bts scr name? */ 291 unsigned char bts_scr_name[40] = { 0 }; /* 40 char long bts scr name? */
291 int wr_room_space; 292 int wr_room_space;
292 int cmd_size; 293 int cmd_size;
293 unsigned long timeout; 294 unsigned long timeout;
n> return generic_block_bmap(mapping,block,efs_get_block); } static const struct address_space_operations efs_aops = { .readpage = efs_readpage, .bmap = _efs_bmap }; static inline void extent_copy(efs_extent *src, efs_extent *dst) { /* * this is slightly evil. it doesn't just copy * efs_extent from src to dst, it also mangles * the bits so that dst ends up in cpu byte-order. */ dst->cooked.ex_magic = (unsigned int) src->raw[0]; dst->cooked.ex_bn = ((unsigned int) src->raw[1] << 16) | ((unsigned int) src->raw[2] << 8) | ((unsigned int) src->raw[3] << 0); dst->cooked.ex_length = (unsigned int) src->raw[4]; dst->cooked.ex_offset = ((unsigned int) src->raw[5] << 16) | ((unsigned int) src->raw[6] << 8) | ((unsigned int) src->raw[7] << 0); return; } struct inode *efs_iget(struct super_block *super, unsigned long ino) { int i, inode_index; dev_t device; u32 rdev; struct buffer_head *bh; struct efs_sb_info *sb = SUPER_INFO(super); struct efs_inode_info *in; efs_block_t block, offset; struct efs_dinode *efs_inode; struct inode *inode; inode = iget_locked(super, ino); if (!inode) return ERR_PTR(-ENOMEM); if (!(inode->i_state & I_NEW)) return inode; in = INODE_INFO(inode); /* ** EFS layout: ** ** | cylinder group | cylinder group | cylinder group ..etc ** |inodes|data |inodes|data |inodes|data ..etc ** ** work out the inode block index, (considering initially that the ** inodes are stored as consecutive blocks). then work out the block ** number of that inode given the above layout, and finally the ** offset of the inode within that block. */ inode_index = inode->i_ino / (EFS_BLOCKSIZE / sizeof(struct efs_dinode)); block = sb->fs_start + sb->first_block + (sb->group_size * (inode_index / sb->inode_blocks)) + (inode_index % sb->inode_blocks); offset = (inode->i_ino % (EFS_BLOCKSIZE / sizeof(struct efs_dinode))) * sizeof(struct efs_dinode); bh = sb_bread(inode->i_sb, block); if (!bh) { pr_warn("%s() failed at block %d\n", __func__, block); goto read_inode_error; } efs_inode = (struct efs_dinode *) (bh->b_data + offset); inode->i_mode = be16_to_cpu(efs_inode->di_mode); set_nlink(inode, be16_to_cpu(efs_inode->di_nlink)); i_uid_write(inode, (uid_t)be16_to_cpu(efs_inode->di_uid)); i_gid_write(inode, (gid_t)be16_to_cpu(efs_inode->di_gid)); inode->i_size = be32_to_cpu(efs_inode->di_size); inode->i_atime.tv_sec = be32_to_cpu(efs_inode->di_atime); inode->i_mtime.tv_sec = be32_to_cpu(efs_inode->di_mtime); inode->i_ctime.tv_sec = be32_to_cpu(efs_inode->di_ctime); inode->i_atime.tv_nsec = inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = 0; /* this is the number of blocks in the file */ if (inode->i_size == 0) { inode->i_blocks = 0; } else { inode->i_blocks = ((inode->i_size - 1) >> EFS_BLOCKSIZE_BITS) + 1; } rdev = be16_to_cpu(efs_inode->di_u.di_dev.odev); if (rdev == 0xffff) { rdev = be32_to_cpu(efs_inode->di_u.di_dev.ndev); if (sysv_major(rdev) > 0xfff) device = 0; else device = MKDEV(sysv_major(rdev), sysv_minor(rdev)); } else device = old_decode_dev(rdev); /* get the number of extents for this object */ in->numextents = be16_to_cpu(efs_inode->di_numextents); in->lastextent = 0; /* copy the extents contained within the inode to memory */ for(i = 0; i < EFS_DIRECTEXTENTS; i++) { extent_copy(&(efs_inode->di_u.di_extents[i]), &(in->extents[i])); if (i < in->numextents && in->extents[i].cooked.ex_magic != 0) { pr_warn("extent %d has bad magic number in inode %lu\n", i, inode->i_ino); brelse(bh); goto read_inode_error; } } brelse(bh); pr_debug("efs_iget(): inode %lu, extents %d, mode %o\n", inode->i_ino, in->numextents, inode->i_mode); switch (inode->i_mode & S_IFMT) { case S_IFDIR: inode->i_op = &efs_dir_inode_operations; inode->i_fop = &efs_dir_operations; break; case S_IFREG: inode->i_fop = &generic_ro_fops; inode->i_data.a_ops = &efs_aops; break; case S_IFLNK: inode->i_op = &page_symlink_inode_operations; inode_nohighmem(inode); inode->i_data.a_ops = &efs_symlink_aops; break; case S_IFCHR: case S_IFBLK: case S_IFIFO: init_special_inode(inode, inode->i_mode, device); break; default: pr_warn("unsupported inode mode %o\n", inode->i_mode); goto read_inode_error; break; } unlock_new_inode(inode); return inode; read_inode_error: pr_warn("failed to read inode %lu\n", inode->i_ino); iget_failed(inode); return ERR_PTR(-EIO); } static inline efs_block_t efs_extent_check(efs_extent *ptr, efs_block_t block, struct efs_sb_info *sb) { efs_block_t start; efs_block_t length; efs_block_t offset; /* * given an extent and a logical block within a file, * can this block be found within this extent ? */ start = ptr->cooked.ex_bn;